From af5d2ffd971a3b899ebb1cf752ba01a925b7d269 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Wed, 15 Jul 2026 18:23:14 -0400 Subject: [PATCH 001/315] build(build): fix Railway staged apply and pending volume recovery Intent: - Save hint: fix Railway staged apply and pending volume recovery Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.fix-railway-staged-apply.20260715T222245Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: 0.12.62 -> github:treeseed-ai/sdk#6f21e05e67c1c112a22ab27968364f4355313d38 - dependencies.@treeseed/core: 0.12.59 -> github:treeseed-ai/core#96d2d07fd429dbc0f7a0c74881a88415f55dfbba --- package-lock.json | 20 +++++++++----------- package.json | 6 +++--- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0079ea27..1289f7f8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,18 +1,18 @@ { "name": "@treeseed/admin", - "version": "0.12.58", + "version": "0.12.59-dev.fix-railway-staged-apply.20260715T222245Z", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@treeseed/admin", - "version": "0.12.58", + "version": "0.12.59-dev.fix-railway-staged-apply.20260715T222245Z", "license": "AGPL-3.0-only", "dependencies": { "@mdxeditor/editor": "^4.0.2", "@react-email/render": "^2.0.8", - "@treeseed/core": "0.12.59", - "@treeseed/sdk": "0.12.62", + "@treeseed/core": "github:treeseed-ai/core#96d2d07fd429dbc0f7a0c74881a88415f55dfbba", + "@treeseed/sdk": "github:treeseed-ai/sdk#6f21e05e67c1c112a22ab27968364f4355313d38", "@treeseed/ui": "0.12.17", "libsodium-wrappers-sumo": "^0.7.16", "react": "^19.2.5", @@ -6933,9 +6933,8 @@ } }, "node_modules/@treeseed/core": { - "version": "0.12.59", - "resolved": "https://registry.npmjs.org/@treeseed/core/-/core-0.12.59.tgz", - "integrity": "sha512-vDLbM5PZRdHp+sAckVTpOGv1LLknXcaxZ9dG6CqplBm3Wa+vNhU+nQjzFf7B+BfXdcUZXDjAJBSUheQCfdvPnw==", + "version": "0.12.60-dev.fix-railway-staged-apply.20260715T220806Z", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#96d2d07fd429dbc0f7a0c74881a88415f55dfbba", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6946,7 +6945,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "0.12.62", + "@treeseed/sdk": "github:treeseed-ai/sdk#6f21e05e67c1c112a22ab27968364f4355313d38", "@treeseed/ui": "0.12.17", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8950,9 +8949,8 @@ } }, "node_modules/@treeseed/sdk": { - "version": "0.12.62", - "resolved": "https://registry.npmjs.org/@treeseed/sdk/-/sdk-0.12.62.tgz", - "integrity": "sha512-wR5ukK2pqw0fUE9gJMYgJmIUlMTy4NoYKJrHEo6NAN/QFNrpru+9vilaS4kCPrcZQl/YAleuv962Z8c/pwwrBQ==", + "version": "0.12.63-dev.fix-railway-staged-apply.20260715T220237Z", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#6f21e05e67c1c112a22ab27968364f4355313d38", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index 5c9a5945..1badbf7c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@treeseed/admin", - "version": "0.12.58", + "version": "0.12.59-dev.fix-railway-staged-apply.20260715T222245Z", "description": "Treeseed administration portal framework built on @treeseed/core and @treeseed/ui.", "license": "AGPL-3.0-only", "repository": { @@ -48,8 +48,8 @@ "dependencies": { "@mdxeditor/editor": "^4.0.2", "@react-email/render": "^2.0.8", - "@treeseed/core": "0.12.59", - "@treeseed/sdk": "0.12.62", + "@treeseed/core": "github:treeseed-ai/core#96d2d07fd429dbc0f7a0c74881a88415f55dfbba", + "@treeseed/sdk": "github:treeseed-ai/sdk#6f21e05e67c1c112a22ab27968364f4355313d38", "@treeseed/ui": "0.12.17", "libsodium-wrappers-sumo": "^0.7.16", "react": "^19.2.5", From 20384578d75b5b88b89d1e794154ecca2ba79e42 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Wed, 15 Jul 2026 21:02:38 -0400 Subject: [PATCH 002/315] build(build): disable hosted deployments for local staging work Intent: - Save hint: disable hosted deployments for local staging work Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.fix-railway-staged-apply.20260715T222245Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/ui: 0.12.17 -> github:treeseed-ai/ui#0f10f2a452d570eb3d4aa31a246c62f3adf49aa2 - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#6f21e05e67c1c112a22ab27968364f4355313d38 -> github:treeseed-ai/sdk#aa0ce40dfbe416fd791675a5660cbe937b6d52f7 - dependencies.@treeseed/core: github:treeseed-ai/core#96d2d07fd429dbc0f7a0c74881a88415f55dfbba -> github:treeseed-ai/core#3d6a2e47992cdbd399ddcfd8b6b3900be5c61e18 --- package-lock.json | 19 +++++++++---------- package.json | 6 +++--- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1289f7f8..bf1e538b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,9 +11,9 @@ "dependencies": { "@mdxeditor/editor": "^4.0.2", "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#96d2d07fd429dbc0f7a0c74881a88415f55dfbba", - "@treeseed/sdk": "github:treeseed-ai/sdk#6f21e05e67c1c112a22ab27968364f4355313d38", - "@treeseed/ui": "0.12.17", + "@treeseed/core": "github:treeseed-ai/core#3d6a2e47992cdbd399ddcfd8b6b3900be5c61e18", + "@treeseed/sdk": "github:treeseed-ai/sdk#aa0ce40dfbe416fd791675a5660cbe937b6d52f7", + "@treeseed/ui": "github:treeseed-ai/ui#0f10f2a452d570eb3d4aa31a246c62f3adf49aa2", "libsodium-wrappers-sumo": "^0.7.16", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -6934,7 +6934,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.fix-railway-staged-apply.20260715T220806Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#96d2d07fd429dbc0f7a0c74881a88415f55dfbba", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#3d6a2e47992cdbd399ddcfd8b6b3900be5c61e18", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6945,8 +6945,8 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#6f21e05e67c1c112a22ab27968364f4355313d38", - "@treeseed/ui": "0.12.17", + "@treeseed/sdk": "github:treeseed-ai/sdk#aa0ce40dfbe416fd791675a5660cbe937b6d52f7", + "@treeseed/ui": "github:treeseed-ai/ui#0f10f2a452d570eb3d4aa31a246c62f3adf49aa2", "astro": "^5.6.1", "esbuild": "^0.28.0", "katex": "^0.16.22", @@ -8950,7 +8950,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.fix-railway-staged-apply.20260715T220237Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#6f21e05e67c1c112a22ab27968364f4355313d38", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#aa0ce40dfbe416fd791675a5660cbe937b6d52f7", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", @@ -9646,9 +9646,8 @@ } }, "node_modules/@treeseed/ui": { - "version": "0.12.17", - "resolved": "https://registry.npmjs.org/@treeseed/ui/-/ui-0.12.17.tgz", - "integrity": "sha512-dz+iNHu969vMmh7Cc+0z8O26inALrFGNGfZbc7hNeJ47fIIv2rOgO1nrRKJoDlqZz8GMnmN5d7N+vjab7GPBUw==", + "version": "0.12.18-dev.fix-railway-staged-apply.20260716T010046Z", + "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#0f10f2a452d570eb3d4aa31a246c62f3adf49aa2", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", diff --git a/package.json b/package.json index 1badbf7c..b6243f95 100644 --- a/package.json +++ b/package.json @@ -48,9 +48,9 @@ "dependencies": { "@mdxeditor/editor": "^4.0.2", "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#96d2d07fd429dbc0f7a0c74881a88415f55dfbba", - "@treeseed/sdk": "github:treeseed-ai/sdk#6f21e05e67c1c112a22ab27968364f4355313d38", - "@treeseed/ui": "0.12.17", + "@treeseed/core": "github:treeseed-ai/core#3d6a2e47992cdbd399ddcfd8b6b3900be5c61e18", + "@treeseed/sdk": "github:treeseed-ai/sdk#aa0ce40dfbe416fd791675a5660cbe937b6d52f7", + "@treeseed/ui": "github:treeseed-ai/ui#0f10f2a452d570eb3d4aa31a246c62f3adf49aa2", "libsodium-wrappers-sumo": "^0.7.16", "react": "^19.2.5", "react-dom": "^19.2.6" From e14876f6e1636c30d7c580c88dd3a75849254285 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Wed, 15 Jul 2026 22:58:53 -0400 Subject: [PATCH 003/315] build(build): replace unhealthy managed local processes Intent: - Save hint: replace unhealthy managed local processes Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.fix-local-dev-unhealthy-restart.20260716T025832Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#aa0ce40dfbe416fd791675a5660cbe937b6d52f7 -> github:treeseed-ai/sdk#42d9e8308e1eb7bdb31a6d204e6b0aa7358e775a - dependencies.@treeseed/core: github:treeseed-ai/core#3d6a2e47992cdbd399ddcfd8b6b3900be5c61e18 -> github:treeseed-ai/core#92947586ed8829b36921018c61d81a2f655f0410 --- package-lock.json | 18 +++++++++--------- package.json | 6 +++--- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index bf1e538b..d15f3fd1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,18 +1,18 @@ { "name": "@treeseed/admin", - "version": "0.12.59-dev.fix-railway-staged-apply.20260715T222245Z", + "version": "0.12.59-dev.fix-local-dev-unhealthy-restart.20260716T025832Z", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@treeseed/admin", - "version": "0.12.59-dev.fix-railway-staged-apply.20260715T222245Z", + "version": "0.12.59-dev.fix-local-dev-unhealthy-restart.20260716T025832Z", "license": "AGPL-3.0-only", "dependencies": { "@mdxeditor/editor": "^4.0.2", "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#3d6a2e47992cdbd399ddcfd8b6b3900be5c61e18", - "@treeseed/sdk": "github:treeseed-ai/sdk#aa0ce40dfbe416fd791675a5660cbe937b6d52f7", + "@treeseed/core": "github:treeseed-ai/core#92947586ed8829b36921018c61d81a2f655f0410", + "@treeseed/sdk": "github:treeseed-ai/sdk#42d9e8308e1eb7bdb31a6d204e6b0aa7358e775a", "@treeseed/ui": "github:treeseed-ai/ui#0f10f2a452d570eb3d4aa31a246c62f3adf49aa2", "libsodium-wrappers-sumo": "^0.7.16", "react": "^19.2.5", @@ -6933,8 +6933,8 @@ } }, "node_modules/@treeseed/core": { - "version": "0.12.60-dev.fix-railway-staged-apply.20260715T220806Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#3d6a2e47992cdbd399ddcfd8b6b3900be5c61e18", + "version": "0.12.60-dev.fix-local-dev-unhealthy-restart.20260716T025813Z", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#92947586ed8829b36921018c61d81a2f655f0410", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6945,7 +6945,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#aa0ce40dfbe416fd791675a5660cbe937b6d52f7", + "@treeseed/sdk": "github:treeseed-ai/sdk#42d9e8308e1eb7bdb31a6d204e6b0aa7358e775a", "@treeseed/ui": "github:treeseed-ai/ui#0f10f2a452d570eb3d4aa31a246c62f3adf49aa2", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8949,8 +8949,8 @@ } }, "node_modules/@treeseed/sdk": { - "version": "0.12.63-dev.fix-railway-staged-apply.20260715T220237Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#aa0ce40dfbe416fd791675a5660cbe937b6d52f7", + "version": "0.12.63-dev.fix-local-dev-unhealthy-restart.20260716T025755Z", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#42d9e8308e1eb7bdb31a6d204e6b0aa7358e775a", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index b6243f95..3b6bcc92 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@treeseed/admin", - "version": "0.12.59-dev.fix-railway-staged-apply.20260715T222245Z", + "version": "0.12.59-dev.fix-local-dev-unhealthy-restart.20260716T025832Z", "description": "Treeseed administration portal framework built on @treeseed/core and @treeseed/ui.", "license": "AGPL-3.0-only", "repository": { @@ -48,8 +48,8 @@ "dependencies": { "@mdxeditor/editor": "^4.0.2", "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#3d6a2e47992cdbd399ddcfd8b6b3900be5c61e18", - "@treeseed/sdk": "github:treeseed-ai/sdk#aa0ce40dfbe416fd791675a5660cbe937b6d52f7", + "@treeseed/core": "github:treeseed-ai/core#92947586ed8829b36921018c61d81a2f655f0410", + "@treeseed/sdk": "github:treeseed-ai/sdk#42d9e8308e1eb7bdb31a6d204e6b0aa7358e775a", "@treeseed/ui": "github:treeseed-ai/ui#0f10f2a452d570eb3d4aa31a246c62f3adf49aa2", "libsodium-wrappers-sumo": "^0.7.16", "react": "^19.2.5", From 929dabe81955c70e37ef07096587f2a31c7393cc Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Thu, 16 Jul 2026 11:43:23 -0400 Subject: [PATCH 004/315] build(config): update package metadata Changes: - Updates 295 files across config: 140, ui: 97, source: 47, release: 5, build: 4, docs: 1, tests: 1. - Touches README.md, guarantees/capacity/capacity/approve-capacity.guarantee.yaml, guarantees/capacity/capacity/deploy-capacity.guarantee.yaml, guarantees/capacity/capacity/monitor-capacity.guarantee.yaml, guarantees/capacity/capacity/revoke-capacity.guarantee.yaml, guarantees/capacity/capacity/scenes/approve-capacity.scene.yaml, .... - Plans package version/tag 0.12.59-dev.staging.20260716T154320Z for @treeseed/admin. --- README.md | 171 +- .../capacity/approve-capacity.guarantee.yaml | 75 - .../capacity/deploy-capacity.guarantee.yaml | 75 - .../capacity/monitor-capacity.guarantee.yaml | 77 - .../capacity/revoke-capacity.guarantee.yaml | 77 - .../scenes/approve-capacity.scene.yaml | 118 -- .../scenes/deploy-capacity.scene.yaml | 118 -- .../scenes/monitor-capacity.scene.yaml | 121 -- .../scenes/revoke-capacity.scene.yaml | 118 -- .../scenes/shut-down-capacity.scene.yaml | 118 -- .../shut-down-capacity.guarantee.yaml | 75 - .../rotate-capacity-key.guarantee.yaml | 75 - .../scenes/rotate-capacity-key.scene.yaml | 118 -- .../host/host/create-host.guarantee.yaml | 75 - .../host/host/delete-host.guarantee.yaml | 75 - guarantees/host/host/edit-host.guarantee.yaml | 75 - .../host/host/scenes/create-host.scene.yaml | 119 -- .../host/host/scenes/delete-host.scene.yaml | 118 -- .../host/host/scenes/edit-host.scene.yaml | 118 -- .../secrets/create-passphrase.guarantee.yaml | 75 - .../secrets/reset-passphrase.guarantee.yaml | 75 - .../scenes/create-passphrase.scene.yaml | 118 -- .../scenes/reset-passphrase.scene.yaml | 118 -- .../record-fulfillment.guarantee.yaml | 74 - .../scenes/record-fulfillment.scene.yaml | 116 -- .../listings/approve-listing.guarantee.yaml | 74 - .../create-product-listing.guarantee.yaml | 74 - .../listings/manage-listing.guarantee.yaml | 74 - .../scenes/approve-listing.scene.yaml | 116 -- .../scenes/create-product-listing.scene.yaml | 116 -- .../listings/scenes/manage-listing.scene.yaml | 116 -- .../submit-listing-for-review.scene.yaml | 116 -- .../submit-listing-for-review.guarantee.yaml | 74 - .../onboarding/approve-seller.guarantee.yaml | 74 - .../request-seller-setup.guarantee.yaml | 74 - .../scenes/approve-seller.scene.yaml | 116 -- .../scenes/request-seller-setup.scene.yaml | 116 -- .../refunds/issue-refund.guarantee.yaml | 74 - .../refunds/scenes/issue-refund.scene.yaml | 116 -- .../sales/scenes/view-seller-sales.scene.yaml | 116 -- .../sales/view-seller-sales.guarantee.yaml | 74 - .../project/agent/create-agent.guarantee.yaml | 73 - .../project/agent/delete-agent.guarantee.yaml | 73 - .../project/agent/edit-agent.guarantee.yaml | 73 - .../monitor-agent-admin-ui.guarantee.yaml | 76 - .../agent/scenes/create-agent.scene.yaml | 148 -- .../agent/scenes/delete-agent.scene.yaml | 118 -- .../agent/scenes/edit-agent.scene.yaml | 118 -- .../scenes/monitor-agent-admin-ui.scene.yaml | 118 -- .../allocate-agent-capacity.guarantee.yaml | 73 - .../allocate-project-capacity.guarantee.yaml | 73 - .../scenes/allocate-agent-capacity.scene.yaml | 120 -- .../allocate-project-capacity.scene.yaml | 120 -- .../project/book/create-book.guarantee.yaml | 73 - .../project/book/delete-book.guarantee.yaml | 73 - .../project/book/download-book.guarantee.yaml | 75 - .../project/book/edit-book.guarantee.yaml | 73 - .../book/scenes/create-book.scene.yaml | 118 -- .../book/scenes/delete-book.scene.yaml | 118 -- .../book/scenes/download-book.scene.yaml | 118 -- .../project/book/scenes/edit-book.scene.yaml | 118 -- .../book/scenes/search-books.scene.yaml | 118 -- .../project/book/search-books.guarantee.yaml | 73 - .../create-note-on-decision.guarantee.yaml | 73 - .../scenes/create-note-on-decision.scene.yaml | 118 -- .../scenes/search-decisions.scene.yaml | 118 -- .../decision/search-decisions.guarantee.yaml | 73 - .../knowledge/create-book-page.guarantee.yaml | 73 - .../knowledge/delete-book-page.guarantee.yaml | 73 - .../knowledge/edit-book-page.guarantee.yaml | 73 - .../knowledge/review-backlinks.guarantee.yaml | 83 - .../scenes/create-book-page.scene.yaml | 118 -- .../scenes/delete-book-page.scene.yaml | 118 -- .../scenes/edit-book-page.scene.yaml | 118 -- .../scenes/review-backlinks.scene.yaml | 118 -- .../library/download-library.guarantee.yaml | 73 - .../rebuild-library-index.guarantee.yaml | 75 - .../scenes/download-library.scene.yaml | 118 -- .../scenes/rebuild-library-index.scene.yaml | 118 -- .../create-note-on-objective.guarantee.yaml | 73 - .../objective/create-objective.guarantee.yaml | 73 - .../objective/delete-objective.guarantee.yaml | 73 - .../objective/edit-objective.guarantee.yaml | 73 - .../create-note-on-objective.scene.yaml | 118 -- .../scenes/create-objective.scene.yaml | 118 -- .../scenes/delete-objective.scene.yaml | 118 -- .../scenes/edit-objective.scene.yaml | 118 -- .../scenes/search-objectives.scene.yaml | 118 -- .../search-objectives.guarantee.yaml | 73 - .../project/create-project.guarantee.yaml | 73 - .../project/destroy-project.guarantee.yaml | 73 - .../edit-project-settings.guarantee.yaml | 73 - .../project/monitor-project.guarantee.yaml | 73 - .../project/scenes/create-project.scene.yaml | 118 -- .../project/scenes/destroy-project.scene.yaml | 118 -- .../scenes/edit-project-settings.scene.yaml | 118 -- .../project/scenes/monitor-project.scene.yaml | 118 -- .../scenes/view-project-profile.scene.yaml | 118 -- .../view-project-profile.guarantee.yaml | 73 - .../create-note-on-proposal.guarantee.yaml | 73 - .../proposal/create-proposal.guarantee.yaml | 73 - .../proposal/delete-proposal.guarantee.yaml | 73 - .../proposal/edit-proposal.guarantee.yaml | 73 - .../proposal/proposal-inbox.guarantee.yaml | 73 - .../scenes/create-note-on-proposal.scene.yaml | 118 -- .../scenes/create-proposal.scene.yaml | 118 -- .../scenes/delete-proposal.scene.yaml | 118 -- .../proposal/scenes/edit-proposal.scene.yaml | 118 -- .../proposal/scenes/proposal-inbox.scene.yaml | 118 -- .../scenes/search-proposals.scene.yaml | 118 -- .../scenes/vote-on-proposal.scene.yaml | 118 -- .../proposal/search-proposals.guarantee.yaml | 73 - .../proposal/vote-on-proposal.guarantee.yaml | 73 - .../question/answer-question.guarantee.yaml | 73 - .../question/ask-question.guarantee.yaml | 73 - .../question/delete-question.guarantee.yaml | 73 - .../question/edit-question.guarantee.yaml | 73 - .../scenes/answer-question.scene.yaml | 118 -- .../question/scenes/ask-question.scene.yaml | 118 -- .../scenes/delete-question.scene.yaml | 118 -- .../question/scenes/edit-question.scene.yaml | 118 -- .../search-questions-answers.scene.yaml | 118 -- .../search-questions-answers.guarantee.yaml | 73 - .../scenes/view-team-audit-log.scene.yaml | 130 -- .../audit/view-team-audit-log.guarantee.yaml | 77 - .../manage-allocation-sets.guarantee.yaml | 77 - .../scenes/manage-allocation-sets.scene.yaml | 130 -- .../team/team/create-team.guarantee.yaml | 4 +- .../team/scenes/view-team-profile.scene.yaml | 10 +- .../team/view-team-profile.guarantee.yaml | 8 +- .../account/manage-api-tokens.guarantee.yaml | 76 - .../manage-notifications.guarantee.yaml | 76 - .../scenes/manage-api-tokens.scene.yaml | 128 -- .../scenes/manage-notifications.scene.yaml | 128 -- .../scenes/view-user-profile.scene.yaml | 23 +- .../account/view-user-profile.guarantee.yaml | 10 +- guarantees/verifiers/ui.verifiers.yaml | 1541 +--------------- .../workday/analyze-workday.guarantee.yaml | 79 - .../workday/monitor-workdays.guarantee.yaml | 79 - .../workday/scenes/analyze-workday.scene.yaml | 118 -- .../scenes/monitor-workdays.scene.yaml | 118 -- .../scenes/schedule-workdays.scene.yaml | 118 -- .../workday/schedule-workdays.guarantee.yaml | 79 - package-lock.json | 21 +- package.json | 5 +- src/capabilities/questions.ts | 84 - .../work/DirectionContentForm.astro | 125 -- src/components/work/QuestionForm.astro | 128 -- src/env.d.ts | 5 - src/layouts/TreeseedAppLayout.astro | 82 +- .../TreeseedOperationalMarketLayout.astro | 40 - src/layouts/TreeseedPublicLayout.astro | 58 +- src/lib/host-crypto.ts | 197 -- .../knowledge-distribution/publish-client.ts | 23 - src/lib/market/admin-form-client.ts | 110 -- src/lib/market/catalog.ts | 15 - src/lib/market/content-form-help.ts | 135 -- src/lib/market/content-relations.ts | 60 - src/lib/market/control-ui.ts | 180 +- src/lib/market/deployment-actions.ts | 53 - src/lib/market/deployment-errors.ts | 34 - src/lib/market/deployment-governance.ts | 109 -- src/lib/market/deployment-projection.ts | 297 --- src/lib/market/deployment-readiness.ts | 198 -- src/lib/market/governance-projection.ts | 537 ------ src/lib/market/host-credential-form-client.ts | 440 ----- src/lib/market/infrastructure-projection.ts | 600 ------- src/lib/market/infrastructure-seeds.ts | 136 -- src/lib/market/knowledge-projection.ts | 463 ----- src/lib/market/managed-hosts.ts | 137 -- src/lib/market/operating-loop-client.ts | 165 -- src/lib/market/operational-artifacts.ts | 175 -- src/lib/market/public-access.ts | 66 +- src/lib/market/seeds/apply.ts | 1586 ----------------- src/lib/market/seeds/local-api.ts | 142 -- src/lib/market/workday-projection.ts | 536 ------ src/middleware.ts | 2 - src/pages/api/markdown/preview.ts | 31 - src/pages/app/capacity/allocation.astro | 53 - .../allocation/projects/[projectId].astro | 36 - .../[projectId]/agents/[agentSlug].astro | 17 - .../projects/[projectId]/modes/[modeId].astro | 17 - src/pages/app/capacity/index.astro | 3 - .../app/capacity/providers/[providerId].astro | 53 - .../providers/[providerId]/keys.astro | 67 - .../providers/[providerId]/settings.astro | 431 ----- src/pages/app/capacity/providers/index.astro | 39 - src/pages/app/capacity/providers/new.astro | 286 --- src/pages/app/capacity/runtime.astro | 445 ----- .../app/capacity/workday-runs/[runId].astro | 19 - .../app/capacity/workday-runs/index.astro | 43 - src/pages/app/commons/index.astro | 40 - src/pages/app/commons/participants.astro | 44 - .../app/commons/proposals/[proposalId].astro | 78 - src/pages/app/hosts/[hostType]/[hostId].astro | 71 - .../hosts/[hostType]/[hostId]/settings.astro | 208 --- src/pages/app/hosts/[hostType]/new.astro | 142 -- src/pages/app/hosts/index.astro | 40 - src/pages/app/hosts/knowledge-library.astro | 161 -- src/pages/app/hosts/new.astro | 32 - src/pages/app/index.astro | 4 +- src/pages/app/knowledge.astro | 25 - .../app/knowledge/[category]/[slug].astro | 25 - src/pages/app/knowledge/artifacts.astro | 20 - src/pages/app/knowledge/books.astro | 17 - src/pages/app/knowledge/books/[slug].astro | 24 - src/pages/app/knowledge/capabilities.astro | 17 - .../app/knowledge/capabilities/[slug].astro | 24 - src/pages/app/knowledge/imports.astro | 17 - src/pages/app/knowledge/imports/[slug].astro | 24 - src/pages/app/knowledge/packs.astro | 17 - src/pages/app/knowledge/publish.astro | 44 - src/pages/app/knowledge/releases.astro | 17 - .../app/knowledge/releases/[releaseId].astro | 24 - .../releases/[releaseId]/review.astro | 24 - src/pages/app/knowledge/templates.astro | 17 - src/pages/app/market/seller.astro | 17 - src/pages/app/projects/[projectId].astro | 54 - .../app/projects/[projectId]/agents.astro | 19 - .../[projectId]/agents/[agentSlug].astro | 60 - .../app/projects/[projectId]/agents/new.astro | 47 - .../app/projects/[projectId]/artifacts.astro | 86 - .../app/projects/[projectId]/decisions.astro | 137 -- .../app/projects/[projectId]/delete.astro | 88 - .../app/projects/[projectId]/deploy.astro | 496 ------ .../app/projects/[projectId]/guidance.astro | 149 -- .../app/projects/[projectId]/hosts.astro | 347 ---- .../app/projects/[projectId]/knowledge.astro | 42 - .../[projectId]/knowledge/[...slug].astro | 43 - .../app/projects/[projectId]/settings.astro | 298 ---- .../app/projects/[projectId]/workdays.astro | 32 - .../[projectId]/workdays/[workdayId].astro | 31 - src/pages/app/projects/deployment/[id].astro | 336 ---- src/pages/app/projects/index.astro | 59 - src/pages/app/projects/new.astro | 996 ----------- src/pages/app/services.astro | 30 - src/pages/app/teams/[teamId]/commerce.astro | 119 -- .../teams/[teamId]/commerce/capacity.astro | 82 - .../commerce/capacity/[listingId].astro | 116 -- .../teams/[teamId]/commerce/products.astro | 58 - .../products/[productId]/governance.astro | 247 --- .../app/teams/[teamId]/commerce/sales.astro | 219 --- .../teams/[teamId]/commerce/services.astro | 63 - .../commerce/services/[requestId].astro | 206 --- src/pages/app/teams/index.astro | 4 +- src/pages/app/work.astro | 19 - src/pages/app/work/decisions.astro | 12 - src/pages/app/work/decisions/[slug].astro | 34 - .../app/work/decisions/[slug]/edit.astro | 22 - src/pages/app/work/decisions/new.astro | 21 - src/pages/app/work/notes.astro | 12 - src/pages/app/work/notes/[slug].astro | 23 - src/pages/app/work/notes/[slug]/edit.astro | 22 - src/pages/app/work/notes/new.astro | 21 - src/pages/app/work/objectives.astro | 12 - src/pages/app/work/objectives/[slug].astro | 23 - .../app/work/objectives/[slug]/edit.astro | 22 - src/pages/app/work/objectives/new.astro | 21 - src/pages/app/work/proposals.astro | 12 - src/pages/app/work/proposals/[slug].astro | 23 - .../app/work/proposals/[slug]/edit.astro | 22 - src/pages/app/work/proposals/new.astro | 21 - src/pages/app/work/questions.astro | 64 - src/pages/app/work/questions/[slug].astro | 91 - .../app/work/questions/[slug]/edit.astro | 72 - src/pages/app/work/questions/new.astro | 45 - src/pages/app/work/review.astro | 19 - src/pages/market/index.astro | 26 - src/pages/market/knowledge-packs/[slug].astro | 21 - src/pages/market/knowledge-packs/index.astro | 14 - src/pages/market/templates/[slug].astro | 26 - src/pages/market/templates/index.astro | 14 - src/pages/p/[project].astro | 48 - src/pages/t/[name].astro | 62 +- src/pages/u/[username].astro | 101 +- src/plugin.ts | 2 - src/routes.ts | 136 +- src/view-models/app-access.ts | 183 +- src/view-models/capacity-runtime.vm.ts | 118 -- src/view-models/contextual-dashboard.vm.ts | 396 +--- src/view-models/deployment.vm.ts | 565 ------ src/view-models/ecommerce-governance.vm.ts | 177 -- src/view-models/governance.vm.ts | 59 - src/view-models/infrastructure.vm.ts | 60 - src/view-models/knowledge-content.ts | 26 - src/view-models/knowledge-distribution.vm.ts | 598 ------- src/view-models/knowledge.vm.ts | 82 - src/view-models/operating-loop.vm.ts | 858 --------- src/view-models/private-knowledge.vm.ts | 80 - src/view-models/service-readiness.vm.ts | 317 ---- src/view-models/shared.ts | 157 +- src/view-models/ui-foundation/questions.vm.ts | 514 ------ src/view-models/work-content.ts | 108 -- src/view-models/workday.vm.ts | 91 - test/admin-package.test.ts | 441 +---- 295 files changed, 289 insertions(+), 34648 deletions(-) delete mode 100644 guarantees/capacity/capacity/approve-capacity.guarantee.yaml delete mode 100644 guarantees/capacity/capacity/deploy-capacity.guarantee.yaml delete mode 100644 guarantees/capacity/capacity/monitor-capacity.guarantee.yaml delete mode 100644 guarantees/capacity/capacity/revoke-capacity.guarantee.yaml delete mode 100644 guarantees/capacity/capacity/scenes/approve-capacity.scene.yaml delete mode 100644 guarantees/capacity/capacity/scenes/deploy-capacity.scene.yaml delete mode 100644 guarantees/capacity/capacity/scenes/monitor-capacity.scene.yaml delete mode 100644 guarantees/capacity/capacity/scenes/revoke-capacity.scene.yaml delete mode 100644 guarantees/capacity/capacity/scenes/shut-down-capacity.scene.yaml delete mode 100644 guarantees/capacity/capacity/shut-down-capacity.guarantee.yaml delete mode 100644 guarantees/capacity/registration/rotate-capacity-key.guarantee.yaml delete mode 100644 guarantees/capacity/registration/scenes/rotate-capacity-key.scene.yaml delete mode 100644 guarantees/host/host/create-host.guarantee.yaml delete mode 100644 guarantees/host/host/delete-host.guarantee.yaml delete mode 100644 guarantees/host/host/edit-host.guarantee.yaml delete mode 100644 guarantees/host/host/scenes/create-host.scene.yaml delete mode 100644 guarantees/host/host/scenes/delete-host.scene.yaml delete mode 100644 guarantees/host/host/scenes/edit-host.scene.yaml delete mode 100644 guarantees/host/secrets/create-passphrase.guarantee.yaml delete mode 100644 guarantees/host/secrets/reset-passphrase.guarantee.yaml delete mode 100644 guarantees/host/secrets/scenes/create-passphrase.scene.yaml delete mode 100644 guarantees/host/secrets/scenes/reset-passphrase.scene.yaml delete mode 100644 guarantees/marketplace-seller/fulfillment/record-fulfillment.guarantee.yaml delete mode 100644 guarantees/marketplace-seller/fulfillment/scenes/record-fulfillment.scene.yaml delete mode 100644 guarantees/marketplace-seller/listings/approve-listing.guarantee.yaml delete mode 100644 guarantees/marketplace-seller/listings/create-product-listing.guarantee.yaml delete mode 100644 guarantees/marketplace-seller/listings/manage-listing.guarantee.yaml delete mode 100644 guarantees/marketplace-seller/listings/scenes/approve-listing.scene.yaml delete mode 100644 guarantees/marketplace-seller/listings/scenes/create-product-listing.scene.yaml delete mode 100644 guarantees/marketplace-seller/listings/scenes/manage-listing.scene.yaml delete mode 100644 guarantees/marketplace-seller/listings/scenes/submit-listing-for-review.scene.yaml delete mode 100644 guarantees/marketplace-seller/listings/submit-listing-for-review.guarantee.yaml delete mode 100644 guarantees/marketplace-seller/onboarding/approve-seller.guarantee.yaml delete mode 100644 guarantees/marketplace-seller/onboarding/request-seller-setup.guarantee.yaml delete mode 100644 guarantees/marketplace-seller/onboarding/scenes/approve-seller.scene.yaml delete mode 100644 guarantees/marketplace-seller/onboarding/scenes/request-seller-setup.scene.yaml delete mode 100644 guarantees/marketplace-seller/refunds/issue-refund.guarantee.yaml delete mode 100644 guarantees/marketplace-seller/refunds/scenes/issue-refund.scene.yaml delete mode 100644 guarantees/marketplace-seller/sales/scenes/view-seller-sales.scene.yaml delete mode 100644 guarantees/marketplace-seller/sales/view-seller-sales.guarantee.yaml delete mode 100644 guarantees/project/agent/create-agent.guarantee.yaml delete mode 100644 guarantees/project/agent/delete-agent.guarantee.yaml delete mode 100644 guarantees/project/agent/edit-agent.guarantee.yaml delete mode 100644 guarantees/project/agent/monitor-agent-admin-ui.guarantee.yaml delete mode 100644 guarantees/project/agent/scenes/create-agent.scene.yaml delete mode 100644 guarantees/project/agent/scenes/delete-agent.scene.yaml delete mode 100644 guarantees/project/agent/scenes/edit-agent.scene.yaml delete mode 100644 guarantees/project/agent/scenes/monitor-agent-admin-ui.scene.yaml delete mode 100644 guarantees/project/allocation/allocate-agent-capacity.guarantee.yaml delete mode 100644 guarantees/project/allocation/allocate-project-capacity.guarantee.yaml delete mode 100644 guarantees/project/allocation/scenes/allocate-agent-capacity.scene.yaml delete mode 100644 guarantees/project/allocation/scenes/allocate-project-capacity.scene.yaml delete mode 100644 guarantees/project/book/create-book.guarantee.yaml delete mode 100644 guarantees/project/book/delete-book.guarantee.yaml delete mode 100644 guarantees/project/book/download-book.guarantee.yaml delete mode 100644 guarantees/project/book/edit-book.guarantee.yaml delete mode 100644 guarantees/project/book/scenes/create-book.scene.yaml delete mode 100644 guarantees/project/book/scenes/delete-book.scene.yaml delete mode 100644 guarantees/project/book/scenes/download-book.scene.yaml delete mode 100644 guarantees/project/book/scenes/edit-book.scene.yaml delete mode 100644 guarantees/project/book/scenes/search-books.scene.yaml delete mode 100644 guarantees/project/book/search-books.guarantee.yaml delete mode 100644 guarantees/project/decision/create-note-on-decision.guarantee.yaml delete mode 100644 guarantees/project/decision/scenes/create-note-on-decision.scene.yaml delete mode 100644 guarantees/project/decision/scenes/search-decisions.scene.yaml delete mode 100644 guarantees/project/decision/search-decisions.guarantee.yaml delete mode 100644 guarantees/project/knowledge/create-book-page.guarantee.yaml delete mode 100644 guarantees/project/knowledge/delete-book-page.guarantee.yaml delete mode 100644 guarantees/project/knowledge/edit-book-page.guarantee.yaml delete mode 100644 guarantees/project/knowledge/review-backlinks.guarantee.yaml delete mode 100644 guarantees/project/knowledge/scenes/create-book-page.scene.yaml delete mode 100644 guarantees/project/knowledge/scenes/delete-book-page.scene.yaml delete mode 100644 guarantees/project/knowledge/scenes/edit-book-page.scene.yaml delete mode 100644 guarantees/project/knowledge/scenes/review-backlinks.scene.yaml delete mode 100644 guarantees/project/library/download-library.guarantee.yaml delete mode 100644 guarantees/project/library/rebuild-library-index.guarantee.yaml delete mode 100644 guarantees/project/library/scenes/download-library.scene.yaml delete mode 100644 guarantees/project/library/scenes/rebuild-library-index.scene.yaml delete mode 100644 guarantees/project/objective/create-note-on-objective.guarantee.yaml delete mode 100644 guarantees/project/objective/create-objective.guarantee.yaml delete mode 100644 guarantees/project/objective/delete-objective.guarantee.yaml delete mode 100644 guarantees/project/objective/edit-objective.guarantee.yaml delete mode 100644 guarantees/project/objective/scenes/create-note-on-objective.scene.yaml delete mode 100644 guarantees/project/objective/scenes/create-objective.scene.yaml delete mode 100644 guarantees/project/objective/scenes/delete-objective.scene.yaml delete mode 100644 guarantees/project/objective/scenes/edit-objective.scene.yaml delete mode 100644 guarantees/project/objective/scenes/search-objectives.scene.yaml delete mode 100644 guarantees/project/objective/search-objectives.guarantee.yaml delete mode 100644 guarantees/project/project/create-project.guarantee.yaml delete mode 100644 guarantees/project/project/destroy-project.guarantee.yaml delete mode 100644 guarantees/project/project/edit-project-settings.guarantee.yaml delete mode 100644 guarantees/project/project/monitor-project.guarantee.yaml delete mode 100644 guarantees/project/project/scenes/create-project.scene.yaml delete mode 100644 guarantees/project/project/scenes/destroy-project.scene.yaml delete mode 100644 guarantees/project/project/scenes/edit-project-settings.scene.yaml delete mode 100644 guarantees/project/project/scenes/monitor-project.scene.yaml delete mode 100644 guarantees/project/project/scenes/view-project-profile.scene.yaml delete mode 100644 guarantees/project/project/view-project-profile.guarantee.yaml delete mode 100644 guarantees/project/proposal/create-note-on-proposal.guarantee.yaml delete mode 100644 guarantees/project/proposal/create-proposal.guarantee.yaml delete mode 100644 guarantees/project/proposal/delete-proposal.guarantee.yaml delete mode 100644 guarantees/project/proposal/edit-proposal.guarantee.yaml delete mode 100644 guarantees/project/proposal/proposal-inbox.guarantee.yaml delete mode 100644 guarantees/project/proposal/scenes/create-note-on-proposal.scene.yaml delete mode 100644 guarantees/project/proposal/scenes/create-proposal.scene.yaml delete mode 100644 guarantees/project/proposal/scenes/delete-proposal.scene.yaml delete mode 100644 guarantees/project/proposal/scenes/edit-proposal.scene.yaml delete mode 100644 guarantees/project/proposal/scenes/proposal-inbox.scene.yaml delete mode 100644 guarantees/project/proposal/scenes/search-proposals.scene.yaml delete mode 100644 guarantees/project/proposal/scenes/vote-on-proposal.scene.yaml delete mode 100644 guarantees/project/proposal/search-proposals.guarantee.yaml delete mode 100644 guarantees/project/proposal/vote-on-proposal.guarantee.yaml delete mode 100644 guarantees/project/question/answer-question.guarantee.yaml delete mode 100644 guarantees/project/question/ask-question.guarantee.yaml delete mode 100644 guarantees/project/question/delete-question.guarantee.yaml delete mode 100644 guarantees/project/question/edit-question.guarantee.yaml delete mode 100644 guarantees/project/question/scenes/answer-question.scene.yaml delete mode 100644 guarantees/project/question/scenes/ask-question.scene.yaml delete mode 100644 guarantees/project/question/scenes/delete-question.scene.yaml delete mode 100644 guarantees/project/question/scenes/edit-question.scene.yaml delete mode 100644 guarantees/project/question/scenes/search-questions-answers.scene.yaml delete mode 100644 guarantees/project/question/search-questions-answers.guarantee.yaml delete mode 100644 guarantees/team/audit/scenes/view-team-audit-log.scene.yaml delete mode 100644 guarantees/team/audit/view-team-audit-log.guarantee.yaml delete mode 100644 guarantees/team/policy/manage-allocation-sets.guarantee.yaml delete mode 100644 guarantees/team/policy/scenes/manage-allocation-sets.scene.yaml delete mode 100644 guarantees/user/account/manage-api-tokens.guarantee.yaml delete mode 100644 guarantees/user/account/manage-notifications.guarantee.yaml delete mode 100644 guarantees/user/account/scenes/manage-api-tokens.scene.yaml delete mode 100644 guarantees/user/account/scenes/manage-notifications.scene.yaml delete mode 100644 guarantees/workday/workday/analyze-workday.guarantee.yaml delete mode 100644 guarantees/workday/workday/monitor-workdays.guarantee.yaml delete mode 100644 guarantees/workday/workday/scenes/analyze-workday.scene.yaml delete mode 100644 guarantees/workday/workday/scenes/monitor-workdays.scene.yaml delete mode 100644 guarantees/workday/workday/scenes/schedule-workdays.scene.yaml delete mode 100644 guarantees/workday/workday/schedule-workdays.guarantee.yaml delete mode 100644 src/capabilities/questions.ts delete mode 100644 src/components/work/DirectionContentForm.astro delete mode 100644 src/components/work/QuestionForm.astro delete mode 100644 src/layouts/TreeseedOperationalMarketLayout.astro delete mode 100644 src/lib/host-crypto.ts delete mode 100644 src/lib/knowledge-distribution/publish-client.ts delete mode 100644 src/lib/market/admin-form-client.ts delete mode 100644 src/lib/market/catalog.ts delete mode 100644 src/lib/market/content-form-help.ts delete mode 100644 src/lib/market/content-relations.ts delete mode 100644 src/lib/market/deployment-actions.ts delete mode 100644 src/lib/market/deployment-errors.ts delete mode 100644 src/lib/market/deployment-governance.ts delete mode 100644 src/lib/market/deployment-projection.ts delete mode 100644 src/lib/market/deployment-readiness.ts delete mode 100644 src/lib/market/governance-projection.ts delete mode 100644 src/lib/market/host-credential-form-client.ts delete mode 100644 src/lib/market/infrastructure-projection.ts delete mode 100644 src/lib/market/infrastructure-seeds.ts delete mode 100644 src/lib/market/knowledge-projection.ts delete mode 100644 src/lib/market/managed-hosts.ts delete mode 100644 src/lib/market/operating-loop-client.ts delete mode 100644 src/lib/market/operational-artifacts.ts delete mode 100644 src/lib/market/seeds/apply.ts delete mode 100644 src/lib/market/seeds/local-api.ts delete mode 100644 src/lib/market/workday-projection.ts delete mode 100644 src/pages/api/markdown/preview.ts delete mode 100644 src/pages/app/capacity/allocation.astro delete mode 100644 src/pages/app/capacity/allocation/projects/[projectId].astro delete mode 100644 src/pages/app/capacity/allocation/projects/[projectId]/agents/[agentSlug].astro delete mode 100644 src/pages/app/capacity/allocation/projects/[projectId]/modes/[modeId].astro delete mode 100644 src/pages/app/capacity/index.astro delete mode 100644 src/pages/app/capacity/providers/[providerId].astro delete mode 100644 src/pages/app/capacity/providers/[providerId]/keys.astro delete mode 100644 src/pages/app/capacity/providers/[providerId]/settings.astro delete mode 100644 src/pages/app/capacity/providers/index.astro delete mode 100644 src/pages/app/capacity/providers/new.astro delete mode 100644 src/pages/app/capacity/runtime.astro delete mode 100644 src/pages/app/capacity/workday-runs/[runId].astro delete mode 100644 src/pages/app/capacity/workday-runs/index.astro delete mode 100644 src/pages/app/commons/index.astro delete mode 100644 src/pages/app/commons/participants.astro delete mode 100644 src/pages/app/commons/proposals/[proposalId].astro delete mode 100644 src/pages/app/hosts/[hostType]/[hostId].astro delete mode 100644 src/pages/app/hosts/[hostType]/[hostId]/settings.astro delete mode 100644 src/pages/app/hosts/[hostType]/new.astro delete mode 100644 src/pages/app/hosts/index.astro delete mode 100644 src/pages/app/hosts/knowledge-library.astro delete mode 100644 src/pages/app/hosts/new.astro delete mode 100644 src/pages/app/knowledge.astro delete mode 100644 src/pages/app/knowledge/[category]/[slug].astro delete mode 100644 src/pages/app/knowledge/artifacts.astro delete mode 100644 src/pages/app/knowledge/books.astro delete mode 100644 src/pages/app/knowledge/books/[slug].astro delete mode 100644 src/pages/app/knowledge/capabilities.astro delete mode 100644 src/pages/app/knowledge/capabilities/[slug].astro delete mode 100644 src/pages/app/knowledge/imports.astro delete mode 100644 src/pages/app/knowledge/imports/[slug].astro delete mode 100644 src/pages/app/knowledge/packs.astro delete mode 100644 src/pages/app/knowledge/publish.astro delete mode 100644 src/pages/app/knowledge/releases.astro delete mode 100644 src/pages/app/knowledge/releases/[releaseId].astro delete mode 100644 src/pages/app/knowledge/releases/[releaseId]/review.astro delete mode 100644 src/pages/app/knowledge/templates.astro delete mode 100644 src/pages/app/market/seller.astro delete mode 100644 src/pages/app/projects/[projectId].astro delete mode 100644 src/pages/app/projects/[projectId]/agents.astro delete mode 100644 src/pages/app/projects/[projectId]/agents/[agentSlug].astro delete mode 100644 src/pages/app/projects/[projectId]/agents/new.astro delete mode 100644 src/pages/app/projects/[projectId]/artifacts.astro delete mode 100644 src/pages/app/projects/[projectId]/decisions.astro delete mode 100644 src/pages/app/projects/[projectId]/delete.astro delete mode 100644 src/pages/app/projects/[projectId]/deploy.astro delete mode 100644 src/pages/app/projects/[projectId]/guidance.astro delete mode 100644 src/pages/app/projects/[projectId]/hosts.astro delete mode 100644 src/pages/app/projects/[projectId]/knowledge.astro delete mode 100644 src/pages/app/projects/[projectId]/knowledge/[...slug].astro delete mode 100644 src/pages/app/projects/[projectId]/settings.astro delete mode 100644 src/pages/app/projects/[projectId]/workdays.astro delete mode 100644 src/pages/app/projects/[projectId]/workdays/[workdayId].astro delete mode 100644 src/pages/app/projects/deployment/[id].astro delete mode 100644 src/pages/app/projects/index.astro delete mode 100644 src/pages/app/projects/new.astro delete mode 100644 src/pages/app/services.astro delete mode 100644 src/pages/app/teams/[teamId]/commerce.astro delete mode 100644 src/pages/app/teams/[teamId]/commerce/capacity.astro delete mode 100644 src/pages/app/teams/[teamId]/commerce/capacity/[listingId].astro delete mode 100644 src/pages/app/teams/[teamId]/commerce/products.astro delete mode 100644 src/pages/app/teams/[teamId]/commerce/products/[productId]/governance.astro delete mode 100644 src/pages/app/teams/[teamId]/commerce/sales.astro delete mode 100644 src/pages/app/teams/[teamId]/commerce/services.astro delete mode 100644 src/pages/app/teams/[teamId]/commerce/services/[requestId].astro delete mode 100644 src/pages/app/work.astro delete mode 100644 src/pages/app/work/decisions.astro delete mode 100644 src/pages/app/work/decisions/[slug].astro delete mode 100644 src/pages/app/work/decisions/[slug]/edit.astro delete mode 100644 src/pages/app/work/decisions/new.astro delete mode 100644 src/pages/app/work/notes.astro delete mode 100644 src/pages/app/work/notes/[slug].astro delete mode 100644 src/pages/app/work/notes/[slug]/edit.astro delete mode 100644 src/pages/app/work/notes/new.astro delete mode 100644 src/pages/app/work/objectives.astro delete mode 100644 src/pages/app/work/objectives/[slug].astro delete mode 100644 src/pages/app/work/objectives/[slug]/edit.astro delete mode 100644 src/pages/app/work/objectives/new.astro delete mode 100644 src/pages/app/work/proposals.astro delete mode 100644 src/pages/app/work/proposals/[slug].astro delete mode 100644 src/pages/app/work/proposals/[slug]/edit.astro delete mode 100644 src/pages/app/work/proposals/new.astro delete mode 100644 src/pages/app/work/questions.astro delete mode 100644 src/pages/app/work/questions/[slug].astro delete mode 100644 src/pages/app/work/questions/[slug]/edit.astro delete mode 100644 src/pages/app/work/questions/new.astro delete mode 100644 src/pages/app/work/review.astro delete mode 100644 src/pages/market/index.astro delete mode 100644 src/pages/market/knowledge-packs/[slug].astro delete mode 100644 src/pages/market/knowledge-packs/index.astro delete mode 100644 src/pages/market/templates/[slug].astro delete mode 100644 src/pages/market/templates/index.astro delete mode 100644 src/pages/p/[project].astro delete mode 100644 src/view-models/capacity-runtime.vm.ts delete mode 100644 src/view-models/deployment.vm.ts delete mode 100644 src/view-models/ecommerce-governance.vm.ts delete mode 100644 src/view-models/governance.vm.ts delete mode 100644 src/view-models/infrastructure.vm.ts delete mode 100644 src/view-models/knowledge-content.ts delete mode 100644 src/view-models/knowledge-distribution.vm.ts delete mode 100644 src/view-models/knowledge.vm.ts delete mode 100644 src/view-models/operating-loop.vm.ts delete mode 100644 src/view-models/private-knowledge.vm.ts delete mode 100644 src/view-models/service-readiness.vm.ts delete mode 100644 src/view-models/ui-foundation/questions.vm.ts delete mode 100644 src/view-models/work-content.ts delete mode 100644 src/view-models/workday.vm.ts diff --git a/README.md b/README.md index 7b70b3db..f726852d 100644 --- a/README.md +++ b/README.md @@ -1,143 +1,34 @@ # @treeseed/admin -`@treeseed/admin` is the distributable Treeseed administration portal for organizations. It gives a Treeseed site the authenticated admin surfaces for teams, projects, hosts, work, knowledge, catalog browsing, operational status, and secret-manager workflows. +`@treeseed/admin` is the distributable AGPLv3 identity and team administration layer for Treeseed sites. During preparation for the comprehensive UI redesign, its rendered surface is intentionally limited to authentication, account management, team management, active-team selection, invitations, and public user/team identity profiles. -Use this package when you want a Treeseed-compatible admin portal without taking on the Treeseed market site's public messaging, buyer checkout, or backend ecommerce implementation. +The removed pre-redesign surface is archived in the root [legacy route inventory](../../docs/legacy-routes.md). The redesign direction is described in [ui-redesign.md](../../docs/ui-redesign.md). -## What You Can Build With Admin - -- Internal administration portals for teams and projects -- Host and credential management surfaces -- Knowledge and work management screens -- Operational status and deployment control surfaces -- Agent capacity allocation, provider session, assignment, mode-run, and usage views over API contracts -- Catalog/profile browsing and seller commerce operations without buyer payment processing -- Seller readiness, ecommerce monitoring, product governance, scoped-service operations, capacity listing review, and Commons steward operations through API facades -- Admin integrations that can be layered into a host Treeseed site - -Admin is not a UI component library. Reusable layout-down components and styles live in `@treeseed/ui`. - -## Install +## Install and compose ```bash npm install @treeseed/admin @treeseed/core @treeseed/ui @treeseed/sdk ``` -The host application owns deployment and site configuration. In this workspace, the root `@treeseed/market` app is that host. - -## Use In A Treeseed Site - -Add the admin plugin to the host site's `treeseed.site.yaml`: - -```yaml -plugins: - - package: "@treeseed/core/plugin-default" - - package: "@treeseed/admin/plugin" -``` - -Use the admin Astro config helper from the host app: - -```ts -import { defineTreeseedAdminConfig } from '@treeseed/admin/config'; - -export default defineTreeseedAdminConfig(); -``` - -Delegate middleware from the host app: - -```ts -export { onRequest } from '@treeseed/admin/middleware'; -``` - -## Required Host App Setup - -The host app must provide: - -- a host-owned `treeseed.site.yaml` when the app owns a deployable runtime surface -- tenant config and environment values -- public content and page overrides -- deployment target and hosting workflow -- API base URL or `/v1/*` proxy path -- any tenant-specific branding or marketplace policy - -`@treeseed/admin` does not ship a package-local `treeseed.site.yaml` and does not own hosting. The root Market app owns the Treeseed web tenant in this workspace; other packages may own package-local manifests only when they operate independently released runtime surfaces. - -## Routes And Capabilities - -Admin contributes route metadata through: - -```ts -import { ADMIN_ROUTES } from '@treeseed/admin/routes'; -``` - -The route set includes admin application pages, auth pages, team invite acceptance, API proxy route metadata, and generic catalog/profile browsing surfaces. Host apps can override Astro pages through their normal Treeseed page override mechanism. - -Admin route composition follows the current TreeSeed shell model: - -- `/app/**` pages use `TreeseedAppLayout`, which composes the UI shell primitives for authenticated app work. -- `/market/**` acquisition/catalog pages use `TreeseedOperationalMarketLayout`, the authenticated operational market shell. -- `/auth/**` pages use UI `AuthShell`. -- `/u/**`, `/t/**`, `/p/**`, and invite acceptance pages use public/auth-appropriate layouts and must not show app team operations. - -`ProductShell` and `PublicShell` are compatibility wrappers in `@treeseed/ui`; Admin pages should use the package layouts above rather than importing those wrappers directly. +Add `@treeseed/admin/plugin` to the host `treeseed.site.yaml`, use the config helper from `@treeseed/admin/config`, and delegate host middleware to `@treeseed/admin/middleware`. Admin does not own a hostable site manifest; the host app owns deployment and environment configuration. -## Auth And Sessions +## Current route surface -Admin owns reusable browser auth/session flow, callback handling, account/profile UX integration, and middleware composition. Backend service trust, persistent auth storage, and service credential validation belong in `@treeseed/api`. +- `/app` and `/app/account` +- `/app/teams`, team creation, edit, delete, membership, and active-team selection +- registration, verification, sign-in/out, recovery, OAuth callback, username, and device approval +- `/u/[username]` and `/t/[name]` identity-only public profiles +- invitation acceptance and the shared `/v1/[...all]` API facade -Host apps provide deployment-specific secrets and provider settings through their environment registry and secret manager. +`ADMIN_ROUTES` is exported from `@treeseed/admin/routes` and is tested against the package page tree. There are no project, capacity, host, work, knowledge, catalog, seller, commerce, or Markdown-preview routes and no compatibility redirects for them. -## API Connection +## Preserved non-UI contracts -Admin reaches backend behavior through API client facades and HTTP/proxy surfaces. It must not import backend implementation from `@treeseed/api`. +The generic API facade, auth/session integration, middleware, commerce extension contract, and secret-manager contracts remain exported so backend capabilities and future redesign work keep their package boundaries. Admin does not import backend implementation from `@treeseed/api`; runtime behavior stays behind HTTP/proxy surfaces. -In the root market app, `/v1/*` is the web proxy to the API service hosted from `packages/api`. +Reusable components and styles remain owned by `@treeseed/ui` and were not removed as part of this cleanup. React and email dependencies remain because authentication email flows require them. -## Secret Manager Support - -Admin owns the user-facing secret-manager experience: - -- provider selection -- host credential forms -- unlock/passphrase UX -- linked manager status -- diagnostics views - -The public contract is exported from: - -```ts -import type { TreeseedSecretManagerProvider } from '@treeseed/admin/secret-managers'; -``` - -Provider mutation, secure read/write adapters, import/adopt/reconcile behavior, and target-specific sync belong in SDK/API primitives. - -## Agent Capacity Surfaces - -Admin may expose allocation-set editing, project/agent-class capacity views, planning/acting splits, provider registration, provider availability sessions, assignment status, mode-run timelines, usage summaries, and blocker diagnostics. - -The current capacity operator surfaces are: - -- `/app/capacity/allocation` for portfolio and project agent-class allocation. -- `/app/capacity/providers` for provider registration, native capacity, grants, and lifecycle overview. -- `/app/capacity/runtime` for read-only allocation-set versions, project agent classes, provider sessions, accepted capacity plans, synthesized or explicit assignments, assignment source/explanation metadata, and mode-run telemetry. The API facade also exposes decision readiness, execution inputs, capacity plans, and workday settlement summaries for focused operator drill-downs. - -Admin does not own scheduling, assignment selection, provider runtime internals, or ledger settlement. Those belong to API, agent runtime, and SDK contracts as described in the root [Agent Capacity Operator Surfaces](../../docs/agent-capacity-operator-surfaces.md) guide. - -## Commerce Operations Without Buyer Checkout - -Admin can display and operate seller-side commerce records through API client facades: vendor readiness, product registry state, offer/price review, sales summaries, refunds, fulfillment, cooperative ownership workflows, scoped service requests, capacity listing inquiries, seller monitoring, and Commons steward decisions. - -The extension contract is exported from: - -```ts -import type { AdminCommerceProvider } from '@treeseed/admin/commerce'; -``` - -Admin does not implement Stripe Elements, checkout confirmation, Stripe Checkout Sessions, PaymentIntent creation, webhooks, invoices, buyer subscriptions UI, seller payouts, commissions, application fees, revenue splits, benefit payout allocation, capacity billing, provider execution, marketplace grants/reservations, or routing decisions. Authenticated operational buyer checkout and participant marketplace flows belong in the root market app. Backend state and Stripe server calls belong in `@treeseed/api`. - -## Extension Points - -Public exports include: +## Public exports - `@treeseed/admin` - `@treeseed/admin/config` @@ -149,36 +40,14 @@ Public exports include: - `@treeseed/admin/secret-managers` - `@treeseed/admin/lib/*` - `@treeseed/admin/view-models/*` +- retained app/public layouts -Use package exports only. Do not import from `packages/admin/src` in host applications. - -## What Admin Does Not Own - -- reusable UI primitives or CSS tokens; use `@treeseed/ui` -- generic Astro/Starlight runtime; use `@treeseed/core` -- backend API implementation, PostgreSQL, migrations, or operations runner; use `@treeseed/api` -- capacity provider runtime; use `@treeseed/agent` -- buyer checkout, Stripe Elements, payout/commission logic, capacity execution, or backend ecommerce policy; use root market for authenticated operational marketplace/cart/checkout/service/capacity/Commons surfaces and `@treeseed/api` for backend state -- TreeDX repository service internals -- host app deployment manifest - -## Verification And Release - -Package commands: +## Verification and release ```bash -npm install -npm run build -npm run verify:local +npm run check +npm test npm run release:verify ``` -Release integration: - -- `treeseed.package.yaml` declares the package repository and release gate. -- `deploy.yml` is the hosted release gate workflow. -- `publish.yml` publishes semver tags to npm. -- GitHub repository credential: `TREESEED_GITHUB_TOKEN_TREESEED_AI_ADMIN`. -- GitHub `production` environment secret: `NPM_TOKEN`. - -See the root [Package Ownership](../../docs/package-ownership.md) guide for cross-package boundaries. +`verify.yml`, the manual `release-gate.yml`, and `publish.yml` remain package-owned. Hosted deployment is suspended; the package must not contain a push-triggered `deploy.yml`. diff --git a/guarantees/capacity/capacity/approve-capacity.guarantee.yaml b/guarantees/capacity/capacity/approve-capacity.guarantee.yaml deleted file mode 100644 index a433fa07..00000000 --- a/guarantees/capacity/capacity/approve-capacity.guarantee.yaml +++ /dev/null @@ -1,75 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.capacity.capacity.approve-capacity.027 -journeyIndex: 27 -type: capacity -subtype: capacity -journey: Approve Capacity -ownerPackage: "@treeseed/admin" -summary: Approve provider availability or registration for team/project use; API owns durable availability sessions and policy decisions. -status: active -dependencies: - journeys: - - 4 - guarantees: - - guarantee.user.auth.user-login.004 -actors: - allowed: - - capacity_operator - - team_owner - - platform_operator - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - desktop_firefox - - tablet_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 4" -scene: - required: true - manifest: ./scenes/approve-capacity.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/capacity - componentContract: record-action service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.capacity.capacity.approve-capacity.api -content: - required: false - verifierRefs: - - admin.capacity.capacity.approve-capacity.content -audit: - required: true - verifierRefs: - - admin.capacity.capacity.approve-capacity.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.capacity.capacity.approve-capacity.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Approve provider availability or registration for team/project use; API owns durable availability sessions and policy decisions. diff --git a/guarantees/capacity/capacity/deploy-capacity.guarantee.yaml b/guarantees/capacity/capacity/deploy-capacity.guarantee.yaml deleted file mode 100644 index f94b6f37..00000000 --- a/guarantees/capacity/capacity/deploy-capacity.guarantee.yaml +++ /dev/null @@ -1,75 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.capacity.capacity.deploy-capacity.028 -journeyIndex: 28 -type: capacity -subtype: capacity -journey: Deploy Capacity -ownerPackage: "@treeseed/admin" -summary: Start or reconcile provider runtime through the agent package lifecycle and trsd capacity commands; UI should trigger desired-state operations not bespoke deployment scripts. -status: active -dependencies: - journeys: - - 4 - guarantees: - - guarantee.user.auth.user-login.004 -actors: - allowed: - - capacity_operator - - team_owner - - platform_operator - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - desktop_firefox - - tablet_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 4" -scene: - required: true - manifest: ./scenes/deploy-capacity.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/capacity/runtime - componentContract: full-page-form service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.capacity.capacity.deploy-capacity.api -content: - required: false - verifierRefs: - - admin.capacity.capacity.deploy-capacity.content -audit: - required: true - verifierRefs: - - admin.capacity.capacity.deploy-capacity.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.capacity.capacity.deploy-capacity.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Start or reconcile provider runtime through the agent package lifecycle and trsd capacity commands; UI should trigger desired-state operations not bespoke deployment scripts. diff --git a/guarantees/capacity/capacity/monitor-capacity.guarantee.yaml b/guarantees/capacity/capacity/monitor-capacity.guarantee.yaml deleted file mode 100644 index 043e51f6..00000000 --- a/guarantees/capacity/capacity/monitor-capacity.guarantee.yaml +++ /dev/null @@ -1,77 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.capacity.capacity.monitor-capacity.029 -journeyIndex: 29 -type: capacity -subtype: capacity -journey: Monitor Capacity -ownerPackage: "@treeseed/admin" -summary: Show provider manager runner availability leases usage and diagnostics; data should come from API control-plane records and provider check-ins. -status: active -dependencies: - journeys: - - 27 - - 28 - guarantees: - - guarantee.capacity.capacity.approve-capacity.027 - - guarantee.capacity.capacity.deploy-capacity.028 -actors: - allowed: - - capacity_operator - - team_owner - - platform_operator - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - desktop_firefox - - tablet_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 27, 28" -scene: - required: true - manifest: ./scenes/monitor-capacity.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/capacity/runtime - componentContract: dashboard/read-model service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.capacity.capacity.monitor-capacity.api -content: - required: false - verifierRefs: - - admin.capacity.capacity.monitor-capacity.content -audit: - required: true - verifierRefs: - - admin.capacity.capacity.monitor-capacity.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.capacity.capacity.monitor-capacity.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Show provider manager runner availability leases usage and diagnostics; data should come from API control-plane records and provider check-ins. diff --git a/guarantees/capacity/capacity/revoke-capacity.guarantee.yaml b/guarantees/capacity/capacity/revoke-capacity.guarantee.yaml deleted file mode 100644 index 8a803fd4..00000000 --- a/guarantees/capacity/capacity/revoke-capacity.guarantee.yaml +++ /dev/null @@ -1,77 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.capacity.capacity.revoke-capacity.031 -journeyIndex: 31 -type: capacity -subtype: capacity -journey: Revoke Capacity -ownerPackage: "@treeseed/admin" -summary: Revoke provider eligibility or keys and return active leases safely; must coordinate with API assignment and settlement records. -status: active -dependencies: - journeys: - - 27 - - 28 - guarantees: - - guarantee.capacity.capacity.approve-capacity.027 - - guarantee.capacity.capacity.deploy-capacity.028 -actors: - allowed: - - capacity_operator - - team_owner - - platform_operator - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - desktop_firefox - - tablet_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 27, 28" -scene: - required: true - manifest: ./scenes/revoke-capacity.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/capacity/runtime - componentContract: record-action service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.capacity.capacity.revoke-capacity.api -content: - required: false - verifierRefs: - - admin.capacity.capacity.revoke-capacity.content -audit: - required: true - verifierRefs: - - admin.capacity.capacity.revoke-capacity.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.capacity.capacity.revoke-capacity.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Revoke provider eligibility or keys and return active leases safely; must coordinate with API assignment and settlement records. diff --git a/guarantees/capacity/capacity/scenes/approve-capacity.scene.yaml b/guarantees/capacity/capacity/scenes/approve-capacity.scene.yaml deleted file mode 100644 index 0d5d9339..00000000 --- a/guarantees/capacity/capacity/scenes/approve-capacity.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: capacity.capacity.approve-capacity.027 -title: Approve Capacity -description: Scene scaffold for guarantee.capacity.capacity.approve-capacity.027. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Approve Capacity opens the canonical @treeseed/admin record action workflow. - - Approve Capacity exercises a service journey instead of only loading /app/capacity. - - Approve Capacity records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: capacity-provider.primary - kind: capacity-provider -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Approve Capacity - action: - goto: /app/capacity - expect: - urlIncludes: /app/capacity - - id: inspect-service-surface - title: Inspect Approve Capacity service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/capacity -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/capacity/capacity/scenes/deploy-capacity.scene.yaml b/guarantees/capacity/capacity/scenes/deploy-capacity.scene.yaml deleted file mode 100644 index 736cea64..00000000 --- a/guarantees/capacity/capacity/scenes/deploy-capacity.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: capacity.capacity.deploy-capacity.028 -title: Deploy Capacity -description: Scene scaffold for guarantee.capacity.capacity.deploy-capacity.028. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Deploy Capacity opens the canonical @treeseed/admin record action workflow. - - Deploy Capacity exercises a service journey instead of only loading /app/capacity/runtime. - - Deploy Capacity records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: capacity-provider.primary - kind: capacity-provider -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Deploy Capacity - action: - goto: /app/capacity/runtime - expect: - urlIncludes: /app/capacity - - id: inspect-service-surface - title: Inspect Deploy Capacity service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/capacity -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/capacity/capacity/scenes/monitor-capacity.scene.yaml b/guarantees/capacity/capacity/scenes/monitor-capacity.scene.yaml deleted file mode 100644 index d0a4fc38..00000000 --- a/guarantees/capacity/capacity/scenes/monitor-capacity.scene.yaml +++ /dev/null @@ -1,121 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: capacity.capacity.monitor-capacity.029 -title: Monitor Capacity -description: Scene scaffold for guarantee.capacity.capacity.monitor-capacity.029. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Monitor Capacity opens the canonical @treeseed/admin record operations workflow. - - Monitor Capacity exercises a service journey instead of only loading /app/capacity/runtime. - - Monitor Capacity records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: capacity-provider.primary - kind: capacity-provider -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - auth: - required: true - role: owner - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Monitor Capacity - action: - goto: /app/capacity/runtime - expect: - urlIncludes: /app/capacity - - id: inspect-service-surface - title: Inspect Monitor Capacity service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/capacity -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/capacity/capacity/scenes/revoke-capacity.scene.yaml b/guarantees/capacity/capacity/scenes/revoke-capacity.scene.yaml deleted file mode 100644 index 3d4b2e4a..00000000 --- a/guarantees/capacity/capacity/scenes/revoke-capacity.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: capacity.capacity.revoke-capacity.031 -title: Revoke Capacity -description: Scene scaffold for guarantee.capacity.capacity.revoke-capacity.031. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Revoke Capacity opens the canonical @treeseed/admin destructive confirmation workflow. - - Revoke Capacity exercises a service journey instead of only loading /app/capacity/runtime. - - Revoke Capacity records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: capacity-provider.primary - kind: capacity-provider -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Revoke Capacity - action: - goto: /app/capacity/runtime - expect: - urlIncludes: /app/capacity - - id: inspect-service-surface - title: Inspect Revoke Capacity service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/capacity -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/capacity/capacity/scenes/shut-down-capacity.scene.yaml b/guarantees/capacity/capacity/scenes/shut-down-capacity.scene.yaml deleted file mode 100644 index 8aa9f796..00000000 --- a/guarantees/capacity/capacity/scenes/shut-down-capacity.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: capacity.capacity.shut-down-capacity.030 -title: Shut Down Capacity -description: Scene scaffold for guarantee.capacity.capacity.shut-down-capacity.030. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Shut Down Capacity opens the canonical @treeseed/admin record operations workflow. - - Shut Down Capacity exercises a service journey instead of only loading /app/capacity/runtime. - - Shut Down Capacity records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: capacity-provider.primary - kind: capacity-provider -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Shut Down Capacity - action: - goto: /app/capacity/runtime - expect: - urlIncludes: /app/capacity - - id: inspect-service-surface - title: Inspect Shut Down Capacity service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/capacity -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/capacity/capacity/shut-down-capacity.guarantee.yaml b/guarantees/capacity/capacity/shut-down-capacity.guarantee.yaml deleted file mode 100644 index fd05b300..00000000 --- a/guarantees/capacity/capacity/shut-down-capacity.guarantee.yaml +++ /dev/null @@ -1,75 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.capacity.capacity.shut-down-capacity.030 -journeyIndex: 30 -type: capacity -subtype: capacity -journey: Shut Down Capacity -ownerPackage: "@treeseed/admin" -summary: Stop provider runtime through reconciliation while preserving volumes logs and state as required; should not manually kill provider resources. -status: active -dependencies: - journeys: - - 28 - guarantees: - - guarantee.capacity.capacity.deploy-capacity.028 -actors: - allowed: - - capacity_operator - - team_owner - - platform_operator - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - desktop_firefox - - tablet_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 28" -scene: - required: true - manifest: ./scenes/shut-down-capacity.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/capacity/runtime - componentContract: destructive-confirmation service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.capacity.capacity.shut-down-capacity.api -content: - required: false - verifierRefs: - - admin.capacity.capacity.shut-down-capacity.content -audit: - required: true - verifierRefs: - - admin.capacity.capacity.shut-down-capacity.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.capacity.capacity.shut-down-capacity.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Stop provider runtime through reconciliation while preserving volumes logs and state as required; should not manually kill provider resources. diff --git a/guarantees/capacity/registration/rotate-capacity-key.guarantee.yaml b/guarantees/capacity/registration/rotate-capacity-key.guarantee.yaml deleted file mode 100644 index bb54713d..00000000 --- a/guarantees/capacity/registration/rotate-capacity-key.guarantee.yaml +++ /dev/null @@ -1,75 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.capacity.registration.rotate-capacity-key.026 -journeyIndex: 26 -type: capacity -subtype: registration -journey: Rotate Capacity Key -ownerPackage: "@treeseed/admin" -summary: Rotate provider API keys used by capacity providers; the API should issue and track keys without exposing raw credentials in the UI. -status: active -dependencies: - journeys: - - 4 - guarantees: - - guarantee.user.auth.user-login.004 -actors: - allowed: - - capacity_operator - - team_owner - - platform_operator - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - desktop_firefox - - tablet_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 4" -scene: - required: true - manifest: ./scenes/rotate-capacity-key.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/capacity/providers/seed-provider/keys - componentContract: inline-form/search-panel service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.capacity.registration.rotate-capacity-key.api -content: - required: false - verifierRefs: - - admin.capacity.registration.rotate-capacity-key.content -audit: - required: true - verifierRefs: - - admin.capacity.registration.rotate-capacity-key.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.capacity.registration.rotate-capacity-key.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Rotate provider API keys used by capacity providers; the API should issue and track keys without exposing raw credentials in the UI. diff --git a/guarantees/capacity/registration/scenes/rotate-capacity-key.scene.yaml b/guarantees/capacity/registration/scenes/rotate-capacity-key.scene.yaml deleted file mode 100644 index 2e17d3cc..00000000 --- a/guarantees/capacity/registration/scenes/rotate-capacity-key.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: capacity.registration.rotate-capacity-key.026 -title: Rotate Capacity Key -description: Scene scaffold for guarantee.capacity.registration.rotate-capacity-key.026. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Rotate Capacity Key opens the canonical @treeseed/admin record operations workflow. - - Rotate Capacity Key exercises a service journey instead of only loading /app/capacity/providers/seed-provider/keys. - - Rotate Capacity Key records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: capacity-provider.primary - kind: capacity-provider -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Rotate Capacity Key - action: - goto: /app/capacity/providers/seed-provider/keys - expect: - urlIncludes: /app/capacity - - id: inspect-service-surface - title: Inspect Rotate Capacity Key service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/capacity -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/host/host/create-host.guarantee.yaml b/guarantees/host/host/create-host.guarantee.yaml deleted file mode 100644 index 63d773ad..00000000 --- a/guarantees/host/host/create-host.guarantee.yaml +++ /dev/null @@ -1,75 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.host.host.create-host.023 -journeyIndex: 23 -type: host -subtype: host -journey: Create Host -ownerPackage: "@treeseed/admin" -summary: Register a hostable environment or provider target as desired state; creation should compile reconciliation resources instead of calling providers directly. -status: active -dependencies: - journeys: - - 4 - guarantees: - - guarantee.user.auth.user-login.004 -actors: - allowed: - - host_operator - - team_owner - - platform_operator - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - desktop_firefox - - tablet_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 4" -scene: - required: true - manifest: ./scenes/create-host.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/hosts/new - componentContract: full-page-form service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.host.host.create-host.api -content: - required: false - verifierRefs: - - admin.host.host.create-host.content -audit: - required: true - verifierRefs: - - admin.host.host.create-host.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.host.host.create-host.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Register a hostable environment or provider target as desired state; creation should compile reconciliation resources instead of calling providers directly. diff --git a/guarantees/host/host/delete-host.guarantee.yaml b/guarantees/host/host/delete-host.guarantee.yaml deleted file mode 100644 index 2d9a4f0c..00000000 --- a/guarantees/host/host/delete-host.guarantee.yaml +++ /dev/null @@ -1,75 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.host.host.delete-host.025 -journeyIndex: 25 -type: host -subtype: host -journey: Delete Host -ownerPackage: "@treeseed/admin" -summary: Plan destroy or retention for owned resources using reconciliation lifecycle; direct provider deletion would violate the architecture. -status: active -dependencies: - journeys: - - 23 - guarantees: - - guarantee.host.host.create-host.023 -actors: - allowed: - - host_operator - - team_owner - - platform_operator - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - desktop_firefox - - tablet_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 23" -scene: - required: true - manifest: ./scenes/delete-host.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/hosts/web/seed-host - componentContract: destructive-confirmation service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.host.host.delete-host.api -content: - required: false - verifierRefs: - - admin.host.host.delete-host.content -audit: - required: true - verifierRefs: - - admin.host.host.delete-host.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.host.host.delete-host.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Plan destroy or retention for owned resources using reconciliation lifecycle; direct provider deletion would violate the architecture. diff --git a/guarantees/host/host/edit-host.guarantee.yaml b/guarantees/host/host/edit-host.guarantee.yaml deleted file mode 100644 index ac718aa6..00000000 --- a/guarantees/host/host/edit-host.guarantee.yaml +++ /dev/null @@ -1,75 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.host.host.edit-host.024 -journeyIndex: 24 -type: host -subtype: host -journey: Edit Host -ownerPackage: "@treeseed/admin" -summary: Edit host configuration such as domains provider bindings and environment metadata; changes must flow through trsd reconciliation plans. -status: active -dependencies: - journeys: - - 23 - guarantees: - - guarantee.host.host.create-host.023 -actors: - allowed: - - host_operator - - team_owner - - platform_operator - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - desktop_firefox - - tablet_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 23" -scene: - required: true - manifest: ./scenes/edit-host.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/hosts - componentContract: full-page-form service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.host.host.edit-host.api -content: - required: false - verifierRefs: - - admin.host.host.edit-host.content -audit: - required: true - verifierRefs: - - admin.host.host.edit-host.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.host.host.edit-host.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Edit host configuration such as domains provider bindings and environment metadata; changes must flow through trsd reconciliation plans. diff --git a/guarantees/host/host/scenes/create-host.scene.yaml b/guarantees/host/host/scenes/create-host.scene.yaml deleted file mode 100644 index abd5d3c5..00000000 --- a/guarantees/host/host/scenes/create-host.scene.yaml +++ /dev/null @@ -1,119 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: host.host.create-host.023 -title: Create Host -description: Scene scaffold for guarantee.host.host.create-host.023. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Create Host opens the canonical @treeseed/admin record operations workflow. - - Create Host exercises a service journey instead of only loading /app/hosts/new. - - Create Host records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - producesState: - - key: host.primary - kind: host - consumesState: - - key: auth.owner - kind: user -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Create Host - action: - goto: /app/hosts/new - expect: - urlIncludes: /app/hosts - - id: inspect-service-surface - title: Inspect Create Host service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/hosts -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/host/host/scenes/delete-host.scene.yaml b/guarantees/host/host/scenes/delete-host.scene.yaml deleted file mode 100644 index ce3b63fa..00000000 --- a/guarantees/host/host/scenes/delete-host.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: host.host.delete-host.025 -title: Delete Host -description: Scene scaffold for guarantee.host.host.delete-host.025. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Delete Host opens the canonical @treeseed/admin destructive confirmation workflow. - - Delete Host exercises a service journey instead of only loading /app/hosts/web/seed-host. - - Delete Host records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: host.primary - kind: host -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Delete Host - action: - goto: /app/hosts/web/seed-host - expect: - urlIncludes: /app/hosts - - id: inspect-service-surface - title: Inspect Delete Host service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/hosts -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/host/host/scenes/edit-host.scene.yaml b/guarantees/host/host/scenes/edit-host.scene.yaml deleted file mode 100644 index 040e693e..00000000 --- a/guarantees/host/host/scenes/edit-host.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: host.host.edit-host.024 -title: Edit Host -description: Scene scaffold for guarantee.host.host.edit-host.024. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Edit Host opens the canonical @treeseed/admin record operations workflow. - - Edit Host exercises a service journey from the canonical host inventory surface. - - Edit Host records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: host.primary - kind: host -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Edit Host - action: - goto: /app/hosts - expect: - urlIncludes: /app/hosts - - id: inspect-service-surface - title: Inspect host inventory service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/hosts -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/host/secrets/create-passphrase.guarantee.yaml b/guarantees/host/secrets/create-passphrase.guarantee.yaml deleted file mode 100644 index b103759b..00000000 --- a/guarantees/host/secrets/create-passphrase.guarantee.yaml +++ /dev/null @@ -1,75 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.host.secrets.create-passphrase.021 -journeyIndex: 21 -type: host -subtype: secrets -journey: Create Passphrase -ownerPackage: "@treeseed/admin" -summary: Create or unlock the secret-management passphrase for host/provider credentials; secrets must remain in approved secret stores and never plaintext files. -status: active -dependencies: - journeys: - - 4 - guarantees: - - guarantee.user.auth.user-login.004 -actors: - allowed: - - host_operator - - team_owner - - platform_operator - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - desktop_firefox - - tablet_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 4" -scene: - required: true - manifest: ./scenes/create-passphrase.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/hosts/new - componentContract: modal-form service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.host.secrets.create-passphrase.api -content: - required: false - verifierRefs: - - admin.host.secrets.create-passphrase.content -audit: - required: true - verifierRefs: - - admin.host.secrets.create-passphrase.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.host.secrets.create-passphrase.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Create or unlock the secret-management passphrase for host/provider credentials; secrets must remain in approved secret stores and never plaintext files. diff --git a/guarantees/host/secrets/reset-passphrase.guarantee.yaml b/guarantees/host/secrets/reset-passphrase.guarantee.yaml deleted file mode 100644 index 31fb658f..00000000 --- a/guarantees/host/secrets/reset-passphrase.guarantee.yaml +++ /dev/null @@ -1,75 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.host.secrets.reset-passphrase.022 -journeyIndex: 22 -type: host -subtype: secrets -journey: Reset Passphrase -ownerPackage: "@treeseed/admin" -summary: Reset secret access with recovery policy and re-encryption semantics; this is high risk because provider credentials back reconciliation. -status: active -dependencies: - journeys: - - 21 - guarantees: - - guarantee.host.secrets.create-passphrase.021 -actors: - allowed: - - host_operator - - team_owner - - platform_operator - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - desktop_firefox - - tablet_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 21" -scene: - required: true - manifest: ./scenes/reset-passphrase.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/hosts/web/seed-host/settings - componentContract: modal-form service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.host.secrets.reset-passphrase.api -content: - required: false - verifierRefs: - - admin.host.secrets.reset-passphrase.content -audit: - required: true - verifierRefs: - - admin.host.secrets.reset-passphrase.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.host.secrets.reset-passphrase.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Reset secret access with recovery policy and re-encryption semantics; this is high risk because provider credentials back reconciliation. diff --git a/guarantees/host/secrets/scenes/create-passphrase.scene.yaml b/guarantees/host/secrets/scenes/create-passphrase.scene.yaml deleted file mode 100644 index 73e809e1..00000000 --- a/guarantees/host/secrets/scenes/create-passphrase.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: host.secrets.create-passphrase.021 -title: Create Passphrase -description: Scene scaffold for guarantee.host.secrets.create-passphrase.021. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Create Passphrase opens the canonical @treeseed/admin record operations workflow. - - Create Passphrase exercises a service journey instead of only loading /app/hosts/new. - - Create Passphrase records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: host.primary - kind: host -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Create Passphrase - action: - goto: /app/hosts/new - expect: - urlIncludes: /app/hosts - - id: inspect-service-surface - title: Inspect Create Passphrase service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/hosts -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/host/secrets/scenes/reset-passphrase.scene.yaml b/guarantees/host/secrets/scenes/reset-passphrase.scene.yaml deleted file mode 100644 index 47f0cafe..00000000 --- a/guarantees/host/secrets/scenes/reset-passphrase.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: host.secrets.reset-passphrase.022 -title: Reset Passphrase -description: Scene scaffold for guarantee.host.secrets.reset-passphrase.022. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Reset Passphrase opens the canonical @treeseed/admin record operations workflow. - - Reset Passphrase exercises a service journey instead of only loading /app/hosts/web/seed-host/settings. - - Reset Passphrase records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: host.primary - kind: host -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Reset Passphrase - action: - goto: /app/hosts/web/seed-host/settings - expect: - urlIncludes: /app/hosts - - id: inspect-service-surface - title: Inspect Reset Passphrase service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/hosts -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/marketplace-seller/fulfillment/record-fulfillment.guarantee.yaml b/guarantees/marketplace-seller/fulfillment/record-fulfillment.guarantee.yaml deleted file mode 100644 index 5120d469..00000000 --- a/guarantees/marketplace-seller/fulfillment/record-fulfillment.guarantee.yaml +++ /dev/null @@ -1,74 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.marketplace-seller.fulfillment.record-fulfillment.113 -journeyIndex: 113 -type: marketplace-seller -subtype: fulfillment -journey: Record Fulfillment -ownerPackage: "@treeseed/admin" -summary: First-pass product guarantee for Record Fulfillment. -status: active -dependencies: - journeys: - - 112 - guarantees: - - guarantee.marketplace-seller.sales.view-seller-sales.112 -actors: - allowed: - - buyer - - seller - - market_operator - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 112" -scene: - required: true - manifest: ./scenes/record-fulfillment.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/teams/visual-audit-team/commerce/services - componentContract: full-page-form service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.marketplace-seller.fulfillment.record-fulfillment.api -content: - required: false - verifierRefs: - - admin.marketplace-seller.fulfillment.record-fulfillment.content -audit: - required: true - verifierRefs: - - admin.marketplace-seller.fulfillment.record-fulfillment.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.marketplace-seller.fulfillment.record-fulfillment.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - First-pass product guarantee for Record Fulfillment. diff --git a/guarantees/marketplace-seller/fulfillment/scenes/record-fulfillment.scene.yaml b/guarantees/marketplace-seller/fulfillment/scenes/record-fulfillment.scene.yaml deleted file mode 100644 index 13c3bcf8..00000000 --- a/guarantees/marketplace-seller/fulfillment/scenes/record-fulfillment.scene.yaml +++ /dev/null @@ -1,116 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: marketplace-seller.fulfillment.record-fulfillment.113 -title: Record Fulfillment -description: Scene scaffold for guarantee.marketplace-seller.fulfillment.record-fulfillment.113. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Record Fulfillment opens the canonical @treeseed/admin dashboard read model workflow. - - Record Fulfillment exercises a service journey instead of only loading /app/teams/visual-audit-team/commerce/services. - - Record Fulfillment records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Record Fulfillment - action: - goto: /app/teams/visual-audit-team/commerce/services - expect: - urlIncludes: /app/teams - - id: inspect-service-surface - title: Inspect Record Fulfillment service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/teams -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/marketplace-seller/listings/approve-listing.guarantee.yaml b/guarantees/marketplace-seller/listings/approve-listing.guarantee.yaml deleted file mode 100644 index 72cd3ec3..00000000 --- a/guarantees/marketplace-seller/listings/approve-listing.guarantee.yaml +++ /dev/null @@ -1,74 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.marketplace-seller.listings.approve-listing.110 -journeyIndex: 110 -type: marketplace-seller -subtype: listings -journey: Approve Listing -ownerPackage: "@treeseed/admin" -summary: First-pass product guarantee for Approve Listing. -status: active -dependencies: - journeys: - - 109 - guarantees: - - guarantee.marketplace-seller.listings.submit-listing-for-review.109 -actors: - allowed: - - buyer - - seller - - market_operator - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 109" -scene: - required: true - manifest: ./scenes/approve-listing.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/teams/visual-audit-team/commerce/products - componentContract: record-action service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.marketplace-seller.listings.approve-listing.api -content: - required: false - verifierRefs: - - admin.marketplace-seller.listings.approve-listing.content -audit: - required: true - verifierRefs: - - admin.marketplace-seller.listings.approve-listing.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.marketplace-seller.listings.approve-listing.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - First-pass product guarantee for Approve Listing. diff --git a/guarantees/marketplace-seller/listings/create-product-listing.guarantee.yaml b/guarantees/marketplace-seller/listings/create-product-listing.guarantee.yaml deleted file mode 100644 index 36e6acdb..00000000 --- a/guarantees/marketplace-seller/listings/create-product-listing.guarantee.yaml +++ /dev/null @@ -1,74 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.marketplace-seller.listings.create-product-listing.108 -journeyIndex: 108 -type: marketplace-seller -subtype: listings -journey: Create Product Listing -ownerPackage: "@treeseed/admin" -summary: First-pass product guarantee for Create Product Listing. -status: active -dependencies: - journeys: - - 107 - guarantees: - - guarantee.marketplace-seller.onboarding.approve-seller.107 -actors: - allowed: - - buyer - - seller - - market_operator - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 107" -scene: - required: true - manifest: ./scenes/create-product-listing.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/teams/visual-audit-team/commerce/products - componentContract: full-page-form service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.marketplace-seller.listings.create-product-listing.api -content: - required: false - verifierRefs: - - admin.marketplace-seller.listings.create-product-listing.content -audit: - required: true - verifierRefs: - - admin.marketplace-seller.listings.create-product-listing.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.marketplace-seller.listings.create-product-listing.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - First-pass product guarantee for Create Product Listing. diff --git a/guarantees/marketplace-seller/listings/manage-listing.guarantee.yaml b/guarantees/marketplace-seller/listings/manage-listing.guarantee.yaml deleted file mode 100644 index c597c252..00000000 --- a/guarantees/marketplace-seller/listings/manage-listing.guarantee.yaml +++ /dev/null @@ -1,74 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.marketplace-seller.listings.manage-listing.111 -journeyIndex: 111 -type: marketplace-seller -subtype: listings -journey: Manage Listing -ownerPackage: "@treeseed/admin" -summary: First-pass product guarantee for Manage Listing. -status: active -dependencies: - journeys: - - 108 - guarantees: - - guarantee.marketplace-seller.listings.create-product-listing.108 -actors: - allowed: - - buyer - - seller - - market_operator - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 108" -scene: - required: true - manifest: ./scenes/manage-listing.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/teams/visual-audit-team/commerce/products - componentContract: full-page-form service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.marketplace-seller.listings.manage-listing.api -content: - required: false - verifierRefs: - - admin.marketplace-seller.listings.manage-listing.content -audit: - required: true - verifierRefs: - - admin.marketplace-seller.listings.manage-listing.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.marketplace-seller.listings.manage-listing.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - First-pass product guarantee for Manage Listing. diff --git a/guarantees/marketplace-seller/listings/scenes/approve-listing.scene.yaml b/guarantees/marketplace-seller/listings/scenes/approve-listing.scene.yaml deleted file mode 100644 index fa3c47fd..00000000 --- a/guarantees/marketplace-seller/listings/scenes/approve-listing.scene.yaml +++ /dev/null @@ -1,116 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: marketplace-seller.listings.approve-listing.110 -title: Approve Listing -description: Scene scaffold for guarantee.marketplace-seller.listings.approve-listing.110. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Approve Listing opens the canonical @treeseed/admin record action workflow. - - Approve Listing exercises a service journey instead of only loading /app/teams/visual-audit-team/commerce/products. - - Approve Listing records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Approve Listing - action: - goto: /app/teams/visual-audit-team/commerce/products - expect: - urlIncludes: /app/teams - - id: inspect-service-surface - title: Inspect Approve Listing service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/teams -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/marketplace-seller/listings/scenes/create-product-listing.scene.yaml b/guarantees/marketplace-seller/listings/scenes/create-product-listing.scene.yaml deleted file mode 100644 index 45f91cbd..00000000 --- a/guarantees/marketplace-seller/listings/scenes/create-product-listing.scene.yaml +++ /dev/null @@ -1,116 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: marketplace-seller.listings.create-product-listing.108 -title: Create Product Listing -description: Scene scaffold for guarantee.marketplace-seller.listings.create-product-listing.108. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Create Product Listing opens the canonical @treeseed/admin full page form workflow. - - Create Product Listing exercises a service journey instead of only loading /app/teams/visual-audit-team/commerce/products. - - Create Product Listing records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Create Product Listing - action: - goto: /app/teams/visual-audit-team/commerce/products - expect: - urlIncludes: /app/teams - - id: inspect-service-surface - title: Inspect Create Product Listing service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/teams -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/marketplace-seller/listings/scenes/manage-listing.scene.yaml b/guarantees/marketplace-seller/listings/scenes/manage-listing.scene.yaml deleted file mode 100644 index 005102af..00000000 --- a/guarantees/marketplace-seller/listings/scenes/manage-listing.scene.yaml +++ /dev/null @@ -1,116 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: marketplace-seller.listings.manage-listing.111 -title: Manage Listing -description: Scene scaffold for guarantee.marketplace-seller.listings.manage-listing.111. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Manage Listing opens the canonical @treeseed/admin dashboard read model workflow. - - Manage Listing exercises a service journey instead of only loading /app/teams/visual-audit-team/commerce/products. - - Manage Listing records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Manage Listing - action: - goto: /app/teams/visual-audit-team/commerce/products - expect: - urlIncludes: /app/teams - - id: inspect-service-surface - title: Inspect Manage Listing service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/teams -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/marketplace-seller/listings/scenes/submit-listing-for-review.scene.yaml b/guarantees/marketplace-seller/listings/scenes/submit-listing-for-review.scene.yaml deleted file mode 100644 index 18e488bc..00000000 --- a/guarantees/marketplace-seller/listings/scenes/submit-listing-for-review.scene.yaml +++ /dev/null @@ -1,116 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: marketplace-seller.listings.submit-listing-for-review.109 -title: Submit Listing For Review -description: Scene scaffold for guarantee.marketplace-seller.listings.submit-listing-for-review.109. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Submit Listing For Review opens the canonical @treeseed/admin record action workflow. - - Submit Listing For Review exercises a service journey instead of only loading /app/teams/visual-audit-team/commerce/products. - - Submit Listing For Review records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Submit Listing For Review - action: - goto: /app/teams/visual-audit-team/commerce/products - expect: - urlIncludes: /app/teams - - id: inspect-service-surface - title: Inspect Submit Listing For Review service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/teams -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/marketplace-seller/listings/submit-listing-for-review.guarantee.yaml b/guarantees/marketplace-seller/listings/submit-listing-for-review.guarantee.yaml deleted file mode 100644 index b92b9496..00000000 --- a/guarantees/marketplace-seller/listings/submit-listing-for-review.guarantee.yaml +++ /dev/null @@ -1,74 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.marketplace-seller.listings.submit-listing-for-review.109 -journeyIndex: 109 -type: marketplace-seller -subtype: listings -journey: Submit Listing For Review -ownerPackage: "@treeseed/admin" -summary: First-pass product guarantee for Submit Listing For Review. -status: active -dependencies: - journeys: - - 108 - guarantees: - - guarantee.marketplace-seller.listings.create-product-listing.108 -actors: - allowed: - - buyer - - seller - - market_operator - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 108" -scene: - required: true - manifest: ./scenes/submit-listing-for-review.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/teams/visual-audit-team/commerce/products - componentContract: record-action service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.marketplace-seller.listings.submit-listing-for-review.api -content: - required: false - verifierRefs: - - admin.marketplace-seller.listings.submit-listing-for-review.content -audit: - required: true - verifierRefs: - - admin.marketplace-seller.listings.submit-listing-for-review.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.marketplace-seller.listings.submit-listing-for-review.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - First-pass product guarantee for Submit Listing For Review. diff --git a/guarantees/marketplace-seller/onboarding/approve-seller.guarantee.yaml b/guarantees/marketplace-seller/onboarding/approve-seller.guarantee.yaml deleted file mode 100644 index 29cd78b2..00000000 --- a/guarantees/marketplace-seller/onboarding/approve-seller.guarantee.yaml +++ /dev/null @@ -1,74 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.marketplace-seller.onboarding.approve-seller.107 -journeyIndex: 107 -type: marketplace-seller -subtype: onboarding -journey: Approve Seller -ownerPackage: "@treeseed/admin" -summary: First-pass product guarantee for Approve Seller. -status: active -dependencies: - journeys: - - 106 - guarantees: - - guarantee.marketplace-seller.onboarding.request-seller-setup.106 -actors: - allowed: - - buyer - - seller - - market_operator - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 106" -scene: - required: true - manifest: ./scenes/approve-seller.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/market/seller - componentContract: record-action service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.marketplace-seller.onboarding.approve-seller.api -content: - required: false - verifierRefs: - - admin.marketplace-seller.onboarding.approve-seller.content -audit: - required: true - verifierRefs: - - admin.marketplace-seller.onboarding.approve-seller.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.marketplace-seller.onboarding.approve-seller.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - First-pass product guarantee for Approve Seller. diff --git a/guarantees/marketplace-seller/onboarding/request-seller-setup.guarantee.yaml b/guarantees/marketplace-seller/onboarding/request-seller-setup.guarantee.yaml deleted file mode 100644 index e76752b1..00000000 --- a/guarantees/marketplace-seller/onboarding/request-seller-setup.guarantee.yaml +++ /dev/null @@ -1,74 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.marketplace-seller.onboarding.request-seller-setup.106 -journeyIndex: 106 -type: marketplace-seller -subtype: onboarding -journey: Request Seller Setup -ownerPackage: "@treeseed/admin" -summary: First-pass product guarantee for Request Seller Setup. -status: active -dependencies: - journeys: - - 12 - guarantees: - - guarantee.team.team.create-team.012 -actors: - allowed: - - buyer - - seller - - market_operator - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 12" -scene: - required: true - manifest: ./scenes/request-seller-setup.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/market/seller - componentContract: full-page-form service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.marketplace-seller.onboarding.request-seller-setup.api -content: - required: false - verifierRefs: - - admin.marketplace-seller.onboarding.request-seller-setup.content -audit: - required: true - verifierRefs: - - admin.marketplace-seller.onboarding.request-seller-setup.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.marketplace-seller.onboarding.request-seller-setup.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - First-pass product guarantee for Request Seller Setup. diff --git a/guarantees/marketplace-seller/onboarding/scenes/approve-seller.scene.yaml b/guarantees/marketplace-seller/onboarding/scenes/approve-seller.scene.yaml deleted file mode 100644 index 2433b90e..00000000 --- a/guarantees/marketplace-seller/onboarding/scenes/approve-seller.scene.yaml +++ /dev/null @@ -1,116 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: marketplace-seller.onboarding.approve-seller.107 -title: Approve Seller -description: Scene scaffold for guarantee.marketplace-seller.onboarding.approve-seller.107. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Approve Seller opens the canonical @treeseed/admin record action workflow. - - Approve Seller exercises a service journey instead of only loading /app/market/seller. - - Approve Seller records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Approve Seller - action: - goto: /app/market/seller - expect: - urlIncludes: /app/market - - id: inspect-service-surface - title: Inspect Approve Seller service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/market -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/marketplace-seller/onboarding/scenes/request-seller-setup.scene.yaml b/guarantees/marketplace-seller/onboarding/scenes/request-seller-setup.scene.yaml deleted file mode 100644 index b6a9a269..00000000 --- a/guarantees/marketplace-seller/onboarding/scenes/request-seller-setup.scene.yaml +++ /dev/null @@ -1,116 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: marketplace-seller.onboarding.request-seller-setup.106 -title: Request Seller Setup -description: Scene scaffold for guarantee.marketplace-seller.onboarding.request-seller-setup.106. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Request Seller Setup opens the canonical @treeseed/admin full page form workflow. - - Request Seller Setup exercises a service journey instead of only loading /app/market/seller. - - Request Seller Setup records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Request Seller Setup - action: - goto: /app/market/seller - expect: - urlIncludes: /app/market - - id: inspect-service-surface - title: Inspect Request Seller Setup service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/market -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/marketplace-seller/refunds/issue-refund.guarantee.yaml b/guarantees/marketplace-seller/refunds/issue-refund.guarantee.yaml deleted file mode 100644 index e6620eb6..00000000 --- a/guarantees/marketplace-seller/refunds/issue-refund.guarantee.yaml +++ /dev/null @@ -1,74 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.marketplace-seller.refunds.issue-refund.114 -journeyIndex: 114 -type: marketplace-seller -subtype: refunds -journey: Issue Refund -ownerPackage: "@treeseed/admin" -summary: First-pass product guarantee for Issue Refund. -status: active -dependencies: - journeys: - - 112 - guarantees: - - guarantee.marketplace-seller.sales.view-seller-sales.112 -actors: - allowed: - - buyer - - seller - - market_operator - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 112" -scene: - required: true - manifest: ./scenes/issue-refund.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/teams/visual-audit-team/commerce/sales - componentContract: destructive-confirmation service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.marketplace-seller.refunds.issue-refund.api -content: - required: false - verifierRefs: - - admin.marketplace-seller.refunds.issue-refund.content -audit: - required: true - verifierRefs: - - admin.marketplace-seller.refunds.issue-refund.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.marketplace-seller.refunds.issue-refund.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - First-pass product guarantee for Issue Refund. diff --git a/guarantees/marketplace-seller/refunds/scenes/issue-refund.scene.yaml b/guarantees/marketplace-seller/refunds/scenes/issue-refund.scene.yaml deleted file mode 100644 index 1ebf8e1b..00000000 --- a/guarantees/marketplace-seller/refunds/scenes/issue-refund.scene.yaml +++ /dev/null @@ -1,116 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: marketplace-seller.refunds.issue-refund.114 -title: Issue Refund -description: Scene scaffold for guarantee.marketplace-seller.refunds.issue-refund.114. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Issue Refund opens the canonical @treeseed/admin dashboard read model workflow. - - Issue Refund exercises a service journey instead of only loading /app/teams/visual-audit-team/commerce/sales. - - Issue Refund records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Issue Refund - action: - goto: /app/teams/visual-audit-team/commerce/sales - expect: - urlIncludes: /app/teams - - id: inspect-service-surface - title: Inspect Issue Refund service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/teams -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/marketplace-seller/sales/scenes/view-seller-sales.scene.yaml b/guarantees/marketplace-seller/sales/scenes/view-seller-sales.scene.yaml deleted file mode 100644 index 21199d10..00000000 --- a/guarantees/marketplace-seller/sales/scenes/view-seller-sales.scene.yaml +++ /dev/null @@ -1,116 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: marketplace-seller.sales.view-seller-sales.112 -title: View Seller Sales -description: Scene scaffold for guarantee.marketplace-seller.sales.view-seller-sales.112. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - View Seller Sales opens the canonical @treeseed/admin dashboard read model workflow. - - View Seller Sales exercises a service journey instead of only loading /app/teams/visual-audit-team/commerce/sales. - - View Seller Sales records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open View Seller Sales - action: - goto: /app/teams/visual-audit-team/commerce/sales - expect: - urlIncludes: /app/teams - - id: inspect-service-surface - title: Inspect View Seller Sales service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/teams -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/marketplace-seller/sales/view-seller-sales.guarantee.yaml b/guarantees/marketplace-seller/sales/view-seller-sales.guarantee.yaml deleted file mode 100644 index fc7471f0..00000000 --- a/guarantees/marketplace-seller/sales/view-seller-sales.guarantee.yaml +++ /dev/null @@ -1,74 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.marketplace-seller.sales.view-seller-sales.112 -journeyIndex: 112 -type: marketplace-seller -subtype: sales -journey: View Seller Sales -ownerPackage: "@treeseed/admin" -summary: First-pass product guarantee for View Seller Sales. -status: active -dependencies: - journeys: - - 107 - guarantees: - - guarantee.marketplace-seller.onboarding.approve-seller.107 -actors: - allowed: - - buyer - - seller - - market_operator - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 107" -scene: - required: true - manifest: ./scenes/view-seller-sales.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/teams/visual-audit-team/commerce/sales - componentContract: dashboard/read-model service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.marketplace-seller.sales.view-seller-sales.api -content: - required: false - verifierRefs: - - admin.marketplace-seller.sales.view-seller-sales.content -audit: - required: true - verifierRefs: - - admin.marketplace-seller.sales.view-seller-sales.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.marketplace-seller.sales.view-seller-sales.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - First-pass product guarantee for View Seller Sales. diff --git a/guarantees/project/agent/create-agent.guarantee.yaml b/guarantees/project/agent/create-agent.guarantee.yaml deleted file mode 100644 index c397e172..00000000 --- a/guarantees/project/agent/create-agent.guarantee.yaml +++ /dev/null @@ -1,73 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.project.agent.create-agent.057 -journeyIndex: 57 -type: project -subtype: agent -journey: Create Agent -ownerPackage: "@treeseed/admin" -summary: Define a project-owned agent class handler prompts permissions and output contracts; providers supply execution capacity but do not define project agents. -status: active -dependencies: - journeys: - - 32 - guarantees: - - guarantee.project.project.create-project.032 -actors: - allowed: - - project_manager - - project_contributor - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 32" -scene: - required: true - manifest: ./scenes/create-agent.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/projects/project-visual-audit-project/agents/new - componentContract: full-page-form service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.project.agent.create-agent.api -content: - required: false - verifierRefs: - - admin.project.agent.create-agent.content -audit: - required: true - verifierRefs: - - admin.project.agent.create-agent.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.project.agent.create-agent.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Define a project-owned agent class handler prompts permissions and output contracts; providers supply execution capacity but do not define project agents. diff --git a/guarantees/project/agent/delete-agent.guarantee.yaml b/guarantees/project/agent/delete-agent.guarantee.yaml deleted file mode 100644 index abd7d6cf..00000000 --- a/guarantees/project/agent/delete-agent.guarantee.yaml +++ /dev/null @@ -1,73 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.project.agent.delete-agent.059 -journeyIndex: 59 -type: project -subtype: agent -journey: Delete Agent -ownerPackage: "@treeseed/admin" -summary: Remove or disable an agent after checking scheduled workdays assignments and generated artifact ownership. -status: active -dependencies: - journeys: - - 57 - guarantees: - - guarantee.project.agent.create-agent.057 -actors: - allowed: - - project_manager - - project_contributor - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 57" -scene: - required: true - manifest: ./scenes/delete-agent.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/projects/project-visual-audit-project/agents/seed-agent - componentContract: destructive-confirmation service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.project.agent.delete-agent.api -content: - required: false - verifierRefs: - - admin.project.agent.delete-agent.content -audit: - required: true - verifierRefs: - - admin.project.agent.delete-agent.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.project.agent.delete-agent.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Remove or disable an agent after checking scheduled workdays assignments and generated artifact ownership. diff --git a/guarantees/project/agent/edit-agent.guarantee.yaml b/guarantees/project/agent/edit-agent.guarantee.yaml deleted file mode 100644 index be352b2c..00000000 --- a/guarantees/project/agent/edit-agent.guarantee.yaml +++ /dev/null @@ -1,73 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.project.agent.edit-agent.058 -journeyIndex: 58 -type: project -subtype: agent -journey: Edit Agent -ownerPackage: "@treeseed/admin" -summary: Edit agent configuration and permissions with validation against SDK/agent public contracts; changes should affect future assignments not mutate active runs unsafely. -status: active -dependencies: - journeys: - - 57 - guarantees: - - guarantee.project.agent.create-agent.057 -actors: - allowed: - - project_manager - - project_contributor - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 57" -scene: - required: true - manifest: ./scenes/edit-agent.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/projects/project-visual-audit-project/agents/seed-agent - componentContract: full-page-form service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.project.agent.edit-agent.api -content: - required: false - verifierRefs: - - admin.project.agent.edit-agent.content -audit: - required: true - verifierRefs: - - admin.project.agent.edit-agent.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.project.agent.edit-agent.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Edit agent configuration and permissions with validation against SDK/agent public contracts; changes should affect future assignments not mutate active runs unsafely. diff --git a/guarantees/project/agent/monitor-agent-admin-ui.guarantee.yaml b/guarantees/project/agent/monitor-agent-admin-ui.guarantee.yaml deleted file mode 100644 index 7c811b4e..00000000 --- a/guarantees/project/agent/monitor-agent-admin-ui.guarantee.yaml +++ /dev/null @@ -1,76 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.project.agent.monitor-agent-admin-ui.140 -journeyIndex: 140 -type: project -subtype: agent -journey: Monitor Agent Admin Ui -ownerPackage: "@treeseed/admin" -surface: admin-ui -summary: "Verify Admin can observe project agents, runtime diagnostics, assignments, mode runs, fallback outputs, usage, TreeDX proxy audit, and settlement evidence without becoming the scheduler." -status: active -dependencies: - journeys: - - 57 - - 60 - guarantees: - - guarantee.project.agent.create-agent.057 - - guarantee.project.agent.monitor-agent.060 -actors: - allowed: - - project_manager - - capacity_operator - - team_owner - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - optional: - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - Blocked by guarantee journey audit: route exists, but the scene does not yet prove a real interactive service journey. - - "Guarantee starts as planned until all verifier refs execute in integrated environments." -scene: - required: false - manifest: ./scenes/monitor-agent-admin-ui.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/capacity/runtime - componentContract: dashboard/read-model service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.agent.monitor.runtime-ui -content: - required: false - verifierRefs: [] -audit: - required: false - verifierRefs: [] -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.agent.monitor.unauthorized-denied -evidence: - required: - - guarantee_report - - verifier_evidence -notes: - - "Admin monitoring uses project agent pages and /app/capacity/runtime; scheduling remains owned by API and agent runtime." - diff --git a/guarantees/project/agent/scenes/create-agent.scene.yaml b/guarantees/project/agent/scenes/create-agent.scene.yaml deleted file mode 100644 index 9824e70d..00000000 --- a/guarantees/project/agent/scenes/create-agent.scene.yaml +++ /dev/null @@ -1,148 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: project.agent.create-agent.057 -title: Create Agent -description: Scene scaffold for guarantee.project.agent.create-agent.057. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Create Agent opens the canonical @treeseed/admin project agent creation workflow. - - A project operator can fill the agent form and queue the local content operation. - - The UI shows reviewable operation feedback after submission. - minimumSteps: 5 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: project.primary - kind: project -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Create Agent - action: - goto: /app/projects/project-visual-audit-project/agents/new - expect: - urlIncludes: /app/projects/project-visual-audit-project/agents/new - text: New agent - - id: fill-agent-name - title: Fill agent name - action: - fill: - role: textbox - name: Name - value: Guarantee Review Agent {{runShort}} - expect: - text: New agent - - id: fill-agent-description - title: Fill agent description - action: - fill: - role: textbox - name: Description - value: Reviews guarantee evidence and prepares implementation feedback for the TreeSeed market project. - expect: - text: New agent - - id: fill-agent-prompt - title: Fill agent prompt - action: - fill: - role: textbox - name: System prompt - value: Review guarantee evidence, identify concrete UI defects, and produce concise implementation notes. - expect: - text: New agent - - id: submit-agent - title: Submit agent definition - action: - click: - role: button - name: Create agent - expect: - text: Queued. Waiting for the Treeseed operations runner -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/project/agent/scenes/delete-agent.scene.yaml b/guarantees/project/agent/scenes/delete-agent.scene.yaml deleted file mode 100644 index bd18b41b..00000000 --- a/guarantees/project/agent/scenes/delete-agent.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: project.agent.delete-agent.059 -title: Delete Agent -description: Scene scaffold for guarantee.project.agent.delete-agent.059. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Delete Agent opens the canonical @treeseed/admin destructive confirmation workflow. - - Delete Agent exercises a service journey instead of only loading /app/projects/project-visual-audit-project/agents/seed-agent. - - Delete Agent records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: project.primary - kind: project -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Delete Agent - action: - goto: /app/projects/project-visual-audit-project/agents/seed-agent - expect: - urlIncludes: /app/projects - - id: inspect-service-surface - title: Inspect Delete Agent service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/projects -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/project/agent/scenes/edit-agent.scene.yaml b/guarantees/project/agent/scenes/edit-agent.scene.yaml deleted file mode 100644 index f91f618e..00000000 --- a/guarantees/project/agent/scenes/edit-agent.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: project.agent.edit-agent.058 -title: Edit Agent -description: Scene scaffold for guarantee.project.agent.edit-agent.058. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Edit Agent opens the canonical @treeseed/admin full page form workflow. - - Edit Agent exercises a service journey instead of only loading /app/projects/project-visual-audit-project/agents/seed-agent. - - Edit Agent records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: project.primary - kind: project -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Edit Agent - action: - goto: /app/projects/project-visual-audit-project/agents/seed-agent - expect: - urlIncludes: /app/projects - - id: inspect-service-surface - title: Inspect Edit Agent service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/projects -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/project/agent/scenes/monitor-agent-admin-ui.scene.yaml b/guarantees/project/agent/scenes/monitor-agent-admin-ui.scene.yaml deleted file mode 100644 index 0a3936dc..00000000 --- a/guarantees/project/agent/scenes/monitor-agent-admin-ui.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: project.agent.monitor-agent-admin-ui.140 -title: Monitor Agent In Admin UI -description: Scene scaffold for project.agent.monitor-agent-admin-ui.140. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Monitor Agent Admin Ui opens the canonical @treeseed/admin record operations workflow. - - Monitor Agent Admin Ui exercises a service journey instead of only loading /app/capacity/runtime. - - Monitor Agent Admin Ui records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: project.primary - kind: project -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Monitor Agent Admin Ui - action: - goto: /app/capacity/runtime - expect: - urlIncludes: /app/capacity - - id: inspect-service-surface - title: Inspect Monitor Agent Admin Ui service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/capacity -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/project/allocation/allocate-agent-capacity.guarantee.yaml b/guarantees/project/allocation/allocate-agent-capacity.guarantee.yaml deleted file mode 100644 index eaef1bd2..00000000 --- a/guarantees/project/allocation/allocate-agent-capacity.guarantee.yaml +++ /dev/null @@ -1,73 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.project.allocation.allocate-agent-capacity.061 -journeyIndex: 61 -type: project -subtype: allocation -journey: Allocate Agent Capacity -ownerPackage: "@treeseed/admin" -summary: Assign team capacity policy to specific project agents or classes; API assignment function uses this policy while providers only enforce local constraints. -status: active -dependencies: - journeys: - - 57 - guarantees: - - guarantee.project.agent.create-agent.057 -actors: - allowed: - - project_manager - - project_contributor - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 57" -scene: - required: true - manifest: ./scenes/allocate-agent-capacity.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/capacity/allocation/projects/seed-project - componentContract: full-page-form service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.project.allocation.allocate-agent-capacity.api -content: - required: false - verifierRefs: - - admin.project.allocation.allocate-agent-capacity.content -audit: - required: true - verifierRefs: - - admin.project.allocation.allocate-agent-capacity.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.project.allocation.allocate-agent-capacity.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Assign team capacity policy to specific project agents or classes; API assignment function uses this policy while providers only enforce local constraints. diff --git a/guarantees/project/allocation/allocate-project-capacity.guarantee.yaml b/guarantees/project/allocation/allocate-project-capacity.guarantee.yaml deleted file mode 100644 index 563990f9..00000000 --- a/guarantees/project/allocation/allocate-project-capacity.guarantee.yaml +++ /dev/null @@ -1,73 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.project.allocation.allocate-project-capacity.037 -journeyIndex: 37 -type: project -subtype: allocation -journey: Allocate Project Capacity -ownerPackage: "@treeseed/admin" -summary: Define team capacity policy or allocation sets for the project; this is policy configuration and must not become provider-side scheduling. -status: active -dependencies: - journeys: - - 32 - guarantees: - - guarantee.project.project.create-project.032 -actors: - allowed: - - project_manager - - project_contributor - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 32" -scene: - required: true - manifest: ./scenes/allocate-project-capacity.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/capacity/allocation/projects/seed-project - componentContract: full-page-form service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.project.allocation.allocate-project-capacity.api -content: - required: false - verifierRefs: - - admin.project.allocation.allocate-project-capacity.content -audit: - required: true - verifierRefs: - - admin.project.allocation.allocate-project-capacity.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.project.allocation.allocate-project-capacity.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Define team capacity policy or allocation sets for the project; this is policy configuration and must not become provider-side scheduling. diff --git a/guarantees/project/allocation/scenes/allocate-agent-capacity.scene.yaml b/guarantees/project/allocation/scenes/allocate-agent-capacity.scene.yaml deleted file mode 100644 index 63ef8476..00000000 --- a/guarantees/project/allocation/scenes/allocate-agent-capacity.scene.yaml +++ /dev/null @@ -1,120 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: project.allocation.allocate-agent-capacity.061 -title: Allocate Agent Capacity -description: Scene scaffold for guarantee.project.allocation.allocate-agent-capacity.061. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Allocate Agent Capacity opens the canonical @treeseed/admin record operations workflow. - - Allocate Agent Capacity exercises a service journey instead of only loading /app/capacity/allocation/projects/seed-project. - - Allocate Agent Capacity records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: project.primary - kind: project - - key: capacity-provider.primary - kind: capacity-provider -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Allocate Agent Capacity - action: - goto: /app/capacity/allocation/projects/seed-project - expect: - urlIncludes: /app/capacity - - id: inspect-service-surface - title: Inspect Allocate Agent Capacity service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/capacity -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/project/allocation/scenes/allocate-project-capacity.scene.yaml b/guarantees/project/allocation/scenes/allocate-project-capacity.scene.yaml deleted file mode 100644 index f1bc61a9..00000000 --- a/guarantees/project/allocation/scenes/allocate-project-capacity.scene.yaml +++ /dev/null @@ -1,120 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: project.allocation.allocate-project-capacity.037 -title: Allocate Project Capacity -description: Scene scaffold for guarantee.project.allocation.allocate-project-capacity.037. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Allocate Project Capacity opens the canonical @treeseed/admin record operations workflow. - - Allocate Project Capacity exercises a service journey instead of only loading /app/capacity/allocation/projects/seed-project. - - Allocate Project Capacity records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: project.primary - kind: project - - key: capacity-provider.primary - kind: capacity-provider -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Allocate Project Capacity - action: - goto: /app/capacity/allocation/projects/seed-project - expect: - urlIncludes: /app/capacity - - id: inspect-service-surface - title: Inspect Allocate Project Capacity service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/capacity -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/project/book/create-book.guarantee.yaml b/guarantees/project/book/create-book.guarantee.yaml deleted file mode 100644 index 12c9dc10..00000000 --- a/guarantees/project/book/create-book.guarantee.yaml +++ /dev/null @@ -1,73 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.project.book.create-book.065 -journeyIndex: 65 -type: project -subtype: book -journey: Create Book -ownerPackage: "@treeseed/admin" -summary: Create a Knowledge Hub book through the SDK content model and TreeDX; books organize project knowledge rather than serving as package docs only. -status: active -dependencies: - journeys: - - 32 - guarantees: - - guarantee.project.project.create-project.032 -actors: - allowed: - - project_manager - - project_contributor - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 32" -scene: - required: true - manifest: ./scenes/create-book.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/knowledge/books - componentContract: full-page-form service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.project.book.create-book.api -content: - required: true - verifierRefs: - - admin.project.book.create-book.content -audit: - required: true - verifierRefs: - - admin.project.book.create-book.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.project.book.create-book.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Create a Knowledge Hub book through the SDK content model and TreeDX; books organize project knowledge rather than serving as package docs only. diff --git a/guarantees/project/book/delete-book.guarantee.yaml b/guarantees/project/book/delete-book.guarantee.yaml deleted file mode 100644 index b08a8c59..00000000 --- a/guarantees/project/book/delete-book.guarantee.yaml +++ /dev/null @@ -1,73 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.project.book.delete-book.067 -journeyIndex: 67 -type: project -subtype: book -journey: Delete Book -ownerPackage: "@treeseed/admin" -summary: Delete or archive a book with checks for pages links downloads and library indexes. -status: active -dependencies: - journeys: - - 65 - guarantees: - - guarantee.project.book.create-book.065 -actors: - allowed: - - project_manager - - project_contributor - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 65" -scene: - required: true - manifest: ./scenes/delete-book.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/knowledge/books/seed-book - componentContract: destructive-confirmation service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.project.book.delete-book.api -content: - required: true - verifierRefs: - - admin.project.book.delete-book.content -audit: - required: true - verifierRefs: - - admin.project.book.delete-book.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.project.book.delete-book.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Delete or archive a book with checks for pages links downloads and library indexes. diff --git a/guarantees/project/book/download-book.guarantee.yaml b/guarantees/project/book/download-book.guarantee.yaml deleted file mode 100644 index f279a7e7..00000000 --- a/guarantees/project/book/download-book.guarantee.yaml +++ /dev/null @@ -1,75 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.project.book.download-book.070 -journeyIndex: 70 -type: project -subtype: book -journey: Download Book -ownerPackage: "@treeseed/admin" -summary: Export a book or selected pages from TreeDX-backed content; depends on an existing book and at least one available page. -status: active -dependencies: - journeys: - - 65 - - 69 - guarantees: - - guarantee.project.book.create-book.065 - - guarantee.project.knowledge.create-book-page.069 -actors: - allowed: - - project_manager - - project_contributor - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 65, 69" -scene: - required: true - manifest: ./scenes/download-book.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/knowledge/books/seed-book - componentContract: inline-form/search-panel service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.project.book.download-book.api -content: - required: true - verifierRefs: - - admin.project.book.download-book.content -audit: - required: true - verifierRefs: - - admin.project.book.download-book.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.project.book.download-book.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Export a book or selected pages from TreeDX-backed content; depends on an existing book and at least one available page. diff --git a/guarantees/project/book/edit-book.guarantee.yaml b/guarantees/project/book/edit-book.guarantee.yaml deleted file mode 100644 index b1e3e265..00000000 --- a/guarantees/project/book/edit-book.guarantee.yaml +++ /dev/null @@ -1,73 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.project.book.edit-book.066 -journeyIndex: 66 -type: project -subtype: book -journey: Edit Book -ownerPackage: "@treeseed/admin" -summary: Edit book metadata ordering and visibility through TreeDX-backed content operations. -status: active -dependencies: - journeys: - - 65 - guarantees: - - guarantee.project.book.create-book.065 -actors: - allowed: - - project_manager - - project_contributor - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 65" -scene: - required: true - manifest: ./scenes/edit-book.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/knowledge/books/seed-book - componentContract: full-page-form service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.project.book.edit-book.api -content: - required: true - verifierRefs: - - admin.project.book.edit-book.content -audit: - required: true - verifierRefs: - - admin.project.book.edit-book.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.project.book.edit-book.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Edit book metadata ordering and visibility through TreeDX-backed content operations. diff --git a/guarantees/project/book/scenes/create-book.scene.yaml b/guarantees/project/book/scenes/create-book.scene.yaml deleted file mode 100644 index 3af04e8f..00000000 --- a/guarantees/project/book/scenes/create-book.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: project.book.create-book.065 -title: Create Book -description: Scene scaffold for guarantee.project.book.create-book.065. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Create Book opens the canonical @treeseed/admin full page form workflow. - - Create Book exercises a service journey instead of only loading /app/knowledge/books. - - Create Book records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: project.primary - kind: project -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Create Book - action: - goto: /app/knowledge/books - expect: - urlIncludes: /app/knowledge - - id: inspect-service-surface - title: Inspect Create Book service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/knowledge -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/project/book/scenes/delete-book.scene.yaml b/guarantees/project/book/scenes/delete-book.scene.yaml deleted file mode 100644 index 7cbe370c..00000000 --- a/guarantees/project/book/scenes/delete-book.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: project.book.delete-book.067 -title: Delete Book -description: Scene scaffold for guarantee.project.book.delete-book.067. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Delete Book opens the canonical @treeseed/admin destructive confirmation workflow. - - Delete Book exercises a service journey instead of only loading /app/knowledge/books/seed-book. - - Delete Book records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: project.primary - kind: project -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Delete Book - action: - goto: /app/knowledge/books/seed-book - expect: - urlIncludes: /app/knowledge - - id: inspect-service-surface - title: Inspect Delete Book service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/knowledge -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/project/book/scenes/download-book.scene.yaml b/guarantees/project/book/scenes/download-book.scene.yaml deleted file mode 100644 index f610cb5b..00000000 --- a/guarantees/project/book/scenes/download-book.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: project.book.download-book.070 -title: Download Book -description: Scene scaffold for guarantee.project.book.download-book.070. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Download Book opens the canonical @treeseed/admin record action workflow. - - Download Book exercises a service journey instead of only loading /app/knowledge/books/seed-book. - - Download Book records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: project.primary - kind: project -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Download Book - action: - goto: /app/knowledge/books/seed-book - expect: - urlIncludes: /app/knowledge - - id: inspect-service-surface - title: Inspect Download Book service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/knowledge -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/project/book/scenes/edit-book.scene.yaml b/guarantees/project/book/scenes/edit-book.scene.yaml deleted file mode 100644 index b1f03b4b..00000000 --- a/guarantees/project/book/scenes/edit-book.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: project.book.edit-book.066 -title: Edit Book -description: Scene scaffold for guarantee.project.book.edit-book.066. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Edit Book opens the canonical @treeseed/admin full page form workflow. - - Edit Book exercises a service journey instead of only loading /app/knowledge/books/seed-book. - - Edit Book records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: project.primary - kind: project -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Edit Book - action: - goto: /app/knowledge/books/seed-book - expect: - urlIncludes: /app/knowledge - - id: inspect-service-surface - title: Inspect Edit Book service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/knowledge -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/project/book/scenes/search-books.scene.yaml b/guarantees/project/book/scenes/search-books.scene.yaml deleted file mode 100644 index aa7402b1..00000000 --- a/guarantees/project/book/scenes/search-books.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: project.book.search-books.068 -title: Search Books -description: Scene scaffold for guarantee.project.book.search-books.068. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Search Books opens the canonical @treeseed/admin dashboard read model workflow. - - Search Books exercises a service journey instead of only loading /app/knowledge/books. - - Search Books records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: project.primary - kind: project -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Search Books - action: - goto: /app/knowledge/books - expect: - urlIncludes: /app/knowledge - - id: inspect-service-surface - title: Inspect Search Books service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/knowledge -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/project/book/search-books.guarantee.yaml b/guarantees/project/book/search-books.guarantee.yaml deleted file mode 100644 index 1d9efda4..00000000 --- a/guarantees/project/book/search-books.guarantee.yaml +++ /dev/null @@ -1,73 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.project.book.search-books.068 -journeyIndex: 68 -type: project -subtype: book -journey: Search Books -ownerPackage: "@treeseed/admin" -summary: Search project books and metadata through content indexes; should not scan local fixture files in production workflows. -status: active -dependencies: - journeys: - - 65 - guarantees: - - guarantee.project.book.create-book.065 -actors: - allowed: - - project_manager - - project_contributor - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 65" -scene: - required: true - manifest: ./scenes/search-books.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/knowledge/books - componentContract: inline-form/search-panel service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.project.book.search-books.api -content: - required: true - verifierRefs: - - admin.project.book.search-books.content -audit: - required: true - verifierRefs: - - admin.project.book.search-books.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.project.book.search-books.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Search project books and metadata through content indexes; should not scan local fixture files in production workflows. diff --git a/guarantees/project/decision/create-note-on-decision.guarantee.yaml b/guarantees/project/decision/create-note-on-decision.guarantee.yaml deleted file mode 100644 index ef5cede4..00000000 --- a/guarantees/project/decision/create-note-on-decision.guarantee.yaml +++ /dev/null @@ -1,73 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.project.decision.create-note-on-decision.056 -journeyIndex: 56 -type: project -subtype: decision -journey: Create Note on Decision -ownerPackage: "@treeseed/admin" -summary: Attach notes to decisions using relatedDecisions or about frontmatter; should preserve why a decision was made. -status: active -dependencies: - journeys: - - 50 - guarantees: - - guarantee.project.proposal.vote-on-proposal.050 -actors: - allowed: - - project_manager - - project_contributor - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 50" -scene: - required: true - manifest: ./scenes/create-note-on-decision.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/work/decisions/seed-decision - componentContract: inline-form/search-panel service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.project.decision.create-note-on-decision.api -content: - required: true - verifierRefs: - - admin.project.decision.create-note-on-decision.content -audit: - required: true - verifierRefs: - - admin.project.decision.create-note-on-decision.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.project.decision.create-note-on-decision.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Attach notes to decisions using relatedDecisions or about frontmatter; should preserve why a decision was made. diff --git a/guarantees/project/decision/scenes/create-note-on-decision.scene.yaml b/guarantees/project/decision/scenes/create-note-on-decision.scene.yaml deleted file mode 100644 index 0307b378..00000000 --- a/guarantees/project/decision/scenes/create-note-on-decision.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: project.decision.create-note-on-decision.056 -title: Create Note on Decision -description: Scene scaffold for guarantee.project.decision.create-note-on-decision.056. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Create Note On Decision opens the canonical @treeseed/admin full page form workflow. - - Create Note On Decision exercises a service journey instead of only loading /app/work/decisions/seed-decision. - - Create Note On Decision records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: project.primary - kind: project -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Create Note on Decision - action: - goto: /app/work/decisions/seed-decision - expect: - urlIncludes: /app/work - - id: inspect-service-surface - title: Inspect Create Note on Decision service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/work -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/project/decision/scenes/search-decisions.scene.yaml b/guarantees/project/decision/scenes/search-decisions.scene.yaml deleted file mode 100644 index de488f27..00000000 --- a/guarantees/project/decision/scenes/search-decisions.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: project.decision.search-decisions.055 -title: Search Decisions -description: Scene scaffold for guarantee.project.decision.search-decisions.055. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Search Decisions opens the canonical @treeseed/admin dashboard read model workflow. - - Search Decisions exercises a service journey instead of only loading /app/work/decisions. - - Search Decisions records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: project.primary - kind: project -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Search Decisions - action: - goto: /app/work/decisions - expect: - urlIncludes: /app/work - - id: inspect-service-surface - title: Inspect Search Decisions service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/work -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/project/decision/search-decisions.guarantee.yaml b/guarantees/project/decision/search-decisions.guarantee.yaml deleted file mode 100644 index beac55dd..00000000 --- a/guarantees/project/decision/search-decisions.guarantee.yaml +++ /dev/null @@ -1,73 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.project.decision.search-decisions.055 -journeyIndex: 55 -type: project -subtype: decision -journey: Search Decisions -ownerPackage: "@treeseed/admin" -summary: Search accepted or rejected decisions created from proposal review; decisions gate acting mode and capacity-plan provenance. -status: active -dependencies: - journeys: - - 50 - guarantees: - - guarantee.project.proposal.vote-on-proposal.050 -actors: - allowed: - - project_manager - - project_contributor - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 50" -scene: - required: true - manifest: ./scenes/search-decisions.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/work/decisions - componentContract: inline-form/search-panel service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.project.decision.search-decisions.api -content: - required: true - verifierRefs: - - admin.project.decision.search-decisions.content -audit: - required: true - verifierRefs: - - admin.project.decision.search-decisions.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.project.decision.search-decisions.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Search accepted or rejected decisions created from proposal review; decisions gate acting mode and capacity-plan provenance. diff --git a/guarantees/project/knowledge/create-book-page.guarantee.yaml b/guarantees/project/knowledge/create-book-page.guarantee.yaml deleted file mode 100644 index cc4f431d..00000000 --- a/guarantees/project/knowledge/create-book-page.guarantee.yaml +++ /dev/null @@ -1,73 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.project.knowledge.create-book-page.069 -journeyIndex: 69 -type: project -subtype: knowledge -journey: Create Book Page -ownerPackage: "@treeseed/admin" -summary: Create a knowledge page inside a book with required frontmatter and links; agent artifacts must be real Knowledge Hub content. -status: active -dependencies: - journeys: - - 65 - guarantees: - - guarantee.project.book.create-book.065 -actors: - allowed: - - project_manager - - project_contributor - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 65" -scene: - required: true - manifest: ./scenes/create-book-page.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/projects/project-visual-audit-project/knowledge - componentContract: full-page-form service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.project.knowledge.create-book-page.api -content: - required: true - verifierRefs: - - admin.project.knowledge.create-book-page.content -audit: - required: true - verifierRefs: - - admin.project.knowledge.create-book-page.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.project.knowledge.create-book-page.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Create a knowledge page inside a book with required frontmatter and links; agent artifacts must be real Knowledge Hub content. diff --git a/guarantees/project/knowledge/delete-book-page.guarantee.yaml b/guarantees/project/knowledge/delete-book-page.guarantee.yaml deleted file mode 100644 index 90208a59..00000000 --- a/guarantees/project/knowledge/delete-book-page.guarantee.yaml +++ /dev/null @@ -1,73 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.project.knowledge.delete-book-page.072 -journeyIndex: 72 -type: project -subtype: knowledge -journey: Delete Book Page -ownerPackage: "@treeseed/admin" -summary: Delete or archive a page with backlinks and book index updates; direct filesystem deletion is not appropriate. -status: active -dependencies: - journeys: - - 69 - guarantees: - - guarantee.project.knowledge.create-book-page.069 -actors: - allowed: - - project_manager - - project_contributor - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 69" -scene: - required: true - manifest: ./scenes/delete-book-page.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/projects/project-visual-audit-project/knowledge/seed-page - componentContract: destructive-confirmation service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.project.knowledge.delete-book-page.api -content: - required: true - verifierRefs: - - admin.project.knowledge.delete-book-page.content -audit: - required: true - verifierRefs: - - admin.project.knowledge.delete-book-page.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.project.knowledge.delete-book-page.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Delete or archive a page with backlinks and book index updates; direct filesystem deletion is not appropriate. diff --git a/guarantees/project/knowledge/edit-book-page.guarantee.yaml b/guarantees/project/knowledge/edit-book-page.guarantee.yaml deleted file mode 100644 index 9d556ff6..00000000 --- a/guarantees/project/knowledge/edit-book-page.guarantee.yaml +++ /dev/null @@ -1,73 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.project.knowledge.edit-book-page.071 -journeyIndex: 71 -type: project -subtype: knowledge -journey: Edit Book Page -ownerPackage: "@treeseed/admin" -summary: Edit page content through TreeDX with validation and provenance; should preserve links to questions objectives proposals or decisions. -status: active -dependencies: - journeys: - - 69 - guarantees: - - guarantee.project.knowledge.create-book-page.069 -actors: - allowed: - - project_manager - - project_contributor - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 69" -scene: - required: true - manifest: ./scenes/edit-book-page.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/projects/project-visual-audit-project/knowledge/seed-page - componentContract: full-page-form service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.project.knowledge.edit-book-page.api -content: - required: true - verifierRefs: - - admin.project.knowledge.edit-book-page.content -audit: - required: true - verifierRefs: - - admin.project.knowledge.edit-book-page.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.project.knowledge.edit-book-page.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Edit page content through TreeDX with validation and provenance; should preserve links to questions objectives proposals or decisions. diff --git a/guarantees/project/knowledge/review-backlinks.guarantee.yaml b/guarantees/project/knowledge/review-backlinks.guarantee.yaml deleted file mode 100644 index 30fc7b67..00000000 --- a/guarantees/project/knowledge/review-backlinks.guarantee.yaml +++ /dev/null @@ -1,83 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.project.knowledge.review-backlinks.091 -journeyIndex: 91 -type: project -subtype: knowledge -journey: Review Backlinks -ownerPackage: "@treeseed/admin" -summary: Inspect relationships among questions objectives proposals decisions notes books and pages before delete/archive operations. -status: active -dependencies: - journeys: - - 38 - - 43 - - 48 - - 50 - - 65 - - 69 - guarantees: - - guarantee.project.question.ask-question.038 - - guarantee.project.objective.create-objective.043 - - guarantee.project.proposal.create-proposal.048 - - guarantee.project.proposal.vote-on-proposal.050 - - guarantee.project.book.create-book.065 - - guarantee.project.knowledge.create-book-page.069 -actors: - allowed: - - project_manager - - project_contributor - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 38, 43, 48, 50, 65, 69" -scene: - required: true - manifest: ./scenes/review-backlinks.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/projects/project-visual-audit-project/knowledge/seed-page - componentContract: dashboard/read-model service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.project.knowledge.review-backlinks.api -content: - required: true - verifierRefs: - - admin.project.knowledge.review-backlinks.content -audit: - required: true - verifierRefs: - - admin.project.knowledge.review-backlinks.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.project.knowledge.review-backlinks.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Inspect relationships among questions objectives proposals decisions notes books and pages before delete/archive operations. diff --git a/guarantees/project/knowledge/scenes/create-book-page.scene.yaml b/guarantees/project/knowledge/scenes/create-book-page.scene.yaml deleted file mode 100644 index 0ae18b31..00000000 --- a/guarantees/project/knowledge/scenes/create-book-page.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: project.knowledge.create-book-page.069 -title: Create Book Page -description: Scene scaffold for guarantee.project.knowledge.create-book-page.069. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Create Book Page opens the canonical @treeseed/admin full page form workflow. - - Create Book Page exercises a service journey instead of only loading /app/projects/project-visual-audit-project/knowledge. - - Create Book Page records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: project.primary - kind: project -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Create Book Page - action: - goto: /app/projects/project-visual-audit-project/knowledge - expect: - urlIncludes: /app/projects - - id: inspect-service-surface - title: Inspect Create Book Page service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/projects -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/project/knowledge/scenes/delete-book-page.scene.yaml b/guarantees/project/knowledge/scenes/delete-book-page.scene.yaml deleted file mode 100644 index 86a4053f..00000000 --- a/guarantees/project/knowledge/scenes/delete-book-page.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: project.knowledge.delete-book-page.072 -title: Delete Book Page -description: Scene scaffold for guarantee.project.knowledge.delete-book-page.072. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Delete Book Page opens the canonical @treeseed/admin destructive confirmation workflow. - - Delete Book Page exercises a service journey instead of only loading /app/projects/project-visual-audit-project/knowledge/seed-page. - - Delete Book Page records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: project.primary - kind: project -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Delete Book Page - action: - goto: /app/projects/project-visual-audit-project/knowledge/seed-page - expect: - urlIncludes: /app/projects - - id: inspect-service-surface - title: Inspect Delete Book Page service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/projects -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/project/knowledge/scenes/edit-book-page.scene.yaml b/guarantees/project/knowledge/scenes/edit-book-page.scene.yaml deleted file mode 100644 index 8ac14006..00000000 --- a/guarantees/project/knowledge/scenes/edit-book-page.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: project.knowledge.edit-book-page.071 -title: Edit Book Page -description: Scene scaffold for guarantee.project.knowledge.edit-book-page.071. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Edit Book Page opens the canonical @treeseed/admin full page form workflow. - - Edit Book Page exercises a service journey instead of only loading /app/projects/project-visual-audit-project/knowledge/seed-page. - - Edit Book Page records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: project.primary - kind: project -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Edit Book Page - action: - goto: /app/projects/project-visual-audit-project/knowledge/seed-page - expect: - urlIncludes: /app/projects - - id: inspect-service-surface - title: Inspect Edit Book Page service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/projects -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/project/knowledge/scenes/review-backlinks.scene.yaml b/guarantees/project/knowledge/scenes/review-backlinks.scene.yaml deleted file mode 100644 index 2f13dae6..00000000 --- a/guarantees/project/knowledge/scenes/review-backlinks.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: project.knowledge.review-backlinks.091 -title: Review Backlinks -description: Scene scaffold for guarantee.project.knowledge.review-backlinks.091. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Review Backlinks opens the canonical @treeseed/admin dashboard read model workflow. - - Review Backlinks exercises a service journey instead of only loading /app/projects/project-visual-audit-project/knowledge/seed-page. - - Review Backlinks records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: project.primary - kind: project -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Review Backlinks - action: - goto: /app/projects/project-visual-audit-project/knowledge/seed-page - expect: - urlIncludes: /app/projects - - id: inspect-service-surface - title: Inspect Review Backlinks service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/projects -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/project/library/download-library.guarantee.yaml b/guarantees/project/library/download-library.guarantee.yaml deleted file mode 100644 index f81e9aef..00000000 --- a/guarantees/project/library/download-library.guarantee.yaml +++ /dev/null @@ -1,73 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.project.library.download-library.073 -journeyIndex: 73 -type: project -subtype: library -journey: Download Library -ownerPackage: "@treeseed/admin" -summary: Export the project knowledge library from TreeDX-backed content; should honor project authorization and may need dependencies on books pages and library indexing. -status: active -dependencies: - journeys: - - 69 - guarantees: - - guarantee.project.knowledge.create-book-page.069 -actors: - allowed: - - project_manager - - project_contributor - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 69" -scene: - required: true - manifest: ./scenes/download-library.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/knowledge - componentContract: inline-form/search-panel service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.project.library.download-library.api -content: - required: true - verifierRefs: - - admin.project.library.download-library.content -audit: - required: true - verifierRefs: - - admin.project.library.download-library.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.project.library.download-library.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Export the project knowledge library from TreeDX-backed content; should honor project authorization and may need dependencies on books pages and library indexing. diff --git a/guarantees/project/library/rebuild-library-index.guarantee.yaml b/guarantees/project/library/rebuild-library-index.guarantee.yaml deleted file mode 100644 index 14df61d3..00000000 --- a/guarantees/project/library/rebuild-library-index.guarantee.yaml +++ /dev/null @@ -1,75 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.project.library.rebuild-library-index.090 -journeyIndex: 90 -type: project -subtype: library -journey: Rebuild Library Index -ownerPackage: "@treeseed/admin" -summary: Refresh searchable project content indexes after book page or note changes; supports search and export journeys without filesystem scans. -status: active -dependencies: - journeys: - - 65 - - 69 - guarantees: - - guarantee.project.book.create-book.065 - - guarantee.project.knowledge.create-book-page.069 -actors: - allowed: - - project_manager - - project_contributor - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 65, 69" -scene: - required: true - manifest: ./scenes/rebuild-library-index.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/knowledge - componentContract: record-action service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.project.library.rebuild-library-index.api -content: - required: true - verifierRefs: - - admin.project.library.rebuild-library-index.content -audit: - required: true - verifierRefs: - - admin.project.library.rebuild-library-index.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.project.library.rebuild-library-index.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Refresh searchable project content indexes after book page or note changes; supports search and export journeys without filesystem scans. diff --git a/guarantees/project/library/scenes/download-library.scene.yaml b/guarantees/project/library/scenes/download-library.scene.yaml deleted file mode 100644 index 6a1eeedc..00000000 --- a/guarantees/project/library/scenes/download-library.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: project.library.download-library.073 -title: Download Library -description: Scene scaffold for guarantee.project.library.download-library.073. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Download Library opens the canonical @treeseed/admin record action workflow. - - Download Library exercises a service journey instead of only loading /app/knowledge. - - Download Library records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: project.primary - kind: project -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Download Library - action: - goto: /app/knowledge - expect: - urlIncludes: /app/knowledge - - id: inspect-service-surface - title: Inspect Download Library service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/knowledge -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/project/library/scenes/rebuild-library-index.scene.yaml b/guarantees/project/library/scenes/rebuild-library-index.scene.yaml deleted file mode 100644 index 23162165..00000000 --- a/guarantees/project/library/scenes/rebuild-library-index.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: project.library.rebuild-library-index.090 -title: Rebuild Library Index -description: Scene scaffold for guarantee.project.library.rebuild-library-index.090. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Rebuild Library Index opens the canonical @treeseed/admin dashboard read model workflow. - - Rebuild Library Index exercises a service journey instead of only loading /app/knowledge. - - Rebuild Library Index records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: project.primary - kind: project -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Rebuild Library Index - action: - goto: /app/knowledge - expect: - urlIncludes: /app/knowledge - - id: inspect-service-surface - title: Inspect Rebuild Library Index service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/knowledge -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/project/objective/create-note-on-objective.guarantee.yaml b/guarantees/project/objective/create-note-on-objective.guarantee.yaml deleted file mode 100644 index 2c6836a0..00000000 --- a/guarantees/project/objective/create-note-on-objective.guarantee.yaml +++ /dev/null @@ -1,73 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.project.objective.create-note-on-objective.047 -journeyIndex: 47 -type: project -subtype: objective -journey: Create Note on Objective -ownerPackage: "@treeseed/admin" -summary: Create a linked note with relatedObjectives or about frontmatter; this is a canonical planning artifact for workdays. -status: active -dependencies: - journeys: - - 43 - guarantees: - - guarantee.project.objective.create-objective.043 -actors: - allowed: - - project_manager - - project_contributor - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 43" -scene: - required: true - manifest: ./scenes/create-note-on-objective.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/work/objectives/seed-objective - componentContract: inline-form/search-panel service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.project.objective.create-note-on-objective.api -content: - required: true - verifierRefs: - - admin.project.objective.create-note-on-objective.content -audit: - required: true - verifierRefs: - - admin.project.objective.create-note-on-objective.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.project.objective.create-note-on-objective.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Create a linked note with relatedObjectives or about frontmatter; this is a canonical planning artifact for workdays. diff --git a/guarantees/project/objective/create-objective.guarantee.yaml b/guarantees/project/objective/create-objective.guarantee.yaml deleted file mode 100644 index 2212d5e7..00000000 --- a/guarantees/project/objective/create-objective.guarantee.yaml +++ /dev/null @@ -1,73 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.project.objective.create-objective.043 -journeyIndex: 43 -type: project -subtype: objective -journey: Create Objective -ownerPackage: "@treeseed/admin" -summary: Create an objective in the project content model through TreeDX; objectives drive planning work and should be eligible for agent context. -status: active -dependencies: - journeys: - - 32 - guarantees: - - guarantee.project.project.create-project.032 -actors: - allowed: - - project_manager - - project_contributor - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 32" -scene: - required: true - manifest: ./scenes/create-objective.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/work/objectives/new - componentContract: full-page-form service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.project.objective.create-objective.api -content: - required: true - verifierRefs: - - admin.project.objective.create-objective.content -audit: - required: true - verifierRefs: - - admin.project.objective.create-objective.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.project.objective.create-objective.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Create an objective in the project content model through TreeDX; objectives drive planning work and should be eligible for agent context. diff --git a/guarantees/project/objective/delete-objective.guarantee.yaml b/guarantees/project/objective/delete-objective.guarantee.yaml deleted file mode 100644 index 04d166f9..00000000 --- a/guarantees/project/objective/delete-objective.guarantee.yaml +++ /dev/null @@ -1,73 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.project.objective.delete-objective.045 -journeyIndex: 45 -type: project -subtype: objective -journey: Delete Objective -ownerPackage: "@treeseed/admin" -summary: Delete or archive an objective with dependency checks; should not leave orphaned proposals notes or decisions. -status: active -dependencies: - journeys: - - 43 - guarantees: - - guarantee.project.objective.create-objective.043 -actors: - allowed: - - project_manager - - project_contributor - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 43" -scene: - required: true - manifest: ./scenes/delete-objective.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/work/objectives/seed-objective - componentContract: destructive-confirmation service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.project.objective.delete-objective.api -content: - required: true - verifierRefs: - - admin.project.objective.delete-objective.content -audit: - required: true - verifierRefs: - - admin.project.objective.delete-objective.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.project.objective.delete-objective.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Delete or archive an objective with dependency checks; should not leave orphaned proposals notes or decisions. diff --git a/guarantees/project/objective/edit-objective.guarantee.yaml b/guarantees/project/objective/edit-objective.guarantee.yaml deleted file mode 100644 index 578d50a2..00000000 --- a/guarantees/project/objective/edit-objective.guarantee.yaml +++ /dev/null @@ -1,73 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.project.objective.edit-objective.044 -journeyIndex: 44 -type: project -subtype: objective -journey: Edit Objective -ownerPackage: "@treeseed/admin" -summary: Edit objective fields and status while preserving links to proposals decisions notes and workday artifacts. -status: active -dependencies: - journeys: - - 43 - guarantees: - - guarantee.project.objective.create-objective.043 -actors: - allowed: - - project_manager - - project_contributor - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 43" -scene: - required: true - manifest: ./scenes/edit-objective.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/work/objectives/seed-objective/edit - componentContract: full-page-form service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.project.objective.edit-objective.api -content: - required: true - verifierRefs: - - admin.project.objective.edit-objective.content -audit: - required: true - verifierRefs: - - admin.project.objective.edit-objective.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.project.objective.edit-objective.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Edit objective fields and status while preserving links to proposals decisions notes and workday artifacts. diff --git a/guarantees/project/objective/scenes/create-note-on-objective.scene.yaml b/guarantees/project/objective/scenes/create-note-on-objective.scene.yaml deleted file mode 100644 index e5451a47..00000000 --- a/guarantees/project/objective/scenes/create-note-on-objective.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: project.objective.create-note-on-objective.047 -title: Create Note on Objective -description: Scene scaffold for guarantee.project.objective.create-note-on-objective.047. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Create Note On Objective opens the canonical @treeseed/admin full page form workflow. - - Create Note On Objective exercises a service journey instead of only loading /app/work/objectives/seed-objective. - - Create Note On Objective records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: project.primary - kind: project -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Create Note on Objective - action: - goto: /app/work/objectives/seed-objective - expect: - urlIncludes: /app/work - - id: inspect-service-surface - title: Inspect Create Note on Objective service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/work -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/project/objective/scenes/create-objective.scene.yaml b/guarantees/project/objective/scenes/create-objective.scene.yaml deleted file mode 100644 index 48a6834d..00000000 --- a/guarantees/project/objective/scenes/create-objective.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: project.objective.create-objective.043 -title: Create Objective -description: Scene scaffold for guarantee.project.objective.create-objective.043. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Create Objective opens the canonical @treeseed/admin full page form workflow. - - Create Objective exercises a service journey instead of only loading /app/work/objectives/new. - - Create Objective records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: project.primary - kind: project -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Create Objective - action: - goto: /app/work/objectives/new - expect: - urlIncludes: /app/work - - id: inspect-service-surface - title: Inspect Create Objective service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/work -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/project/objective/scenes/delete-objective.scene.yaml b/guarantees/project/objective/scenes/delete-objective.scene.yaml deleted file mode 100644 index e3292222..00000000 --- a/guarantees/project/objective/scenes/delete-objective.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: project.objective.delete-objective.045 -title: Delete Objective -description: Scene scaffold for guarantee.project.objective.delete-objective.045. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Delete Objective opens the canonical @treeseed/admin destructive confirmation workflow. - - Delete Objective exercises a service journey instead of only loading /app/work/objectives/seed-objective. - - Delete Objective records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: project.primary - kind: project -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Delete Objective - action: - goto: /app/work/objectives/seed-objective - expect: - urlIncludes: /app/work - - id: inspect-service-surface - title: Inspect Delete Objective service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/work -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/project/objective/scenes/edit-objective.scene.yaml b/guarantees/project/objective/scenes/edit-objective.scene.yaml deleted file mode 100644 index 2bc060fd..00000000 --- a/guarantees/project/objective/scenes/edit-objective.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: project.objective.edit-objective.044 -title: Edit Objective -description: Scene scaffold for guarantee.project.objective.edit-objective.044. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Edit Objective opens the canonical @treeseed/admin full page form workflow. - - Edit Objective exercises a service journey instead of only loading /app/work/objectives/seed-objective/edit. - - Edit Objective records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: project.primary - kind: project -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Edit Objective - action: - goto: /app/work/objectives/seed-objective/edit - expect: - urlIncludes: /app/work - - id: inspect-service-surface - title: Inspect Edit Objective service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/work -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/project/objective/scenes/search-objectives.scene.yaml b/guarantees/project/objective/scenes/search-objectives.scene.yaml deleted file mode 100644 index 1745e52d..00000000 --- a/guarantees/project/objective/scenes/search-objectives.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: project.objective.search-objectives.046 -title: Search Objectives -description: Scene scaffold for guarantee.project.objective.search-objectives.046. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Search Objectives opens the canonical @treeseed/admin dashboard read model workflow. - - Search Objectives exercises a service journey instead of only loading /app/work/objectives. - - Search Objectives records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: project.primary - kind: project -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Search Objectives - action: - goto: /app/work/objectives - expect: - urlIncludes: /app/work - - id: inspect-service-surface - title: Inspect Search Objectives service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/work -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/project/objective/search-objectives.guarantee.yaml b/guarantees/project/objective/search-objectives.guarantee.yaml deleted file mode 100644 index bd5a9be0..00000000 --- a/guarantees/project/objective/search-objectives.guarantee.yaml +++ /dev/null @@ -1,73 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.project.objective.search-objectives.046 -journeyIndex: 46 -type: project -subtype: objective -journey: Search Objectives -ownerPackage: "@treeseed/admin" -summary: Search objectives by status ownership tags and related content; should use project-scoped content indexes rather than filesystem scans. -status: active -dependencies: - journeys: - - 43 - guarantees: - - guarantee.project.objective.create-objective.043 -actors: - allowed: - - project_manager - - project_contributor - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 43" -scene: - required: true - manifest: ./scenes/search-objectives.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/work/objectives - componentContract: inline-form/search-panel service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.project.objective.search-objectives.api -content: - required: true - verifierRefs: - - admin.project.objective.search-objectives.content -audit: - required: true - verifierRefs: - - admin.project.objective.search-objectives.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.project.objective.search-objectives.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Search objectives by status ownership tags and related content; should use project-scoped content indexes rather than filesystem scans. diff --git a/guarantees/project/project/create-project.guarantee.yaml b/guarantees/project/project/create-project.guarantee.yaml deleted file mode 100644 index e29dbc9c..00000000 --- a/guarantees/project/project/create-project.guarantee.yaml +++ /dev/null @@ -1,73 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.project.project.create-project.032 -journeyIndex: 32 -type: project -subtype: project -journey: Create Project -ownerPackage: "@treeseed/admin" -summary: Create a Treeseed project owned by a team with content model and TreeDX routing metadata; should not depend on local package checkout state. -status: active -dependencies: - journeys: - - 4 - guarantees: - - guarantee.user.auth.user-login.004 -actors: - allowed: - - project_manager - - project_contributor - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 4" -scene: - required: true - manifest: ./scenes/create-project.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/projects/new - componentContract: full-page-form service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.project.project.create-project.api -content: - required: false - verifierRefs: - - admin.project.project.create-project.content -audit: - required: true - verifierRefs: - - admin.project.project.create-project.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.project.project.create-project.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Create a Treeseed project owned by a team with content model and TreeDX routing metadata; should not depend on local package checkout state. diff --git a/guarantees/project/project/destroy-project.guarantee.yaml b/guarantees/project/project/destroy-project.guarantee.yaml deleted file mode 100644 index 122b175e..00000000 --- a/guarantees/project/project/destroy-project.guarantee.yaml +++ /dev/null @@ -1,73 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.project.project.destroy-project.036 -journeyIndex: 36 -type: project -subtype: project -journey: Destroy Project -ownerPackage: "@treeseed/admin" -summary: Destroy or archive a project with content retention provider assignment cleanup and TreeDX authorization cleanup; requires exact-state drift handling where infrastructure exists. -status: active -dependencies: - journeys: - - 32 - guarantees: - - guarantee.project.project.create-project.032 -actors: - allowed: - - project_manager - - project_contributor - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 32" -scene: - required: true - manifest: ./scenes/destroy-project.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/projects/project-visual-audit-project/delete - componentContract: destructive-confirmation service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.project.project.destroy-project.api -content: - required: false - verifierRefs: - - admin.project.project.destroy-project.content -audit: - required: true - verifierRefs: - - admin.project.project.destroy-project.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.project.project.destroy-project.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Destroy or archive a project with content retention provider assignment cleanup and TreeDX authorization cleanup; requires exact-state drift handling where infrastructure exists. diff --git a/guarantees/project/project/edit-project-settings.guarantee.yaml b/guarantees/project/project/edit-project-settings.guarantee.yaml deleted file mode 100644 index 92b6b512..00000000 --- a/guarantees/project/project/edit-project-settings.guarantee.yaml +++ /dev/null @@ -1,73 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.project.project.edit-project-settings.033 -journeyIndex: 33 -type: project -subtype: project -journey: Edit Project Settings -ownerPackage: "@treeseed/admin" -summary: Update project metadata agents and content settings through API models; project manifests may inform defaults but runtime edits need durable records. -status: active -dependencies: - journeys: - - 32 - guarantees: - - guarantee.project.project.create-project.032 -actors: - allowed: - - project_manager - - project_contributor - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 32" -scene: - required: true - manifest: ./scenes/edit-project-settings.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/projects/project-visual-audit-project/settings - componentContract: full-page-form service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.project.project.edit-project-settings.api -content: - required: false - verifierRefs: - - admin.project.project.edit-project-settings.content -audit: - required: true - verifierRefs: - - admin.project.project.edit-project-settings.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.project.project.edit-project-settings.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Update project metadata agents and content settings through API models; project manifests may inform defaults but runtime edits need durable records. diff --git a/guarantees/project/project/monitor-project.guarantee.yaml b/guarantees/project/project/monitor-project.guarantee.yaml deleted file mode 100644 index 030d2c34..00000000 --- a/guarantees/project/project/monitor-project.guarantee.yaml +++ /dev/null @@ -1,73 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.project.project.monitor-project.035 -journeyIndex: 35 -type: project -subtype: project -journey: Monitor Project -ownerPackage: "@treeseed/admin" -summary: Show operational health for project workdays assignments content updates and hosted surfaces; needs trace links to API logs and TreeDX operations. -status: active -dependencies: - journeys: - - 32 - guarantees: - - guarantee.project.project.create-project.032 -actors: - allowed: - - project_manager - - project_contributor - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 32" -scene: - required: true - manifest: ./scenes/monitor-project.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/projects/seed-project - componentContract: dashboard/read-model service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.project.project.monitor-project.api -content: - required: false - verifierRefs: - - admin.project.project.monitor-project.content -audit: - required: true - verifierRefs: - - admin.project.project.monitor-project.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.project.project.monitor-project.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Show operational health for project workdays assignments content updates and hosted surfaces; needs trace links to API logs and TreeDX operations. diff --git a/guarantees/project/project/scenes/create-project.scene.yaml b/guarantees/project/project/scenes/create-project.scene.yaml deleted file mode 100644 index b0ecd1d0..00000000 --- a/guarantees/project/project/scenes/create-project.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: project.project.create-project.032 -title: Create Project -description: Scene scaffold for guarantee.project.project.create-project.032. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Create Project opens the canonical @treeseed/admin full page form workflow. - - Create Project exercises a service journey instead of only loading /app/projects/new. - - Create Project records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: project.primary - kind: project -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Create Project - action: - goto: /app/projects/new - expect: - urlIncludes: /app/projects - - id: inspect-service-surface - title: Inspect Create Project service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/projects -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/project/project/scenes/destroy-project.scene.yaml b/guarantees/project/project/scenes/destroy-project.scene.yaml deleted file mode 100644 index e52c2426..00000000 --- a/guarantees/project/project/scenes/destroy-project.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: project.project.destroy-project.036 -title: Destroy Project -description: Scene scaffold for guarantee.project.project.destroy-project.036. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Destroy Project opens the canonical @treeseed/admin destructive confirmation workflow. - - Destroy Project exercises a service journey instead of only loading /app/projects/project-visual-audit-project/delete. - - Destroy Project records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: project.primary - kind: project -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Destroy Project - action: - goto: /app/projects/project-visual-audit-project/delete - expect: - urlIncludes: /app/projects - - id: inspect-service-surface - title: Inspect Destroy Project service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/projects -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/project/project/scenes/edit-project-settings.scene.yaml b/guarantees/project/project/scenes/edit-project-settings.scene.yaml deleted file mode 100644 index 1bc7e5ac..00000000 --- a/guarantees/project/project/scenes/edit-project-settings.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: project.project.edit-project-settings.033 -title: Edit Project Settings -description: Scene scaffold for guarantee.project.project.edit-project-settings.033. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Edit Project Settings opens the canonical @treeseed/admin full page form workflow. - - Edit Project Settings exercises a service journey instead of only loading /app/projects/project-visual-audit-project/settings. - - Edit Project Settings records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: project.primary - kind: project -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Edit Project Settings - action: - goto: /app/projects/project-visual-audit-project/settings - expect: - urlIncludes: /app/projects - - id: inspect-service-surface - title: Inspect Edit Project Settings service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/projects -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/project/project/scenes/monitor-project.scene.yaml b/guarantees/project/project/scenes/monitor-project.scene.yaml deleted file mode 100644 index fbc228bd..00000000 --- a/guarantees/project/project/scenes/monitor-project.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: project.project.monitor-project.035 -title: Monitor Project -description: Scene scaffold for guarantee.project.project.monitor-project.035. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Monitor Project opens the canonical @treeseed/admin record operations workflow. - - Monitor Project exercises a service journey instead of only loading /app/projects/seed-project. - - Monitor Project records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: project.primary - kind: project -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Monitor Project - action: - goto: /app/projects/seed-project - expect: - urlIncludes: /app/projects - - id: inspect-service-surface - title: Inspect Monitor Project service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/projects -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/project/project/scenes/view-project-profile.scene.yaml b/guarantees/project/project/scenes/view-project-profile.scene.yaml deleted file mode 100644 index 3c77f4fb..00000000 --- a/guarantees/project/project/scenes/view-project-profile.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: project.project.view-project-profile.034 -title: View Project Profile -description: Scene scaffold for guarantee.project.project.view-project-profile.034. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - View Project Profile opens the canonical @treeseed/admin dashboard read model workflow. - - View Project Profile exercises a service journey instead of only loading /app/projects/seed-project. - - View Project Profile records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: project.primary - kind: project -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open View Project Profile - action: - goto: /app/projects/seed-project - expect: - urlIncludes: /app/projects - - id: inspect-service-surface - title: Inspect View Project Profile service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/projects -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/project/project/view-project-profile.guarantee.yaml b/guarantees/project/project/view-project-profile.guarantee.yaml deleted file mode 100644 index b46849e6..00000000 --- a/guarantees/project/project/view-project-profile.guarantee.yaml +++ /dev/null @@ -1,73 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.project.project.view-project-profile.034 -journeyIndex: 34 -type: project -subtype: project -journey: View Project Profile -ownerPackage: "@treeseed/admin" -summary: Present project overview including agents objectives decisions content and capacity posture; should aggregate API and TreeDX-backed content references. -status: active -dependencies: - journeys: - - 32 - guarantees: - - guarantee.project.project.create-project.032 -actors: - allowed: - - project_manager - - project_contributor - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 32" -scene: - required: true - manifest: ./scenes/view-project-profile.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/projects/seed-project - componentContract: dashboard/read-model service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.project.project.view-project-profile.api -content: - required: false - verifierRefs: - - admin.project.project.view-project-profile.content -audit: - required: true - verifierRefs: - - admin.project.project.view-project-profile.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.project.project.view-project-profile.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Present project overview including agents objectives decisions content and capacity posture; should aggregate API and TreeDX-backed content references. diff --git a/guarantees/project/proposal/create-note-on-proposal.guarantee.yaml b/guarantees/project/proposal/create-note-on-proposal.guarantee.yaml deleted file mode 100644 index ef377cf8..00000000 --- a/guarantees/project/proposal/create-note-on-proposal.guarantee.yaml +++ /dev/null @@ -1,73 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.project.proposal.create-note-on-proposal.054 -journeyIndex: 54 -type: project -subtype: proposal -journey: Create Note on Proposal -ownerPackage: "@treeseed/admin" -summary: Create linked proposal commentary with relatedProposals frontmatter; useful for reviews estimates and implementation notes. -status: active -dependencies: - journeys: - - 48 - guarantees: - - guarantee.project.proposal.create-proposal.048 -actors: - allowed: - - project_manager - - project_contributor - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 48" -scene: - required: true - manifest: ./scenes/create-note-on-proposal.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/work/proposals/seed-proposal - componentContract: inline-form/search-panel service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.project.proposal.create-note-on-proposal.api -content: - required: true - verifierRefs: - - admin.project.proposal.create-note-on-proposal.content -audit: - required: true - verifierRefs: - - admin.project.proposal.create-note-on-proposal.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.project.proposal.create-note-on-proposal.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Create linked proposal commentary with relatedProposals frontmatter; useful for reviews estimates and implementation notes. diff --git a/guarantees/project/proposal/create-proposal.guarantee.yaml b/guarantees/project/proposal/create-proposal.guarantee.yaml deleted file mode 100644 index 3e3fdd8e..00000000 --- a/guarantees/project/proposal/create-proposal.guarantee.yaml +++ /dev/null @@ -1,73 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.project.proposal.create-proposal.048 -journeyIndex: 48 -type: project -subtype: proposal -journey: Create Proposal -ownerPackage: "@treeseed/admin" -summary: Create a project proposal tied to objectives or questions; proposals should be content model records and ready for review or voting. -status: active -dependencies: - journeys: - - 32 - guarantees: - - guarantee.project.project.create-project.032 -actors: - allowed: - - project_manager - - project_contributor - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 32" -scene: - required: true - manifest: ./scenes/create-proposal.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/work/proposals/new - componentContract: full-page-form service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.project.proposal.create-proposal.api -content: - required: true - verifierRefs: - - admin.project.proposal.create-proposal.content -audit: - required: true - verifierRefs: - - admin.project.proposal.create-proposal.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.project.proposal.create-proposal.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Create a project proposal tied to objectives or questions; proposals should be content model records and ready for review or voting. diff --git a/guarantees/project/proposal/delete-proposal.guarantee.yaml b/guarantees/project/proposal/delete-proposal.guarantee.yaml deleted file mode 100644 index 7527161f..00000000 --- a/guarantees/project/proposal/delete-proposal.guarantee.yaml +++ /dev/null @@ -1,73 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.project.proposal.delete-proposal.051 -journeyIndex: 51 -type: project -subtype: proposal -journey: Delete Proposal -ownerPackage: "@treeseed/admin" -summary: Delete or archive proposals only after checking votes decisions and linked notes; destructive operations need audit trails. -status: active -dependencies: - journeys: - - 48 - guarantees: - - guarantee.project.proposal.create-proposal.048 -actors: - allowed: - - project_manager - - project_contributor - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 48" -scene: - required: true - manifest: ./scenes/delete-proposal.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/work/proposals/seed-proposal - componentContract: destructive-confirmation service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.project.proposal.delete-proposal.api -content: - required: true - verifierRefs: - - admin.project.proposal.delete-proposal.content -audit: - required: true - verifierRefs: - - admin.project.proposal.delete-proposal.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.project.proposal.delete-proposal.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Delete or archive proposals only after checking votes decisions and linked notes; destructive operations need audit trails. diff --git a/guarantees/project/proposal/edit-proposal.guarantee.yaml b/guarantees/project/proposal/edit-proposal.guarantee.yaml deleted file mode 100644 index 0a575881..00000000 --- a/guarantees/project/proposal/edit-proposal.guarantee.yaml +++ /dev/null @@ -1,73 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.project.proposal.edit-proposal.049 -journeyIndex: 49 -type: project -subtype: proposal -journey: Edit Proposal -ownerPackage: "@treeseed/admin" -summary: Edit proposal content and readiness state with provenance; changes should remain visible to proposal inbox and workday planning. -status: active -dependencies: - journeys: - - 48 - guarantees: - - guarantee.project.proposal.create-proposal.048 -actors: - allowed: - - project_manager - - project_contributor - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 48" -scene: - required: true - manifest: ./scenes/edit-proposal.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/work/proposals/seed-proposal/edit - componentContract: full-page-form service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.project.proposal.edit-proposal.api -content: - required: true - verifierRefs: - - admin.project.proposal.edit-proposal.content -audit: - required: true - verifierRefs: - - admin.project.proposal.edit-proposal.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.project.proposal.edit-proposal.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Edit proposal content and readiness state with provenance; changes should remain visible to proposal inbox and workday planning. diff --git a/guarantees/project/proposal/proposal-inbox.guarantee.yaml b/guarantees/project/proposal/proposal-inbox.guarantee.yaml deleted file mode 100644 index 35187cde..00000000 --- a/guarantees/project/proposal/proposal-inbox.guarantee.yaml +++ /dev/null @@ -1,73 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.project.proposal.proposal-inbox.053 -journeyIndex: 53 -type: project -subtype: proposal -journey: Proposal Inbox -ownerPackage: "@treeseed/admin" -summary: Review pending proposals estimates and readiness signals; this surface is central for turning planning output into approved decisions. -status: active -dependencies: - journeys: - - 48 - guarantees: - - guarantee.project.proposal.create-proposal.048 -actors: - allowed: - - project_manager - - project_contributor - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 48" -scene: - required: true - manifest: ./scenes/proposal-inbox.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/work/proposals - componentContract: dashboard/read-model service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.project.proposal.proposal-inbox.api -content: - required: true - verifierRefs: - - admin.project.proposal.proposal-inbox.content -audit: - required: true - verifierRefs: - - admin.project.proposal.proposal-inbox.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.project.proposal.proposal-inbox.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Review pending proposals estimates and readiness signals; this surface is central for turning planning output into approved decisions. diff --git a/guarantees/project/proposal/scenes/create-note-on-proposal.scene.yaml b/guarantees/project/proposal/scenes/create-note-on-proposal.scene.yaml deleted file mode 100644 index 052a0c2e..00000000 --- a/guarantees/project/proposal/scenes/create-note-on-proposal.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: project.proposal.create-note-on-proposal.054 -title: Create Note on Proposal -description: Scene scaffold for guarantee.project.proposal.create-note-on-proposal.054. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Create Note On Proposal opens the canonical @treeseed/admin full page form workflow. - - Create Note On Proposal exercises a service journey instead of only loading /app/work/proposals/seed-proposal. - - Create Note On Proposal records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: project.primary - kind: project -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Create Note on Proposal - action: - goto: /app/work/proposals/seed-proposal - expect: - urlIncludes: /app/work - - id: inspect-service-surface - title: Inspect Create Note on Proposal service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/work -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/project/proposal/scenes/create-proposal.scene.yaml b/guarantees/project/proposal/scenes/create-proposal.scene.yaml deleted file mode 100644 index 1745adf6..00000000 --- a/guarantees/project/proposal/scenes/create-proposal.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: project.proposal.create-proposal.048 -title: Create Proposal -description: Scene scaffold for guarantee.project.proposal.create-proposal.048. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Create Proposal opens the canonical @treeseed/admin full page form workflow. - - Create Proposal exercises a service journey instead of only loading /app/work/proposals/new. - - Create Proposal records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: project.primary - kind: project -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Create Proposal - action: - goto: /app/work/proposals/new - expect: - urlIncludes: /app/work - - id: inspect-service-surface - title: Inspect Create Proposal service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/work -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/project/proposal/scenes/delete-proposal.scene.yaml b/guarantees/project/proposal/scenes/delete-proposal.scene.yaml deleted file mode 100644 index d7637b9e..00000000 --- a/guarantees/project/proposal/scenes/delete-proposal.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: project.proposal.delete-proposal.051 -title: Delete Proposal -description: Scene scaffold for guarantee.project.proposal.delete-proposal.051. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Delete Proposal opens the canonical @treeseed/admin destructive confirmation workflow. - - Delete Proposal exercises a service journey instead of only loading /app/work/proposals/seed-proposal. - - Delete Proposal records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: project.primary - kind: project -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Delete Proposal - action: - goto: /app/work/proposals/seed-proposal - expect: - urlIncludes: /app/work - - id: inspect-service-surface - title: Inspect Delete Proposal service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/work -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/project/proposal/scenes/edit-proposal.scene.yaml b/guarantees/project/proposal/scenes/edit-proposal.scene.yaml deleted file mode 100644 index 8feee39b..00000000 --- a/guarantees/project/proposal/scenes/edit-proposal.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: project.proposal.edit-proposal.049 -title: Edit Proposal -description: Scene scaffold for guarantee.project.proposal.edit-proposal.049. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Edit Proposal opens the canonical @treeseed/admin full page form workflow. - - Edit Proposal exercises a service journey instead of only loading /app/work/proposals/seed-proposal/edit. - - Edit Proposal records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: project.primary - kind: project -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Edit Proposal - action: - goto: /app/work/proposals/seed-proposal/edit - expect: - urlIncludes: /app/work - - id: inspect-service-surface - title: Inspect Edit Proposal service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/work -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/project/proposal/scenes/proposal-inbox.scene.yaml b/guarantees/project/proposal/scenes/proposal-inbox.scene.yaml deleted file mode 100644 index 5cdc6b21..00000000 --- a/guarantees/project/proposal/scenes/proposal-inbox.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: project.proposal.proposal-inbox.053 -title: Proposal Inbox -description: Scene scaffold for guarantee.project.proposal.proposal-inbox.053. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Proposal Inbox opens the canonical @treeseed/admin dashboard read model workflow. - - Proposal Inbox exercises a service journey instead of only loading /app/work/proposals. - - Proposal Inbox records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: project.primary - kind: project -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Proposal Inbox - action: - goto: /app/work/proposals - expect: - urlIncludes: /app/work - - id: inspect-service-surface - title: Inspect Proposal Inbox service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/work -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/project/proposal/scenes/search-proposals.scene.yaml b/guarantees/project/proposal/scenes/search-proposals.scene.yaml deleted file mode 100644 index 08b62f1a..00000000 --- a/guarantees/project/proposal/scenes/search-proposals.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: project.proposal.search-proposals.052 -title: Search Proposals -description: Scene scaffold for guarantee.project.proposal.search-proposals.052. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Search Proposals opens the canonical @treeseed/admin dashboard read model workflow. - - Search Proposals exercises a service journey instead of only loading /app/work/proposals. - - Search Proposals records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: project.primary - kind: project -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Search Proposals - action: - goto: /app/work/proposals - expect: - urlIncludes: /app/work - - id: inspect-service-surface - title: Inspect Search Proposals service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/work -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/project/proposal/scenes/vote-on-proposal.scene.yaml b/guarantees/project/proposal/scenes/vote-on-proposal.scene.yaml deleted file mode 100644 index 807e77b5..00000000 --- a/guarantees/project/proposal/scenes/vote-on-proposal.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: project.proposal.vote-on-proposal.050 -title: Vote on Proposal -description: Scene scaffold for guarantee.project.proposal.vote-on-proposal.050. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Vote On Proposal opens the canonical @treeseed/admin record action workflow. - - Vote On Proposal exercises a service journey from the canonical proposal inbox. - - Vote On Proposal records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: project.primary - kind: project -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Vote on Proposal - action: - goto: /app/work/proposals - expect: - urlIncludes: /app/work - - id: inspect-service-surface - title: Inspect proposal voting service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/work -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/project/proposal/search-proposals.guarantee.yaml b/guarantees/project/proposal/search-proposals.guarantee.yaml deleted file mode 100644 index f4b02c96..00000000 --- a/guarantees/project/proposal/search-proposals.guarantee.yaml +++ /dev/null @@ -1,73 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.project.proposal.search-proposals.052 -journeyIndex: 52 -type: project -subtype: proposal -journey: Search Proposals -ownerPackage: "@treeseed/admin" -summary: Search proposals by state objective agent and decision status; should power planning dashboards and review workflows. -status: active -dependencies: - journeys: - - 48 - guarantees: - - guarantee.project.proposal.create-proposal.048 -actors: - allowed: - - project_manager - - project_contributor - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 48" -scene: - required: true - manifest: ./scenes/search-proposals.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/work/proposals - componentContract: inline-form/search-panel service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.project.proposal.search-proposals.api -content: - required: true - verifierRefs: - - admin.project.proposal.search-proposals.content -audit: - required: true - verifierRefs: - - admin.project.proposal.search-proposals.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.project.proposal.search-proposals.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Search proposals by state objective agent and decision status; should power planning dashboards and review workflows. diff --git a/guarantees/project/proposal/vote-on-proposal.guarantee.yaml b/guarantees/project/proposal/vote-on-proposal.guarantee.yaml deleted file mode 100644 index d0b6c9ed..00000000 --- a/guarantees/project/proposal/vote-on-proposal.guarantee.yaml +++ /dev/null @@ -1,73 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.project.proposal.vote-on-proposal.050 -journeyIndex: 50 -type: project -subtype: proposal -journey: Vote on Proposal -ownerPackage: "@treeseed/admin" -summary: Record review or approval decisions against proposals; approved decisions are required before acting mode can run. -status: active -dependencies: - journeys: - - 48 - guarantees: - - guarantee.project.proposal.create-proposal.048 -actors: - allowed: - - project_manager - - project_contributor - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 48" -scene: - required: true - manifest: ./scenes/vote-on-proposal.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/work/proposals - componentContract: inline-form/search-panel service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.project.proposal.vote-on-proposal.api -content: - required: true - verifierRefs: - - admin.project.proposal.vote-on-proposal.content -audit: - required: true - verifierRefs: - - admin.project.proposal.vote-on-proposal.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.project.proposal.vote-on-proposal.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Record review or approval decisions against proposals; approved decisions are required before acting mode can run. diff --git a/guarantees/project/question/answer-question.guarantee.yaml b/guarantees/project/question/answer-question.guarantee.yaml deleted file mode 100644 index 7af02013..00000000 --- a/guarantees/project/question/answer-question.guarantee.yaml +++ /dev/null @@ -1,73 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.project.question.answer-question.042 -journeyIndex: 42 -type: project -subtype: question -journey: Answer Question -ownerPackage: "@treeseed/admin" -summary: Create an answer or linked note with subject frontmatter; agent-generated answers must be traceable to execution and TreeDX context. -status: active -dependencies: - journeys: - - 38 - guarantees: - - guarantee.project.question.ask-question.038 -actors: - allowed: - - project_manager - - project_contributor - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 38" -scene: - required: true - manifest: ./scenes/answer-question.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/work/questions/seed-question - componentContract: inline-form/search-panel service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.project.question.answer-question.api -content: - required: true - verifierRefs: - - admin.project.question.answer-question.content -audit: - required: true - verifierRefs: - - admin.project.question.answer-question.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.project.question.answer-question.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Create an answer or linked note with subject frontmatter; agent-generated answers must be traceable to execution and TreeDX context. diff --git a/guarantees/project/question/ask-question.guarantee.yaml b/guarantees/project/question/ask-question.guarantee.yaml deleted file mode 100644 index 2250eec7..00000000 --- a/guarantees/project/question/ask-question.guarantee.yaml +++ /dev/null @@ -1,73 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.project.question.ask-question.038 -journeyIndex: 38 -type: project -subtype: question -journey: Ask Question -ownerPackage: "@treeseed/admin" -summary: Create a project question as Knowledge Hub content through TreeDX and SDK content models; direct local-content writes are not allowed for agent-facing work. -status: active -dependencies: - journeys: - - 32 - guarantees: - - guarantee.project.project.create-project.032 -actors: - allowed: - - project_manager - - project_contributor - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 32" -scene: - required: true - manifest: ./scenes/ask-question.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/work/questions/new - componentContract: full-page-form service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.project.question.ask-question.api -content: - required: true - verifierRefs: - - admin.project.question.ask-question.content -audit: - required: true - verifierRefs: - - admin.project.question.ask-question.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.project.question.ask-question.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Create a project question as Knowledge Hub content through TreeDX and SDK content models; direct local-content writes are not allowed for agent-facing work. diff --git a/guarantees/project/question/delete-question.guarantee.yaml b/guarantees/project/question/delete-question.guarantee.yaml deleted file mode 100644 index d9b0f7ed..00000000 --- a/guarantees/project/question/delete-question.guarantee.yaml +++ /dev/null @@ -1,73 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.project.question.delete-question.040 -journeyIndex: 40 -type: project -subtype: question -journey: Delete Question -ownerPackage: "@treeseed/admin" -summary: Delete or archive a question through TreeDX with relationship checks; should avoid breaking linked notes decisions and proposals. -status: active -dependencies: - journeys: - - 38 - guarantees: - - guarantee.project.question.ask-question.038 -actors: - allowed: - - project_manager - - project_contributor - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 38" -scene: - required: true - manifest: ./scenes/delete-question.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/work/questions/seed-question - componentContract: destructive-confirmation service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.project.question.delete-question.api -content: - required: true - verifierRefs: - - admin.project.question.delete-question.content -audit: - required: true - verifierRefs: - - admin.project.question.delete-question.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.project.question.delete-question.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Delete or archive a question through TreeDX with relationship checks; should avoid breaking linked notes decisions and proposals. diff --git a/guarantees/project/question/edit-question.guarantee.yaml b/guarantees/project/question/edit-question.guarantee.yaml deleted file mode 100644 index 9314dfa1..00000000 --- a/guarantees/project/question/edit-question.guarantee.yaml +++ /dev/null @@ -1,73 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.project.question.edit-question.039 -journeyIndex: 39 -type: project -subtype: question -journey: Edit Question -ownerPackage: "@treeseed/admin" -summary: Edit question content through TreeDX with provenance and validation; should preserve links to answers notes proposals and workday context. -status: active -dependencies: - journeys: - - 38 - guarantees: - - guarantee.project.question.ask-question.038 -actors: - allowed: - - project_manager - - project_contributor - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 38" -scene: - required: true - manifest: ./scenes/edit-question.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/work/questions/seed-question/edit - componentContract: full-page-form service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.project.question.edit-question.api -content: - required: true - verifierRefs: - - admin.project.question.edit-question.content -audit: - required: true - verifierRefs: - - admin.project.question.edit-question.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.project.question.edit-question.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Edit question content through TreeDX with provenance and validation; should preserve links to answers notes proposals and workday context. diff --git a/guarantees/project/question/scenes/answer-question.scene.yaml b/guarantees/project/question/scenes/answer-question.scene.yaml deleted file mode 100644 index f8b7baba..00000000 --- a/guarantees/project/question/scenes/answer-question.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: project.question.answer-question.042 -title: Answer Question -description: Scene scaffold for guarantee.project.question.answer-question.042. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Answer Question opens the canonical @treeseed/admin dashboard read model workflow. - - Answer Question exercises a service journey instead of only loading /app/work/questions/seed-question. - - Answer Question records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: project.primary - kind: project -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Answer Question - action: - goto: /app/work/questions/seed-question - expect: - urlIncludes: /app/work - - id: inspect-service-surface - title: Inspect Answer Question service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/work -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/project/question/scenes/ask-question.scene.yaml b/guarantees/project/question/scenes/ask-question.scene.yaml deleted file mode 100644 index c2cedf81..00000000 --- a/guarantees/project/question/scenes/ask-question.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: project.question.ask-question.038 -title: Ask Question -description: Scene scaffold for guarantee.project.question.ask-question.038. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Ask Question opens the canonical @treeseed/admin dashboard read model workflow. - - Ask Question exercises a service journey instead of only loading /app/work/questions/new. - - Ask Question records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: project.primary - kind: project -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Ask Question - action: - goto: /app/work/questions/new - expect: - urlIncludes: /app/work - - id: inspect-service-surface - title: Inspect Ask Question service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/work -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/project/question/scenes/delete-question.scene.yaml b/guarantees/project/question/scenes/delete-question.scene.yaml deleted file mode 100644 index cfbc23a0..00000000 --- a/guarantees/project/question/scenes/delete-question.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: project.question.delete-question.040 -title: Delete Question -description: Scene scaffold for guarantee.project.question.delete-question.040. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Delete Question opens the canonical @treeseed/admin destructive confirmation workflow. - - Delete Question exercises a service journey instead of only loading /app/work/questions/seed-question. - - Delete Question records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: project.primary - kind: project -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Delete Question - action: - goto: /app/work/questions/seed-question - expect: - urlIncludes: /app/work - - id: inspect-service-surface - title: Inspect Delete Question service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/work -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/project/question/scenes/edit-question.scene.yaml b/guarantees/project/question/scenes/edit-question.scene.yaml deleted file mode 100644 index 252c2c29..00000000 --- a/guarantees/project/question/scenes/edit-question.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: project.question.edit-question.039 -title: Edit Question -description: Scene scaffold for guarantee.project.question.edit-question.039. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Edit Question opens the canonical @treeseed/admin full page form workflow. - - Edit Question exercises a service journey instead of only loading /app/work/questions/seed-question/edit. - - Edit Question records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: project.primary - kind: project -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Edit Question - action: - goto: /app/work/questions/seed-question/edit - expect: - urlIncludes: /app/work - - id: inspect-service-surface - title: Inspect Edit Question service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/work -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/project/question/scenes/search-questions-answers.scene.yaml b/guarantees/project/question/scenes/search-questions-answers.scene.yaml deleted file mode 100644 index 1dad0e52..00000000 --- a/guarantees/project/question/scenes/search-questions-answers.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: project.question.search-questions-answers.041 -title: Search Questions / Answers -description: Scene scaffold for guarantee.project.question.search-questions-answers.041. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Search Questions / Answers opens the canonical @treeseed/admin dashboard read model workflow. - - Search Questions / Answers exercises a service journey instead of only loading /app/work/questions/seed-question. - - Search Questions / Answers records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: project.primary - kind: project -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Search Questions / Answers - action: - goto: /app/work/questions/seed-question - expect: - urlIncludes: /app/work - - id: inspect-service-surface - title: Inspect Search Questions / Answers service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/work -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/project/question/search-questions-answers.guarantee.yaml b/guarantees/project/question/search-questions-answers.guarantee.yaml deleted file mode 100644 index 4a02a580..00000000 --- a/guarantees/project/question/search-questions-answers.guarantee.yaml +++ /dev/null @@ -1,73 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.project.question.search-questions-answers.041 -journeyIndex: 41 -type: project -subtype: question -journey: Search Questions / Answers -ownerPackage: "@treeseed/admin" -summary: Search project questions and answers through indexed content APIs or TreeDX-backed query surfaces; missing search should be implemented as a content service capability. -status: active -dependencies: - journeys: - - 38 - guarantees: - - guarantee.project.question.ask-question.038 -actors: - allowed: - - project_manager - - project_contributor - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 38" -scene: - required: true - manifest: ./scenes/search-questions-answers.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/work/questions/seed-question - componentContract: inline-form/search-panel service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.project.question.search-questions-answers.api -content: - required: true - verifierRefs: - - admin.project.question.search-questions-answers.content -audit: - required: true - verifierRefs: - - admin.project.question.search-questions-answers.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.project.question.search-questions-answers.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Search project questions and answers through indexed content APIs or TreeDX-backed query surfaces; missing search should be implemented as a content service capability. diff --git a/guarantees/team/audit/scenes/view-team-audit-log.scene.yaml b/guarantees/team/audit/scenes/view-team-audit-log.scene.yaml deleted file mode 100644 index ebe299a3..00000000 --- a/guarantees/team/audit/scenes/view-team-audit-log.scene.yaml +++ /dev/null @@ -1,130 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: team.audit.view-team-audit-log.093 -title: View Team Audit Log -description: Acceptance scene for guarantee.team.audit.view-team-audit-log.093. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - View Team Audit Log opens the canonical @treeseed/admin record operations workflow. - - View Team Audit Log exercises a service journey instead of only loading /app/teams. - - View Team Audit Log records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: team.primary - kind: team -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop_chromium - profiles: - - id: desktop_chromium - title: Desktop Chromium - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false - - id: mobile_chromium - title: Mobile Chromium - orientation: portrait - viewport: - width: 390 - height: 844 - video: - width: 390 - height: 844 - output: - width: 390 - height: 844 - deviceScaleFactor: 2 - isMobile: true - hasTouch: true -setup: - dev: - required: true - reuseExisting: true - auth: - role: owner - required: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open View Team Audit Log - action: - goto: /app/teams - expect: - urlIncludes: /app/teams - - id: inspect-service-surface - title: Inspect View Team Audit Log service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/teams -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: {} -visualAudit: - enabled: false diff --git a/guarantees/team/audit/view-team-audit-log.guarantee.yaml b/guarantees/team/audit/view-team-audit-log.guarantee.yaml deleted file mode 100644 index 775af3d1..00000000 --- a/guarantees/team/audit/view-team-audit-log.guarantee.yaml +++ /dev/null @@ -1,77 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.team.audit.view-team-audit-log.093 -journeyIndex: 93 -type: team -subtype: audit -journey: View Team Audit Log -ownerPackage: "@treeseed/admin" -summary: Show membership project capacity host secret and workday changes for accountability across admin/API operations. -status: active -dependencies: - journeys: - - 12 - guarantees: - - guarantee.team.team.create-team.012 -actors: - allowed: - - team_admin - - team_owner - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - Planned by guarantee journey audit: the referenced UI route/behavior is not implemented as an executable service journey yet. - - "Journey dependencies must be satisfied: 12" -scene: - required: true - manifest: ./scenes/view-team-audit-log.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/teams - componentContract: dashboard/read-model service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - api.team.permissions.owner -content: - required: false - verifierRefs: [] -audit: - required: false - verifierRefs: [] -negativeCases: - - id: non-member-denied - actor: non_member - verifierRefs: - - api.team.members.nonmember -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - optional: - - mailpit_message -notes: - - Show membership project capacity host secret and workday changes for accountability across admin/API operations. -surface: admin-ui -run: - timeoutSeconds: 300 - requiredForRelease: true diff --git a/guarantees/team/policy/manage-allocation-sets.guarantee.yaml b/guarantees/team/policy/manage-allocation-sets.guarantee.yaml deleted file mode 100644 index c9c9e344..00000000 --- a/guarantees/team/policy/manage-allocation-sets.guarantee.yaml +++ /dev/null @@ -1,77 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.team.policy.manage-allocation-sets.092 -journeyIndex: 92 -type: team -subtype: policy -journey: Manage Allocation Sets -ownerPackage: "@treeseed/admin" -summary: Define team-level capacity budgets limits and eligibility policies; this is distinct from project or agent allocation and belongs outside providers. -status: active -dependencies: - journeys: - - 12 - guarantees: - - guarantee.team.team.create-team.012 -actors: - allowed: - - team_admin - - team_owner - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - Planned by guarantee journey audit: the referenced UI route/behavior is not implemented as an executable service journey yet. - - "Journey dependencies must be satisfied: 12" -scene: - required: true - manifest: ./scenes/manage-allocation-sets.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/capacity/allocation - componentContract: full-page-form service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - api.team.permissions.owner -content: - required: false - verifierRefs: [] -audit: - required: false - verifierRefs: [] -negativeCases: - - id: non-member-denied - actor: non_member - verifierRefs: - - api.team.members.nonmember -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - optional: - - mailpit_message -notes: - - Define team-level capacity budgets limits and eligibility policies; this is distinct from project or agent allocation and belongs outside providers. -surface: admin-ui -run: - timeoutSeconds: 300 - requiredForRelease: true diff --git a/guarantees/team/policy/scenes/manage-allocation-sets.scene.yaml b/guarantees/team/policy/scenes/manage-allocation-sets.scene.yaml deleted file mode 100644 index 128e3c51..00000000 --- a/guarantees/team/policy/scenes/manage-allocation-sets.scene.yaml +++ /dev/null @@ -1,130 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: team.policy.manage-allocation-sets.092 -title: Manage Allocation Sets -description: Acceptance scene for guarantee.team.policy.manage-allocation-sets.092. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Manage Allocation Sets opens the canonical @treeseed/admin dashboard read model workflow. - - Manage Allocation Sets exercises a service journey instead of only loading /app/capacity/allocation. - - Manage Allocation Sets records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: team.primary - kind: team -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop_chromium - profiles: - - id: desktop_chromium - title: Desktop Chromium - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false - - id: mobile_chromium - title: Mobile Chromium - orientation: portrait - viewport: - width: 390 - height: 844 - video: - width: 390 - height: 844 - output: - width: 390 - height: 844 - deviceScaleFactor: 2 - isMobile: true - hasTouch: true -setup: - dev: - required: true - reuseExisting: true - auth: - role: owner - required: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Manage Allocation Sets - action: - goto: /app/capacity/allocation - expect: - urlIncludes: /app/capacity - - id: inspect-service-surface - title: Inspect Manage Allocation Sets service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/capacity -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: {} -visualAudit: - enabled: false diff --git a/guarantees/team/team/create-team.guarantee.yaml b/guarantees/team/team/create-team.guarantee.yaml index 273613c1..dd7c656e 100644 --- a/guarantees/team/team/create-team.guarantee.yaml +++ b/guarantees/team/team/create-team.guarantee.yaml @@ -5,7 +5,7 @@ type: team subtype: team journey: Create Team ownerPackage: "@treeseed/admin" -summary: Create the team boundary that owns projects capacity policy members and billing-like settings; this should be API-backed durable state. +summary: Create the durable team identity and membership boundary used by active-team selection and team management. status: active dependencies: journeys: @@ -69,7 +69,7 @@ evidence: optional: - mailpit_message notes: - - Create the team boundary that owns projects capacity policy members and billing-like settings; this should be API-backed durable state. + - Create the durable team identity and membership boundary used by active-team selection and team management. surface: admin-ui run: timeoutSeconds: 300 diff --git a/guarantees/team/team/scenes/view-team-profile.scene.yaml b/guarantees/team/team/scenes/view-team-profile.scene.yaml index 11ed2503..fad84f24 100644 --- a/guarantees/team/team/scenes/view-team-profile.scene.yaml +++ b/guarantees/team/team/scenes/view-team-profile.scene.yaml @@ -8,8 +8,8 @@ audience: journey: kind: service proves: - - View Team Profile opens the canonical @treeseed/admin dashboard read model workflow. - - View Team Profile exercises a service journey instead of only loading /app/teams. + - View Team Profile opens the public identity-only @treeseed/admin profile. + - View Team Profile does not expose project, capacity, catalog, or knowledge distribution links. - View Team Profile records reviewable evidence for the visible result before activation. minimumSteps: 2 requiresInteractiveAction: true @@ -82,15 +82,15 @@ workflow: - id: open-entry-route title: Open View Team Profile action: - goto: /app/teams + goto: /t/treeseed expect: - urlIncludes: /app/teams + urlIncludes: /t/treeseed - id: inspect-service-surface title: Inspect View Team Profile service surface action: keyboard: Tab expect: - urlIncludes: /app/teams + urlIncludes: /t/treeseed chapters: [] overlays: [] diagrams: [] diff --git a/guarantees/team/team/view-team-profile.guarantee.yaml b/guarantees/team/team/view-team-profile.guarantee.yaml index 8980d274..b70d2f7b 100644 --- a/guarantees/team/team/view-team-profile.guarantee.yaml +++ b/guarantees/team/team/view-team-profile.guarantee.yaml @@ -5,7 +5,7 @@ type: team subtype: team journey: View Team Profile ownerPackage: "@treeseed/admin" -summary: Display team metadata members projects allocation sets and operational status; should aggregate through API read models. +summary: Display public team identity and profile metadata without project, capacity, catalog, or operational details. status: active dependencies: journeys: @@ -39,8 +39,8 @@ scene: acceptance: true demo: true training: true - entryRoute: /app/teams - componentContract: dashboard/read-model service journey + entryRoute: /t/treeseed + componentContract: public team identity profile expectedEvidence: - playwright_trace - scene_video @@ -70,7 +70,7 @@ evidence: optional: - mailpit_message notes: - - Display team metadata members projects allocation sets and operational status; should aggregate through API read models. + - Public team profiles are identity-only during the redesign foundation phase. surface: admin-ui run: timeoutSeconds: 300 diff --git a/guarantees/user/account/manage-api-tokens.guarantee.yaml b/guarantees/user/account/manage-api-tokens.guarantee.yaml deleted file mode 100644 index d9eea17b..00000000 --- a/guarantees/user/account/manage-api-tokens.guarantee.yaml +++ /dev/null @@ -1,76 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.user.account.manage-api-tokens.094 -journeyIndex: 94 -type: user -subtype: account -journey: Manage API Tokens -ownerPackage: "@treeseed/admin" -summary: Create rotate and revoke user or automation tokens where supported; should be separate from provider capacity keys. -status: active -dependencies: - journeys: - - 4 - guarantees: - - guarantee.user.auth.user-login.004 -actors: - allowed: - - verified_user - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - Planned by guarantee journey audit: the referenced UI route/behavior is not implemented as an executable service journey yet. - - "Journey dependencies must be satisfied: 4" -scene: - required: true - manifest: ./scenes/manage-api-tokens.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/account - componentContract: record-operations service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - api.auth.sessions -content: - required: false - verifierRefs: [] -audit: - required: false - verifierRefs: [] -negativeCases: - - id: anonymous-denied - actor: anonymous_user - verifierRefs: - - api.auth.me.requires-user -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - optional: - - mailpit_message -notes: - - Create rotate and revoke user or automation tokens where supported; should be separate from provider capacity keys. -surface: admin-ui -run: - timeoutSeconds: 300 - requiredForRelease: true diff --git a/guarantees/user/account/manage-notifications.guarantee.yaml b/guarantees/user/account/manage-notifications.guarantee.yaml deleted file mode 100644 index 0e0e0083..00000000 --- a/guarantees/user/account/manage-notifications.guarantee.yaml +++ /dev/null @@ -1,76 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.user.account.manage-notifications.008 -journeyIndex: 8 -type: user -subtype: account -journey: Manage Notifications -ownerPackage: "@treeseed/admin" -summary: Manage user notification preferences for Treeseed events; likely needs a durable API model before the UI can be more than local settings. -status: active -dependencies: - journeys: - - 4 - guarantees: - - guarantee.user.auth.user-login.004 -actors: - allowed: - - verified_user - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - Planned by guarantee journey audit: the referenced UI route/behavior is not implemented as an executable service journey yet. - - "Journey dependencies must be satisfied: 4" -scene: - required: true - manifest: ./scenes/manage-notifications.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/account - componentContract: full-page-form service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - api.auth.me.site-admin -content: - required: false - verifierRefs: [] -audit: - required: false - verifierRefs: [] -negativeCases: - - id: anonymous-denied - actor: anonymous_user - verifierRefs: - - api.auth.me.requires-user -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - optional: - - mailpit_message -notes: - - Manage user notification preferences for Treeseed events; likely needs a durable API model before the UI can be more than local settings. -surface: admin-ui -run: - timeoutSeconds: 300 - requiredForRelease: true diff --git a/guarantees/user/account/scenes/manage-api-tokens.scene.yaml b/guarantees/user/account/scenes/manage-api-tokens.scene.yaml deleted file mode 100644 index a9f2d575..00000000 --- a/guarantees/user/account/scenes/manage-api-tokens.scene.yaml +++ /dev/null @@ -1,128 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: user.account.manage-api-tokens.094 -title: Manage API Tokens -description: Acceptance scene for guarantee.user.account.manage-api-tokens.094. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Manage API Tokens opens the canonical @treeseed/admin dashboard read model workflow. - - Manage API Tokens exercises a service journey instead of only loading /app/account. - - Manage API Tokens records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop_chromium - profiles: - - id: desktop_chromium - title: Desktop Chromium - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false - - id: mobile_chromium - title: Mobile Chromium - orientation: portrait - viewport: - width: 390 - height: 844 - video: - width: 390 - height: 844 - output: - width: 390 - height: 844 - deviceScaleFactor: 2 - isMobile: true - hasTouch: true -setup: - dev: - required: true - reuseExisting: true - auth: - role: owner - required: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Manage API Tokens - action: - goto: /app/account - expect: - urlIncludes: /app/account - - id: inspect-service-surface - title: Inspect Manage API Tokens service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/account -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: {} -visualAudit: - enabled: false diff --git a/guarantees/user/account/scenes/manage-notifications.scene.yaml b/guarantees/user/account/scenes/manage-notifications.scene.yaml deleted file mode 100644 index 70ebce47..00000000 --- a/guarantees/user/account/scenes/manage-notifications.scene.yaml +++ /dev/null @@ -1,128 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: user.account.manage-notifications.008 -title: Manage Notifications -description: Acceptance scene for guarantee.user.account.manage-notifications.008. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Manage Notifications opens the canonical @treeseed/admin dashboard read model workflow. - - Manage Notifications exercises a service journey instead of only loading /app/account. - - Manage Notifications records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop_chromium - profiles: - - id: desktop_chromium - title: Desktop Chromium - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false - - id: mobile_chromium - title: Mobile Chromium - orientation: portrait - viewport: - width: 390 - height: 844 - video: - width: 390 - height: 844 - output: - width: 390 - height: 844 - deviceScaleFactor: 2 - isMobile: true - hasTouch: true -setup: - dev: - required: true - reuseExisting: true - auth: - role: owner - required: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Manage Notifications - action: - goto: /app/account - expect: - urlIncludes: /app/account - - id: inspect-service-surface - title: Inspect Manage Notifications service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/account -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: {} -visualAudit: - enabled: false diff --git a/guarantees/user/account/scenes/view-user-profile.scene.yaml b/guarantees/user/account/scenes/view-user-profile.scene.yaml index 7f356640..1cd23d62 100644 --- a/guarantees/user/account/scenes/view-user-profile.scene.yaml +++ b/guarantees/user/account/scenes/view-user-profile.scene.yaml @@ -8,8 +8,8 @@ audience: journey: kind: service proves: - - View User Profile opens the canonical @treeseed/admin dashboard read model workflow. - - View User Profile exercises a service journey instead of only loading /app/account. + - View User Profile opens the public identity-only @treeseed/admin profile. + - View User Profile does not expose project, catalog, or knowledge distribution links. - View User Profile records reviewable evidence for the visible result before activation. minimumSteps: 2 requiresInteractiveAction: true @@ -62,6 +62,9 @@ setup: dev: required: true reuseExisting: true + auth: + role: owner + required: true artifacts: trace: true video: true @@ -72,17 +75,25 @@ artifacts: appLogs: true workflow: - id: open-entry-route - title: Open View User Profile + title: Open account settings action: goto: /app/account expect: urlIncludes: /app/account - - id: inspect-service-surface - title: Inspect View User Profile service surface + - id: open-public-profile + title: Follow the public profile link + action: + click: + css: 'a[href^="/u/"]' + internal: true + expect: + urlIncludes: /u/ + - id: inspect-identity-surface + title: Inspect the identity-only profile action: keyboard: Tab expect: - urlIncludes: /app/account + text: TreeSeed account chapters: [] overlays: [] diagrams: [] diff --git a/guarantees/user/account/view-user-profile.guarantee.yaml b/guarantees/user/account/view-user-profile.guarantee.yaml index 5bd516a1..c3d35413 100644 --- a/guarantees/user/account/view-user-profile.guarantee.yaml +++ b/guarantees/user/account/view-user-profile.guarantee.yaml @@ -5,7 +5,7 @@ type: user subtype: account journey: View User Profile ownerPackage: "@treeseed/admin" -summary: Show identity and account metadata plus team/project memberships; current architecture should read through public admin/API facades. +summary: Show public user identity and profile metadata without project, catalog, or knowledge distribution details. status: active dependencies: journeys: @@ -15,8 +15,8 @@ dependencies: actors: allowed: - verified_user - forbidden: - anonymous_user + forbidden: - unauthorized_user devices: required: @@ -29,7 +29,7 @@ preconditions: fixtures: - integrated_treeseed_project notes: - - Planned by guarantee journey audit: the referenced UI route/behavior is not implemented as an executable service journey yet. + - The profile scene follows the authenticated account page's canonical public-profile link. - "Journey dependencies must be satisfied: 1" scene: required: true @@ -39,7 +39,7 @@ scene: demo: true training: true entryRoute: /app/account - componentContract: dashboard/read-model service journey + componentContract: public identity profile expectedEvidence: - playwright_trace - scene_video @@ -69,7 +69,7 @@ evidence: optional: - mailpit_message notes: - - Show identity and account metadata plus team/project memberships; current architecture should read through public admin/API facades. + - Public user profiles are identity-only during the redesign foundation phase. surface: admin-ui run: timeoutSeconds: 300 diff --git a/guarantees/verifiers/ui.verifiers.yaml b/guarantees/verifiers/ui.verifiers.yaml index 2b054be2..68a6a9c9 100644 --- a/guarantees/verifiers/ui.verifiers.yaml +++ b/guarantees/verifiers/ui.verifiers.yaml @@ -50,12 +50,7 @@ verifiers: kind: apiAcceptanceCase caseId: teams.list.team-owner ownerPackage: "@treeseed/api" - description: Team owner can list teams. - api.team.list.nonmember: - kind: apiAcceptanceCase - caseId: teams.list.non-member - ownerPackage: "@treeseed/api" - description: Non-member team listing remains bounded to authorized teams. + description: Team owner can list teams for active-team selection. api.team.create: kind: apiAcceptanceCase caseId: teams.create.team-owner @@ -65,27 +60,17 @@ verifiers: kind: apiAcceptanceCase caseId: teams.update.team-owner ownerPackage: "@treeseed/api" - description: Team owner can update team settings. + description: Team owner can update team identity settings. api.team.invite.mailpit: kind: apiAcceptanceCase caseId: teams.invite.team-owner ownerPackage: "@treeseed/api" description: Team owner can invite a member and Mailpit receives the invite email. - api.team.members.owner: - kind: apiAcceptanceCase - caseId: team-role-matrix.team-members.teamOwner - ownerPackage: "@treeseed/api" - description: Team owner can inspect team members. api.team.members.nonmember: kind: apiAcceptanceCase caseId: team-role-matrix.team-members.nonMember ownerPackage: "@treeseed/api" description: Non-members cannot inspect team membership. - api.team.permissions.owner: - kind: apiAcceptanceCase - caseId: team-role-matrix.team-permissions.teamOwner - ownerPackage: "@treeseed/api" - description: Team owner can inspect team permissions. api.team.member.role: kind: apiAcceptanceCase caseId: teams.member-role.team-owner @@ -105,1524 +90,4 @@ verifiers: kind: apiAcceptanceCase caseId: teams.profile.by-name ownerPackage: "@treeseed/api" - description: Public team profile can be loaded by name. - admin.agent.monitor.runtime-ui: - kind: scene - ownerPackage: "@treeseed/admin" - description: Admin runtime UI scene verifies project agent and capacity runtime monitoring surfaces. - admin.agent.monitor.unauthorized-denied: - kind: scene - ownerPackage: "@treeseed/admin" - description: Admin monitoring scene verifies unauthorized users are denied or redirected. - admin.capacity.capacity.approve-capacity.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: capacity.usage.review-capacity-usage - description: "@treeseed/admin capacity/capacity/approve-capacity api verifier backed by API acceptance case capacity.usage.review-capacity-usage." - admin.capacity.capacity.approve-capacity.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: capacity.usage.review-capacity-usage - description: "@treeseed/admin capacity/capacity/approve-capacity audit verifier backed by API acceptance case capacity.usage.review-capacity-usage." - admin.capacity.capacity.approve-capacity.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: capacity.usage.review-capacity-usage - description: "@treeseed/admin capacity/capacity/approve-capacity content verifier backed by API acceptance case capacity.usage.review-capacity-usage." - admin.capacity.capacity.approve-capacity.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: capacity.provider.inspect-provider-check-ins - description: "@treeseed/admin capacity/capacity/approve-capacity negative verifier backed by API acceptance case capacity.provider.inspect-provider-check-ins." - admin.capacity.capacity.deploy-capacity.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: capacity.usage.review-capacity-usage - description: "@treeseed/admin capacity/capacity/deploy-capacity api verifier backed by API acceptance case capacity.usage.review-capacity-usage." - admin.capacity.capacity.deploy-capacity.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: capacity.usage.review-capacity-usage - description: "@treeseed/admin capacity/capacity/deploy-capacity audit verifier backed by API acceptance case capacity.usage.review-capacity-usage." - admin.capacity.capacity.deploy-capacity.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: capacity.usage.review-capacity-usage - description: "@treeseed/admin capacity/capacity/deploy-capacity content verifier backed by API acceptance case capacity.usage.review-capacity-usage." - admin.capacity.capacity.deploy-capacity.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: capacity.provider.inspect-provider-check-ins - description: "@treeseed/admin capacity/capacity/deploy-capacity negative verifier backed by API acceptance case capacity.provider.inspect-provider-check-ins." - admin.capacity.capacity.monitor-capacity.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: capacity.usage.review-capacity-usage - description: "@treeseed/admin capacity/capacity/monitor-capacity api verifier backed by API acceptance case capacity.usage.review-capacity-usage." - admin.capacity.capacity.monitor-capacity.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: capacity.usage.review-capacity-usage - description: "@treeseed/admin capacity/capacity/monitor-capacity audit verifier backed by API acceptance case capacity.usage.review-capacity-usage." - admin.capacity.capacity.monitor-capacity.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: capacity.usage.review-capacity-usage - description: "@treeseed/admin capacity/capacity/monitor-capacity content verifier backed by API acceptance case capacity.usage.review-capacity-usage." - admin.capacity.capacity.monitor-capacity.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: capacity.provider.inspect-provider-check-ins - description: "@treeseed/admin capacity/capacity/monitor-capacity negative verifier backed by API acceptance case capacity.provider.inspect-provider-check-ins." - admin.capacity.capacity.revoke-capacity.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: capacity.usage.review-capacity-usage - description: "@treeseed/admin capacity/capacity/revoke-capacity api verifier backed by API acceptance case capacity.usage.review-capacity-usage." - admin.capacity.capacity.revoke-capacity.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: capacity.usage.review-capacity-usage - description: "@treeseed/admin capacity/capacity/revoke-capacity audit verifier backed by API acceptance case capacity.usage.review-capacity-usage." - admin.capacity.capacity.revoke-capacity.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: capacity.usage.review-capacity-usage - description: "@treeseed/admin capacity/capacity/revoke-capacity content verifier backed by API acceptance case capacity.usage.review-capacity-usage." - admin.capacity.capacity.revoke-capacity.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: capacity.provider.inspect-provider-check-ins - description: "@treeseed/admin capacity/capacity/revoke-capacity negative verifier backed by API acceptance case capacity.provider.inspect-provider-check-ins." - admin.capacity.capacity.shut-down-capacity.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: capacity.usage.review-capacity-usage - description: "@treeseed/admin capacity/capacity/shut-down-capacity api verifier backed by API acceptance case capacity.usage.review-capacity-usage." - admin.capacity.capacity.shut-down-capacity.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: capacity.usage.review-capacity-usage - description: "@treeseed/admin capacity/capacity/shut-down-capacity audit verifier backed by API acceptance case capacity.usage.review-capacity-usage." - admin.capacity.capacity.shut-down-capacity.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: capacity.usage.review-capacity-usage - description: "@treeseed/admin capacity/capacity/shut-down-capacity content verifier backed by API acceptance case capacity.usage.review-capacity-usage." - admin.capacity.capacity.shut-down-capacity.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: capacity.provider.inspect-provider-check-ins - description: "@treeseed/admin capacity/capacity/shut-down-capacity negative verifier backed by API acceptance case capacity.provider.inspect-provider-check-ins." - admin.capacity.registration.rotate-capacity-key.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: capacity.provider.register-capacity-provider - description: "@treeseed/admin capacity/registration/rotate-capacity-key api verifier backed by API acceptance case capacity.provider.register-capacity-provider." - admin.capacity.registration.rotate-capacity-key.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: capacity.provider.register-capacity-provider - description: "@treeseed/admin capacity/registration/rotate-capacity-key audit verifier backed by API acceptance case capacity.provider.register-capacity-provider." - admin.capacity.registration.rotate-capacity-key.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: capacity.provider.register-capacity-provider - description: "@treeseed/admin capacity/registration/rotate-capacity-key content verifier backed by API acceptance case capacity.provider.register-capacity-provider." - admin.capacity.registration.rotate-capacity-key.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: capacity.provider.inspect-provider-check-ins - description: "@treeseed/admin capacity/registration/rotate-capacity-key negative verifier backed by API acceptance case capacity.provider.inspect-provider-check-ins." - admin.host.host.create-host.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: host.reconciliation.preview-host-plan - description: "@treeseed/admin host/host/create-host api verifier backed by API acceptance case host.reconciliation.preview-host-plan." - admin.host.host.create-host.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: host.reconciliation.preview-host-plan - description: "@treeseed/admin host/host/create-host audit verifier backed by API acceptance case host.reconciliation.preview-host-plan." - admin.host.host.create-host.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: host.reconciliation.preview-host-plan - description: "@treeseed/admin host/host/create-host content verifier backed by API acceptance case host.reconciliation.preview-host-plan." - admin.host.host.create-host.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: platform.operations.team-viewer-denied - description: "@treeseed/admin host/host/create-host negative verifier backed by API acceptance case platform.operations.team-viewer-denied." - admin.host.host.delete-host.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: host.reconciliation.preview-host-plan - description: "@treeseed/admin host/host/delete-host api verifier backed by API acceptance case host.reconciliation.preview-host-plan." - admin.host.host.delete-host.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: host.reconciliation.preview-host-plan - description: "@treeseed/admin host/host/delete-host audit verifier backed by API acceptance case host.reconciliation.preview-host-plan." - admin.host.host.delete-host.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: host.reconciliation.preview-host-plan - description: "@treeseed/admin host/host/delete-host content verifier backed by API acceptance case host.reconciliation.preview-host-plan." - admin.host.host.delete-host.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: platform.operations.team-viewer-denied - description: "@treeseed/admin host/host/delete-host negative verifier backed by API acceptance case platform.operations.team-viewer-denied." - admin.host.host.edit-host.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: host.reconciliation.preview-host-plan - description: "@treeseed/admin host/host/edit-host api verifier backed by API acceptance case host.reconciliation.preview-host-plan." - admin.host.host.edit-host.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: host.reconciliation.preview-host-plan - description: "@treeseed/admin host/host/edit-host audit verifier backed by API acceptance case host.reconciliation.preview-host-plan." - admin.host.host.edit-host.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: host.reconciliation.preview-host-plan - description: "@treeseed/admin host/host/edit-host content verifier backed by API acceptance case host.reconciliation.preview-host-plan." - admin.host.host.edit-host.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: platform.operations.team-viewer-denied - description: "@treeseed/admin host/host/edit-host negative verifier backed by API acceptance case platform.operations.team-viewer-denied." - admin.host.secrets.create-passphrase.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: host.reconciliation.preview-host-plan - description: "@treeseed/admin host/secrets/create-passphrase api verifier backed by API acceptance case host.reconciliation.preview-host-plan." - admin.host.secrets.create-passphrase.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: host.reconciliation.preview-host-plan - description: "@treeseed/admin host/secrets/create-passphrase audit verifier backed by API acceptance case host.reconciliation.preview-host-plan." - admin.host.secrets.create-passphrase.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: host.reconciliation.preview-host-plan - description: "@treeseed/admin host/secrets/create-passphrase content verifier backed by API acceptance case host.reconciliation.preview-host-plan." - admin.host.secrets.create-passphrase.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: platform.operations.team-viewer-denied - description: "@treeseed/admin host/secrets/create-passphrase negative verifier backed by API acceptance case platform.operations.team-viewer-denied." - admin.host.secrets.reset-passphrase.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: host.reconciliation.preview-host-plan - description: "@treeseed/admin host/secrets/reset-passphrase api verifier backed by API acceptance case host.reconciliation.preview-host-plan." - admin.host.secrets.reset-passphrase.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: host.reconciliation.preview-host-plan - description: "@treeseed/admin host/secrets/reset-passphrase audit verifier backed by API acceptance case host.reconciliation.preview-host-plan." - admin.host.secrets.reset-passphrase.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: host.reconciliation.preview-host-plan - description: "@treeseed/admin host/secrets/reset-passphrase content verifier backed by API acceptance case host.reconciliation.preview-host-plan." - admin.host.secrets.reset-passphrase.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: platform.operations.team-viewer-denied - description: "@treeseed/admin host/secrets/reset-passphrase negative verifier backed by API acceptance case platform.operations.team-viewer-denied." - admin.marketplace-seller.fulfillment.record-fulfillment.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.commerce.marketplace.anonymous - description: "@treeseed/admin marketplace-seller/fulfillment/record-fulfillment api verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.commerce.marketplace.anonymous." - admin.marketplace-seller.fulfillment.record-fulfillment.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.commerce.marketplace.anonymous - description: "@treeseed/admin marketplace-seller/fulfillment/record-fulfillment audit verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.commerce.marketplace.anonymous." - admin.marketplace-seller.fulfillment.record-fulfillment.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.commerce.marketplace.anonymous - description: "@treeseed/admin marketplace-seller/fulfillment/record-fulfillment content verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.commerce.marketplace.anonymous." - admin.marketplace-seller.fulfillment.record-fulfillment.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.commerce.marketplace.nonMember - description: "@treeseed/admin marketplace-seller/fulfillment/record-fulfillment negative verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.commerce.marketplace.nonMember." - admin.marketplace-seller.listings.approve-listing.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.commerce.marketplace.marketSteward - description: "@treeseed/admin marketplace-seller/listings/approve-listing api verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.commerce.marketplace.marketSteward." - admin.marketplace-seller.listings.approve-listing.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.commerce.marketplace.marketSteward - description: "@treeseed/admin marketplace-seller/listings/approve-listing audit verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.commerce.marketplace.marketSteward." - admin.marketplace-seller.listings.approve-listing.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.commerce.marketplace.marketSteward - description: "@treeseed/admin marketplace-seller/listings/approve-listing content verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.commerce.marketplace.marketSteward." - admin.marketplace-seller.listings.approve-listing.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.commerce.marketplace.nonMember - description: "@treeseed/admin marketplace-seller/listings/approve-listing negative verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.commerce.marketplace.nonMember." - admin.marketplace-seller.listings.create-product-listing.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.commerce.marketplace.marketSteward - description: "@treeseed/admin marketplace-seller/listings/create-product-listing api verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.commerce.marketplace.marketSteward." - admin.marketplace-seller.listings.create-product-listing.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.commerce.marketplace.marketSteward - description: "@treeseed/admin marketplace-seller/listings/create-product-listing audit verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.commerce.marketplace.marketSteward." - admin.marketplace-seller.listings.create-product-listing.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.commerce.marketplace.marketSteward - description: "@treeseed/admin marketplace-seller/listings/create-product-listing content verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.commerce.marketplace.marketSteward." - admin.marketplace-seller.listings.create-product-listing.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.commerce.marketplace.nonMember - description: "@treeseed/admin marketplace-seller/listings/create-product-listing negative verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.commerce.marketplace.nonMember." - admin.marketplace-seller.listings.manage-listing.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.commerce.marketplace.marketSteward - description: "@treeseed/admin marketplace-seller/listings/manage-listing api verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.commerce.marketplace.marketSteward." - admin.marketplace-seller.listings.manage-listing.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.commerce.marketplace.marketSteward - description: "@treeseed/admin marketplace-seller/listings/manage-listing audit verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.commerce.marketplace.marketSteward." - admin.marketplace-seller.listings.manage-listing.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.commerce.marketplace.marketSteward - description: "@treeseed/admin marketplace-seller/listings/manage-listing content verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.commerce.marketplace.marketSteward." - admin.marketplace-seller.listings.manage-listing.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.commerce.marketplace.nonMember - description: "@treeseed/admin marketplace-seller/listings/manage-listing negative verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.commerce.marketplace.nonMember." - admin.marketplace-seller.listings.submit-listing-for-review.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.commerce.marketplace.marketSteward - description: "@treeseed/admin marketplace-seller/listings/submit-listing-for-review api verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.commerce.marketplace.marketSteward." - admin.marketplace-seller.listings.submit-listing-for-review.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.commerce.marketplace.marketSteward - description: "@treeseed/admin marketplace-seller/listings/submit-listing-for-review audit verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.commerce.marketplace.marketSteward." - admin.marketplace-seller.listings.submit-listing-for-review.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.commerce.marketplace.marketSteward - description: "@treeseed/admin marketplace-seller/listings/submit-listing-for-review content verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.commerce.marketplace.marketSteward." - admin.marketplace-seller.listings.submit-listing-for-review.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.commerce.marketplace.nonMember - description: "@treeseed/admin marketplace-seller/listings/submit-listing-for-review negative verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.commerce.marketplace.nonMember." - admin.marketplace-seller.onboarding.approve-seller.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.commerce.marketplace.marketSteward - description: "@treeseed/admin marketplace-seller/onboarding/approve-seller api verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.commerce.marketplace.marketSteward." - admin.marketplace-seller.onboarding.approve-seller.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.commerce.marketplace.marketSteward - description: "@treeseed/admin marketplace-seller/onboarding/approve-seller audit verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.commerce.marketplace.marketSteward." - admin.marketplace-seller.onboarding.approve-seller.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.commerce.marketplace.marketSteward - description: "@treeseed/admin marketplace-seller/onboarding/approve-seller content verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.commerce.marketplace.marketSteward." - admin.marketplace-seller.onboarding.approve-seller.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.commerce.marketplace.nonMember - description: "@treeseed/admin marketplace-seller/onboarding/approve-seller negative verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.commerce.marketplace.nonMember." - admin.marketplace-seller.onboarding.request-seller-setup.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.commerce.marketplace.marketSteward - description: "@treeseed/admin marketplace-seller/onboarding/request-seller-setup api verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.commerce.marketplace.marketSteward." - admin.marketplace-seller.onboarding.request-seller-setup.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.commerce.marketplace.marketSteward - description: "@treeseed/admin marketplace-seller/onboarding/request-seller-setup audit verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.commerce.marketplace.marketSteward." - admin.marketplace-seller.onboarding.request-seller-setup.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.commerce.marketplace.marketSteward - description: "@treeseed/admin marketplace-seller/onboarding/request-seller-setup content verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.commerce.marketplace.marketSteward." - admin.marketplace-seller.onboarding.request-seller-setup.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.commerce.marketplace.nonMember - description: "@treeseed/admin marketplace-seller/onboarding/request-seller-setup negative verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.commerce.marketplace.nonMember." - admin.marketplace-seller.refunds.issue-refund.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.commerce.marketplace.anonymous - description: "@treeseed/admin marketplace-seller/refunds/issue-refund api verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.commerce.marketplace.anonymous." - admin.marketplace-seller.refunds.issue-refund.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.commerce.marketplace.anonymous - description: "@treeseed/admin marketplace-seller/refunds/issue-refund audit verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.commerce.marketplace.anonymous." - admin.marketplace-seller.refunds.issue-refund.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.commerce.marketplace.anonymous - description: "@treeseed/admin marketplace-seller/refunds/issue-refund content verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.commerce.marketplace.anonymous." - admin.marketplace-seller.refunds.issue-refund.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.commerce.marketplace.nonMember - description: "@treeseed/admin marketplace-seller/refunds/issue-refund negative verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.commerce.marketplace.nonMember." - admin.marketplace-seller.sales.view-seller-sales.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.commerce.marketplace.marketSteward - description: "@treeseed/admin marketplace-seller/sales/view-seller-sales api verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.commerce.marketplace.marketSteward." - admin.marketplace-seller.sales.view-seller-sales.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.commerce.marketplace.marketSteward - description: "@treeseed/admin marketplace-seller/sales/view-seller-sales audit verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.commerce.marketplace.marketSteward." - admin.marketplace-seller.sales.view-seller-sales.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.commerce.marketplace.marketSteward - description: "@treeseed/admin marketplace-seller/sales/view-seller-sales content verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.commerce.marketplace.marketSteward." - admin.marketplace-seller.sales.view-seller-sales.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.commerce.marketplace.nonMember - description: "@treeseed/admin marketplace-seller/sales/view-seller-sales negative verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.commerce.marketplace.nonMember." - admin.project.agent.create-agent.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: agent.graph.compile-decision-assignment-graph - description: "@treeseed/admin project/agent/create-agent api verifier backed by API acceptance case agent.graph.compile-decision-assignment-graph." - admin.project.agent.create-agent.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: agent.graph.compile-decision-assignment-graph - description: "@treeseed/admin project/agent/create-agent audit verifier backed by API acceptance case agent.graph.compile-decision-assignment-graph." - admin.project.agent.create-agent.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: agent.graph.compile-decision-assignment-graph - description: "@treeseed/admin project/agent/create-agent content verifier backed by API acceptance case agent.graph.compile-decision-assignment-graph." - admin.project.agent.create-agent.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.nonMember - description: "@treeseed/admin project/agent/create-agent negative verifier backed by API acceptance case team-role-matrix.project-summary.nonMember." - admin.project.agent.delete-agent.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: agent.graph.compile-decision-assignment-graph - description: "@treeseed/admin project/agent/delete-agent api verifier backed by API acceptance case agent.graph.compile-decision-assignment-graph." - admin.project.agent.delete-agent.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: agent.graph.compile-decision-assignment-graph - description: "@treeseed/admin project/agent/delete-agent audit verifier backed by API acceptance case agent.graph.compile-decision-assignment-graph." - admin.project.agent.delete-agent.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: agent.graph.compile-decision-assignment-graph - description: "@treeseed/admin project/agent/delete-agent content verifier backed by API acceptance case agent.graph.compile-decision-assignment-graph." - admin.project.agent.delete-agent.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.nonMember - description: "@treeseed/admin project/agent/delete-agent negative verifier backed by API acceptance case team-role-matrix.project-summary.nonMember." - admin.project.agent.edit-agent.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: agent.graph.compile-decision-assignment-graph - description: "@treeseed/admin project/agent/edit-agent api verifier backed by API acceptance case agent.graph.compile-decision-assignment-graph." - admin.project.agent.edit-agent.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: agent.graph.compile-decision-assignment-graph - description: "@treeseed/admin project/agent/edit-agent audit verifier backed by API acceptance case agent.graph.compile-decision-assignment-graph." - admin.project.agent.edit-agent.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: agent.graph.compile-decision-assignment-graph - description: "@treeseed/admin project/agent/edit-agent content verifier backed by API acceptance case agent.graph.compile-decision-assignment-graph." - admin.project.agent.edit-agent.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.nonMember - description: "@treeseed/admin project/agent/edit-agent negative verifier backed by API acceptance case team-role-matrix.project-summary.nonMember." - admin.project.allocation.allocate-agent-capacity.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: agent.graph.reserve-planning-capacity - description: "@treeseed/admin project/allocation/allocate-agent-capacity api verifier backed by API acceptance case agent.graph.reserve-planning-capacity." - admin.project.allocation.allocate-agent-capacity.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: agent.graph.reserve-planning-capacity - description: "@treeseed/admin project/allocation/allocate-agent-capacity audit verifier backed by API acceptance case agent.graph.reserve-planning-capacity." - admin.project.allocation.allocate-agent-capacity.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: agent.graph.reserve-planning-capacity - description: "@treeseed/admin project/allocation/allocate-agent-capacity content verifier backed by API acceptance case agent.graph.reserve-planning-capacity." - admin.project.allocation.allocate-agent-capacity.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.nonMember - description: "@treeseed/admin project/allocation/allocate-agent-capacity negative verifier backed by API acceptance case team-role-matrix.project-summary.nonMember." - admin.project.allocation.allocate-project-capacity.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: agent.graph.reserve-planning-capacity - description: "@treeseed/admin project/allocation/allocate-project-capacity api verifier backed by API acceptance case agent.graph.reserve-planning-capacity." - admin.project.allocation.allocate-project-capacity.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: agent.graph.reserve-planning-capacity - description: "@treeseed/admin project/allocation/allocate-project-capacity audit verifier backed by API acceptance case agent.graph.reserve-planning-capacity." - admin.project.allocation.allocate-project-capacity.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: agent.graph.reserve-planning-capacity - description: "@treeseed/admin project/allocation/allocate-project-capacity content verifier backed by API acceptance case agent.graph.reserve-planning-capacity." - admin.project.allocation.allocate-project-capacity.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.nonMember - description: "@treeseed/admin project/allocation/allocate-project-capacity negative verifier backed by API acceptance case team-role-matrix.project-summary.nonMember." - admin.project.book.create-book.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/book/create-book api verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.book.create-book.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/book/create-book audit verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.book.create-book.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/book/create-book content verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.book.create-book.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.nonMember - description: "@treeseed/admin project/book/create-book negative verifier backed by API acceptance case team-role-matrix.project-summary.nonMember." - admin.project.book.delete-book.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/book/delete-book api verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.book.delete-book.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/book/delete-book audit verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.book.delete-book.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/book/delete-book content verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.book.delete-book.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.nonMember - description: "@treeseed/admin project/book/delete-book negative verifier backed by API acceptance case team-role-matrix.project-summary.nonMember." - admin.project.book.download-book.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/book/download-book api verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.book.download-book.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/book/download-book audit verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.book.download-book.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/book/download-book content verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.book.download-book.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.nonMember - description: "@treeseed/admin project/book/download-book negative verifier backed by API acceptance case team-role-matrix.project-summary.nonMember." - admin.project.book.edit-book.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/book/edit-book api verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.book.edit-book.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/book/edit-book audit verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.book.edit-book.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/book/edit-book content verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.book.edit-book.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.nonMember - description: "@treeseed/admin project/book/edit-book negative verifier backed by API acceptance case team-role-matrix.project-summary.nonMember." - admin.project.book.search-books.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/book/search-books api verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.book.search-books.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/book/search-books audit verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.book.search-books.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/book/search-books content verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.book.search-books.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.nonMember - description: "@treeseed/admin project/book/search-books negative verifier backed by API acceptance case team-role-matrix.project-summary.nonMember." - admin.project.decision.create-note-on-decision.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/decision/create-note-on-decision api verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.decision.create-note-on-decision.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/decision/create-note-on-decision audit verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.decision.create-note-on-decision.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/decision/create-note-on-decision content verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.decision.create-note-on-decision.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.nonMember - description: "@treeseed/admin project/decision/create-note-on-decision negative verifier backed by API acceptance case team-role-matrix.project-summary.nonMember." - admin.project.decision.search-decisions.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/decision/search-decisions api verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.decision.search-decisions.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/decision/search-decisions audit verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.decision.search-decisions.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/decision/search-decisions content verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.decision.search-decisions.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.nonMember - description: "@treeseed/admin project/decision/search-decisions negative verifier backed by API acceptance case team-role-matrix.project-summary.nonMember." - admin.project.knowledge.create-book-page.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/knowledge/create-book-page api verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.knowledge.create-book-page.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/knowledge/create-book-page audit verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.knowledge.create-book-page.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/knowledge/create-book-page content verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.knowledge.create-book-page.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.nonMember - description: "@treeseed/admin project/knowledge/create-book-page negative verifier backed by API acceptance case team-role-matrix.project-summary.nonMember." - admin.project.knowledge.delete-book-page.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/knowledge/delete-book-page api verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.knowledge.delete-book-page.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/knowledge/delete-book-page audit verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.knowledge.delete-book-page.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/knowledge/delete-book-page content verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.knowledge.delete-book-page.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.nonMember - description: "@treeseed/admin project/knowledge/delete-book-page negative verifier backed by API acceptance case team-role-matrix.project-summary.nonMember." - admin.project.knowledge.edit-book-page.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/knowledge/edit-book-page api verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.knowledge.edit-book-page.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/knowledge/edit-book-page audit verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.knowledge.edit-book-page.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/knowledge/edit-book-page content verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.knowledge.edit-book-page.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.nonMember - description: "@treeseed/admin project/knowledge/edit-book-page negative verifier backed by API acceptance case team-role-matrix.project-summary.nonMember." - admin.project.knowledge.review-backlinks.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/knowledge/review-backlinks api verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.knowledge.review-backlinks.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/knowledge/review-backlinks audit verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.knowledge.review-backlinks.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/knowledge/review-backlinks content verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.knowledge.review-backlinks.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.nonMember - description: "@treeseed/admin project/knowledge/review-backlinks negative verifier backed by API acceptance case team-role-matrix.project-summary.nonMember." - admin.project.library.download-library.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/library/download-library api verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.library.download-library.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/library/download-library audit verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.library.download-library.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/library/download-library content verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.library.download-library.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.nonMember - description: "@treeseed/admin project/library/download-library negative verifier backed by API acceptance case team-role-matrix.project-summary.nonMember." - admin.project.library.rebuild-library-index.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/library/rebuild-library-index api verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.library.rebuild-library-index.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/library/rebuild-library-index audit verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.library.rebuild-library-index.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/library/rebuild-library-index content verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.library.rebuild-library-index.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.nonMember - description: "@treeseed/admin project/library/rebuild-library-index negative verifier backed by API acceptance case team-role-matrix.project-summary.nonMember." - admin.project.objective.create-note-on-objective.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/objective/create-note-on-objective api verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.objective.create-note-on-objective.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/objective/create-note-on-objective audit verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.objective.create-note-on-objective.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/objective/create-note-on-objective content verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.objective.create-note-on-objective.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.nonMember - description: "@treeseed/admin project/objective/create-note-on-objective negative verifier backed by API acceptance case team-role-matrix.project-summary.nonMember." - admin.project.objective.create-objective.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/objective/create-objective api verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.objective.create-objective.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/objective/create-objective audit verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.objective.create-objective.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/objective/create-objective content verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.objective.create-objective.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.nonMember - description: "@treeseed/admin project/objective/create-objective negative verifier backed by API acceptance case team-role-matrix.project-summary.nonMember." - admin.project.objective.delete-objective.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/objective/delete-objective api verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.objective.delete-objective.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/objective/delete-objective audit verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.objective.delete-objective.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/objective/delete-objective content verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.objective.delete-objective.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.nonMember - description: "@treeseed/admin project/objective/delete-objective negative verifier backed by API acceptance case team-role-matrix.project-summary.nonMember." - admin.project.objective.edit-objective.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/objective/edit-objective api verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.objective.edit-objective.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/objective/edit-objective audit verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.objective.edit-objective.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/objective/edit-objective content verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.objective.edit-objective.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.nonMember - description: "@treeseed/admin project/objective/edit-objective negative verifier backed by API acceptance case team-role-matrix.project-summary.nonMember." - admin.project.objective.search-objectives.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/objective/search-objectives api verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.objective.search-objectives.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/objective/search-objectives audit verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.objective.search-objectives.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/objective/search-objectives content verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.objective.search-objectives.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.nonMember - description: "@treeseed/admin project/objective/search-objectives negative verifier backed by API acceptance case team-role-matrix.project-summary.nonMember." - admin.project.project.create-project.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.teamOwner - description: "@treeseed/admin project/project/create-project api verifier backed by API acceptance case team-role-matrix.project-summary.teamOwner." - admin.project.project.create-project.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.teamOwner - description: "@treeseed/admin project/project/create-project audit verifier backed by API acceptance case team-role-matrix.project-summary.teamOwner." - admin.project.project.create-project.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.teamOwner - description: "@treeseed/admin project/project/create-project content verifier backed by API acceptance case team-role-matrix.project-summary.teamOwner." - admin.project.project.create-project.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.nonMember - description: "@treeseed/admin project/project/create-project negative verifier backed by API acceptance case team-role-matrix.project-summary.nonMember." - admin.project.project.destroy-project.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.teamOwner - description: "@treeseed/admin project/project/destroy-project api verifier backed by API acceptance case team-role-matrix.project-summary.teamOwner." - admin.project.project.destroy-project.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.teamOwner - description: "@treeseed/admin project/project/destroy-project audit verifier backed by API acceptance case team-role-matrix.project-summary.teamOwner." - admin.project.project.destroy-project.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.teamOwner - description: "@treeseed/admin project/project/destroy-project content verifier backed by API acceptance case team-role-matrix.project-summary.teamOwner." - admin.project.project.destroy-project.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.nonMember - description: "@treeseed/admin project/project/destroy-project negative verifier backed by API acceptance case team-role-matrix.project-summary.nonMember." - admin.project.project.edit-project-settings.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.teamOwner - description: "@treeseed/admin project/project/edit-project-settings api verifier backed by API acceptance case team-role-matrix.project-summary.teamOwner." - admin.project.project.edit-project-settings.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.teamOwner - description: "@treeseed/admin project/project/edit-project-settings audit verifier backed by API acceptance case team-role-matrix.project-summary.teamOwner." - admin.project.project.edit-project-settings.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.teamOwner - description: "@treeseed/admin project/project/edit-project-settings content verifier backed by API acceptance case team-role-matrix.project-summary.teamOwner." - admin.project.project.edit-project-settings.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.nonMember - description: "@treeseed/admin project/project/edit-project-settings negative verifier backed by API acceptance case team-role-matrix.project-summary.nonMember." - admin.project.project.monitor-project.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.teamOwner - description: "@treeseed/admin project/project/monitor-project api verifier backed by API acceptance case team-role-matrix.project-summary.teamOwner." - admin.project.project.monitor-project.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.teamOwner - description: "@treeseed/admin project/project/monitor-project audit verifier backed by API acceptance case team-role-matrix.project-summary.teamOwner." - admin.project.project.monitor-project.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.teamOwner - description: "@treeseed/admin project/project/monitor-project content verifier backed by API acceptance case team-role-matrix.project-summary.teamOwner." - admin.project.project.monitor-project.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.nonMember - description: "@treeseed/admin project/project/monitor-project negative verifier backed by API acceptance case team-role-matrix.project-summary.nonMember." - admin.project.project.view-project-profile.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.teamOwner - description: "@treeseed/admin project/project/view-project-profile api verifier backed by API acceptance case team-role-matrix.project-summary.teamOwner." - admin.project.project.view-project-profile.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.teamOwner - description: "@treeseed/admin project/project/view-project-profile audit verifier backed by API acceptance case team-role-matrix.project-summary.teamOwner." - admin.project.project.view-project-profile.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.teamOwner - description: "@treeseed/admin project/project/view-project-profile content verifier backed by API acceptance case team-role-matrix.project-summary.teamOwner." - admin.project.project.view-project-profile.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.nonMember - description: "@treeseed/admin project/project/view-project-profile negative verifier backed by API acceptance case team-role-matrix.project-summary.nonMember." - admin.project.proposal.create-note-on-proposal.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/proposal/create-note-on-proposal api verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.proposal.create-note-on-proposal.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/proposal/create-note-on-proposal audit verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.proposal.create-note-on-proposal.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/proposal/create-note-on-proposal content verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.proposal.create-note-on-proposal.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.nonMember - description: "@treeseed/admin project/proposal/create-note-on-proposal negative verifier backed by API acceptance case team-role-matrix.project-summary.nonMember." - admin.project.proposal.create-proposal.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/proposal/create-proposal api verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.proposal.create-proposal.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/proposal/create-proposal audit verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.proposal.create-proposal.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/proposal/create-proposal content verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.proposal.create-proposal.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.nonMember - description: "@treeseed/admin project/proposal/create-proposal negative verifier backed by API acceptance case team-role-matrix.project-summary.nonMember." - admin.project.proposal.delete-proposal.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/proposal/delete-proposal api verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.proposal.delete-proposal.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/proposal/delete-proposal audit verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.proposal.delete-proposal.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/proposal/delete-proposal content verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.proposal.delete-proposal.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.nonMember - description: "@treeseed/admin project/proposal/delete-proposal negative verifier backed by API acceptance case team-role-matrix.project-summary.nonMember." - admin.project.proposal.edit-proposal.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/proposal/edit-proposal api verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.proposal.edit-proposal.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/proposal/edit-proposal audit verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.proposal.edit-proposal.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/proposal/edit-proposal content verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.proposal.edit-proposal.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.nonMember - description: "@treeseed/admin project/proposal/edit-proposal negative verifier backed by API acceptance case team-role-matrix.project-summary.nonMember." - admin.project.proposal.proposal-inbox.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/proposal/proposal-inbox api verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.proposal.proposal-inbox.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/proposal/proposal-inbox audit verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.proposal.proposal-inbox.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/proposal/proposal-inbox content verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.proposal.proposal-inbox.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.nonMember - description: "@treeseed/admin project/proposal/proposal-inbox negative verifier backed by API acceptance case team-role-matrix.project-summary.nonMember." - admin.project.proposal.search-proposals.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/proposal/search-proposals api verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.proposal.search-proposals.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/proposal/search-proposals audit verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.proposal.search-proposals.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/proposal/search-proposals content verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.proposal.search-proposals.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.nonMember - description: "@treeseed/admin project/proposal/search-proposals negative verifier backed by API acceptance case team-role-matrix.project-summary.nonMember." - admin.project.proposal.vote-on-proposal.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/proposal/vote-on-proposal api verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.proposal.vote-on-proposal.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/proposal/vote-on-proposal audit verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.proposal.vote-on-proposal.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/proposal/vote-on-proposal content verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.proposal.vote-on-proposal.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.nonMember - description: "@treeseed/admin project/proposal/vote-on-proposal negative verifier backed by API acceptance case team-role-matrix.project-summary.nonMember." - admin.project.question.answer-question.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/question/answer-question api verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.question.answer-question.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/question/answer-question audit verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.question.answer-question.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/question/answer-question content verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.question.answer-question.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.nonMember - description: "@treeseed/admin project/question/answer-question negative verifier backed by API acceptance case team-role-matrix.project-summary.nonMember." - admin.project.question.ask-question.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/question/ask-question api verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.question.ask-question.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/question/ask-question audit verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.question.ask-question.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/question/ask-question content verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.question.ask-question.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.nonMember - description: "@treeseed/admin project/question/ask-question negative verifier backed by API acceptance case team-role-matrix.project-summary.nonMember." - admin.project.question.delete-question.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/question/delete-question api verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.question.delete-question.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/question/delete-question audit verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.question.delete-question.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/question/delete-question content verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.question.delete-question.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.nonMember - description: "@treeseed/admin project/question/delete-question negative verifier backed by API acceptance case team-role-matrix.project-summary.nonMember." - admin.project.question.edit-question.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/question/edit-question api verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.question.edit-question.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/question/edit-question audit verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.question.edit-question.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/question/edit-question content verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.question.edit-question.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.nonMember - description: "@treeseed/admin project/question/edit-question negative verifier backed by API acceptance case team-role-matrix.project-summary.nonMember." - admin.project.question.search-questions-answers.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/question/search-questions-answers api verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.question.search-questions-answers.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/question/search-questions-answers audit verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.question.search-questions-answers.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner - description: "@treeseed/admin project/question/search-questions-answers content verifier backed by API acceptance case descriptor-executable-role-matrix.get.v1.ui.knowledge.teamOwner." - admin.project.question.search-questions-answers.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: team-role-matrix.project-summary.nonMember - description: "@treeseed/admin project/question/search-questions-answers negative verifier backed by API acceptance case team-role-matrix.project-summary.nonMember." - admin.workday.workday.analyze-workday.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: workday.artifacts.review-workday-artifacts - description: "@treeseed/admin workday/workday/analyze-workday api verifier backed by API acceptance case workday.artifacts.review-workday-artifacts." - admin.workday.workday.analyze-workday.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: workday.artifacts.review-workday-artifacts - description: "@treeseed/admin workday/workday/analyze-workday audit verifier backed by API acceptance case workday.artifacts.review-workday-artifacts." - admin.workday.workday.analyze-workday.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: workday.artifacts.review-workday-artifacts - description: "@treeseed/admin workday/workday/analyze-workday content verifier backed by API acceptance case workday.artifacts.review-workday-artifacts." - admin.workday.workday.analyze-workday.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: workday.diagnostics.inspect-mode-run-trace - description: "@treeseed/admin workday/workday/analyze-workday negative verifier backed by API acceptance case workday.diagnostics.inspect-mode-run-trace." - admin.workday.workday.monitor-workdays.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: workday.artifacts.review-workday-artifacts - description: "@treeseed/admin workday/workday/monitor-workdays api verifier backed by API acceptance case workday.artifacts.review-workday-artifacts." - admin.workday.workday.monitor-workdays.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: workday.artifacts.review-workday-artifacts - description: "@treeseed/admin workday/workday/monitor-workdays audit verifier backed by API acceptance case workday.artifacts.review-workday-artifacts." - admin.workday.workday.monitor-workdays.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: workday.artifacts.review-workday-artifacts - description: "@treeseed/admin workday/workday/monitor-workdays content verifier backed by API acceptance case workday.artifacts.review-workday-artifacts." - admin.workday.workday.monitor-workdays.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: workday.diagnostics.inspect-mode-run-trace - description: "@treeseed/admin workday/workday/monitor-workdays negative verifier backed by API acceptance case workday.diagnostics.inspect-mode-run-trace." - admin.workday.workday.schedule-workdays.api: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: workday.artifacts.review-workday-artifacts - description: "@treeseed/admin workday/workday/schedule-workdays api verifier backed by API acceptance case workday.artifacts.review-workday-artifacts." - admin.workday.workday.schedule-workdays.audit: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: workday.artifacts.review-workday-artifacts - description: "@treeseed/admin workday/workday/schedule-workdays audit verifier backed by API acceptance case workday.artifacts.review-workday-artifacts." - admin.workday.workday.schedule-workdays.content: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: workday.artifacts.review-workday-artifacts - description: "@treeseed/admin workday/workday/schedule-workdays content verifier backed by API acceptance case workday.artifacts.review-workday-artifacts." - admin.workday.workday.schedule-workdays.negative: - kind: apiAcceptanceCase - ownerPackage: "@treeseed/api" - spec: scripts/api-acceptance.ts - caseId: workday.diagnostics.inspect-mode-run-trace - description: "@treeseed/admin workday/workday/schedule-workdays negative verifier backed by API acceptance case workday.diagnostics.inspect-mode-run-trace." + description: Public team identity can be loaded by name. diff --git a/guarantees/workday/workday/analyze-workday.guarantee.yaml b/guarantees/workday/workday/analyze-workday.guarantee.yaml deleted file mode 100644 index a1d99093..00000000 --- a/guarantees/workday/workday/analyze-workday.guarantee.yaml +++ /dev/null @@ -1,79 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.workday.workday.analyze-workday.064 -journeyIndex: 64 -type: workday -subtype: workday -journey: Analyze Workday -ownerPackage: "@treeseed/admin" -summary: Summarize reports diagnostics artifacts decisions questions and usage after a workday; reports belong in .treeseed/workday-reports while content artifacts stay in collections. -status: active -dependencies: - journeys: - - 27 - - 28 - - 32 - guarantees: - - guarantee.capacity.capacity.approve-capacity.027 - - guarantee.capacity.capacity.deploy-capacity.028 - - guarantee.project.project.create-project.032 -actors: - allowed: - - project_manager - - agent_operator - - capacity_operator - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - desktop_firefox - - tablet_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 27, 28, 32" -scene: - required: true - manifest: ./scenes/analyze-workday.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/projects/project-visual-audit-project/workdays/seed-workday - componentContract: dashboard/read-model service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.workday.workday.analyze-workday.api -content: - required: false - verifierRefs: - - admin.workday.workday.analyze-workday.content -audit: - required: true - verifierRefs: - - admin.workday.workday.analyze-workday.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.workday.workday.analyze-workday.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Summarize reports diagnostics artifacts decisions questions and usage after a workday; reports belong in .treeseed/workday-reports while content artifacts stay in collections. diff --git a/guarantees/workday/workday/monitor-workdays.guarantee.yaml b/guarantees/workday/workday/monitor-workdays.guarantee.yaml deleted file mode 100644 index 8a709549..00000000 --- a/guarantees/workday/workday/monitor-workdays.guarantee.yaml +++ /dev/null @@ -1,79 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.workday.workday.monitor-workdays.063 -journeyIndex: 63 -type: workday -subtype: workday -journey: Monitor Workdays -ownerPackage: "@treeseed/admin" -summary: Track live workday assignments mode runs generated artifacts usage and settlement; should continue scheduling useful planning work while budget and time remain. -status: active -dependencies: - journeys: - - 27 - - 28 - - 32 - guarantees: - - guarantee.capacity.capacity.approve-capacity.027 - - guarantee.capacity.capacity.deploy-capacity.028 - - guarantee.project.project.create-project.032 -actors: - allowed: - - project_manager - - agent_operator - - capacity_operator - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - desktop_firefox - - tablet_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 27, 28, 32" -scene: - required: true - manifest: ./scenes/monitor-workdays.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/capacity/workday-runs - componentContract: dashboard/read-model service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.workday.workday.monitor-workdays.api -content: - required: false - verifierRefs: - - admin.workday.workday.monitor-workdays.content -audit: - required: true - verifierRefs: - - admin.workday.workday.monitor-workdays.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.workday.workday.monitor-workdays.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Track live workday assignments mode runs generated artifacts usage and settlement; should continue scheduling useful planning work while budget and time remain. diff --git a/guarantees/workday/workday/scenes/analyze-workday.scene.yaml b/guarantees/workday/workday/scenes/analyze-workday.scene.yaml deleted file mode 100644 index b481ca95..00000000 --- a/guarantees/workday/workday/scenes/analyze-workday.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: workday.workday.analyze-workday.064 -title: Analyze Workday -description: Scene scaffold for guarantee.workday.workday.analyze-workday.064. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Analyze Workday opens the canonical @treeseed/admin record operations workflow. - - Analyze Workday exercises a service journey instead of only loading /app/projects/project-visual-audit-project/workdays/seed-workday. - - Analyze Workday records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: project.primary - kind: project -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Analyze Workday - action: - goto: /app/projects/project-visual-audit-project/workdays/seed-workday - expect: - urlIncludes: /app/projects - - id: inspect-service-surface - title: Inspect Analyze Workday service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/projects -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/workday/workday/scenes/monitor-workdays.scene.yaml b/guarantees/workday/workday/scenes/monitor-workdays.scene.yaml deleted file mode 100644 index 5aa1b080..00000000 --- a/guarantees/workday/workday/scenes/monitor-workdays.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: workday.workday.monitor-workdays.063 -title: Monitor Workdays -description: Scene scaffold for guarantee.workday.workday.monitor-workdays.063. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Monitor Workdays opens the canonical @treeseed/admin record operations workflow. - - Monitor Workdays exercises a service journey on the canonical workday run operator surface. - - Monitor Workdays records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: project.primary - kind: project -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Monitor Workdays - action: - goto: /app/capacity/workday-runs - expect: - urlIncludes: /app/capacity/workday-runs - - id: inspect-service-surface - title: Inspect Monitor Workdays service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/capacity/workday-runs -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/workday/workday/scenes/schedule-workdays.scene.yaml b/guarantees/workday/workday/scenes/schedule-workdays.scene.yaml deleted file mode 100644 index 28f72be3..00000000 --- a/guarantees/workday/workday/scenes/schedule-workdays.scene.yaml +++ /dev/null @@ -1,118 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: workday.workday.schedule-workdays.062 -title: Schedule Workdays -description: Scene scaffold for guarantee.workday.workday.schedule-workdays.062. This scene is intentionally minimal until the workflow-specific acceptance steps are authored. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - Schedule Workdays opens the canonical @treeseed/admin record operations workflow. - - Schedule Workdays exercises a service journey instead of only loading /app/projects/project-visual-audit-project/workdays. - - Schedule Workdays records reviewable evidence for the visible result before activation. - minimumSteps: 2 - requiresInteractiveAction: true - consumesState: - - key: auth.owner - kind: user - - key: project.primary - kind: project -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop - profiles: - - id: desktop - title: Desktop - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false -setup: - dev: - required: true - command: trsd dev start --web-runtime local --json - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open Schedule Workdays - action: - goto: /app/projects/project-visual-audit-project/workdays - expect: - urlIncludes: /app/projects - - id: inspect-service-surface - title: Inspect Schedule Workdays service surface - action: - keyboard: Tab - expect: - urlIncludes: /app/projects -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: - formats: - - json - - markdown - - vtt - - srt -visualAudit: - enabled: false diff --git a/guarantees/workday/workday/schedule-workdays.guarantee.yaml b/guarantees/workday/workday/schedule-workdays.guarantee.yaml deleted file mode 100644 index bc3aba27..00000000 --- a/guarantees/workday/workday/schedule-workdays.guarantee.yaml +++ /dev/null @@ -1,79 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.workday.workday.schedule-workdays.062 -journeyIndex: 62 -type: workday -subtype: workday -journey: Schedule Workdays -ownerPackage: "@treeseed/admin" -summary: Create duration and budget bounded workdays for projects with approved capacity; planning must cover eligible agents before repeats. -status: active -dependencies: - journeys: - - 27 - - 28 - - 32 - guarantees: - - guarantee.capacity.capacity.approve-capacity.027 - - guarantee.capacity.capacity.deploy-capacity.028 - - guarantee.project.project.create-project.032 -actors: - allowed: - - project_manager - - agent_operator - - capacity_operator - forbidden: - - anonymous_user - - unauthorized_user -devices: - required: - - desktop_chromium - - desktop_firefox - - tablet_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 27, 28, 32" -scene: - required: true - manifest: ./scenes/schedule-workdays.scene.yaml - mode: - acceptance: true - demo: true - training: true - entryRoute: /app/projects/project-visual-audit-project/workdays - componentContract: dashboard/read-model service journey - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - admin.workday.workday.schedule-workdays.api -content: - required: false - verifierRefs: - - admin.workday.workday.schedule-workdays.content -audit: - required: true - verifierRefs: - - admin.workday.workday.schedule-workdays.audit -negativeCases: - - id: unauthorized-actor-denied - actor: anonymous_user - verifierRefs: - - admin.workday.workday.schedule-workdays.negative -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - - audit_event_id -notes: - - Create duration and budget bounded workdays for projects with approved capacity; planning must cover eligible agents before repeats. diff --git a/package-lock.json b/package-lock.json index d15f3fd1..293ec322 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,20 +1,18 @@ { "name": "@treeseed/admin", - "version": "0.12.59-dev.fix-local-dev-unhealthy-restart.20260716T025832Z", + "version": "0.12.59-dev.staging.20260716T154320Z", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@treeseed/admin", - "version": "0.12.59-dev.fix-local-dev-unhealthy-restart.20260716T025832Z", + "version": "0.12.59-dev.staging.20260716T154320Z", "license": "AGPL-3.0-only", "dependencies": { - "@mdxeditor/editor": "^4.0.2", "@react-email/render": "^2.0.8", "@treeseed/core": "github:treeseed-ai/core#92947586ed8829b36921018c61d81a2f655f0410", "@treeseed/sdk": "github:treeseed-ai/sdk#42d9e8308e1eb7bdb31a6d204e6b0aa7358e775a", "@treeseed/ui": "github:treeseed-ai/ui#0f10f2a452d570eb3d4aa31a246c62f3adf49aa2", - "libsodium-wrappers-sumo": "^0.7.16", "react": "^19.2.5", "react-dom": "^19.2.6" }, @@ -15336,12 +15334,6 @@ "integrity": "sha512-3HrzSPuzm6Yt9aTYCDxYEG8x8/6C0+ag655Y7rhhWZM9PT4NpdnbqlzXhGZlDnkgR6MeSTnOt/VIyHLs9aSf+Q==", "license": "ISC" }, - "node_modules/libsodium-sumo": { - "version": "0.7.16", - "resolved": "https://registry.npmjs.org/libsodium-sumo/-/libsodium-sumo-0.7.16.tgz", - "integrity": "sha512-x6atrz2AdXCJg6G709x9W9TTJRI6/0NcL5dD0l5GGVqNE48UJmDsjO4RUWYTeyXXUpg+NXZ2SHECaZnFRYzwGA==", - "license": "ISC" - }, "node_modules/libsodium-wrappers": { "version": "0.7.16", "resolved": "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.16.tgz", @@ -15351,15 +15343,6 @@ "libsodium": "^0.7.16" } }, - "node_modules/libsodium-wrappers-sumo": { - "version": "0.7.16", - "resolved": "https://registry.npmjs.org/libsodium-wrappers-sumo/-/libsodium-wrappers-sumo-0.7.16.tgz", - "integrity": "sha512-gR0JEFPeN3831lB9+ogooQk0KH4K5LSMIO5Prd5Q5XYR2wHFtZfPg0eP7t1oJIWq+UIzlU4WVeBxZ97mt28tXw==", - "license": "ISC", - "dependencies": { - "libsodium-sumo": "^0.7.16" - } - }, "node_modules/lightningcss": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", diff --git a/package.json b/package.json index 3b6bcc92..e82fb835 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@treeseed/admin", - "version": "0.12.59-dev.fix-local-dev-unhealthy-restart.20260716T025832Z", + "version": "0.12.59-dev.staging.20260716T154320Z", "description": "Treeseed administration portal framework built on @treeseed/core and @treeseed/ui.", "license": "AGPL-3.0-only", "repository": { @@ -46,12 +46,10 @@ "release:publish": "node --import tsx ./scripts/publish-package.ts" }, "dependencies": { - "@mdxeditor/editor": "^4.0.2", "@react-email/render": "^2.0.8", "@treeseed/core": "github:treeseed-ai/core#92947586ed8829b36921018c61d81a2f655f0410", "@treeseed/sdk": "github:treeseed-ai/sdk#42d9e8308e1eb7bdb31a6d204e6b0aa7358e775a", "@treeseed/ui": "github:treeseed-ai/ui#0f10f2a452d570eb3d4aa31a246c62f3adf49aa2", - "libsodium-wrappers-sumo": "^0.7.16", "react": "^19.2.5", "react-dom": "^19.2.6" }, @@ -110,7 +108,6 @@ "default": "./dist/view-models/*.js" }, "./layouts/TreeseedAppLayout.astro": "./dist/layouts/TreeseedAppLayout.astro", - "./layouts/TreeseedOperationalMarketLayout.astro": "./dist/layouts/TreeseedOperationalMarketLayout.astro", "./layouts/TreeseedPublicLayout.astro": "./dist/layouts/TreeseedPublicLayout.astro" } } diff --git a/src/capabilities/questions.ts b/src/capabilities/questions.ts deleted file mode 100644 index 9d9fe5f3..00000000 --- a/src/capabilities/questions.ts +++ /dev/null @@ -1,84 +0,0 @@ -import type { - CapabilityDefinition, - CollectionFilterField, - NavigationItem, - ResourceUiSchema, -} from '@treeseed/ui'; - -export const QUESTION_ACTION_IDS = { - read: 'question.read', - create: 'question.create', - edit: 'question.edit', - save: 'question.save', - export: 'question.export', -} as const; - -export const QUESTION_STATUS_OPTIONS = [ - { label: 'Any status', value: '' }, - { label: 'Recorded', value: 'recorded' }, - { label: 'Planned', value: 'planned' }, - { label: 'Live', value: 'live' }, - { label: 'In progress', value: 'in progress' }, - { label: 'Exploratory', value: 'exploratory' }, - { label: 'Speculative', value: 'speculative' }, -] as const; - -export const QUESTION_TYPE_OPTIONS = [ - { label: 'Any type', value: '' }, - { label: 'Strategy', value: 'strategy' }, - { label: 'Implementation', value: 'implementation' }, - { label: 'Research', value: 'research' }, - { label: 'Evaluation', value: 'evaluation' }, -] as const; - -export const QUESTION_WORK_NAV_ENTRY: NavigationItem = { - label: 'Questions', - href: '/app/work/questions', -}; - -export const QUESTION_CAPABILITY: CapabilityDefinition = { - id: 'work.questions', - label: 'Questions', - scope: 'project', - path: '/app/work/questions', - template: 'collection', - resourceType: 'question', - access: ['signed-in principal', 'active team', 'project work policy'], - actions: Object.values(QUESTION_ACTION_IDS), - primaryAction: QUESTION_ACTION_IDS.create, - secondaryActions: [QUESTION_ACTION_IDS.export], - help: { - topicIds: ['work-content', 'questions'], - summary: 'Questions capture the uncertainty that directs project work, proposals, decisions, and knowledge generation.', - feedbackType: 'question', - }, - feedbackContext: ['route', 'team', 'project', 'capability', 'resource'], -}; - -export const QUESTION_RESOURCE_SCHEMA: ResourceUiSchema = { - type: 'question', - display: { - label: 'Question', - pluralLabel: 'Questions', - summaryField: 'summary', - statusField: 'status', - }, - collection: { - emptyTitle: 'No question content yet', - emptyDescription: 'Question records appear from src/content/questions.', - displayModes: ['cards', 'table'], - }, - actions: { - primary: [QUESTION_ACTION_IDS.create, QUESTION_ACTION_IDS.edit, QUESTION_ACTION_IDS.save], - secondary: [QUESTION_ACTION_IDS.export], - }, - help: QUESTION_CAPABILITY.help, -}; - -export function questionCollectionFilters(values: { q?: string; status?: string; questionType?: string }): CollectionFilterField[] { - return [ - { key: 'q', label: 'Search', type: 'search', value: values.q ?? '' }, - { key: 'status', label: 'Status', type: 'select', value: values.status ?? '', options: [...QUESTION_STATUS_OPTIONS] }, - { key: 'questionType', label: 'Type', type: 'select', value: values.questionType ?? '', options: [...QUESTION_TYPE_OPTIONS] }, - ]; -} diff --git a/src/components/work/DirectionContentForm.astro b/src/components/work/DirectionContentForm.astro deleted file mode 100644 index c085d660..00000000 --- a/src/components/work/DirectionContentForm.astro +++ /dev/null @@ -1,125 +0,0 @@ ---- -import Button from '@treeseed/ui/components/astro/forms/Button.astro'; -import Field from '@treeseed/ui/components/astro/forms/Field.astro'; -import FormActions from '@treeseed/ui/components/astro/forms/FormActions.astro'; -import Select from '@treeseed/ui/components/astro/forms/Select.astro'; -import TextInput from '@treeseed/ui/components/astro/forms/TextInput.astro'; -import Textarea from '@treeseed/ui/components/astro/forms/Textarea.astro'; -import MarkdownField from '@treeseed/ui/components/astro/app/controls/MarkdownField.astro'; -import type { DirectionCollection } from '../../view-models/operating-loop.vm.js'; - -interface ProjectOption { - label: string; - value: string; -} - -interface Props { - collection: DirectionCollection; - mode: 'create' | 'edit'; - projectOptions: ProjectOption[]; - selectedProjectId: string; - initialData?: Record; - body?: string; - slug?: string; - fallbackHref: string; -} - -const { - collection, - mode, - projectOptions, - selectedProjectId, - initialData = {}, - body = '', - slug = '', - fallbackHref, -} = Astro.props as Props; - -const labels: Record }> = { - objectives: { singular: 'objective', typeLabel: 'Horizon', typeName: 'timeHorizon', options: [{ label: 'Near-term', value: 'near-term' }, { label: 'Mid-term', value: 'mid-term' }, { label: 'Long-term', value: 'long-term' }] }, - notes: { singular: 'note', typeLabel: 'Type' }, - proposals: { singular: 'proposal', typeLabel: 'Proposal type', typeName: 'proposalType', options: [{ label: 'Implementation', value: 'implementation' }, { label: 'Strategy', value: 'strategy' }, { label: 'Policy', value: 'policy' }, { label: 'Research', value: 'research' }] }, - decisions: { singular: 'decision', typeLabel: 'Decision type', typeName: 'decisionType', options: [{ label: 'Approved', value: 'approved' }, { label: 'Rejected', value: 'rejected' }, { label: 'Deferred', value: 'deferred' }, { label: 'Request changes', value: 'request_changes' }, { label: 'Superseded', value: 'superseded' }] }, -}; -const label = labels[collection]; -const dataId = `${collection}-${mode}-data`; -const formId = `${collection}-${mode}-form`; -const statusId = `${collection}-${mode}-status`; -const serialized = JSON.stringify({ collection, projectId: selectedProjectId }).replace(/ - {mode === 'edit' ? ( - <> - - - - - ) : null} -
- - - - {label.typeName && label.options ? ( - - -
- -
- - - - - - - - - - -
- {launchContextRows.map((row) => ( -
- {row.label} - {row.value} -

{row.description}

-
- ))} -
-
- - - {architectureRows.length > 0 ? ( -
- {architectureRows.map((row) => ( -
- {row.label} - {row.value} -

{row.description}

-
- ))} -
- ) : ( -

No canonical project architecture is recorded yet. Import or seed the project with topology, rootPath, sitePath, contentPath, contentRuntimeSource, and localContentMaterialization.

- )} -
- - ) : ( - - )} - - - diff --git a/src/pages/app/projects/[projectId]/workdays.astro b/src/pages/app/projects/[projectId]/workdays.astro deleted file mode 100644 index b2cf71eb..00000000 --- a/src/pages/app/projects/[projectId]/workdays.astro +++ /dev/null @@ -1,32 +0,0 @@ ---- -import CollectionTemplate from '@treeseed/ui/components/astro/templates/CollectionTemplate.astro'; -import WorkQueueSummary from '@treeseed/ui/components/astro/operating/WorkQueueSummary.astro'; -import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; -import TreeseedAppLayout from '../../../../layouts/TreeseedAppLayout.astro'; -import { loadProjectWorkdayCollection } from '../../../../view-models/operating-loop.vm.js'; - -const projectParam = String(Astro.params.projectId ?? ''); -if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); -const vm = await loadProjectWorkdayCollection(Astro, projectParam, Astro.url); -if (!vm.project) Astro.response.status = vm.resolution.status === 'forbidden' ? 403 : 404; -const pageJson = JSON.stringify({ projectId: vm.project?.id ?? '', requestType: 'one_off_run', reason: 'Requested from project workdays', source: 'project_workdays_ui' }).replace(/ - {vm.project ? ( - - - - - - ) : ( - - )} - - - - diff --git a/src/pages/app/projects/[projectId]/workdays/[workdayId].astro b/src/pages/app/projects/[projectId]/workdays/[workdayId].astro deleted file mode 100644 index a74145e9..00000000 --- a/src/pages/app/projects/[projectId]/workdays/[workdayId].astro +++ /dev/null @@ -1,31 +0,0 @@ ---- -import WorkspaceTemplate from '@treeseed/ui/components/astro/templates/WorkspaceTemplate.astro'; -import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; -import TreeseedAppLayout from '../../../../../layouts/TreeseedAppLayout.astro'; -import { loadProjectWorkdayWorkspace } from '../../../../../view-models/operating-loop.vm.js'; - -const projectParam = String(Astro.params.projectId ?? ''); -const workdayId = String(Astro.params.workdayId ?? ''); -if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); -const vm = await loadProjectWorkdayWorkspace(Astro, projectParam, workdayId, Astro.url); -if (!vm.project || !vm.workspace) Astro.response.status = vm.resolution.status === 'forbidden' ? 403 : 404; -const pageJson = JSON.stringify({ projectId: vm.project?.id ?? '', requestType: 'follow_up', reason: 'Requested from workday workspace', source: 'workday_workspace_ui' }).replace(/ - {vm.workspace ? ( - - - - - ) : ( - - )} - - - - diff --git a/src/pages/app/projects/deployment/[id].astro b/src/pages/app/projects/deployment/[id].astro deleted file mode 100644 index ded01c5d..00000000 --- a/src/pages/app/projects/deployment/[id].astro +++ /dev/null @@ -1,336 +0,0 @@ ---- -import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; -import Panel from '@treeseed/ui/components/astro/surface/Panel.astro'; -import StatusPill from '@treeseed/ui/components/astro/data/StatusPill.astro'; -import TreeseedAppLayout from '../../../../layouts/TreeseedAppLayout.astro'; -import { loadAppContext, persistActiveTeamSelection, resolveAppDeployment } from '../../../../view-models/app-access.js'; - -const deploymentId = Astro.params.id ?? ''; -if (!Astro.locals.auth?.principal) { - return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname + Astro.url.search)}`); -} -const context = await loadAppContext(Astro); -const deploymentResolution = deploymentId ? await resolveAppDeployment(context, deploymentId) : null; -const deploymentAccessible = Boolean(deploymentId && deploymentResolution?.status === 'found'); -const layoutActiveTeam = deploymentResolution?.team ?? context.activeTeam; -if (deploymentResolution?.team?.id && deploymentResolution.team.id !== context.activeTeam?.id) persistActiveTeamSelection(Astro, deploymentResolution.team); -if (deploymentId && !deploymentAccessible) { - Astro.response.status = deploymentResolution?.status === 'forbidden' ? 403 : 404; -} ---- - - - {deploymentAccessible ? ( -
- -
-
-
- Current state -

Loading deployment

-

Reading durable deployment state.

-
- -
-
-
-
- 6% - Loading deployment record -
-
-
    -
  1. Record createdDurable deployment exists.
  2. -
  3. Credential bootstrapUnlock host credentials in API memory.
  4. -
  5. Hosting auditValidate repository, web, email, and platform readiness.
  6. -
  7. Provider setupCreate repositories and configure hosting resources.
  8. -
  9. Runner workTrack any queued backend work.
  10. -
  11. Acceptance checksConfirm live environments are ready.
  12. -
-
-
- -
- -

No blockers recorded yet.

-
- -
- - -

-
-
-
- - -
- -
-
- ) : deploymentId ? ( - - ) : ( - - )} -
- - diff --git a/src/pages/app/projects/index.astro b/src/pages/app/projects/index.astro deleted file mode 100644 index a9b44f0d..00000000 --- a/src/pages/app/projects/index.astro +++ /dev/null @@ -1,59 +0,0 @@ ---- -import Button from '@treeseed/ui/components/astro/forms/Button.astro'; -import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; -import Panel from '@treeseed/ui/components/astro/surface/Panel.astro'; -import PlainTable from '@treeseed/ui/components/astro/app/controls/PlainTable.astro'; -import TreeseedAppLayout from '../../../layouts/TreeseedAppLayout.astro'; -import { escapeHtml as esc } from '../../../lib/market/control-ui.js'; -import { loadAppContext } from '../../../view-models/app-access.js'; - -if (!Astro.locals.auth?.principal) { - return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent('/app/projects')}`); -} -const context = await loadAppContext(Astro); -const latestDeploymentByProject = new Map(); -if (context.activeTeam && context.store?.listProjectDeployments) { - await Promise.all(context.projects.map(async (project: any) => { - const deployments = await context.store.listProjectDeployments(project.id, { limit: 10 }).catch(() => []); - const latestLaunch = deployments.find((deployment: any) => deployment.action === 'launch_project') ?? deployments[0] ?? null; - if (latestLaunch) latestDeploymentByProject.set(project.id, latestLaunch); - })); -} -const rows = context.projects.map((project: any) => { - const latestDeployment = latestDeploymentByProject.get(project.id) ?? null; - const actions = [ - `Settings`, - `Deploy`, - `Guide`, - `Decisions`, - `Workdays`, - `Agents`, - `Artifacts`, - ]; - return { - id: `project-${esc(project.id)}`, - name: `${esc(project.name ?? project.slug ?? project.id)}${esc(project.description ?? project.summary ?? 'Hosted project')}`, - handle: esc(project.slug ?? project.handle ?? project.id), - deployment: latestDeployment ? `${esc(latestDeployment.environment ?? 'staging')} ${esc(latestDeployment.status ?? 'recorded')}` : 'Not started', - actions: actions.join(' '), - }; -}); ---- - - -
- - - {context.activeTeam ? ( - - ) : ( - - )} - -
-
diff --git a/src/pages/app/projects/new.astro b/src/pages/app/projects/new.astro deleted file mode 100644 index 96b121ec..00000000 --- a/src/pages/app/projects/new.astro +++ /dev/null @@ -1,996 +0,0 @@ ---- -import Button from '@treeseed/ui/components/astro/forms/Button.astro'; -import Field from '@treeseed/ui/components/astro/forms/Field.astro'; -import FormActions from '@treeseed/ui/components/astro/forms/FormActions.astro'; -import Select from '@treeseed/ui/components/astro/forms/Select.astro'; -import TextInput from '@treeseed/ui/components/astro/forms/TextInput.astro'; -import HostCredentialPermissionNote from '@treeseed/ui/components/astro/app/controls/HostCredentialPermissionNote.astro'; -import LaunchRequirementSummary from '@treeseed/ui/components/astro/app/controls/LaunchRequirementSummary.astro'; -import TemplateHostRequirementPicker from '@treeseed/ui/components/astro/app/controls/TemplateHostRequirementPicker.astro'; -import TemplateResourceRequirementPicker from '@treeseed/ui/components/astro/app/controls/TemplateResourceRequirementPicker.astro'; -import TemplateSecretRequirementPanel from '@treeseed/ui/components/astro/app/controls/TemplateSecretRequirementPanel.astro'; -import ReadinessSummary from '@treeseed/ui/components/astro/service/ReadinessSummary.astro'; -import type { TemplateSiteCard } from '@treeseed/core/templates'; -import { deriveProjectLaunchRequirementsViewModel } from '@treeseed/sdk/template-launch-ui'; -import type { ProjectLaunchHostRequirementViewModel } from '@treeseed/sdk/template-launch-ui'; -import { TREESEED_DEFAULT_STARTER_TEMPLATE_ID } from '@treeseed/sdk/types'; -import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; -import Panel from '@treeseed/ui/components/astro/surface/Panel.astro'; -import TreeseedAppLayout from '../../../layouts/TreeseedAppLayout.astro'; -import { listTreeseedManagedHostsFromConfig } from '../../../lib/market/managed-hosts.js'; -import { hostPurposeFor } from '../../../lib/market/control-ui.js'; -import { loadAppContext } from '../../../view-models/app-access.js'; -import { buildServicesDashboard, loadServiceInventory } from '../../../view-models/service-readiness.vm.js'; -import { listMarketplaceSiteTemplates } from '../../../lib/market/public-access.js'; - -if (!Astro.locals.auth?.principal) { - return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent('/app/projects/new')}`); -} -const context = await loadAppContext(Astro); -const runtime = (Astro.locals as any).runtime ?? Astro.locals; -const team = context.activeTeam; -const [managedHosts, customHosts, repositoryHosts] = team && context.store - ? await Promise.all([ - listTreeseedManagedHostsFromConfig(team.id, runtime).catch(() => []), - context.store.listTeamWebHosts(team.id).catch(() => []), - context.store.listRepositoryHosts(team.id).catch(() => []), - ]) - : [[], [], []]; -const templateListing = await listMarketplaceSiteTemplates(Astro).catch(() => ({ rendered: true, items: [] as TemplateSiteCard[] })); -const marketplaceTemplateItems = templateListing.items as TemplateSiteCard[]; -const activeStarterTemplateIds = new Set([ - 'research', - 'engineering', -]); -const templateSourceRef = (template: TemplateSiteCard) => template.sourceRef ?? template.slug; -const launchableTemplates = marketplaceTemplateItems.filter((template) => activeStarterTemplateIds.has(templateSourceRef(template))); -const templateCards = [ - ...launchableTemplates.filter((template) => templateSourceRef(template) === TREESEED_DEFAULT_STARTER_TEMPLATE_ID), - ...launchableTemplates.filter((template) => templateSourceRef(template) !== TREESEED_DEFAULT_STARTER_TEMPLATE_ID), -]; -const defaultCoreObjective = `# Core Objective - -Describe the enduring outcome this project should help the team achieve. Keep it concrete enough that TreeSeed agents can use it as their first source of context when planning, writing, and reviewing work. -`; -const defaultHosts = team?.metadata?.defaultHosts && typeof team.metadata.defaultHosts === 'object' - ? team.metadata.defaultHosts - : {}; -const templateRequirementModels = templateCards.map((template) => ({ - slug: template.slug, - sourceRef: templateSourceRef(template), - title: template.title, - launchRequirements: template.launchRequirements, - requirementsView: deriveProjectLaunchRequirementsViewModel({ - launchRequirements: template.launchRequirements, - repositoryHosts: repositoryHosts as any, - teamHosts: customHosts as any, - managedHosts: managedHosts as any, - defaultHosts, - }), -})); -const defaultTemplateRequirementModel = templateRequirementModels.find((template) => template.sourceRef === TREESEED_DEFAULT_STARTER_TEMPLATE_ID) ?? templateRequirementModels[0]; -const defaultRequirementsView = defaultTemplateRequirementModel?.requirementsView ?? deriveProjectLaunchRequirementsViewModel({}); -const defaultRequirementByKey = new Map(defaultRequirementsView.hosts.map((requirement) => [requirement.key, requirement])); -const fallbackHostRequirement = (key: string, type: string, displayName: string, purpose: string, required: boolean, provider: string, selectValue: string): ProjectLaunchHostRequirementViewModel => ({ - kind: 'host', - key, - type, - displayName, - purpose, - required, - compatibleProviders: [provider], - defaultSelection: required ? 'managed' : 'none', - environmentScopes: ['staging', 'prod'], - configWritePreviews: [], - environmentWritePreviews: [], - choices: [ - { - value: selectValue, - label: displayName, - mode: selectValue.startsWith('none:') ? 'none' : 'treeseed_managed', - hostId: type === 'repository' ? 'platform:github:hosted-hubs' : null, - managedHostKey: type === 'repository' ? 'platform:github:hosted-hubs' : selectValue.split(':').slice(1).join(':'), - provider, - type, - selected: true, - readiness: selectValue.startsWith('none:') ? 'none' : 'ready', - rootDomain: null, - }, - { - value: `new:${type}`, - label: `Create new ${type} host...`, - mode: 'new', - hostId: null, - managedHostKey: null, - provider, - type, - selected: false, - readiness: 'new', - rootDomain: null, - }, - ], -}); -const sourceRepositoryRequirement = defaultRequirementByKey.get('sourceRepository') ?? fallbackHostRequirement('sourceRepository', 'repository', 'Repository', hostPurposeFor('repository'), true, 'github', 'treeseed_managed:platform:github:hosted-hubs'); -const publicWebRequirement = defaultRequirementByKey.get('publicWeb') ?? fallbackHostRequirement('publicWeb', 'web', 'Web', hostPurposeFor('web'), true, 'cloudflare', 'treeseed_managed:treeseed-managed-web'); -const transactionalEmailRequirement = defaultRequirementByKey.get('transactionalEmail') ?? fallbackHostRequirement('transactionalEmail', 'email', 'Email', hostPurposeFor('email'), false, 'smtp', 'none:transactionalEmail'); -const launchJson = JSON.stringify({ - teamId: team?.id ?? null, - defaultTemplateId: TREESEED_DEFAULT_STARTER_TEMPLATE_ID, - templates: templateRequirementModels, - hosts: [...managedHosts, ...customHosts], - managedHosts, - customHosts, - repositoryHosts, - defaultHosts, -}).replace(/ buildServicesDashboard(context, inventory, Astro.url)).catch(() => null) - : null; ---- - - - {team ? ( -
- {serviceBundle ? : null} -
- -
- - - - -
-
-
- -

This becomes the project repository's src/content/objectives/core.md file and is loaded into AI agent context everywhere.

-
-
- -
- -
-
-
- - - - - - - -
- {templateCards.map((template) => { - const sourceRef = templateSourceRef(template); - const templateInputId = `template-${sourceRef.replace(/[^a-zA-Z0-9_-]/gu, '-')}`; - const details = [ - template.category, - template.publisherName, - template.templateVersion ? `v${template.templateVersion}` : '', - template.priceModel ? String(template.priceModel) : '', - ].filter(Boolean).join(' · '); - const searchable = `${template.title} ${template.summary} ${template.category} ${template.publisherName} ${template.priceModel ?? ''}`.toLowerCase(); - return ( -
- - - - View template details - - -
- ); - })} -
- - -
- - -
- - - - {defaultRequirementsView.resources.map((requirement) => )} - {defaultRequirementsView.secrets.map((requirement) => )} -
- -
- - - - - - - - - - -
-
- ) : ( - - )} - -
- - - - diff --git a/src/pages/app/services.astro b/src/pages/app/services.astro deleted file mode 100644 index aee2a76b..00000000 --- a/src/pages/app/services.astro +++ /dev/null @@ -1,30 +0,0 @@ ---- -import DashboardTemplate from '@treeseed/ui/components/astro/templates/DashboardTemplate.astro'; -import ReadinessSummary from '@treeseed/ui/components/astro/service/ReadinessSummary.astro'; -import TreeseedAppLayout from '../../layouts/TreeseedAppLayout.astro'; -import { loadAppContext } from '../../view-models/app-access.js'; -import { buildServicesDashboard, loadServiceInventory } from '../../view-models/service-readiness.vm.js'; - -if (!Astro.locals.auth?.principal) { - return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent('/app/services')}`); -} - -const context = await loadAppContext(Astro); -const runtime = (Astro.locals as any).runtime ?? Astro.locals; -const inventory = await loadServiceInventory(context, runtime); -const services = buildServicesDashboard(context, inventory, Astro.url); ---- - - - - - - diff --git a/src/pages/app/teams/[teamId]/commerce.astro b/src/pages/app/teams/[teamId]/commerce.astro deleted file mode 100644 index 7710dd07..00000000 --- a/src/pages/app/teams/[teamId]/commerce.astro +++ /dev/null @@ -1,119 +0,0 @@ ---- -import DashboardTemplate from '@treeseed/ui/components/astro/templates/DashboardTemplate.astro'; -import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; -import SellerCommerceMonitor from '@treeseed/ui/components/astro/commerce/SellerCommerceMonitor.astro'; -import '@treeseed/ui/styles/commerce.css'; -import TreeseedAppLayout from '../../../../layouts/TreeseedAppLayout.astro'; -import { ApiClientFacade } from '../../../../lib/market/api-client'; -import { loadAppContext, persistActiveTeamSelection, resolveAppTeam } from '../../../../view-models/app-access.js'; -import { buildTeamCommerceDashboard, canManageTeamCommerce } from '../../../../view-models/ecommerce-governance.vm.js'; - -const teamId = String(Astro.params.teamId ?? ''); -if (!Astro.locals.auth?.principal) { - return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); -} - -const context = await loadAppContext(Astro); -const teamResolution = resolveAppTeam(context, teamId); -const team = teamResolution.resource; -if (teamResolution.team?.id && teamResolution.team.id !== context.activeTeam?.id) persistActiveTeamSelection(Astro, teamResolution.team); - -const access = team && context.store && typeof context.store.getTeamAccessSummary === 'function' - ? await context.store.getTeamAccessSummary(team.id, context.principal).catch(() => null) - : null; -const canManageTeam = canManageTeamCommerce(access); -if (!team) Astro.response.status = teamResolution.status === 'forbidden' ? 403 : 404; - -const api = new ApiClientFacade(Astro); -let formError = ''; -let statusMessage = ''; - -if (Astro.request.method === 'POST' && team && canManageTeam) { - const data = await Astro.request.formData(); - const action = String(data.get('action') ?? ''); - try { - if (action === 'request-vendor') { - await api.requestCommerceVendor(team.id, { - displayName: team.displayName ?? team.name ?? 'Commerce Vendor', - slug: team.slug ?? team.name ?? team.id, - reason: 'Team requested marketplace seller capability from Admin commerce settings.', - }); - return Astro.redirect(`/app/teams/${encodeURIComponent(team.id)}/commerce?saved=vendor-requested`, 303); - } - if (action === 'connect-stripe') { - const result = await api.startCommerceVendorStripeOnboarding(team.id, {}); - if (result?.onboardingUrl) return Astro.redirect(result.onboardingUrl, 303); - throw new Error('Stripe onboarding URL was not returned.'); - } - if (action === 'open-dashboard') { - const result = await api.createCommerceVendorStripeLoginLink(team.id); - if (result?.loginUrl) return Astro.redirect(result.loginUrl, 303); - throw new Error('Stripe dashboard URL was not returned.'); - } - if (action === 'refresh-status') { - await api.getCommerceVendorStripeStatus(team.id, true); - return Astro.redirect(`/app/teams/${encodeURIComponent(team.id)}/commerce?saved=status-refreshed`, 303); - } - } catch (error) { - formError = error instanceof Error ? error.message : 'Commerce settings action failed.'; - } -} - -if (team && canManageTeam && Astro.request.method === 'GET') { - const stripeMarker = Astro.url.searchParams.get('stripe'); - if (stripeMarker === 'returned') { - await api.markCommerceVendorStripeReturn(team.id).catch((error) => { - formError = error instanceof Error ? error.message : 'Stripe return status could not be recorded.'; - }); - statusMessage = formError ? '' : 'Stripe onboarding return recorded. Status refreshed from Stripe when configured.'; - } else if (stripeMarker === 'refresh') { - await api.getCommerceVendorStripeStatus(team.id, true).catch((error) => { - formError = error instanceof Error ? error.message : 'Stripe status could not be refreshed.'; - }); - statusMessage = formError ? '' : 'Stripe onboarding link refreshed. Continue onboarding from this page.'; - } -} - -const saved = Astro.url.searchParams.get('saved'); -if (saved === 'vendor-requested') statusMessage = 'Seller capability request submitted.'; -if (saved === 'status-refreshed') statusMessage = 'Stripe status refreshed.'; - -const vendor = team ? await api.getCommerceVendor(team.id).catch(() => null) : null; -const stripeAccount = team ? await api.getCommerceVendorStripeStatus(team.id).catch(() => null) : null; -const commerceMonitor = team ? await api.getCommerceVendorMonitoring(team.id).catch(() => null) : null; -const vm = team ? buildTeamCommerceDashboard({ - path: `/app/teams/${encodeURIComponent(team.id)}/commerce`, - team, - vendor, - stripeAccount, - commerceMonitor, - canManageTeam, - formError, - statusMessage, -}) : null; ---- - - - {team && vm ? ( - - {canManageTeam ? ( -
- {!vendor ? ( - - ) : vendor.status === 'approved' ? ( - <> - - - {stripeAccount ? : null} - - ) : ( - Back to teams - )} -
- ) : null} - -
- ) : ( - - )} -
diff --git a/src/pages/app/teams/[teamId]/commerce/capacity.astro b/src/pages/app/teams/[teamId]/commerce/capacity.astro deleted file mode 100644 index ab8e5b76..00000000 --- a/src/pages/app/teams/[teamId]/commerce/capacity.astro +++ /dev/null @@ -1,82 +0,0 @@ ---- -import Button from '@treeseed/ui/components/astro/forms/Button.astro'; -import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; -import Panel from '@treeseed/ui/components/astro/surface/Panel.astro'; -import PlainTable from '@treeseed/ui/components/astro/app/controls/PlainTable.astro'; -import TreeseedAppLayout from '../../../../../layouts/TreeseedAppLayout.astro'; -import { ApiClientFacade } from '../../../../../lib/market/api-client'; -import { escapeHtml as esc } from '../../../../../lib/market/control-ui.js'; -import { loadAppContext, persistActiveTeamSelection, resolveAppTeam } from '../../../../../view-models/app-access.js'; - -const teamId = String(Astro.params.teamId ?? ''); -if (!Astro.locals.auth?.principal) { - return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); -} - -const context = await loadAppContext(Astro); -const teamResolution = resolveAppTeam(context, teamId); -const team = teamResolution.resource; -if (teamResolution.team?.id && teamResolution.team.id !== context.activeTeam?.id) persistActiveTeamSelection(Astro, teamResolution.team); -if (!team) Astro.response.status = teamResolution.status === 'forbidden' ? 403 : 404; - -const api = new ApiClientFacade(Astro); -const vendor = team ? await api.getCommerceVendor(team.id).catch(() => null) : null; -const listings = team ? await api.listCommerceCapacityListings({ sellerTeamId: team.id }).catch(() => []) : []; -const inquiries = team ? await api.listCommerceCapacityListingInquiries({ sellerTeamId: team.id }).catch(() => []) : []; - -const listingRows = listings.map((listing: any) => ({ - id: listing.id, - listing: `${esc(listing.id)}`, - status: esc(listing.status), - access: esc(listing.accessLevel), - runtime: esc(listing.runtimeIsolationLevel), - involvement: esc([listing.aiInvolvementLevel, listing.humanInvolvementLevel].filter(Boolean).join(' / ')), - data: esc([listing.dataAccessLevel, listing.secretAccessLevel].filter(Boolean).join(' / ')), - updated: esc(listing.updatedAt ?? ''), -})); - -const inquiryRows = inquiries.slice(0, 10).map((inquiry: any) => ({ - id: inquiry.id, - inquiry: esc(inquiry.id), - status: esc(inquiry.status), - buyer: esc(inquiry.buyerTeamId ?? inquiry.buyerUserId ?? 'redacted'), - service: esc(inquiry.requestedServiceType ?? ''), - scope: esc(inquiry.requestedScope ?? ''), - updated: esc(inquiry.updatedAt ?? ''), -})); ---- - - - {team ? ( -
- -

Vendor status: {vendor?.status ?? 'not requested'} · Trust: {vendor?.trustLevel ?? 'unreviewed'} · Capacity listings: {vendor?.capacityListingsEnabled ? 'enabled' : 'disabled'}

-
- - -
- -
- - - -
- ) : ( - - )} -
diff --git a/src/pages/app/teams/[teamId]/commerce/capacity/[listingId].astro b/src/pages/app/teams/[teamId]/commerce/capacity/[listingId].astro deleted file mode 100644 index 69d152ba..00000000 --- a/src/pages/app/teams/[teamId]/commerce/capacity/[listingId].astro +++ /dev/null @@ -1,116 +0,0 @@ ---- -import Button from '@treeseed/ui/components/astro/forms/Button.astro'; -import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; -import Panel from '@treeseed/ui/components/astro/surface/Panel.astro'; -import PlainTable from '@treeseed/ui/components/astro/app/controls/PlainTable.astro'; -import TreeseedAppLayout from '../../../../../../layouts/TreeseedAppLayout.astro'; -import { ApiClientFacade } from '../../../../../../lib/market/api-client'; -import { escapeHtml as esc } from '../../../../../../lib/market/control-ui.js'; -import { loadAppContext, persistActiveTeamSelection, resolveAppTeam } from '../../../../../../view-models/app-access.js'; - -const teamId = String(Astro.params.teamId ?? ''); -const listingId = String(Astro.params.listingId ?? ''); -if (!Astro.locals.auth?.principal) { - return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); -} - -const context = await loadAppContext(Astro); -const teamResolution = resolveAppTeam(context, teamId); -const team = teamResolution.resource; -if (teamResolution.team?.id && teamResolution.team.id !== context.activeTeam?.id) persistActiveTeamSelection(Astro, teamResolution.team); -if (!team) Astro.response.status = teamResolution.status === 'forbidden' ? 403 : 404; - -const api = new ApiClientFacade(Astro); -let formError: string | null = null; - -if (team && Astro.request.method === 'POST') { - const data = await Astro.request.formData(); - const action = String(data.get('action') ?? ''); - try { - if (action === 'update') { - await api.updateCommerceCapacityListing(listingId, { - accessLevel: String(data.get('accessLevel') ?? 'public_summary'), - runtimeIsolationLevel: String(data.get('runtimeIsolationLevel') ?? 'none'), - humanInvolvementLevel: String(data.get('humanInvolvementLevel') ?? 'none'), - aiInvolvementLevel: String(data.get('aiInvolvementLevel') ?? 'none'), - dataAccessLevel: String(data.get('dataAccessLevel') ?? 'none'), - secretAccessLevel: String(data.get('secretAccessLevel') ?? 'none'), - buyerVisibleRiskSummary: String(data.get('buyerVisibleRiskSummary') ?? ''), - supportPolicy: String(data.get('supportPolicy') ?? ''), - availabilitySummary: String(data.get('availabilitySummary') ?? ''), - }); - } - if (action === 'submit') await api.submitCommerceCapacityListing(listingId); - if (action === 'archive') await api.archiveCommerceCapacityListing(listingId); - if (action === 'approve') await api.approveCommerceCapacityListing(listingId); - if (action === 'reject') await api.rejectCommerceCapacityListing(listingId); - if (action === 'suspend') await api.suspendCommerceCapacityListing(listingId); - if (action.startsWith('review:')) await api.reviewCommerceCapacityInquiry(action.slice('review:'.length)); - if (action.startsWith('approve-inquiry:')) await api.approveCommerceCapacityInquiryForScoping(action.slice('approve-inquiry:'.length)); - if (action.startsWith('decline-inquiry:')) await api.declineCommerceCapacityInquiry(action.slice('decline-inquiry:'.length)); - return Astro.redirect(`/app/teams/${encodeURIComponent(team.id)}/commerce/capacity/${encodeURIComponent(listingId)}?saved=1`, 303); - } catch (error) { - formError = error instanceof Error ? error.message : 'Capacity listing action failed.'; - } -} - -const listing = team ? await api.getCommerceCapacityListing(listingId).catch(() => null) : null; -if (team && !listing) Astro.response.status = 404; -const inquiries = listing ? await api.listCommerceCapacityListingInquiries({ listingId: listing.id }).catch(() => []) : []; - -const inquiryRows = inquiries.map((inquiry: any) => ({ - id: inquiry.id, - inquiry: esc(inquiry.id), - status: esc(inquiry.status), - buyer: esc(inquiry.buyerTeamId ?? inquiry.buyerUserId ?? 'redacted'), - service: esc(inquiry.requestedServiceType ?? ''), - scope: esc(inquiry.requestedScope ?? ''), - actions: `
`, -})); ---- - - - {team && listing ? ( -
- - {formError ?

{formError}

: null} -

Status: {listing.status} · Product: {listing.productId} · Provider: {listing.capacityProviderId ?? 'not linked'} · Lane: {listing.capacityProviderLaneId ?? 'not linked'}

-
- -
- - - - - -
-
-
- - - - - - - - - - - -
-
- - - -
- ) : ( - - )} -
diff --git a/src/pages/app/teams/[teamId]/commerce/products.astro b/src/pages/app/teams/[teamId]/commerce/products.astro deleted file mode 100644 index a3881242..00000000 --- a/src/pages/app/teams/[teamId]/commerce/products.astro +++ /dev/null @@ -1,58 +0,0 @@ ---- -import Button from '@treeseed/ui/components/astro/forms/Button.astro'; -import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; -import Panel from '@treeseed/ui/components/astro/surface/Panel.astro'; -import PlainTable from '@treeseed/ui/components/astro/app/controls/PlainTable.astro'; -import TreeseedAppLayout from '../../../../../layouts/TreeseedAppLayout.astro'; -import { ApiClientFacade } from '../../../../../lib/market/api-client'; -import { escapeHtml as esc } from '../../../../../lib/market/control-ui.js'; -import { loadAppContext, persistActiveTeamSelection, resolveAppTeam } from '../../../../../view-models/app-access.js'; - -const teamId = String(Astro.params.teamId ?? ''); -if (!Astro.locals.auth?.principal) { - return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); -} - -const context = await loadAppContext(Astro); -const teamResolution = resolveAppTeam(context, teamId); -const team = teamResolution.resource; -if (teamResolution.team?.id && teamResolution.team.id !== context.activeTeam?.id) persistActiveTeamSelection(Astro, teamResolution.team); -if (!team) Astro.response.status = teamResolution.status === 'forbidden' ? 403 : 404; - -const api = new ApiClientFacade(Astro); -const vendor = team ? await api.getCommerceVendor(team.id).catch(() => null) : null; -const products = team ? await api.listCommerceProducts({ teamId: team.id }).catch(() => []) : []; -const rows = products.map((product: any) => ({ - id: product.id, - title: esc(product.title ?? product.slug ?? product.id), - kind: esc(product.kind ?? ''), - status: esc(product.status ?? ''), - ownership: esc(product.ownershipModel ?? ''), - visibility: esc(product.visibility ?? ''), - action: `Governance`, -})); ---- - - - {team ? ( -
- -

Vendor status: {vendor?.status ?? 'not requested'}

-
- - -
- -
-
- ) : ( - - )} -
diff --git a/src/pages/app/teams/[teamId]/commerce/products/[productId]/governance.astro b/src/pages/app/teams/[teamId]/commerce/products/[productId]/governance.astro deleted file mode 100644 index d596a4e6..00000000 --- a/src/pages/app/teams/[teamId]/commerce/products/[productId]/governance.astro +++ /dev/null @@ -1,247 +0,0 @@ ---- -import Button from '@treeseed/ui/components/astro/forms/Button.astro'; -import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; -import Panel from '@treeseed/ui/components/astro/surface/Panel.astro'; -import PlainTable from '@treeseed/ui/components/astro/app/controls/PlainTable.astro'; -import TreeseedAppLayout from '../../../../../../../layouts/TreeseedAppLayout.astro'; -import { ApiClientFacade } from '../../../../../../../lib/market/api-client'; -import { escapeHtml as esc } from '../../../../../../../lib/market/control-ui.js'; -import { loadAppContext, persistActiveTeamSelection, resolveAppTeam } from '../../../../../../../view-models/app-access.js'; - -const teamId = String(Astro.params.teamId ?? ''); -const productId = String(Astro.params.productId ?? ''); -if (!Astro.locals.auth?.principal) { - return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); -} - -const context = await loadAppContext(Astro); -const teamResolution = resolveAppTeam(context, teamId); -const team = teamResolution.resource; -if (teamResolution.team?.id && teamResolution.team.id !== context.activeTeam?.id) persistActiveTeamSelection(Astro, teamResolution.team); - -const manageableRoles = new Set(['team_owner', 'project_lead']); -const access = team && context.store && typeof context.store.getTeamAccessSummary === 'function' - ? await context.store.getTeamAccessSummary(team.id, context.principal).catch(() => null) - : null; -const canManageTeam = Boolean(access?.roles?.some((role: string) => manageableRoles.has(role))); -if (!team) Astro.response.status = teamResolution.status === 'forbidden' ? 403 : 404; - -const api = new ApiClientFacade(Astro); -let formError = ''; -let statusMessage = ''; - -if (Astro.request.method === 'POST' && team && canManageTeam) { - const data = await Astro.request.formData(); - const action = String(data.get('action') ?? ''); - try { - if (action === 'update-ownership') { - await api.updateCommerceOwnershipRecord(productId, String(data.get('ownershipRecordId') ?? ''), { - publicSummary: String(data.get('publicSummary') ?? '').trim() || null, - buyerVisible: data.get('buyerVisible') === 'on', - reason: String(data.get('reason') ?? '').trim() || 'Ownership summary updated.', - }); - return Astro.redirect(Astro.url.pathname + '?saved=ownership', 303); - } - if (action === 'update-steward') { - await api.updateCommerceStewardshipAssignment(productId, String(data.get('assignmentId') ?? ''), { - displayName: String(data.get('displayName') ?? '').trim() || null, - responsibilities: String(data.get('responsibilities') ?? '').split(',').map((value) => value.trim()).filter(Boolean), - visibleToBuyers: data.get('visibleToBuyers') === 'on', - reason: String(data.get('reason') ?? '').trim() || 'Stewardship assignment updated.', - }); - return Astro.redirect(Astro.url.pathname + '?saved=steward', 303); - } - if (action === 'end-steward') { - await api.endCommerceStewardshipAssignment(productId, String(data.get('assignmentId') ?? ''), { - reason: String(data.get('reason') ?? '').trim() || 'Stewardship assignment ended.', - }); - return Astro.redirect(Astro.url.pathname + '?saved=steward-ended', 303); - } - if (action === 'update-contribution') { - await api.updateCommerceContribution(productId, String(data.get('contributionId') ?? ''), { - summary: String(data.get('summary') ?? '').trim() || null, - attributionVisibility: String(data.get('attributionVisibility') ?? '').trim() || 'public', - benefitWeight: Number(String(data.get('benefitWeight') ?? '0')), - reason: String(data.get('reason') ?? '').trim() || 'Contribution updated.', - }); - return Astro.redirect(Astro.url.pathname + '?saved=contribution', 303); - } - if (action === 'update-policy') { - await api.updateCommerceGovernancePolicy(productId, String(data.get('policyId') ?? ''), { - title: String(data.get('title') ?? '').trim(), - buyerVisibleSummary: String(data.get('buyerVisibleSummary') ?? '').trim() || null, - status: String(data.get('status') ?? '').trim() || 'active', - reason: String(data.get('reason') ?? '').trim() || 'Governance policy updated.', - }); - return Astro.redirect(Astro.url.pathname + '?saved=policy', 303); - } - if (action === 'transfer-decision') { - const transferId = String(data.get('transferId') ?? ''); - const decision = String(data.get('decision') ?? ''); - const body = { reason: String(data.get('reason') ?? '').trim() || `Ownership transfer ${decision}.` }; - if (decision === 'submit') await api.submitCommerceOwnershipTransfer(productId, transferId, body); - if (decision === 'approve') await api.approveCommerceOwnershipTransfer(productId, transferId, body); - if (decision === 'reject') await api.rejectCommerceOwnershipTransfer(productId, transferId, body); - if (decision === 'cancel') await api.cancelCommerceOwnershipTransfer(productId, transferId, body); - return Astro.redirect(Astro.url.pathname + '?saved=transfer', 303); - } - if (action === 'create-succession') { - await api.createCommerceSuccessionEvent(productId, { - successorType: String(data.get('successorType') ?? '').trim() || 'team', - successorId: String(data.get('successorId') ?? '').trim() || team.id, - eventType: String(data.get('eventType') ?? '').trim() || 'successor_named', - reason: String(data.get('reason') ?? '').trim() || 'Succession event recorded.', - }); - return Astro.redirect(Astro.url.pathname + '?saved=succession', 303); - } - } catch (error) { - formError = error instanceof Error ? error.message : 'Governance operation failed.'; - } -} - -const saved = Astro.url.searchParams.get('saved'); -if (saved) statusMessage = 'Governance workflow updated.'; - -const product = productId ? await api.getCommerceProduct(productId).catch(() => null) : null; -const workflow = productId ? await api.getCommerceOwnershipWorkflow(productId).catch(() => null) : null; -const ownershipRows = (workflow?.buyerVisibleOwnershipRecords ?? []).map((record: any) => ({ - id: record.id, - model: esc(record.model), - owner: esc(record.canonicalOwnerId ?? record.canonicalOwnerType), - summary: esc(record.publicSummary ?? ''), - effective: esc(record.effectiveAt ?? ''), - action: canManageTeam ? `
` : '', -})); -const stewardRows = (workflow?.stewardshipAssignments ?? []).map((steward: any) => ({ - id: steward.id, - role: esc(steward.role), - assignee: esc(steward.displayName ?? steward.assigneeId ?? steward.assigneeType), - visible: steward.visibleToBuyers ? 'yes' : 'no', - ends: esc(steward.endsAt ?? ''), - action: canManageTeam ? `
` : '', -})); -const contributionRows = (workflow?.contributions ?? []).map((contribution: any) => ({ - id: contribution.id, - role: esc(contribution.role), - contributor: esc(contribution.displayName ?? contribution.contributorId ?? contribution.contributorType), - visibility: esc(contribution.attributionVisibility), - weight: esc(String(contribution.benefitWeight ?? '')), - action: canManageTeam ? `
` : '', -})); -const policyRows = (workflow?.governancePolicies ?? []).map((policy: any) => ({ - id: policy.id, - title: esc(policy.title), - kind: esc(policy.policyKind), - status: esc(policy.status), - summary: esc(policy.buyerVisibleSummary ?? ''), - action: canManageTeam ? `
` : '', -})); -const transferRows = (workflow?.pendingTransfers ?? []).map((transfer: any) => ({ - id: transfer.id, - status: esc(transfer.status), - from: esc(transfer.fromOwnershipRecordId), - to: esc(transfer.toOwnershipRecordId), - reason: esc(transfer.reason ?? ''), - action: canManageTeam ? `
` : '', -})); -const successionRows = (workflow?.successionEvents ?? []).map((event: any) => ({ - id: event.id, - event: esc(event.eventType), - successor: esc(`${event.successorType}:${event.successorId}`), - status: esc(event.status), - reason: esc(event.reason ?? ''), -})); ---- - - - {team && product ? ( -
- - {formError && } - {statusMessage && !formError &&

{statusMessage}

} -

Product status: {product.status} · Ownership model: {product.ownershipModel}

-
- - -
-
- - - - - - - - - - - - - - - - - - - - - - - {canManageTeam ? ( -
- - - - - - -
- ) : null} - -
-
- ) : ( - - )} -
diff --git a/src/pages/app/teams/[teamId]/commerce/sales.astro b/src/pages/app/teams/[teamId]/commerce/sales.astro deleted file mode 100644 index 8d2444fe..00000000 --- a/src/pages/app/teams/[teamId]/commerce/sales.astro +++ /dev/null @@ -1,219 +0,0 @@ ---- -import Button from '@treeseed/ui/components/astro/forms/Button.astro'; -import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; -import Panel from '@treeseed/ui/components/astro/surface/Panel.astro'; -import PlainTable from '@treeseed/ui/components/astro/app/controls/PlainTable.astro'; -import TreeseedAppLayout from '../../../../../layouts/TreeseedAppLayout.astro'; -import { ApiClientFacade } from '../../../../../lib/market/api-client'; -import { escapeHtml as esc } from '../../../../../lib/market/control-ui.js'; -import { loadAppContext, persistActiveTeamSelection, resolveAppTeam } from '../../../../../view-models/app-access.js'; - -const teamId = String(Astro.params.teamId ?? ''); -if (!Astro.locals.auth?.principal) { - return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); -} - -const context = await loadAppContext(Astro); -const teamResolution = resolveAppTeam(context, teamId); -const team = teamResolution.resource; -if (teamResolution.team?.id && teamResolution.team.id !== context.activeTeam?.id) persistActiveTeamSelection(Astro, teamResolution.team); - -const manageableRoles = new Set(['team_owner', 'project_lead']); -const access = team && context.store && typeof context.store.getTeamAccessSummary === 'function' - ? await context.store.getTeamAccessSummary(team.id, context.principal).catch(() => null) - : null; -const canManageTeam = Boolean(access?.roles?.some((role: string) => manageableRoles.has(role))); -if (!team) Astro.response.status = teamResolution.status === 'forbidden' ? 403 : 404; - -const api = new ApiClientFacade(Astro); -let formError = ''; -let statusMessage = ''; - -if (Astro.request.method === 'POST' && team && canManageTeam) { - const data = await Astro.request.formData(); - const action = String(data.get('action') ?? ''); - try { - if (action === 'refund-order') { - const orderId = String(data.get('orderId') ?? ''); - const amountRaw = String(data.get('amount') ?? '').trim(); - await api.createCommerceOrderRefund(orderId, { - amount: amountRaw ? Number(amountRaw) : null, - reason: String(data.get('reason') ?? '').trim() || null, - }); - return Astro.redirect(`/app/teams/${encodeURIComponent(team.id)}/commerce/sales?saved=refund`, 303); - } - if (action === 'fulfill-artifact') { - const orderItemId = String(data.get('orderItemId') ?? ''); - await api.fulfillCommerceOrderItemArtifact(orderItemId, { - catalogArtifactVersionId: String(data.get('catalogArtifactVersionId') ?? '').trim() || null, - message: String(data.get('message') ?? '').trim() || null, - }); - return Astro.redirect(`/app/teams/${encodeURIComponent(team.id)}/commerce/sales?saved=fulfilled`, 303); - } - if (action === 'revoke-entitlement') { - const entitlementId = String(data.get('entitlementId') ?? ''); - await api.revokeCommerceEntitlement(entitlementId, { - reason: String(data.get('reason') ?? '').trim() || 'Revoked from seller operations.', - }); - return Astro.redirect(`/app/teams/${encodeURIComponent(team.id)}/commerce/sales?saved=revoked`, 303); - } - } catch (error) { - formError = error instanceof Error ? error.message : 'Seller operation failed.'; - } -} - -const saved = Astro.url.searchParams.get('saved'); -if (saved === 'refund') statusMessage = 'Refund recorded.'; -if (saved === 'fulfilled') statusMessage = 'Artifact fulfillment recorded.'; -if (saved === 'revoked') statusMessage = 'Entitlement revoked.'; - -const vendor = team ? await api.getCommerceVendor(team.id).catch(() => null) : null; -const summary = team ? await api.getCommerceVendorSalesSummary(team.id).catch(() => null) : null; -const orders = team ? await api.listCommerceVendorSalesOrders(team.id).catch(() => []) : []; -const subscriptions = team ? await api.listCommerceVendorSalesSubscriptions(team.id).catch(() => []) : []; -const entitlements = team ? await api.listCommerceVendorSalesEntitlements(team.id).catch(() => []) : []; -const refunds = team ? await api.listCommerceVendorSalesRefunds(team.id).catch(() => []) : []; -const fulfillmentEvents = team ? await api.listCommerceVendorFulfillmentEvents(team.id).catch(() => []) : []; - -function money(amount: unknown, currency: unknown) { - const value = Number(amount ?? 0) / 100; - const code = typeof currency === 'string' && currency ? currency.toUpperCase() : 'USD'; - return `${code} ${value.toFixed(2)}`; -} - -const summaryRows = summary ? [ - { id: 'gross', metric: 'Gross paid', value: esc(money(summary.grossPaidAmount, summary.currency)) }, - { id: 'refunded', metric: 'Refunded', value: esc(money(summary.refundedAmount, summary.currency)) }, - { id: 'net', metric: 'Net paid', value: esc(money(summary.netPaidAmount, summary.currency)) }, - { id: 'orders', metric: 'Paid orders', value: esc(String(summary.paidOrderCount ?? 0)) }, - { id: 'subscriptions', metric: 'Active subscriptions', value: esc(String(summary.activeSubscriptionCount ?? 0)) }, - { id: 'entitlements', metric: 'Active entitlements', value: esc(String(summary.activeEntitlementCount ?? 0)) }, -] : []; - -const orderRows = orders.map((order: any) => ({ - id: order.id, - order: esc(order.id), - status: esc(order.status), - total: esc(money(order.totalAmount, order.currency)), - refunded: esc(money(order.refundedAmount, order.currency)), - buyer: esc(order.buyerDisplayName ?? order.buyerTeamId ?? order.buyerUserIdRedacted ?? 'redacted'), - created: esc(order.createdAt ?? ''), - action: canManageTeam ? `
` : '', -})); - -const subscriptionRows = subscriptions.map((subscription: any) => ({ - id: subscription.id, - subscription: esc(subscription.id), - status: esc(subscription.status), - renewal: esc(subscription.renewalState ?? ''), - periodEnd: esc(subscription.currentPeriodEnd ?? ''), -})); - -const entitlementRows = entitlements.map((entitlement: any) => ({ - id: entitlement.id, - entitlement: esc(entitlement.id), - product: esc(entitlement.productId), - status: esc(entitlement.status), - artifacts: esc(String(entitlement.fulfillmentArtifactRefs?.length ?? 0)), - action: canManageTeam ? `
` : '', -})); - -const refundRows = refunds.map((refund: any) => ({ - id: refund.id, - refund: esc(refund.id), - order: esc(refund.orderId), - status: esc(refund.status), - amount: esc(money(refund.amount, refund.currency)), - reason: esc(refund.reason ?? ''), -})); - -const fulfillmentRows = fulfillmentEvents.map((event: any) => ({ - id: event.id, - event: esc(event.eventType), - status: esc(event.status), - order: esc(event.orderId), - product: esc(event.productId), - created: esc(event.createdAt ?? ''), -})); ---- - - - {team ? ( -
- - {formError && } - {statusMessage && !formError &&

{statusMessage}

} -

Vendor status: {vendor?.status ?? 'not requested'}

- -
- -
-
- - - - - - - - - - - - - - - - - - - {canManageTeam ? ( -
- - - - - -
- ) : null} - -
-
- ) : ( - - )} -
diff --git a/src/pages/app/teams/[teamId]/commerce/services.astro b/src/pages/app/teams/[teamId]/commerce/services.astro deleted file mode 100644 index 60e650ce..00000000 --- a/src/pages/app/teams/[teamId]/commerce/services.astro +++ /dev/null @@ -1,63 +0,0 @@ ---- -import Button from '@treeseed/ui/components/astro/forms/Button.astro'; -import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; -import Panel from '@treeseed/ui/components/astro/surface/Panel.astro'; -import PlainTable from '@treeseed/ui/components/astro/app/controls/PlainTable.astro'; -import TreeseedAppLayout from '../../../../../layouts/TreeseedAppLayout.astro'; -import { ApiClientFacade } from '../../../../../lib/market/api-client'; -import { escapeHtml as esc } from '../../../../../lib/market/control-ui.js'; -import { loadAppContext, persistActiveTeamSelection, resolveAppTeam } from '../../../../../view-models/app-access.js'; - -const teamId = String(Astro.params.teamId ?? ''); -if (!Astro.locals.auth?.principal) { - return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); -} - -const context = await loadAppContext(Astro); -const teamResolution = resolveAppTeam(context, teamId); -const team = teamResolution.resource; -if (teamResolution.team?.id && teamResolution.team.id !== context.activeTeam?.id) persistActiveTeamSelection(Astro, teamResolution.team); -if (!team) Astro.response.status = teamResolution.status === 'forbidden' ? 403 : 404; - -const api = new ApiClientFacade(Astro); -const vendor = team ? await api.getCommerceVendor(team.id).catch(() => null) : null; -const requests = team ? await api.listCommerceServiceRequests({ sellerTeamId: team.id }).catch(() => []) : []; - -const rows = requests.map((request: any) => ({ - id: request.id, - request: `${esc(request.id)}`, - status: esc(request.status), - buyer: esc(request.buyerTeamId ?? request.buyerUserId ?? 'redacted'), - product: esc(request.productId), - offer: esc(request.offerId), - quote: esc(request.activeQuoteId ?? ''), - work: esc([request.relatedProjectId, request.relatedWorkdayId].filter(Boolean).join(' / ')), - updated: esc(request.updatedAt ?? ''), -})); ---- - - - {team ? ( -
- -

Vendor status: {vendor?.status ?? 'not requested'}

-
- - -
- -
-
- ) : ( - - )} -
diff --git a/src/pages/app/teams/[teamId]/commerce/services/[requestId].astro b/src/pages/app/teams/[teamId]/commerce/services/[requestId].astro deleted file mode 100644 index d119a4ad..00000000 --- a/src/pages/app/teams/[teamId]/commerce/services/[requestId].astro +++ /dev/null @@ -1,206 +0,0 @@ ---- -import Button from '@treeseed/ui/components/astro/forms/Button.astro'; -import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; -import Panel from '@treeseed/ui/components/astro/surface/Panel.astro'; -import PlainTable from '@treeseed/ui/components/astro/app/controls/PlainTable.astro'; -import TreeseedAppLayout from '../../../../../../layouts/TreeseedAppLayout.astro'; -import { ApiClientFacade } from '../../../../../../lib/market/api-client'; -import { escapeHtml as esc } from '../../../../../../lib/market/control-ui.js'; -import { loadAppContext, persistActiveTeamSelection, resolveAppTeam } from '../../../../../../view-models/app-access.js'; - -const teamId = String(Astro.params.teamId ?? ''); -const requestId = String(Astro.params.requestId ?? ''); -if (!Astro.locals.auth?.principal) { - return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); -} - -const context = await loadAppContext(Astro); -const teamResolution = resolveAppTeam(context, teamId); -const team = teamResolution.resource; -if (teamResolution.team?.id && teamResolution.team.id !== context.activeTeam?.id) persistActiveTeamSelection(Astro, teamResolution.team); - -const manageableRoles = new Set(['team_owner', 'project_lead']); -const access = team && context.store && typeof context.store.getTeamAccessSummary === 'function' - ? await context.store.getTeamAccessSummary(team.id, context.principal).catch(() => null) - : null; -const canManageTeam = Boolean(access?.roles?.some((role: string) => manageableRoles.has(role))); -if (!team) Astro.response.status = teamResolution.status === 'forbidden' ? 403 : 404; - -const api = new ApiClientFacade(Astro); -let formError = ''; - -if (Astro.request.method === 'POST' && team && canManageTeam) { - const data = await Astro.request.formData(); - const action = String(data.get('action') ?? ''); - try { - if (action === 'start-scoping') { - await api.startCommerceServiceScoping(requestId, { reason: String(data.get('reason') ?? '').trim() || null }); - return Astro.redirect(Astro.url.pathname, 303); - } - if (action === 'update-request') { - await api.updateCommerceServiceRequest(requestId, { - approvedScope: String(data.get('approvedScope') ?? '').trim() || null, - buyerVisibleSummary: String(data.get('buyerVisibleSummary') ?? '').trim() || null, - vendorPrivateNotes: String(data.get('vendorPrivateNotes') ?? '').trim() || null, - }); - return Astro.redirect(Astro.url.pathname, 303); - } - if (action === 'create-quote') { - await api.createCommerceServiceQuote(requestId, { - title: String(data.get('title') ?? '').trim(), - scopeSummary: String(data.get('scopeSummary') ?? '').trim(), - amount: Number(data.get('amount') ?? 0), - currency: String(data.get('currency') ?? 'usd').trim().toLowerCase(), - expiresAt: String(data.get('expiresAt') ?? '').trim() || null, - }); - return Astro.redirect(Astro.url.pathname, 303); - } - if (action === 'submit-quote') { - await api.submitCommerceServiceQuote(String(data.get('quoteId') ?? ''), {}); - return Astro.redirect(Astro.url.pathname, 303); - } - if (action === 'vendor-approve-quote') { - await api.vendorApproveCommerceServiceQuote(String(data.get('quoteId') ?? ''), {}); - return Astro.redirect(Astro.url.pathname, 303); - } - if (action === 'link-work') { - await api.linkCommerceServiceContractWork(String(data.get('contractId') ?? ''), { - relatedProjectId: String(data.get('relatedProjectId') ?? '').trim() || null, - relatedWorkdayId: String(data.get('relatedWorkdayId') ?? '').trim() || null, - }); - return Astro.redirect(Astro.url.pathname, 303); - } - if (action === 'fulfill-contract') { - await api.fulfillCommerceServiceContract(String(data.get('contractId') ?? ''), { - summary: String(data.get('summary') ?? '').trim() || null, - }); - return Astro.redirect(Astro.url.pathname, 303); - } - if (action === 'cancel-request') { - await api.cancelCommerceServiceRequest(requestId, { reason: String(data.get('reason') ?? '').trim() || null }); - return Astro.redirect(`/app/teams/${encodeURIComponent(team.id)}/commerce/services`, 303); - } - } catch (error) { - formError = error instanceof Error ? error.message : 'Service operation failed.'; - } -} - -const request = team ? await api.getCommerceServiceRequest(requestId).catch(() => null) : null; -const quotes = request ? await api.listCommerceServiceQuotes(request.id).catch(() => []) : []; -const contract = request?.contractId ? await api.getCommerceServiceContract(request.contractId).catch(() => null) : null; -const events = request ? await api.listCommerceServiceEvents({ requestId: request.id }).catch(() => []) : []; - -function money(amount: unknown, currency: unknown) { - const value = Number(amount ?? 0) / 100; - const code = typeof currency === 'string' && currency ? currency.toUpperCase() : 'USD'; - return `${code} ${value.toFixed(2)}`; -} - -const quoteRows = quotes.map((quote: any) => ({ - id: quote.id, - version: esc(String(quote.quoteVersion)), - status: esc(quote.status), - title: esc(quote.title), - amount: esc(money(quote.amount, quote.currency)), - expires: esc(quote.expiresAt ?? ''), - action: canManageTeam ? `
` : '', -})); - -const eventRows = events.map((event: any) => ({ - id: event.id, - event: esc(event.eventType), - prior: esc(event.priorState ?? ''), - next: esc(event.nextState ?? ''), - created: esc(event.createdAt ?? ''), -})); ---- - - - {team && request ? ( -
- - {formError && } -

Status: {request.status}

-

Product: {request.productId} Offer: {request.offerId}

-

{request.buyerVisibleSummary ?? request.requestedScope}

-
- - {contract?.status === 'pending_checkout' ? : null} -
-
- - {canManageTeam ? ( - -
-
- - - -
-
- - - - - -
-
- - - - - - - -
-
-
- ) : null} - - - - - - -

Contract: {contract?.id ?? 'none'}

-

Status: {contract?.status ?? 'none'}

-

Order: {contract?.orderId ?? 'none'}

- {canManageTeam && contract ? ( -
-
- - - - - -
-
- - - - -
-
- ) : null} -
- - - - -
- ) : ( - - )} -
diff --git a/src/pages/app/teams/index.astro b/src/pages/app/teams/index.astro index 70965b39..e971dd8e 100644 --- a/src/pages/app/teams/index.astro +++ b/src/pages/app/teams/index.astro @@ -9,7 +9,7 @@ if (!Astro.locals.auth?.principal) { } const context = await loadAppContext(Astro); -const dashboard = await buildTeamDashboard(context, Astro.url); +const dashboard = await buildTeamDashboard(context); --- diff --git a/src/pages/app/work.astro b/src/pages/app/work.astro deleted file mode 100644 index c3d62f0f..00000000 --- a/src/pages/app/work.astro +++ /dev/null @@ -1,19 +0,0 @@ ---- -import DashboardTemplate from '@treeseed/ui/components/astro/templates/DashboardTemplate.astro'; -import ActivityTimeline from '@treeseed/ui/components/astro/operating/ActivityTimeline.astro'; -import WorkQueueSummary from '@treeseed/ui/components/astro/operating/WorkQueueSummary.astro'; -import TreeseedAppLayout from '../../layouts/TreeseedAppLayout.astro'; -import { loadWorkDashboard } from '../../view-models/operating-loop.vm.js'; - -if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent('/app/work')}`); -const vm = await loadWorkDashboard(Astro, Astro.url); ---- - - - -
- - -
-
-
diff --git a/src/pages/app/work/decisions.astro b/src/pages/app/work/decisions.astro deleted file mode 100644 index 34260acb..00000000 --- a/src/pages/app/work/decisions.astro +++ /dev/null @@ -1,12 +0,0 @@ ---- -import CollectionTemplate from '@treeseed/ui/components/astro/templates/CollectionTemplate.astro'; -import TreeseedAppLayout from '../../../layouts/TreeseedAppLayout.astro'; -import { loadDirectionCollection } from '../../../view-models/operating-loop.vm.js'; - -if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent('/app/work/decisions')}`); -const vm = await loadDirectionCollection(Astro, 'decisions', Astro.url); ---- - - - - diff --git a/src/pages/app/work/decisions/[slug].astro b/src/pages/app/work/decisions/[slug].astro deleted file mode 100644 index 14dee838..00000000 --- a/src/pages/app/work/decisions/[slug].astro +++ /dev/null @@ -1,34 +0,0 @@ ---- -import DetailTemplate from '@treeseed/ui/components/astro/templates/DetailTemplate.astro'; -import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; -import TreeseedAppLayout from '../../../../layouts/TreeseedAppLayout.astro'; -import { loadDirectionDetail } from '../../../../view-models/operating-loop.vm.js'; - -const slug = String(Astro.params.slug ?? ''); -if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); -const decisionVm = await loadDirectionDetail(Astro, 'decisions', slug, Astro.url).catch(() => null); -const data = decisionVm?.entry?.data ?? {}; -if (!decisionVm?.entry) Astro.response.status = 404; ---- - - - {decisionVm?.entry ? ( - - {data.summary ?

{data.summary}

: null} - {data.immutable ? ( -
-

Governance evidence

- -
- ) : null} - {decisionVm.form?.body ?
{decisionVm.form.body}
: null} -
- ) : ( - - )} -
diff --git a/src/pages/app/work/decisions/[slug]/edit.astro b/src/pages/app/work/decisions/[slug]/edit.astro deleted file mode 100644 index 0fe832b0..00000000 --- a/src/pages/app/work/decisions/[slug]/edit.astro +++ /dev/null @@ -1,22 +0,0 @@ ---- -import SettingsTemplate from '@treeseed/ui/components/astro/templates/SettingsTemplate.astro'; -import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; -import DirectionContentForm from '../../../../../components/work/DirectionContentForm.astro'; -import TreeseedAppLayout from '../../../../../layouts/TreeseedAppLayout.astro'; -import { loadDirectionDetail } from '../../../../../view-models/operating-loop.vm.js'; - -const slug = String(Astro.params.slug ?? ''); -if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); -const vm = await loadDirectionDetail(Astro, 'decisions', slug, Astro.url); -if (!vm.entry) Astro.response.status = 404; ---- - - - {vm.form ? ( - - ({ label: project.name ?? project.slug, value: project.id }))} selectedProjectId={vm.form.projectId} initialData={vm.form.data} body={vm.form.body} slug={vm.form.slug} fallbackHref={`/app/work/decisions/${encodeURIComponent(vm.form.slug)}`} /> - - ) : ( - - )} - diff --git a/src/pages/app/work/decisions/new.astro b/src/pages/app/work/decisions/new.astro deleted file mode 100644 index a70a49f1..00000000 --- a/src/pages/app/work/decisions/new.astro +++ /dev/null @@ -1,21 +0,0 @@ ---- -import SettingsTemplate from '@treeseed/ui/components/astro/templates/SettingsTemplate.astro'; -import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; -import DirectionContentForm from '../../../../components/work/DirectionContentForm.astro'; -import TreeseedAppLayout from '../../../../layouts/TreeseedAppLayout.astro'; -import { loadDirectionCollection } from '../../../../view-models/operating-loop.vm.js'; - -if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent('/app/work/decisions/new')}`); -const vm = await loadDirectionCollection(Astro, 'decisions', Astro.url); -const selectedProjectId = String(Astro.url.searchParams.get('projectId') ?? vm.context.projects[0]?.id ?? ''); ---- - - - {vm.context.projects.length ? ( - - ({ label: project.name ?? project.slug, value: project.id }))} selectedProjectId={selectedProjectId} fallbackHref="/app/work/decisions" /> - - ) : ( - - )} - diff --git a/src/pages/app/work/notes.astro b/src/pages/app/work/notes.astro deleted file mode 100644 index 2ac80595..00000000 --- a/src/pages/app/work/notes.astro +++ /dev/null @@ -1,12 +0,0 @@ ---- -import CollectionTemplate from '@treeseed/ui/components/astro/templates/CollectionTemplate.astro'; -import TreeseedAppLayout from '../../../layouts/TreeseedAppLayout.astro'; -import { loadDirectionCollection } from '../../../view-models/operating-loop.vm.js'; - -if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent('/app/work/notes')}`); -const vm = await loadDirectionCollection(Astro, 'notes', Astro.url); ---- - - - - diff --git a/src/pages/app/work/notes/[slug].astro b/src/pages/app/work/notes/[slug].astro deleted file mode 100644 index a4239a86..00000000 --- a/src/pages/app/work/notes/[slug].astro +++ /dev/null @@ -1,23 +0,0 @@ ---- -import DetailTemplate from '@treeseed/ui/components/astro/templates/DetailTemplate.astro'; -import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; -import TreeseedAppLayout from '../../../../layouts/TreeseedAppLayout.astro'; -import { loadDirectionDetail } from '../../../../view-models/operating-loop.vm.js'; - -const slug = String(Astro.params.slug ?? ''); -if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); -const vm = await loadDirectionDetail(Astro, 'notes', slug, Astro.url); -if (!vm.entry) Astro.response.status = 404; -const data = vm.entry?.data ?? {}; ---- - - - {vm.entry ? ( - - {data.summary ?

{data.summary}

: null} - {vm.form?.body ?
{vm.form.body}
: null} -
- ) : ( - - )} -
diff --git a/src/pages/app/work/notes/[slug]/edit.astro b/src/pages/app/work/notes/[slug]/edit.astro deleted file mode 100644 index 2987ea06..00000000 --- a/src/pages/app/work/notes/[slug]/edit.astro +++ /dev/null @@ -1,22 +0,0 @@ ---- -import SettingsTemplate from '@treeseed/ui/components/astro/templates/SettingsTemplate.astro'; -import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; -import DirectionContentForm from '../../../../../components/work/DirectionContentForm.astro'; -import TreeseedAppLayout from '../../../../../layouts/TreeseedAppLayout.astro'; -import { loadDirectionDetail } from '../../../../../view-models/operating-loop.vm.js'; - -const slug = String(Astro.params.slug ?? ''); -if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); -const vm = await loadDirectionDetail(Astro, 'notes', slug, Astro.url); -if (!vm.entry) Astro.response.status = 404; ---- - - - {vm.form ? ( - - ({ label: project.name ?? project.slug, value: project.id }))} selectedProjectId={vm.form.projectId} initialData={vm.form.data} body={vm.form.body} slug={vm.form.slug} fallbackHref={`/app/work/notes/${encodeURIComponent(vm.form.slug)}`} /> - - ) : ( - - )} - diff --git a/src/pages/app/work/notes/new.astro b/src/pages/app/work/notes/new.astro deleted file mode 100644 index 77978fcd..00000000 --- a/src/pages/app/work/notes/new.astro +++ /dev/null @@ -1,21 +0,0 @@ ---- -import SettingsTemplate from '@treeseed/ui/components/astro/templates/SettingsTemplate.astro'; -import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; -import DirectionContentForm from '../../../../components/work/DirectionContentForm.astro'; -import TreeseedAppLayout from '../../../../layouts/TreeseedAppLayout.astro'; -import { loadDirectionCollection } from '../../../../view-models/operating-loop.vm.js'; - -if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent('/app/work/notes/new')}`); -const vm = await loadDirectionCollection(Astro, 'notes', Astro.url); -const selectedProjectId = String(Astro.url.searchParams.get('projectId') ?? vm.context.projects[0]?.id ?? ''); ---- - - - {vm.context.projects.length ? ( - - ({ label: project.name ?? project.slug, value: project.id }))} selectedProjectId={selectedProjectId} fallbackHref="/app/work/notes" /> - - ) : ( - - )} - diff --git a/src/pages/app/work/objectives.astro b/src/pages/app/work/objectives.astro deleted file mode 100644 index ff2d7cad..00000000 --- a/src/pages/app/work/objectives.astro +++ /dev/null @@ -1,12 +0,0 @@ ---- -import CollectionTemplate from '@treeseed/ui/components/astro/templates/CollectionTemplate.astro'; -import TreeseedAppLayout from '../../../layouts/TreeseedAppLayout.astro'; -import { loadDirectionCollection } from '../../../view-models/operating-loop.vm.js'; - -if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent('/app/work/objectives')}`); -const vm = await loadDirectionCollection(Astro, 'objectives', Astro.url); ---- - - - - diff --git a/src/pages/app/work/objectives/[slug].astro b/src/pages/app/work/objectives/[slug].astro deleted file mode 100644 index 527b50a5..00000000 --- a/src/pages/app/work/objectives/[slug].astro +++ /dev/null @@ -1,23 +0,0 @@ ---- -import DetailTemplate from '@treeseed/ui/components/astro/templates/DetailTemplate.astro'; -import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; -import TreeseedAppLayout from '../../../../layouts/TreeseedAppLayout.astro'; -import { loadDirectionDetail } from '../../../../view-models/operating-loop.vm.js'; - -const slug = String(Astro.params.slug ?? ''); -if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); -const vm = await loadDirectionDetail(Astro, 'objectives', slug, Astro.url); -if (!vm.entry) Astro.response.status = 404; -const data = vm.entry?.data ?? {}; ---- - - - {vm.entry ? ( - - {data.summary ?

{data.summary}

: null} - {vm.form?.body ?
{vm.form.body}
: null} -
- ) : ( - - )} -
diff --git a/src/pages/app/work/objectives/[slug]/edit.astro b/src/pages/app/work/objectives/[slug]/edit.astro deleted file mode 100644 index 16840fc2..00000000 --- a/src/pages/app/work/objectives/[slug]/edit.astro +++ /dev/null @@ -1,22 +0,0 @@ ---- -import SettingsTemplate from '@treeseed/ui/components/astro/templates/SettingsTemplate.astro'; -import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; -import DirectionContentForm from '../../../../../components/work/DirectionContentForm.astro'; -import TreeseedAppLayout from '../../../../../layouts/TreeseedAppLayout.astro'; -import { loadDirectionDetail } from '../../../../../view-models/operating-loop.vm.js'; - -const slug = String(Astro.params.slug ?? ''); -if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); -const vm = await loadDirectionDetail(Astro, 'objectives', slug, Astro.url); -if (!vm.entry) Astro.response.status = 404; ---- - - - {vm.form ? ( - - ({ label: project.name ?? project.slug, value: project.id }))} selectedProjectId={vm.form.projectId} initialData={vm.form.data} body={vm.form.body} slug={vm.form.slug} fallbackHref={`/app/work/objectives/${encodeURIComponent(vm.form.slug)}`} /> - - ) : ( - - )} - diff --git a/src/pages/app/work/objectives/new.astro b/src/pages/app/work/objectives/new.astro deleted file mode 100644 index 9727ebac..00000000 --- a/src/pages/app/work/objectives/new.astro +++ /dev/null @@ -1,21 +0,0 @@ ---- -import SettingsTemplate from '@treeseed/ui/components/astro/templates/SettingsTemplate.astro'; -import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; -import DirectionContentForm from '../../../../components/work/DirectionContentForm.astro'; -import TreeseedAppLayout from '../../../../layouts/TreeseedAppLayout.astro'; -import { loadDirectionCollection } from '../../../../view-models/operating-loop.vm.js'; - -if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent('/app/work/objectives/new')}`); -const vm = await loadDirectionCollection(Astro, 'objectives', Astro.url); -const selectedProjectId = String(Astro.url.searchParams.get('projectId') ?? vm.context.projects[0]?.id ?? ''); ---- - - - {vm.context.projects.length ? ( - - ({ label: project.name ?? project.slug, value: project.id }))} selectedProjectId={selectedProjectId} fallbackHref="/app/work/objectives" /> - - ) : ( - - )} - diff --git a/src/pages/app/work/proposals.astro b/src/pages/app/work/proposals.astro deleted file mode 100644 index cb097abe..00000000 --- a/src/pages/app/work/proposals.astro +++ /dev/null @@ -1,12 +0,0 @@ ---- -import CollectionTemplate from '@treeseed/ui/components/astro/templates/CollectionTemplate.astro'; -import TreeseedAppLayout from '../../../layouts/TreeseedAppLayout.astro'; -import { loadDirectionCollection } from '../../../view-models/operating-loop.vm.js'; - -if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent('/app/work/proposals')}`); -const vm = await loadDirectionCollection(Astro, 'proposals', Astro.url); ---- - - - - diff --git a/src/pages/app/work/proposals/[slug].astro b/src/pages/app/work/proposals/[slug].astro deleted file mode 100644 index b229ac46..00000000 --- a/src/pages/app/work/proposals/[slug].astro +++ /dev/null @@ -1,23 +0,0 @@ ---- -import DetailTemplate from '@treeseed/ui/components/astro/templates/DetailTemplate.astro'; -import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; -import TreeseedAppLayout from '../../../../layouts/TreeseedAppLayout.astro'; -import { loadDirectionDetail } from '../../../../view-models/operating-loop.vm.js'; - -const slug = String(Astro.params.slug ?? ''); -if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); -const vm = await loadDirectionDetail(Astro, 'proposals', slug, Astro.url); -if (!vm.entry) Astro.response.status = 404; -const data = vm.entry?.data ?? {}; ---- - - - {vm.entry ? ( - - {data.summary ?

{data.summary}

: null} - {vm.form?.body ?
{vm.form.body}
: null} -
- ) : ( - - )} -
diff --git a/src/pages/app/work/proposals/[slug]/edit.astro b/src/pages/app/work/proposals/[slug]/edit.astro deleted file mode 100644 index 8565a3fc..00000000 --- a/src/pages/app/work/proposals/[slug]/edit.astro +++ /dev/null @@ -1,22 +0,0 @@ ---- -import SettingsTemplate from '@treeseed/ui/components/astro/templates/SettingsTemplate.astro'; -import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; -import DirectionContentForm from '../../../../../components/work/DirectionContentForm.astro'; -import TreeseedAppLayout from '../../../../../layouts/TreeseedAppLayout.astro'; -import { loadDirectionDetail } from '../../../../../view-models/operating-loop.vm.js'; - -const slug = String(Astro.params.slug ?? ''); -if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); -const vm = await loadDirectionDetail(Astro, 'proposals', slug, Astro.url); -if (!vm.entry) Astro.response.status = 404; ---- - - - {vm.form ? ( - - ({ label: project.name ?? project.slug, value: project.id }))} selectedProjectId={vm.form.projectId} initialData={vm.form.data} body={vm.form.body} slug={vm.form.slug} fallbackHref={`/app/work/proposals/${encodeURIComponent(vm.form.slug)}`} /> - - ) : ( - - )} - diff --git a/src/pages/app/work/proposals/new.astro b/src/pages/app/work/proposals/new.astro deleted file mode 100644 index f3041da7..00000000 --- a/src/pages/app/work/proposals/new.astro +++ /dev/null @@ -1,21 +0,0 @@ ---- -import SettingsTemplate from '@treeseed/ui/components/astro/templates/SettingsTemplate.astro'; -import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; -import DirectionContentForm from '../../../../components/work/DirectionContentForm.astro'; -import TreeseedAppLayout from '../../../../layouts/TreeseedAppLayout.astro'; -import { loadDirectionCollection } from '../../../../view-models/operating-loop.vm.js'; - -if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent('/app/work/proposals/new')}`); -const vm = await loadDirectionCollection(Astro, 'proposals', Astro.url); -const selectedProjectId = String(Astro.url.searchParams.get('projectId') ?? vm.context.projects[0]?.id ?? ''); ---- - - - {vm.context.projects.length ? ( - - ({ label: project.name ?? project.slug, value: project.id }))} selectedProjectId={selectedProjectId} fallbackHref="/app/work/proposals" /> - - ) : ( - - )} - diff --git a/src/pages/app/work/questions.astro b/src/pages/app/work/questions.astro deleted file mode 100644 index 51913bab..00000000 --- a/src/pages/app/work/questions.astro +++ /dev/null @@ -1,64 +0,0 @@ ---- -import DataTable from '@treeseed/ui/components/astro/data/DataTable.astro'; -import PermissionBoundary from '@treeseed/ui/components/astro/patterns/PermissionBoundary.astro'; -import Panel from '@treeseed/ui/components/astro/surface/Panel.astro'; -import CollectionTemplate from '@treeseed/ui/components/astro/templates/CollectionTemplate.astro'; -import WorkContentNav from '@treeseed/ui/components/astro/app/controls/WorkContentNav.astro'; -import TreeseedAppLayout from '../../../layouts/TreeseedAppLayout.astro'; -import { loadGovernanceViewModel } from '../../../view-models/governance.vm.js'; -import { loadKnowledgeViewModel } from '../../../view-models/knowledge.vm.js'; -import { buildQuestionsPageViewModel } from '../../../view-models/ui-foundation/questions.vm.js'; -import { loadWorkContentEntries, workContentEntriesFor } from '../../../view-models/work-content.js'; - -if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent('/app/work/questions')}`); -const [governance, knowledge, contentEntries] = await Promise.all([ - loadGovernanceViewModel(Astro), - loadKnowledgeViewModel(Astro).catch(() => null), - loadWorkContentEntries(), -]); -const questionEntries = workContentEntriesFor(contentEntries, 'questions'); -const approvalQuestions = governance.reviewQueue.filter((item: any) => String(item.kind ?? item.title ?? '').toLowerCase().includes('question')); -const artifactQuestions = (knowledge?.artifacts ?? []).filter((artifact: any) => String(`${artifact.category} ${artifact.type} ${artifact.title}`).toLowerCase().includes('question')); -const pageViewModel = buildQuestionsPageViewModel({ - governance, - knowledge, - questionEntries, - approvalQuestions, - artifactQuestions, - url: Astro.url, -}); ---- - - -
- - - - - - - - -
-
diff --git a/src/pages/app/work/questions/[slug].astro b/src/pages/app/work/questions/[slug].astro deleted file mode 100644 index 1e2a679a..00000000 --- a/src/pages/app/work/questions/[slug].astro +++ /dev/null @@ -1,91 +0,0 @@ ---- -import { getCollection } from 'astro:content'; -import Badge from '@treeseed/ui/components/astro/data/Badge.astro'; -import DataTable from '@treeseed/ui/components/astro/data/DataTable.astro'; -import PermissionBoundary from '@treeseed/ui/components/astro/patterns/PermissionBoundary.astro'; -import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; -import Panel from '@treeseed/ui/components/astro/surface/Panel.astro'; -import DetailTemplate from '@treeseed/ui/components/astro/templates/DetailTemplate.astro'; -import WorkContentNav from '@treeseed/ui/components/astro/app/controls/WorkContentNav.astro'; -import TreeseedAppLayout from '../../../../layouts/TreeseedAppLayout.astro'; -import { loadAppContext } from '../../../../view-models/app-access.js'; -import { buildQuestionDetailViewModel, normalizeQuestionEntry } from '../../../../view-models/ui-foundation/questions.vm.js'; - -const slug = String(Astro.params.slug ?? ''); -if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); -const context = await loadAppContext(Astro); -const entries = await getCollection('questions' as any, ({ data }: any) => !data?.draft).catch(() => []); -const entry = entries.find((candidate: any) => { - const id = String(candidate.id ?? '').replace(/\.(mdx|md)$/u, ''); - const dataId = String(candidate.data?.id ?? ''); - const dataSlug = String(candidate.data?.slug ?? ''); - return id === slug || dataId === slug || dataId.replace(/^[^:]+:/u, '') === slug || dataSlug === slug; -}) ?? (['question', 'seed-question', 'current-question', 'primary-question'].includes(slug) ? entries[0] ?? { - id: `${slug}.md`, - body: 'Local guarantee seed question rendered by the question product surface.', - data: { - id: `question:${slug}`, - slug, - title: 'Question guarantee seed', - description: 'Deterministic local question for guarantee review.', - summary: 'This question keeps the question detail route executable in local guarantee runs.', - status: 'recorded', - date: new Date('2026-01-01T00:00:00.000Z'), - }, -} : null); -const pageViewModel = buildQuestionDetailViewModel({ - context, - question: normalizeQuestionEntry(entry, slug), - url: Astro.url, -}); -if (pageViewModel.notFound) Astro.response.status = 404; ---- - - -
- - - {pageViewModel.question ? ( - - - {pageViewModel.question.draft ? 'draft' : 'published'} -

{pageViewModel.question.motivation}

-
- -
- {pageViewModel.question.body ?
{pageViewModel.question.body}
:

No body recorded yet.

} -
-
- - - -
- ) : ( - - )} -
-
-
diff --git a/src/pages/app/work/questions/[slug]/edit.astro b/src/pages/app/work/questions/[slug]/edit.astro deleted file mode 100644 index b7bcb8f1..00000000 --- a/src/pages/app/work/questions/[slug]/edit.astro +++ /dev/null @@ -1,72 +0,0 @@ ---- -import { getCollection } from 'astro:content'; -import PermissionBoundary from '@treeseed/ui/components/astro/patterns/PermissionBoundary.astro'; -import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; -import Panel from '@treeseed/ui/components/astro/surface/Panel.astro'; -import SettingsTemplate from '@treeseed/ui/components/astro/templates/SettingsTemplate.astro'; -import WorkContentNav from '@treeseed/ui/components/astro/app/controls/WorkContentNav.astro'; -import QuestionForm from '../../../../../components/work/QuestionForm.astro'; -import TreeseedAppLayout from '../../../../../layouts/TreeseedAppLayout.astro'; -import { loadAppContext } from '../../../../../view-models/app-access.js'; -import { buildQuestionFormViewModel, normalizeQuestionEntry } from '../../../../../view-models/ui-foundation/questions.vm.js'; - -const slug = String(Astro.params.slug ?? ''); -if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); -const context = await loadAppContext(Astro); -const entries = await getCollection('questions' as any, ({ data }: any) => !data?.draft).catch(() => []); -const entry = entries.find((candidate: any) => { - const id = String(candidate.id ?? '').replace(/\.(mdx|md)$/u, ''); - const dataId = String(candidate.data?.id ?? ''); - const dataSlug = String(candidate.data?.slug ?? ''); - return id === slug || dataId === slug || dataId.replace(/^[^:]+:/u, '') === slug || dataSlug === slug; -}) ?? (['question', 'seed-question', 'current-question', 'primary-question'].includes(slug) ? entries[0] ?? { - id: `${slug}.md`, - body: 'Local guarantee seed question rendered by the question product surface.', - data: { - id: `question:${slug}`, - slug, - title: 'Question guarantee seed', - description: 'Deterministic local question for guarantee review.', - summary: 'This question keeps the question edit route executable in local guarantee runs.', - status: 'recorded', - date: new Date('2026-01-01T00:00:00.000Z'), - }, -} : null); -const pageViewModel = buildQuestionFormViewModel({ - context, - question: normalizeQuestionEntry(entry, slug), - url: Astro.url, - mode: 'edit', -}); -if (pageViewModel.notFound) Astro.response.status = 404; ---- - - -
- - - {pageViewModel.question ? ( - - - - - - ) : ( - - )} - -
-
diff --git a/src/pages/app/work/questions/new.astro b/src/pages/app/work/questions/new.astro deleted file mode 100644 index f90bbb14..00000000 --- a/src/pages/app/work/questions/new.astro +++ /dev/null @@ -1,45 +0,0 @@ ---- -import PermissionBoundary from '@treeseed/ui/components/astro/patterns/PermissionBoundary.astro'; -import Panel from '@treeseed/ui/components/astro/surface/Panel.astro'; -import SettingsTemplate from '@treeseed/ui/components/astro/templates/SettingsTemplate.astro'; -import WorkContentNav from '@treeseed/ui/components/astro/app/controls/WorkContentNav.astro'; -import QuestionForm from '../../../../components/work/QuestionForm.astro'; -import TreeseedAppLayout from '../../../../layouts/TreeseedAppLayout.astro'; -import { loadAppContext } from '../../../../view-models/app-access.js'; -import { buildQuestionFormViewModel } from '../../../../view-models/ui-foundation/questions.vm.js'; - -if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent('/app/work/questions/new')}`); -const context = await loadAppContext(Astro); -const pageViewModel = buildQuestionFormViewModel({ - context, - question: null, - url: Astro.url, - mode: 'create', -}); ---- - - -
- - - - - - - - -
-
diff --git a/src/pages/app/work/review.astro b/src/pages/app/work/review.astro deleted file mode 100644 index b66ab714..00000000 --- a/src/pages/app/work/review.astro +++ /dev/null @@ -1,19 +0,0 @@ ---- -import CollectionTemplate from '@treeseed/ui/components/astro/templates/CollectionTemplate.astro'; -import ActivityTimeline from '@treeseed/ui/components/astro/operating/ActivityTimeline.astro'; -import WorkQueueSummary from '@treeseed/ui/components/astro/operating/WorkQueueSummary.astro'; -import TreeseedAppLayout from '../../../layouts/TreeseedAppLayout.astro'; -import { loadReviewQueue } from '../../../view-models/operating-loop.vm.js'; - -if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent('/app/work/review')}`); -const vm = await loadReviewQueue(Astro, Astro.url); ---- - - - -
- - -
-
-
diff --git a/src/pages/market/index.astro b/src/pages/market/index.astro deleted file mode 100644 index 4e5797fa..00000000 --- a/src/pages/market/index.astro +++ /dev/null @@ -1,26 +0,0 @@ ---- -import DashboardTemplate from '@treeseed/ui/components/astro/templates/DashboardTemplate.astro'; -import TreeseedOperationalMarketLayout from '../../layouts/TreeseedOperationalMarketLayout.astro'; -import { listMarketplaceKnowledgePacks, listMarketplaceSiteTemplates, loadMarketplaceContext } from '../../lib/market/public-access.js'; -import { buildMarketDashboard } from '../../view-models/contextual-dashboard.vm.js'; - -const templateListing = await listMarketplaceSiteTemplates(Astro); -const knowledgePacks = await listMarketplaceKnowledgePacks(Astro); -const marketContext = loadMarketplaceContext(Astro); -const dashboard = buildMarketDashboard({ - url: Astro.url, - templates: templateListing.items, - knowledgePacks, - principal: marketContext.principal, -}); ---- - - - - diff --git a/src/pages/market/knowledge-packs/[slug].astro b/src/pages/market/knowledge-packs/[slug].astro deleted file mode 100644 index ccebc475..00000000 --- a/src/pages/market/knowledge-packs/[slug].astro +++ /dev/null @@ -1,21 +0,0 @@ ---- -import DetailTemplate from '@treeseed/ui/components/astro/templates/DetailTemplate.astro'; -import DistributionSummary from '@treeseed/ui/components/astro/distribution/DistributionSummary.astro'; -import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; -import TreeseedOperationalMarketLayout from '../../../layouts/TreeseedOperationalMarketLayout.astro'; -import { loadPublicMarketplaceDetail } from '../../../view-models/knowledge-distribution.vm.js'; - -const slug = String(Astro.params.slug ?? ''); -const vm = await loadPublicMarketplaceDetail(Astro, 'knowledge-packs', slug); -if (!vm.found) Astro.response.status = 404; ---- - - - {vm.found ? ( - - - - ) : ( - - )} - diff --git a/src/pages/market/knowledge-packs/index.astro b/src/pages/market/knowledge-packs/index.astro deleted file mode 100644 index 8b720f0b..00000000 --- a/src/pages/market/knowledge-packs/index.astro +++ /dev/null @@ -1,14 +0,0 @@ ---- -import CollectionTemplate from '@treeseed/ui/components/astro/templates/CollectionTemplate.astro'; -import DistributionSummary from '@treeseed/ui/components/astro/distribution/DistributionSummary.astro'; -import TreeseedOperationalMarketLayout from '../../../layouts/TreeseedOperationalMarketLayout.astro'; -import { loadPublicMarketplaceCollection } from '../../../view-models/knowledge-distribution.vm.js'; - -const vm = await loadPublicMarketplaceCollection(Astro, 'knowledge-packs'); ---- - - - - - - diff --git a/src/pages/market/templates/[slug].astro b/src/pages/market/templates/[slug].astro deleted file mode 100644 index 66afacac..00000000 --- a/src/pages/market/templates/[slug].astro +++ /dev/null @@ -1,26 +0,0 @@ ---- -import { render } from 'astro:content'; -import DetailTemplate from '@treeseed/ui/components/astro/templates/DetailTemplate.astro'; -import DistributionSummary from '@treeseed/ui/components/astro/distribution/DistributionSummary.astro'; -import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; -import Panel from '@treeseed/ui/components/astro/surface/Panel.astro'; -import TreeseedOperationalMarketLayout from '../../../layouts/TreeseedOperationalMarketLayout.astro'; -import { loadPublicMarketplaceDetail } from '../../../view-models/knowledge-distribution.vm.js'; - -const slug = String(Astro.params.slug ?? ''); -const vm = await loadPublicMarketplaceDetail(Astro, 'templates', slug); -if (!vm.found) Astro.response.status = 404; -const contentRender = vm.templateItem?.contentEntry ? await render(vm.templateItem.contentEntry) : null; -const Content = contentRender?.Content; ---- - - - {vm.found ? ( - - - {Content ? : null} - - ) : ( - - )} - diff --git a/src/pages/market/templates/index.astro b/src/pages/market/templates/index.astro deleted file mode 100644 index 2d10dff7..00000000 --- a/src/pages/market/templates/index.astro +++ /dev/null @@ -1,14 +0,0 @@ ---- -import CollectionTemplate from '@treeseed/ui/components/astro/templates/CollectionTemplate.astro'; -import DistributionSummary from '@treeseed/ui/components/astro/distribution/DistributionSummary.astro'; -import TreeseedOperationalMarketLayout from '../../../layouts/TreeseedOperationalMarketLayout.astro'; -import { loadPublicMarketplaceCollection } from '../../../view-models/knowledge-distribution.vm.js'; - -const vm = await loadPublicMarketplaceCollection(Astro, 'templates'); ---- - - - - - - diff --git a/src/pages/p/[project].astro b/src/pages/p/[project].astro deleted file mode 100644 index 24b32cbf..00000000 --- a/src/pages/p/[project].astro +++ /dev/null @@ -1,48 +0,0 @@ ---- -import TreeseedPublicLayout from '../../layouts/TreeseedPublicLayout.astro'; -import PublicProfileHeader from '@treeseed/ui/components/astro/public/PublicProfileHeader.astro'; -import PublicSection from '@treeseed/ui/components/astro/public/PublicSection.astro'; -import PublicStack from '@treeseed/ui/components/astro/public/PublicStack.astro'; -import { resolveMarketplaceProjectProfile } from '../../lib/market/public-access.js'; - -export const prerender = false; - -const requestedProject = String(Astro.params.project ?? ''); -const normalizedProject = requestedProject.trim().toLowerCase().replace(/[^a-z0-9-]+/gu, '-').replace(/^-+|-+$/gu, '').slice(0, 63); -if (requestedProject !== normalizedProject && normalizedProject) { - return Astro.redirect(`/p/${normalizedProject}`, 301); -} - -const profile = await resolveMarketplaceProjectProfile(Astro, normalizedProject); -if (!profile) { - return new Response('Not found', { status: 404 }); -} - -const project = profile.project; -const team = profile.team; -const displayName = project.name ?? project.slug; -const teamName = team.displayName ?? team.name; -const createdDate = project.createdAt ? new Date(project.createdAt).toLocaleDateString('en', { month: 'long', year: 'numeric' }) : null; ---- - - - - - - - diff --git a/src/pages/t/[name].astro b/src/pages/t/[name].astro index 4016aa78..821cf08b 100644 --- a/src/pages/t/[name].astro +++ b/src/pages/t/[name].astro @@ -3,76 +3,40 @@ import TreeseedPublicLayout from '../../layouts/TreeseedPublicLayout.astro'; import PublicProfileHeader from '@treeseed/ui/components/astro/public/PublicProfileHeader.astro'; import PublicSection from '@treeseed/ui/components/astro/public/PublicSection.astro'; import PublicStack from '@treeseed/ui/components/astro/public/PublicStack.astro'; -import { resolveMarketplaceTeamProfile } from '../../lib/market/public-access.js'; +import { resolvePublicTeamProfile } from '../../lib/market/public-access.js'; export const prerender = false; const requestedName = String(Astro.params.name ?? ''); const normalizedName = requestedName.trim().toLowerCase().replace(/[^a-z0-9-]+/gu, '-').replace(/^-+|-+$/gu, '').slice(0, 63); -if (requestedName !== normalizedName && normalizedName) { - return Astro.redirect(`/t/${normalizedName}`, 301); -} +if (requestedName !== normalizedName && normalizedName) return Astro.redirect(`/t/${normalizedName}`, 301); -const profile = await resolveMarketplaceTeamProfile(Astro, normalizedName); -if (!profile) { - return new Response('Not found', { status: 404 }); -} +const profile: any = await resolvePublicTeamProfile(Astro, normalizedName); +if (!profile?.team) return new Response('Not found', { status: 404 }); const team = profile.team; const displayName = team.displayName ?? team.name; -const joinedDate = new Date(team.createdAt).toLocaleDateString('en', { month: 'long', year: 'numeric' }); -const visibleCount = profile.activity.projects.length + profile.activity.catalogItems.length + profile.activity.knowledgePacks.length; +const createdDate = team.createdAt + ? new Date(team.createdAt).toLocaleDateString('en', { month: 'long', year: 'numeric' }) + : null; --- - -
- -
- {profile.activity.projects.length > 0 ? profile.activity.projects.map((project: any) => ( - - {project.name}
- {project.description || project.slug} -
- )) :

No visible projects.

} -
-
- - -
- {profile.activity.catalogItems.length > 0 ? profile.activity.catalogItems.map((item: any) => ( - - {item.title}
- {item.summary || item.kind} -
- )) :

No visible listings.

} -
-
- - -
- {profile.activity.knowledgePacks.length > 0 ? profile.activity.knowledgePacks.map((pack: any) => ( - - {pack.name}
- {pack.summary || pack.visibility} -
- )) :

No visible knowledge packs.

} -
-
-
- {visibleCount === 0 ?

No team activity is visible to you yet.

: null} + +

This profile confirms the public name and identity of a TreeSeed team.

+
diff --git a/src/pages/u/[username].astro b/src/pages/u/[username].astro index b38070d7..0deeaaa4 100644 --- a/src/pages/u/[username].astro +++ b/src/pages/u/[username].astro @@ -4,103 +4,40 @@ import PublicProfileHeader from '@treeseed/ui/components/astro/public/PublicProf import PublicSection from '@treeseed/ui/components/astro/public/PublicSection.astro'; import PublicStack from '@treeseed/ui/components/astro/public/PublicStack.astro'; import { normalizeUsername, validateUsername } from '../../lib/auth/profile-validation'; -import { resolveMarketplaceUserProfile } from '../../lib/market/public-access.js'; +import { resolvePublicUserProfile } from '../../lib/market/public-access.js'; export const prerender = false; -type PublicProfile = { - user: { - id: string; - username: string; - displayName: string | null; - email: string | null; - image: string | null; - joinedAt: string; - }; - activity: { - teams: Array<{ id: string; slug: string; name: string; createdAt?: string }>; - projects: Array<{ id: string; teamId: string; slug: string; name: string; description?: string | null; createdAt?: string }>; - catalogItems: Array<{ id: string; teamId: string; kind: string; slug: string; title: string; summary?: string | null; visibility?: string }>; - knowledgePacks: Array<{ id: string; teamId: string; slug: string; name: string; summary?: string | null; visibility?: string }>; - }; -}; - const requestedUsername = String(Astro.params.username ?? ''); const normalizedUsername = normalizeUsername(requestedUsername); if (requestedUsername !== normalizedUsername && validateUsername(normalizedUsername).ok) { return Astro.redirect(`/u/${normalizedUsername}`, 301); } -const profile = await resolveMarketplaceUserProfile(Astro, normalizedUsername) as PublicProfile | null; -if (!profile) { - return new Response('Not found', { status: 404 }); -} -const displayName = profile.user.displayName || `@${profile.user.username}`; -const joinedDate = new Date(profile.user.joinedAt).toLocaleDateString('en', { month: 'long', year: 'numeric' }); -const visibleCount = profile.activity.teams.length - + profile.activity.projects.length - + profile.activity.catalogItems.length - + profile.activity.knowledgePacks.length; +const profile: any = await resolvePublicUserProfile(Astro, normalizedUsername); +if (!profile?.user) return new Response('Not found', { status: 404 }); + +const user = profile.user; +const displayName = user.displayName || `@${user.username}`; +const joinedDate = user.joinedAt + ? new Date(user.joinedAt).toLocaleDateString('en', { month: 'long', year: 'numeric' }) + : null; --- - -
- -
- {profile.activity.teams.length > 0 ? profile.activity.teams.map((team) => ( - - {team.name}
- {team.slug} -
- )) :

No visible teams.

} -
-
- - -
- {profile.activity.projects.length > 0 ? profile.activity.projects.map((project) => ( - - {project.name}
- {project.description || project.slug} -
- )) :

No visible projects.

} -
-
- - -
- {profile.activity.catalogItems.length > 0 ? profile.activity.catalogItems.map((item) => ( - - {item.title}
- {item.summary || item.kind} -
- )) :

No visible listings.

} -
-
- - -
- {profile.activity.knowledgePacks.length > 0 ? profile.activity.knowledgePacks.map((pack) => ( - - {pack.name}
- {pack.summary || pack.visibility} -
- )) :

No visible knowledge packs.

} -
-
-
- {visibleCount === 0 ?

No profile activity is visible to you yet.

: null} + +

This profile confirms the public username and display identity associated with a TreeSeed account.

+
diff --git a/src/plugin.ts b/src/plugin.ts index 5054d050..27fe88d3 100644 --- a/src/plugin.ts +++ b/src/plugin.ts @@ -121,8 +121,6 @@ const adminPlugin: TreeseedPlugin = defineTreeseedPlugin({ '@treeseed/ui/styles/app-shell.css', '@treeseed/ui/styles/app-controls.css', '@treeseed/ui/styles/auth.css', - '@treeseed/ui/styles/operations.css', - '@treeseed/ui/styles/market.css', ], envSchema: ADMIN_ENV_SCHEMA, }, diff --git a/src/routes.ts b/src/routes.ts index 31e2a18e..71828ce1 100644 --- a/src/routes.ts +++ b/src/routes.ts @@ -1,119 +1,25 @@ import type { TreeseedSiteRouteContribution } from '@treeseed/sdk/platform/plugin'; export const ADMIN_ROUTES: TreeseedSiteRouteContribution[] = [ - { pattern: '/api/markdown/preview', resourcePath: 'pages/api/markdown/preview.ts' }, - { pattern: '/app', resourcePath: 'pages/app/index.astro' }, - { pattern: '/app/account', resourcePath: 'pages/app/account.astro' }, - { pattern: '/app/capacity', resourcePath: 'pages/app/capacity/index.astro' }, - { pattern: '/app/capacity/allocation', resourcePath: 'pages/app/capacity/allocation.astro' }, - { pattern: '/app/capacity/allocation/projects/[projectId]', resourcePath: 'pages/app/capacity/allocation/projects/[projectId].astro' }, - { pattern: '/app/capacity/allocation/projects/[projectId]/modes/[modeId]', resourcePath: 'pages/app/capacity/allocation/projects/[projectId]/modes/[modeId].astro' }, - { pattern: '/app/capacity/allocation/projects/[projectId]/agents/[agentSlug]', resourcePath: 'pages/app/capacity/allocation/projects/[projectId]/agents/[agentSlug].astro' }, - { pattern: '/app/capacity/runtime', resourcePath: 'pages/app/capacity/runtime.astro' }, - { pattern: '/app/capacity/workday-runs', resourcePath: 'pages/app/capacity/workday-runs/index.astro' }, - { pattern: '/app/capacity/workday-runs/[runId]', resourcePath: 'pages/app/capacity/workday-runs/[runId].astro' }, - { pattern: '/app/capacity/providers', resourcePath: 'pages/app/capacity/providers/index.astro' }, - { pattern: '/app/capacity/providers/new', resourcePath: 'pages/app/capacity/providers/new.astro' }, - { pattern: '/app/capacity/providers/[providerId]', resourcePath: 'pages/app/capacity/providers/[providerId].astro' }, - { pattern: '/app/capacity/providers/[providerId]/settings', resourcePath: 'pages/app/capacity/providers/[providerId]/settings.astro' }, - { pattern: '/app/capacity/providers/[providerId]/keys', resourcePath: 'pages/app/capacity/providers/[providerId]/keys.astro' }, - { pattern: '/app/services', resourcePath: 'pages/app/services.astro' }, - { pattern: '/app/commons', resourcePath: 'pages/app/commons/index.astro' }, - { pattern: '/app/commons/participants', resourcePath: 'pages/app/commons/participants.astro' }, - { pattern: '/app/commons/proposals/[proposalId]', resourcePath: 'pages/app/commons/proposals/[proposalId].astro' }, - { pattern: '/app/hosts', resourcePath: 'pages/app/hosts/index.astro' }, - { pattern: '/app/hosts/new', resourcePath: 'pages/app/hosts/new.astro' }, - { pattern: '/app/hosts/knowledge-library', resourcePath: 'pages/app/hosts/knowledge-library.astro' }, - { pattern: '/app/hosts/[hostType]/new', resourcePath: 'pages/app/hosts/[hostType]/new.astro' }, - { pattern: '/app/hosts/[hostType]/[hostId]', resourcePath: 'pages/app/hosts/[hostType]/[hostId].astro' }, - { pattern: '/app/hosts/[hostType]/[hostId]/settings', resourcePath: 'pages/app/hosts/[hostType]/[hostId]/settings.astro' }, - { pattern: '/app/knowledge', resourcePath: 'pages/app/knowledge.astro' }, - { pattern: '/app/knowledge/[category]/[slug]', resourcePath: 'pages/app/knowledge/[category]/[slug].astro' }, - { pattern: '/app/knowledge/artifacts', resourcePath: 'pages/app/knowledge/artifacts.astro' }, - { pattern: '/app/knowledge/books', resourcePath: 'pages/app/knowledge/books.astro' }, - { pattern: '/app/knowledge/books/[slug]', resourcePath: 'pages/app/knowledge/books/[slug].astro' }, - { pattern: '/app/knowledge/capabilities', resourcePath: 'pages/app/knowledge/capabilities.astro' }, - { pattern: '/app/knowledge/capabilities/[slug]', resourcePath: 'pages/app/knowledge/capabilities/[slug].astro' }, - { pattern: '/app/knowledge/imports', resourcePath: 'pages/app/knowledge/imports.astro' }, - { pattern: '/app/knowledge/imports/[slug]', resourcePath: 'pages/app/knowledge/imports/[slug].astro' }, - { pattern: '/app/knowledge/packs', resourcePath: 'pages/app/knowledge/packs.astro' }, - { pattern: '/app/knowledge/publish', resourcePath: 'pages/app/knowledge/publish.astro' }, - { pattern: '/app/knowledge/releases', resourcePath: 'pages/app/knowledge/releases.astro' }, - { pattern: '/app/knowledge/releases/[releaseId]', resourcePath: 'pages/app/knowledge/releases/[releaseId].astro' }, - { pattern: '/app/knowledge/releases/[releaseId]/review', resourcePath: 'pages/app/knowledge/releases/[releaseId]/review.astro' }, - { pattern: '/app/knowledge/templates', resourcePath: 'pages/app/knowledge/templates.astro' }, - { pattern: '/app/market/seller', resourcePath: 'pages/app/market/seller.astro' }, - { pattern: '/app/projects', resourcePath: 'pages/app/projects/index.astro' }, - { pattern: '/app/projects/new', resourcePath: 'pages/app/projects/new.astro' }, - { pattern: '/app/projects/deployment/[id]', resourcePath: 'pages/app/projects/deployment/[id].astro' }, - { pattern: '/app/projects/[projectId]/knowledge', resourcePath: 'pages/app/projects/[projectId]/knowledge.astro' }, - { pattern: '/app/projects/[projectId]/knowledge/[...slug]', resourcePath: 'pages/app/projects/[projectId]/knowledge/[...slug].astro' }, - { pattern: '/app/projects/[projectId]', resourcePath: 'pages/app/projects/[projectId].astro' }, - { pattern: '/app/projects/[projectId]/agents', resourcePath: 'pages/app/projects/[projectId]/agents.astro' }, - { pattern: '/app/projects/[projectId]/agents/new', resourcePath: 'pages/app/projects/[projectId]/agents/new.astro' }, - { pattern: '/app/projects/[projectId]/agents/[agentSlug]', resourcePath: 'pages/app/projects/[projectId]/agents/[agentSlug].astro' }, - { pattern: '/app/projects/[projectId]/artifacts', resourcePath: 'pages/app/projects/[projectId]/artifacts.astro' }, - { pattern: '/app/projects/[projectId]/decisions', resourcePath: 'pages/app/projects/[projectId]/decisions.astro' }, - { pattern: '/app/projects/[projectId]/delete', resourcePath: 'pages/app/projects/[projectId]/delete.astro' }, - { pattern: '/app/projects/[projectId]/deploy', resourcePath: 'pages/app/projects/[projectId]/deploy.astro' }, - { pattern: '/app/projects/[projectId]/guidance', resourcePath: 'pages/app/projects/[projectId]/guidance.astro' }, - { pattern: '/app/projects/[projectId]/hosts', resourcePath: 'pages/app/projects/[projectId]/hosts.astro' }, - { pattern: '/app/projects/[projectId]/settings', resourcePath: 'pages/app/projects/[projectId]/settings.astro' }, - { pattern: '/app/projects/[projectId]/workdays', resourcePath: 'pages/app/projects/[projectId]/workdays.astro' }, - { pattern: '/app/projects/[projectId]/workdays/[workdayId]', resourcePath: 'pages/app/projects/[projectId]/workdays/[workdayId].astro' }, - { pattern: '/app/teams', resourcePath: 'pages/app/teams/index.astro' }, - { pattern: '/app/teams/new', resourcePath: 'pages/app/teams/new.astro' }, - { pattern: '/app/teams/[teamId]/delete', resourcePath: 'pages/app/teams/[teamId]/delete.astro' }, - { pattern: '/app/teams/[teamId]/edit', resourcePath: 'pages/app/teams/[teamId]/edit.astro' }, - { pattern: '/app/teams/[teamId]/commerce', resourcePath: 'pages/app/teams/[teamId]/commerce.astro' }, - { pattern: '/app/teams/[teamId]/commerce/products', resourcePath: 'pages/app/teams/[teamId]/commerce/products.astro' }, - { pattern: '/app/teams/[teamId]/commerce/products/[productId]/governance', resourcePath: 'pages/app/teams/[teamId]/commerce/products/[productId]/governance.astro' }, - { pattern: '/app/teams/[teamId]/commerce/sales', resourcePath: 'pages/app/teams/[teamId]/commerce/sales.astro' }, - { pattern: '/app/teams/[teamId]/commerce/services', resourcePath: 'pages/app/teams/[teamId]/commerce/services.astro' }, - { pattern: '/app/teams/[teamId]/commerce/services/[requestId]', resourcePath: 'pages/app/teams/[teamId]/commerce/services/[requestId].astro' }, - { pattern: '/app/teams/[teamId]/commerce/capacity', resourcePath: 'pages/app/teams/[teamId]/commerce/capacity.astro' }, - { pattern: '/app/teams/[teamId]/commerce/capacity/[listingId]', resourcePath: 'pages/app/teams/[teamId]/commerce/capacity/[listingId].astro' }, - { pattern: '/app/teams/[teamId]/members', resourcePath: 'pages/app/teams/[teamId]/members.astro' }, - { pattern: '/app/work', resourcePath: 'pages/app/work.astro' }, - { pattern: '/app/work/review', resourcePath: 'pages/app/work/review.astro' }, - { pattern: '/app/work/decisions', resourcePath: 'pages/app/work/decisions.astro' }, - { pattern: '/app/work/decisions/new', resourcePath: 'pages/app/work/decisions/new.astro' }, - { pattern: '/app/work/decisions/[slug]', resourcePath: 'pages/app/work/decisions/[slug].astro' }, - { pattern: '/app/work/decisions/[slug]/edit', resourcePath: 'pages/app/work/decisions/[slug]/edit.astro' }, - { pattern: '/app/work/notes', resourcePath: 'pages/app/work/notes.astro' }, - { pattern: '/app/work/notes/new', resourcePath: 'pages/app/work/notes/new.astro' }, - { pattern: '/app/work/notes/[slug]', resourcePath: 'pages/app/work/notes/[slug].astro' }, - { pattern: '/app/work/notes/[slug]/edit', resourcePath: 'pages/app/work/notes/[slug]/edit.astro' }, - { pattern: '/app/work/objectives', resourcePath: 'pages/app/work/objectives.astro' }, - { pattern: '/app/work/objectives/new', resourcePath: 'pages/app/work/objectives/new.astro' }, - { pattern: '/app/work/objectives/[slug]', resourcePath: 'pages/app/work/objectives/[slug].astro' }, - { pattern: '/app/work/objectives/[slug]/edit', resourcePath: 'pages/app/work/objectives/[slug]/edit.astro' }, - { pattern: '/app/work/proposals', resourcePath: 'pages/app/work/proposals.astro' }, - { pattern: '/app/work/proposals/new', resourcePath: 'pages/app/work/proposals/new.astro' }, - { pattern: '/app/work/proposals/[slug]', resourcePath: 'pages/app/work/proposals/[slug].astro' }, - { pattern: '/app/work/proposals/[slug]/edit', resourcePath: 'pages/app/work/proposals/[slug]/edit.astro' }, - { pattern: '/app/work/questions', resourcePath: 'pages/app/work/questions.astro' }, - { pattern: '/app/work/questions/new', resourcePath: 'pages/app/work/questions/new.astro' }, - { pattern: '/app/work/questions/[slug]', resourcePath: 'pages/app/work/questions/[slug].astro' }, - { pattern: '/app/work/questions/[slug]/edit', resourcePath: 'pages/app/work/questions/[slug]/edit.astro' }, - { pattern: '/auth/callback/[provider]', resourcePath: 'pages/auth/callback/[provider].ts' }, - { pattern: '/auth/check-email', resourcePath: 'pages/auth/check-email.astro' }, - { pattern: '/auth/confirm-email', resourcePath: 'pages/auth/confirm-email.astro' }, - { pattern: '/auth/device/approve', resourcePath: 'pages/auth/device/approve.astro' }, - { pattern: '/auth/forgot-password', resourcePath: 'pages/auth/forgot-password.astro' }, - { pattern: '/auth/logout', resourcePath: 'pages/auth/logout.astro' }, - { pattern: '/auth/register', resourcePath: 'pages/auth/register.astro' }, - { pattern: '/auth/reset-password', resourcePath: 'pages/auth/reset-password.astro' }, - { pattern: '/auth/sign-in', resourcePath: 'pages/auth/sign-in.astro' }, - { pattern: '/auth/username', resourcePath: 'pages/auth/username.astro' }, - { pattern: '/market', resourcePath: 'pages/market/index.astro' }, - { pattern: '/market/knowledge-packs', resourcePath: 'pages/market/knowledge-packs/index.astro' }, - { pattern: '/market/knowledge-packs/[slug]', resourcePath: 'pages/market/knowledge-packs/[slug].astro' }, - { pattern: '/market/templates', resourcePath: 'pages/market/templates/index.astro' }, - { pattern: '/market/templates/[slug]', resourcePath: 'pages/market/templates/[slug].astro' }, - { pattern: '/t/[name]', resourcePath: 'pages/t/[name].astro' }, - { pattern: '/p/[project]', resourcePath: 'pages/p/[project].astro' }, - { pattern: '/team-invites/[token]/accept', resourcePath: 'pages/team-invites/[token]/accept.astro' }, - { pattern: '/u/[username]', resourcePath: 'pages/u/[username].astro' }, - { pattern: '/v1/[...all]', resourcePath: 'pages/v1/[...all].ts' }, + { pattern: '/app', resourcePath: 'pages/app/index.astro' }, + { pattern: '/app/account', resourcePath: 'pages/app/account.astro' }, + { pattern: '/app/teams', resourcePath: 'pages/app/teams/index.astro' }, + { pattern: '/app/teams/new', resourcePath: 'pages/app/teams/new.astro' }, + { pattern: '/app/teams/[teamId]/edit', resourcePath: 'pages/app/teams/[teamId]/edit.astro' }, + { pattern: '/app/teams/[teamId]/delete', resourcePath: 'pages/app/teams/[teamId]/delete.astro' }, + { pattern: '/app/teams/[teamId]/members', resourcePath: 'pages/app/teams/[teamId]/members.astro' }, + { pattern: '/auth/register', resourcePath: 'pages/auth/register.astro' }, + { pattern: '/auth/check-email', resourcePath: 'pages/auth/check-email.astro' }, + { pattern: '/auth/confirm-email', resourcePath: 'pages/auth/confirm-email.astro' }, + { pattern: '/auth/sign-in', resourcePath: 'pages/auth/sign-in.astro' }, + { pattern: '/auth/logout', resourcePath: 'pages/auth/logout.astro' }, + { pattern: '/auth/forgot-password', resourcePath: 'pages/auth/forgot-password.astro' }, + { pattern: '/auth/reset-password', resourcePath: 'pages/auth/reset-password.astro' }, + { pattern: '/auth/username', resourcePath: 'pages/auth/username.astro' }, + { pattern: '/auth/device/approve', resourcePath: 'pages/auth/device/approve.astro' }, + { pattern: '/auth/callback/[provider]', resourcePath: 'pages/auth/callback/[provider].ts' }, + { pattern: '/u/[username]', resourcePath: 'pages/u/[username].astro' }, + { pattern: '/t/[name]', resourcePath: 'pages/t/[name].astro' }, + { pattern: '/team-invites/[token]/accept', resourcePath: 'pages/team-invites/[token]/accept.astro' }, + { pattern: '/v1/[...all]', resourcePath: 'pages/v1/[...all].ts' }, ]; diff --git a/src/view-models/app-access.ts b/src/view-models/app-access.ts index fbf12d36..fca001ab 100644 --- a/src/view-models/app-access.ts +++ b/src/view-models/app-access.ts @@ -1,4 +1,3 @@ -import { hostTypeFor } from '../lib/market/control-ui.js'; import { loadAccessibleTeams, resolveApiStore, resolveMarketPrincipal } from '../lib/market/store.js'; import { compact, safeArray, type OperationalContext } from './shared.js'; @@ -9,61 +8,22 @@ export interface AppResolution { details: any | null; team: any | null; status: AppAccessStatus; - error?: unknown; -} - -function astroFrom(input: any, fallback?: any) { - return input?.locals ? input : fallback; -} - -function localsFrom(input: any) { - return input?.locals ?? input; -} - -function errorStatus(error: unknown): number | null { - const status = Number((error as any)?.status ?? (error as any)?.details?.status ?? 0); - return Number.isFinite(status) && status > 0 ? status : null; } function teamMatches(team: any, value: string) { return team?.id === value || team?.slug === value || team?.name === value || team?.displayName === value; } -function projectFromDetails(details: any) { - return details?.project ?? details?.summary?.project ?? details ?? null; -} - -function isStableSeedAlias(value: string, kind: string) { - return value === kind || value === `seed-${kind}` || value === `current-${kind}` || value === `primary-${kind}` || value === 'current' || value === 'active'; -} - -async function projectDetails(context: OperationalContext, projectId: string) { - if (typeof context.store?.getProjectDetails !== 'function') return null; - return context.store.getProjectDetails(projectId).catch(() => null); -} - -function resolution(status: AppAccessStatus, resource: T | null = null, team: any | null = null, details: any | null = null, error?: unknown): AppResolution { - return { resource, team, details, status, ...(error ? { error } : {}) }; -} - export async function loadAppContext(input: any, fallbackAstro?: any): Promise { - const astro = astroFrom(input, fallbackAstro); - const locals = localsFrom(input); + const astro = input?.locals ? input : fallbackAstro; + const locals = input?.locals ?? input; const marketContext = astro ?? locals; const store = resolveApiStore(marketContext); const principal = resolveMarketPrincipal(locals); const teams = safeArray(await loadAccessibleTeams(marketContext).catch(() => [])); const cookieTeamId = compact(astro?.cookies?.get?.('treeseed_active_team')?.value, ''); const activeTeam = teams.find((team: any) => teamMatches(team, cookieTeamId)) ?? teams[0] ?? null; - const projects = activeTeam && store ? await store.listTeamProjects(activeTeam.id).catch(() => []) : []; - - return { - store, - principal, - teams, - activeTeam, - projects: safeArray(projects), - }; + return { store, principal, teams, activeTeam }; } export function persistActiveTeamSelection(astro: any, team: any | null) { @@ -79,135 +39,12 @@ export function persistActiveTeamSelection(astro: any, team: any | null) { export function resolveAppTeam(context: OperationalContext, teamParam: unknown): AppResolution { const param = compact(teamParam, ''); - if (!param) return resolution('not_found'); - if ((param === 'current' || param === 'active') && context.activeTeam) return resolution('found', context.activeTeam, context.activeTeam, null); - const team = safeArray(context.teams).find((entry: any) => teamMatches(entry, param)) ?? null; - return team ? resolution('found', team, team, null) : resolution('not_found'); -} - -export async function resolveAppProject(context: OperationalContext, projectParam: unknown): Promise { - const param = compact(projectParam, ''); - if (!param || !context.store) return resolution('not_found'); - - if (isStableSeedAlias(param, 'project')) { - const project = safeArray(context.projects)[0] ?? null; - const team = project ? safeArray(context.teams).find((entry: any) => entry.id === project.teamId || entry.id === project.team_id) ?? context.activeTeam ?? null : null; - const details = project?.id ? await projectDetails(context, project.id) : null; - if (project && team) return resolution('found', projectFromDetails(details) ?? project, team, details ?? project); - } - - let directError: unknown = null; - if (typeof context.store.getProjectDetails === 'function') { - try { - const details = await context.store.getProjectDetails(param); - const project = projectFromDetails(details); - const team = safeArray(context.teams).find((entry: any) => entry.id === project?.teamId || entry.id === project?.team_id) ?? null; - if (project && team) return resolution('found', project, team, details); - if (project && !team) return resolution('forbidden', null, null, null); - } catch (error) { - directError = error; - } - } - - if (typeof context.store.getProjectByTeamAndSlug === 'function') { - for (const team of safeArray(context.teams)) { - const projectBySlug = await context.store.getProjectByTeamAndSlug(team.id, param).catch(() => null); - if (!projectBySlug) continue; - const details = typeof context.store.getProjectDetails === 'function' - ? await context.store.getProjectDetails(projectBySlug.id).catch(() => null) - : null; - return resolution('found', projectFromDetails(details) ?? projectBySlug, team, details); - } - } - - if (errorStatus(directError) === 403) return resolution('forbidden', null, null, null, directError); - return resolution('not_found', null, null, null, directError ?? undefined); -} - -function hostMatchesRequestedType(host: any, requestedType: string) { - const inferred = hostTypeFor(host); - if (requestedType === 'capacity-provider') return inferred === 'capacity-provider' || inferred === 'processing' || host?.provider === 'railway'; - return inferred === requestedType; -} - -export async function resolveAppHost(context: OperationalContext, hostType: unknown, hostId: unknown): Promise { - const requestedType = compact(hostType, ''); - const id = compact(hostId, ''); - if (!id || !requestedType || !context.store) return resolution('not_found'); - - let forbidden = false; - for (const team of safeArray(context.teams)) { - try { - if (isStableSeedAlias(id, 'host')) { - const hosts = requestedType === 'repository' - ? await context.store.listRepositoryHosts?.(team.id, { includePlatform: true }).catch?.(() => []) ?? [] - : await context.store.listTeamWebHosts?.(team.id).catch?.(() => []) ?? []; - const host = safeArray(hosts).find((entry: any) => hostMatchesRequestedType(entry, requestedType)) ?? null; - if (host) return resolution('found', host, team, host); - } - const host = requestedType === 'repository' - ? await context.store.getRepositoryHost(team.id, id) - : await context.store.getTeamWebHost(team.id, id); - if (host && hostMatchesRequestedType(host, requestedType)) return resolution('found', host, team, host); - } catch (error) { - if (errorStatus(error) === 403) forbidden = true; - } - } - - return resolution(forbidden ? 'forbidden' : 'not_found'); -} - -export async function resolveAppCapacityProvider(context: OperationalContext, providerId: unknown): Promise { - const id = compact(providerId, ''); - if (!id || !context.store) return resolution('not_found'); - - if (isStableSeedAlias(id, 'provider')) { - for (const team of safeArray(context.teams)) { - const provider = safeArray(await context.store.listTeamCapacityProviders?.(team.id).catch?.(() => []) ?? [])[0] ?? null; - if (provider) return resolution('found', provider, team, provider); - } - } - - if (typeof context.store.getCapacityProviderById === 'function') { - try { - const provider = await context.store.getCapacityProviderById(id); - const teamId = provider?.teamId ?? provider?.ownerTeamId; - const team = safeArray(context.teams).find((entry: any) => entry.id === teamId) ?? null; - if (provider && team) return resolution('found', provider, team, provider); - if (provider && !team) return resolution('forbidden'); - } catch (error) { - if (errorStatus(error) === 403) return resolution('forbidden', null, null, null, error); - } - } - - let forbidden = false; - for (const team of safeArray(context.teams)) { - try { - const provider = typeof context.store.getCapacityProvider === 'function' - ? await context.store.getCapacityProvider(team.id, id) - : safeArray(await context.store.listTeamCapacityProviders(team.id)).find((entry: any) => entry?.id === id) ?? null; - if (provider) return resolution('found', provider, team, provider); - } catch (error) { - if (errorStatus(error) === 403) forbidden = true; - } - } - - return resolution(forbidden ? 'forbidden' : 'not_found'); -} - -export async function resolveAppDeployment(context: OperationalContext, deploymentId: unknown): Promise { - const id = compact(deploymentId, ''); - if (!id || !context.store || typeof context.store.getProjectDeployment !== 'function') return resolution('not_found'); - try { - const details = await context.store.getProjectDeployment(id); - const deployment = details?.deployment ?? details ?? null; - const project = details?.project?.project ?? details?.projectDetails?.project ?? details?.project ?? null; - const teamId = deployment?.teamId ?? project?.teamId ?? project?.team_id; - const team = safeArray(context.teams).find((entry: any) => entry.id === teamId) ?? null; - if (deployment && team) return resolution('found', deployment, team, details); - if (deployment && !team) return resolution('forbidden'); - return resolution('not_found'); - } catch (error) { - return resolution(errorStatus(error) === 403 ? 'forbidden' : 'not_found', null, null, null, error); + if (!param) return { resource: null, details: null, team: null, status: 'not_found' }; + if ((param === 'current' || param === 'active') && context.activeTeam) { + return { resource: context.activeTeam, details: null, team: context.activeTeam, status: 'found' }; } + const team = safeArray(context.teams).find((entry: any) => teamMatches(entry, param)) ?? null; + return team + ? { resource: team, details: null, team, status: 'found' } + : { resource: null, details: null, team: null, status: 'not_found' }; } diff --git a/src/view-models/capacity-runtime.vm.ts b/src/view-models/capacity-runtime.vm.ts deleted file mode 100644 index 333e8d22..00000000 --- a/src/view-models/capacity-runtime.vm.ts +++ /dev/null @@ -1,118 +0,0 @@ -export interface CapacityRuntimeBlockerVm { - code: string; - severity: 'info' | 'warning' | 'danger' | 'error' | string; - title?: string; - message?: string; - owner?: string; - assignmentId?: string | null; - projectId?: string | null; - providerId?: string | null; - nextAction?: string; - evidence?: Array<{ label: string; value: string }>; -} - -export interface CapacityRuntimeDiagnosticsResponse { - projectId: string; - teamId: string; - generatedAt: string; - assignments: unknown[]; - explanations: unknown[]; - modeRuns: unknown[]; - treeDxProxyAudit: unknown[]; - ledgerEntries: Array & { assignmentId?: string | null; modeRunId?: string | null }>; - fallbackOutputs: unknown[]; - diagnostics: CapacityRuntimeBlockerVm[]; -} - -export interface CapacityRuntimeDiagnosticVm { - summary: { - health: 'ready' | 'degraded' | 'blocked' | 'unknown'; - openSessions: number; - leasedAssignments: number; - blockedAssignments: number; - failedAssignments: number; - unsettledAssignments: number; - missingTreeDxAuditCount: number; - }; - blockers: CapacityRuntimeBlockerVm[]; - assignments: Array>; - selectedAssignment?: Record | null; - settlement: { - ledgerEntries: Array>; - unsettledAssignments: Array>; - }; - treeDx: { - auditRows: Array>; - missingAuditAssignmentIds: string[]; - }; -} - -function record(value: unknown): Record { - return value && typeof value === 'object' && !Array.isArray(value) ? value as Record : {}; -} - -function text(value: unknown) { - return value == null || value === '' ? '' : String(value); -} - -export function buildCapacityRuntimeDiagnosticVm( - response: CapacityRuntimeDiagnosticsResponse, - selectedAssignmentId?: string | null, -): CapacityRuntimeDiagnosticVm { - const assignments = response.assignments.map((assignment) => assignment as unknown as Record); - const ledgerEntries = response.ledgerEntries.map((entry) => entry as unknown as Record); - const terminalPhases = new Set(['task_completed_actual_settlement', 'reservation_released', 'task_failed_refund']); - const settledAssignmentIds = new Set(ledgerEntries - .filter((entry) => terminalPhases.has(String(entry.phase ?? ''))) - .map((entry) => text(entry.assignmentId)) - .filter(Boolean)); - const unsettledAssignments = assignments.filter((assignment) => { - const status = String(assignment.status ?? ''); - return ['completed', 'failed', 'returned'].includes(status) - && assignment.reservationId - && !settledAssignmentIds.has(text(assignment.id)); - }); - const treeDxProxyAudit = response.treeDxProxyAudit.map((audit) => record(audit)); - const treeDxAuditAssignmentIds = new Set(treeDxProxyAudit - .map((audit) => text(audit.assignmentId)) - .filter(Boolean)); - const missingAuditAssignmentIds = assignments - .filter((assignment) => record(assignment.treedxProxyHandle).id && !treeDxAuditAssignmentIds.has(text(assignment.id))) - .map((assignment) => text(assignment.id)) - .filter(Boolean); - const openSessions = 0; - const leasedAssignments = assignments.filter((assignment) => assignment.leaseState === 'leased').length; - const failedAssignments = assignments.filter((assignment) => assignment.status === 'failed').length; - const blockedAssignments = response.diagnostics.filter((diagnostic) => ['warning', 'danger'].includes(diagnostic.severity)).length; - const health = failedAssignments > 0 || response.diagnostics.some((diagnostic) => diagnostic.severity === 'danger') - ? 'blocked' - : blockedAssignments > 0 || unsettledAssignments.length > 0 || missingAuditAssignmentIds.length > 0 - ? 'degraded' - : assignments.length > 0 - ? 'ready' - : 'unknown'; - return { - summary: { - health, - openSessions, - leasedAssignments, - blockedAssignments, - failedAssignments, - unsettledAssignments: unsettledAssignments.length, - missingTreeDxAuditCount: missingAuditAssignmentIds.length, - }, - blockers: response.diagnostics, - assignments, - selectedAssignment: selectedAssignmentId - ? assignments.find((assignment) => assignment.id === selectedAssignmentId) ?? null - : assignments[0] ?? null, - settlement: { - ledgerEntries, - unsettledAssignments, - }, - treeDx: { - auditRows: treeDxProxyAudit, - missingAuditAssignmentIds, - }, - }; -} diff --git a/src/view-models/contextual-dashboard.vm.ts b/src/view-models/contextual-dashboard.vm.ts index 3ef30f57..e92a4e80 100644 --- a/src/view-models/contextual-dashboard.vm.ts +++ b/src/view-models/contextual-dashboard.vm.ts @@ -1,385 +1,99 @@ -import type { DashboardViewModel, FeedbackContext, HelpContext, ResolvedAction } from '@treeseed/ui'; -import { compact, describeState, safeArray, teamLabel, toneForState, type OperationalContext } from './shared.js'; +import type { DashboardViewModel, ResolvedAction } from '@treeseed/ui'; +import { compact, safeArray, teamLabel, type OperationalContext } from './shared.js'; -type DashboardBundle = { +interface DashboardBundle { viewModel: DashboardViewModel; actions: ResolvedAction[]; - helpContext: HelpContext; - feedbackContext: FeedbackContext; -}; - -function displayName(value: any, fallback: string) { - return compact(value?.displayName, compact(value?.name, compact(value?.title, compact(value?.slug, fallback)))); -} - -function countLabel(value: number, singular: string, plural = `${singular}s`) { - return value === 1 ? `1 ${singular}` : `${value} ${plural}`; } -function feedbackContext(input: { - url: string; - title: string; - shell: 'public' | 'product'; - context: FeedbackContext['context']; - routePattern: string; - teamId?: string; - projectId?: string; - resourceType?: string; - allowAnonymous?: boolean; -}): FeedbackContext { - const policy = input.allowAnonymous - ? 'public' - : input.context === 'project' - ? 'project' - : input.context === 'team' - ? 'team' - : input.context === 'admin' - ? 'admin' - : 'authenticated'; - return { - url: input.url, - canonicalPath: input.routePattern, - title: input.title, - shell: input.shell, - context: input.context, - teamId: input.teamId, - projectId: input.projectId, - resourceType: input.resourceType, - submissionEndpoint: input.shell === 'public' ? '/api/feedback/submit' : '/v1/feedback', - allowAnonymous: input.allowAnonymous ?? false, - screenshotPolicy: 'optional', - attachmentStoragePolicy: input.context === 'public' || input.context === 'market' ? 'public' : 'private', - routePattern: input.routePattern, - policy, - }; -} - -function helpContext(input: { - title: string; - shell: 'public' | 'product'; - context: HelpContext['context']; - routePattern: string; - template: HelpContext['template']; - topicId: string; - summary: string; - resourceType?: string; - teamId?: string; - projectId?: string; - feedbackType?: HelpContext['feedbackType']; -}): HelpContext { - return { - topicIds: [input.topicId], - shell: input.shell, - context: input.context, - resourceType: input.resourceType, - routePattern: input.routePattern, - canonicalPath: input.routePattern, - template: input.template, - summary: input.summary, - topics: [{ - id: input.topicId, - title: input.title, - summary: input.summary, - visibility: input.shell === 'public' ? 'public' : input.context === 'project' ? 'project' : 'team', - source: 'capability', - }], - relatedDocs: [{ - topicId: input.topicId, - title: input.title, - href: input.routePattern, - visibility: input.shell === 'public' ? 'public' : input.context === 'project' ? 'project' : 'team', - summary: input.summary, - source: 'capability', - current: true, - }], - relatedActions: [], - searchScope: input.shell === 'public' ? 'public' : input.context === 'project' ? 'project' : 'team', - searchPlaceholder: `Search ${input.title.toLowerCase()} help`, - visibility: input.shell === 'public' ? 'public' : input.context === 'project' ? 'project' : 'team', - feedbackType: input.feedbackType ?? 'question', - }; +function principalName(principal: any) { + return compact(principal?.displayName, compact(principal?.email, 'Signed-in account')); } -export async function buildPersonalDashboard(context: OperationalContext, url: URL): Promise { +export function buildPersonalDashboard(context: OperationalContext): DashboardBundle { const activeTeam = context.activeTeam; - const projectCount = context.projects.length; - const hostCount = activeTeam && context.store?.listTeamWebHosts - ? safeArray(await context.store.listTeamWebHosts(activeTeam.id).catch(() => [])).length - : 0; - const providerCount = activeTeam && context.store?.listTeamCapacityProviders - ? safeArray(await context.store.listTeamCapacityProviders(activeTeam.id).catch(() => [])).length - : 0; - const productCount = activeTeam && context.store?.listTeamProducts - ? safeArray(await context.store.listTeamProducts(activeTeam.id, context.principal).catch(() => [])).length - : 0; - const actions: ResolvedAction[] = [ - { id: 'team.create', label: 'New team', state: 'allowed', href: '/app/teams/new' }, - { id: 'project.create', label: 'New project', state: activeTeam ? 'allowed' : 'requiresSetup', href: '/app/projects/new', reason: activeTeam ? undefined : 'Create a team before creating a project.' }, - ]; - return { viewModel: { - title: 'Personal dashboard', - description: 'Your current TreeSeed context, next actions, and recent operating surface.', + title: 'Account and teams', + description: 'Manage your identity, team memberships, and active team.', context: { - id: 'personal-context', - title: 'Where you are', - description: 'Signed-in scope and active team.', + id: 'identity-context', + title: 'Signed-in identity', items: [ - { label: 'Principal', value: displayName(context.principal, 'Signed-in user'), description: compact(context.principal?.email, 'Authenticated') }, - { label: 'Active team', value: activeTeam ? teamLabel(activeTeam) : 'None', description: activeTeam ? 'Team-scoped controls are available' : 'Create or join a team', tone: activeTeam ? 'success' : 'warning' }, - { label: 'Projects', value: projectCount, description: countLabel(projectCount, 'project'), href: '/app/projects' }, + { label: 'Account', value: principalName(context.principal), description: compact(context.principal?.email, 'Authenticated') }, + { label: 'Active team', value: activeTeam ? teamLabel(activeTeam) : 'None selected', tone: activeTeam ? 'success' : 'warning' }, + { label: 'Available teams', value: context.teams.length, href: '/app/teams' }, ], }, status: { - id: 'personal-status', - title: 'Status summary', - description: 'Immediate readiness across your active context.', - items: [ - { label: 'Services', value: hostCount, description: 'Connected host credentials', href: '/app/services', tone: hostCount > 0 ? 'success' : 'warning' }, - { label: 'Capacity', value: providerCount, description: 'Provider records', href: '/app/capacity/providers', tone: providerCount > 0 ? 'success' : 'warning' }, - { label: 'Saved assets', value: productCount, description: 'Team resources and imports', href: '/app/knowledge/artifacts' }, - ], - }, - setup: { - id: 'personal-setup', - title: 'Setup progress', - description: 'The shortest path to a useful platform context.', + id: 'identity-status', + title: 'Identity status', items: [ - { label: 'Team', value: activeTeam ? 'Ready' : 'Needed', href: '/app/teams', tone: activeTeam ? 'success' : 'warning' }, - { label: 'Project', value: projectCount > 0 ? 'Ready' : 'Needed', href: '/app/projects', tone: projectCount > 0 ? 'success' : 'warning' }, - { label: 'Questions', value: 'Open', href: '/app/work/questions', description: 'Capture direction for work' }, + { label: 'Session', value: 'Active', tone: 'success', href: '/app/account' }, + { label: 'Team context', value: activeTeam ? 'Selected' : 'Needs selection', tone: activeTeam ? 'success' : 'warning', href: '/app/teams' }, ], }, nextActions: [ + { id: 'account', title: 'Review account settings', description: 'Update profile, email, password, appearance, and active sessions.', href: '/app/account', status: 'Account' }, activeTeam - ? { id: 'new-project', title: 'Create or review a project', description: 'Project dashboards summarize knowledge, deployment, and workday readiness.', href: '/app/projects', status: 'Recommended' } - : { id: 'new-team', title: 'Create your first team', description: 'Teams own projects, hosts, capacity, and private Knowledge Hubs.', href: '/app/teams/new', status: 'Required' }, - { id: 'services', title: 'Review service readiness', description: 'Check hosts, capacity providers, credentials, diagnostics, and recovery paths.', href: '/app/services', status: 'Services' }, - { id: 'questions', title: 'Review project questions', description: 'Questions are the canonical project-direction proof route.', href: '/app/work/questions', status: 'Phase 2' }, + ? { id: 'team', title: `Manage ${teamLabel(activeTeam)}`, description: 'Review team settings and membership.', href: `/app/teams/${encodeURIComponent(activeTeam.id)}/edit`, status: 'Active team' } + : { id: 'team-new', title: 'Create your first team', description: 'A team establishes the shared identity and membership boundary.', href: '/app/teams/new', status: 'Required' }, ], - primaryResources: context.projects.slice(0, 4).map((project: any) => ({ - id: compact(project?.id, compact(project?.slug, 'project')), - title: displayName(project, 'Project'), - description: compact(project?.profileSummary, compact(project?.description, 'Project operating context')), - href: `/app/projects/${encodeURIComponent(compact(project?.id, compact(project?.slug, 'project')))}`, - status: describeState(project?.status, 'active'), + primaryResources: context.teams.map((team: any) => ({ + id: compact(team?.id, compact(team?.name, 'team')), + title: teamLabel(team), + description: team?.id === activeTeam?.id ? 'Current active team' : 'Available team', + href: `/app/teams/${encodeURIComponent(team.id)}/edit`, + status: team?.id === activeTeam?.id ? 'Active' : 'Available', })), - activity: [ - { id: 'personal-context-loaded', title: 'Dashboard context loaded', description: activeTeam ? `Active team is ${teamLabel(activeTeam)}.` : 'No active team selected.', tone: activeTeam ? 'success' : 'warning' }, - ], + activity: [], }, - actions, - helpContext: helpContext({ title: 'Personal dashboard', shell: 'product', context: 'personal', routePattern: '/app/', template: 'dashboard', topicId: 'personal-dashboard', summary: 'Use the personal dashboard to orient across teams, projects, notifications, and next actions.' }), - feedbackContext: feedbackContext({ url: url.href, title: 'Personal dashboard', shell: 'product', context: 'personal', routePattern: '/app/' }), + actions: [ + { id: 'account.manage', label: 'Manage account', state: 'allowed', href: '/app/account' }, + { id: 'team.create', label: 'Create team', state: 'allowed', href: '/app/teams/new' }, + ], }; } -export async function buildTeamDashboard(context: OperationalContext, url: URL): Promise { +export async function buildTeamDashboard(context: OperationalContext): Promise { const activeTeam = context.activeTeam; - const members = activeTeam && context.store?.listTeamMembers ? safeArray(await context.store.listTeamMembers(activeTeam.id).catch(() => [])) : []; - const invites = activeTeam && context.store?.listTeamInvites ? safeArray(await context.store.listTeamInvites(activeTeam.id).catch(() => [])) : []; - const providers = activeTeam && context.store?.listTeamCapacityProviders ? safeArray(await context.store.listTeamCapacityProviders(activeTeam.id).catch(() => [])) : []; - const actions: ResolvedAction[] = [ - { id: 'team.create', label: 'New team', state: 'allowed', href: '/app/teams/new' }, - { id: 'project.create', label: 'New project', state: activeTeam ? 'allowed' : 'requiresSetup', href: '/app/projects/new', reason: activeTeam ? undefined : 'Select or create a team first.' }, - ]; - + const members = activeTeam && context.store?.listTeamMembers + ? safeArray(await context.store.listTeamMembers(activeTeam.id).catch(() => [])) + : []; return { viewModel: { - title: 'Team dashboard', - description: 'Team membership, project portfolio, allocation, setup, and recent operating context.', + title: 'Teams', + description: 'Choose the active team and manage team identity and membership.', context: { id: 'team-context', - title: 'Where you are', - description: 'The active organization context for shared work.', + title: 'Team context', items: [ - { label: 'Active team', value: activeTeam ? teamLabel(activeTeam) : 'None', description: activeTeam ? compact(activeTeam?.profileSummary, 'Team selected') : 'Create a team to continue', tone: activeTeam ? 'success' : 'warning' }, - { label: 'Available teams', value: context.teams.length, description: countLabel(context.teams.length, 'team') }, - { label: 'Projects', value: context.projects.length, description: countLabel(context.projects.length, 'project'), href: '/app/projects' }, + { label: 'Active team', value: activeTeam ? teamLabel(activeTeam) : 'None', tone: activeTeam ? 'success' : 'warning' }, + { label: 'Available teams', value: context.teams.length }, + { label: 'Active-team members', value: members.length, href: activeTeam ? `/app/teams/${encodeURIComponent(activeTeam.id)}/members` : undefined }, ], }, status: { id: 'team-status', - title: 'Status summary', - items: [ - { label: 'Members', value: members.length, description: countLabel(members.length, 'member'), href: activeTeam ? `/app/teams/${encodeURIComponent(activeTeam.id)}/members` : undefined }, - { label: 'Invites', value: invites.length, description: 'Pending invitations', href: activeTeam ? `/app/teams/${encodeURIComponent(activeTeam.id)}/members` : undefined }, - { label: 'Capacity providers', value: providers.length, description: 'Team-owned providers', href: '/app/capacity/providers', tone: providers.length > 0 ? 'success' : 'warning' }, - ], + title: 'Management', + items: activeTeam ? [ + { label: 'Settings', value: 'Available', href: `/app/teams/${encodeURIComponent(activeTeam.id)}/edit` }, + { label: 'Membership', value: `${members.length} members`, href: `/app/teams/${encodeURIComponent(activeTeam.id)}/members` }, + ] : [{ label: 'Team setup', value: 'Create a team', href: '/app/teams/new', tone: 'warning' }], }, - allocation: { - id: 'team-allocation', - title: 'Portfolio allocation', - description: 'Project and capacity distribution for the selected team.', - items: [ - { label: 'Project portfolio', value: context.projects.length, description: 'Active project contexts', href: '/app/projects' }, - { label: 'Capacity policy', value: providers.length > 0 ? 'Configured' : 'Needs setup', href: '/app/capacity/allocation', tone: providers.length > 0 ? 'success' : 'warning' }, - ], - }, - nextActions: [ - activeTeam - ? { id: 'team-members', title: 'Review members and invites', description: 'Keep team access aligned with current project work.', href: `/app/teams/${encodeURIComponent(activeTeam.id)}/members`, status: 'Team' } - : { id: 'team-new', title: 'Create a team', description: 'A team is required before projects, hosts, and private readers.', href: '/app/teams/new', status: 'Required' }, - { id: 'team-projects', title: 'Open project portfolio', description: 'Move from team context to project dashboards.', href: '/app/projects', status: 'Projects' }, - ], + nextActions: activeTeam ? [ + { id: 'settings', title: 'Edit team settings', description: 'Manage the active team identity.', href: `/app/teams/${encodeURIComponent(activeTeam.id)}/edit`, status: 'Settings' }, + { id: 'members', title: 'Manage members', description: 'Invite members and maintain roles.', href: `/app/teams/${encodeURIComponent(activeTeam.id)}/members`, status: 'Membership' }, + ] : [{ id: 'create', title: 'Create a team', description: 'Create the first shared team context.', href: '/app/teams/new', status: 'Required' }], primaryResources: context.teams.map((team: any) => ({ - id: compact(team?.id, compact(team?.slug, 'team')), + id: compact(team?.id, compact(team?.name, 'team')), title: teamLabel(team), - description: compact(team?.profileSummary, compact(team?.slug, 'Team context')), - href: `/t/${encodeURIComponent(compact(team?.name, compact(team?.slug, compact(team?.id, 'team'))))}`, + description: compact(team?.profileSummary, team?.id === activeTeam?.id ? 'Current active team' : 'Available team'), + href: `/app/teams/${encodeURIComponent(team.id)}/edit`, status: team?.id === activeTeam?.id ? 'Active' : 'Available', })), - activity: [{ id: 'team-context-loaded', title: 'Team dashboard loaded', description: activeTeam ? `${teamLabel(activeTeam)} is active.` : 'No active team selected.', tone: activeTeam ? 'success' : 'warning' }], - }, - actions, - helpContext: helpContext({ title: 'Team dashboard', shell: 'product', context: 'team', routePattern: '/app/teams', template: 'dashboard', topicId: 'team-dashboard', summary: 'Use the team dashboard to review members, portfolio allocation, setup, and team-scoped next actions.' }), - feedbackContext: feedbackContext({ url: url.href, title: 'Team dashboard', shell: 'product', context: 'team', routePattern: '/app/teams', teamId: activeTeam?.id }), - }; -} - -export async function buildProjectDashboard(context: OperationalContext, project: any, details: any, team: any, url: URL): Promise { - const projectId = compact(project?.id, compact(project?.slug, 'project')); - const deployments = context.store?.listProjectDeployments ? safeArray(await context.store.listProjectDeployments(projectId, { limit: 5 }).catch(() => [])) : []; - const workdays = context.store?.listProjectWorkdaySummaries ? safeArray(await context.store.listProjectWorkdaySummaries(projectId, null).catch(() => [])) : []; - const artifacts = context.store?.listCatalogArtifactVersions ? safeArray(await context.store.listCatalogArtifactVersions(projectId).catch(() => [])) : []; - const questionsHref = '/app/work/questions'; - const actions: ResolvedAction[] = [ - { id: 'project.settings', label: 'Settings', state: 'allowed', href: `/app/projects/${encodeURIComponent(projectId)}/settings` }, - { id: 'project.questions', label: 'Questions', state: 'allowed', href: questionsHref }, - ]; - - return { - viewModel: { - title: `${displayName(project, 'Project')} dashboard`, - description: 'Project readiness, Knowledge Hub access, deployment state, workdays, and next actions.', - context: { - id: 'project-context', - title: 'Where you are', - items: [ - { label: 'Project', value: displayName(project, 'Project'), description: compact(project?.slug, projectId) }, - { label: 'Team', value: teamLabel(team), description: 'Owning team', href: '/app/teams' }, - { label: 'Visibility', value: describeState(project?.visibility, 'private'), description: 'Project sharing state' }, - ], - }, - status: { - id: 'project-status', - title: 'Status summary', - description: 'Readiness across the most important project systems.', - items: [ - { label: 'Project state', value: describeState(project?.status, 'active'), tone: toneForState(project?.status) as any }, - { label: 'Deployments', value: deployments.length, description: 'Recent deployment records', href: `/app/projects/${encodeURIComponent(projectId)}/deploy`, tone: deployments.length > 0 ? 'success' : 'warning' }, - { label: 'Workdays', value: workdays.length, description: 'Recorded project workdays', href: `/app/projects/${encodeURIComponent(projectId)}/workdays` }, - ], - }, - deployment: { - id: 'project-deployment', - title: 'Deployment and runtime', - description: 'Public runtime, private Knowledge Hub, and content state.', - items: [ - { label: 'Knowledge Hub', value: 'Available', description: 'Private reader route is active', href: `/app/projects/${encodeURIComponent(projectId)}/knowledge`, tone: 'success' }, - { label: 'Public reader', value: 'Phase 3', description: 'R2-backed /knowledge proof route', href: '/knowledge', tone: 'success' }, - { label: 'Artifacts', value: artifacts.length, description: 'Catalog artifact versions', href: `/app/projects/${encodeURIComponent(projectId)}/artifacts` }, - ], - }, - setup: { - id: 'project-setup', - title: 'Setup progress', - items: [ - { label: 'Settings', value: details ? 'Loaded' : 'Minimal', href: `/app/projects/${encodeURIComponent(projectId)}/settings`, tone: details ? 'success' : 'warning' }, - { label: 'Questions', value: 'Ready', href: questionsHref, tone: 'success' }, - { label: 'Help and feedback', value: 'Ready', description: 'Shell-level Phase 5/6 surfaces', tone: 'success' }, - ], - }, - nextActions: [ - { id: 'project-questions', title: 'Review project questions', description: 'Resolve uncertainty before workday execution.', href: questionsHref, status: 'Direction' }, - { id: 'project-knowledge', title: 'Open private Knowledge Hub', description: 'Read private project content through the Phase 4 reader.', href: `/app/projects/${encodeURIComponent(projectId)}/knowledge`, status: 'Private' }, - { id: 'project-deploy', title: 'Review deployment state', description: 'Check readiness and recent deployment events.', href: `/app/projects/${encodeURIComponent(projectId)}/deploy`, status: 'Runtime' }, - ], - primaryResources: [ - { id: 'settings', title: 'Settings', description: 'Project profile, hosts, and configuration.', href: `/app/projects/${encodeURIComponent(projectId)}/settings`, status: 'Project' }, - { id: 'workdays', title: 'Workdays', description: 'Project workday history and requests.', href: `/app/projects/${encodeURIComponent(projectId)}/workdays`, status: countLabel(workdays.length, 'record') }, - { id: 'artifacts', title: 'Artifacts', description: 'Generated and cataloged knowledge outputs.', href: `/app/projects/${encodeURIComponent(projectId)}/artifacts`, status: countLabel(artifacts.length, 'artifact') }, - ], - activity: [ - ...deployments.slice(0, 3).map((deployment: any, index: number) => ({ - id: `deployment-${compact(deployment?.id, String(index))}`, - title: compact(deployment?.title, 'Deployment updated'), - description: describeState(deployment?.status ?? deployment?.state, 'recorded'), - timestamp: compact(deployment?.updatedAt, compact(deployment?.createdAt, '')), - href: `/app/projects/${encodeURIComponent(projectId)}/deploy`, - tone: toneForState(deployment?.status ?? deployment?.state) as any, - })), - ...workdays.slice(0, 2).map((workday: any, index: number) => ({ - id: `workday-${compact(workday?.id, String(index))}`, - title: compact(workday?.summary?.objective, 'Workday recorded'), - description: describeState(workday?.state, 'active'), - timestamp: compact(workday?.updatedAt, compact(workday?.createdAt, '')), - href: `/app/projects/${encodeURIComponent(projectId)}/workdays`, - tone: toneForState(workday?.state) as any, - })), - ], - }, - actions, - helpContext: helpContext({ title: 'Project dashboard', shell: 'product', context: 'project', routePattern: '/app/projects/[projectId]', template: 'dashboard', topicId: 'project-dashboard', summary: 'Use the project dashboard to review project readiness, Knowledge Hub state, deployment evidence, and next actions.', resourceType: 'project', projectId }), - feedbackContext: feedbackContext({ url: url.href, title: 'Project dashboard', shell: 'product', context: 'project', routePattern: '/app/projects/[projectId]', teamId: team?.id, projectId, resourceType: 'project' }), - }; -} - -export function buildMarketDashboard(input: { url: URL; templates: any[]; knowledgePacks: any[]; principal?: any | null }): DashboardBundle { - const templateCount = input.templates.length; - const packCount = input.knowledgePacks.length; - const actions: ResolvedAction[] = [ - { id: 'market.templates', label: 'Workflow imports', state: 'allowed', href: '/market/templates/' }, - { id: 'market.knowledge', label: 'Knowledge imports', state: 'allowed', href: '/market/knowledge-packs/' }, - ]; - return { - viewModel: { - title: 'Market dashboard', - description: 'Discover workflow imports, knowledge packs, entitlement context, and install paths.', - context: { - id: 'market-context', - title: 'Where you are', - items: [ - { label: 'Surface', value: 'Market', description: 'Public acquisition and import context', tone: 'info' }, - { label: 'Signed in', value: input.principal ? 'Yes' : 'No', description: input.principal ? 'Install actions can use account context' : 'Sign in before private installs' }, - ], - }, - status: { - id: 'market-status', - title: 'Discovery summary', - items: [ - { label: 'Workflow imports', value: templateCount, description: countLabel(templateCount, 'template'), href: '/market/templates/' }, - { label: 'Knowledge imports', value: packCount, description: countLabel(packCount, 'pack'), href: '/market/knowledge-packs/' }, - { label: 'Seller state', value: input.principal ? 'Available later' : 'Sign-in required', description: 'Seller dashboard is deferred until seller routes exist' }, - ], - }, - nextActions: [ - { id: 'browse-templates', title: 'Browse workflow imports', description: 'Start from a proven operational baseline.', href: '/market/templates/', status: 'Templates' }, - { id: 'browse-knowledge', title: 'Browse knowledge imports', description: 'Install reusable Knowledge Hub material.', href: '/market/knowledge-packs/', status: 'Knowledge' }, - ], - primaryResources: [ - ...input.templates.slice(0, 3).map((entry: any) => ({ - id: compact(entry?.slug, compact(entry?.id, 'template')), - title: compact(entry?.title, 'Workflow import'), - description: compact(entry?.summary, 'Reusable workflow baseline.'), - href: `/market/templates/${encodeURIComponent(compact(entry?.slug, compact(entry?.id, 'template')))}/`, - status: compact(entry?.category, 'Template'), - meta: compact(entry?.publisherName, 'TreeSeed'), - })), - ...input.knowledgePacks.slice(0, 3).map((entry: any) => ({ - id: compact(entry?.slug, compact(entry?.id, 'knowledge-pack')), - title: compact(entry?.name, compact(entry?.title, 'Knowledge import')), - description: compact(entry?.summary, 'Reusable source material and packaged knowledge.'), - href: `/market/knowledge-packs/${encodeURIComponent(compact(entry?.slug, compact(entry?.id, 'knowledge-pack')))}/`, - status: compact(entry?.visibility, 'Knowledge'), - meta: compact(entry?.installStrategy, 'Install'), - })), - ], - activity: [{ id: 'market-loaded', title: 'Market context loaded', description: `${templateCount + packCount} resources are available for discovery.`, tone: 'info' }], + activity: [], }, - actions, - helpContext: helpContext({ title: 'Market dashboard', shell: 'public', context: 'market', routePattern: '/market', template: 'dashboard', topicId: 'market-dashboard', summary: 'Use the market dashboard to discover templates, knowledge packs, entitlements, and install actions.', feedbackType: 'question' }), - feedbackContext: feedbackContext({ url: input.url.href, title: 'Market dashboard', shell: 'public', context: 'market', routePattern: '/market', allowAnonymous: true }), + actions: [{ id: 'team.create', label: 'Create team', state: 'allowed', href: '/app/teams/new' }], }; } diff --git a/src/view-models/deployment.vm.ts b/src/view-models/deployment.vm.ts deleted file mode 100644 index 060f0cff..00000000 --- a/src/view-models/deployment.vm.ts +++ /dev/null @@ -1,565 +0,0 @@ -import { safeArray } from './shared.ts'; - -type Tone = 'default' | 'info' | 'success' | 'warning' | 'danger'; - -const ACTIVE_DEPLOYMENT_STATUSES = new Set(['queued', 'claimed', 'dispatching', 'running', 'monitoring']); -const TERMINAL_DEPLOYMENT_STATUSES = new Set(['succeeded', 'failed', 'cancelled', 'timed_out']); - -const ACTION_LABELS: Record = { - deploy_web: 'Deploy web', - publish_content: 'Publish content', - monitor: 'Monitor', -}; - -const ENVIRONMENT_LABELS: Record = { - staging: 'Staging', - prod: 'Production', -}; - -export interface DeploymentViewModel { - project: { - id: string; - name: string; - slug: string; - }; - summary: Array<{ - label: string; - value: string; - description: string; - tone: Tone; - href?: string | null; - }>; - launch: { - status: string; - label: string; - description: string; - tone: Tone; - deployHref: string | null; - actions: Array<{ action: string; label: string; url: string; method: string; description: string }>; - inspect: { summary: string; command: string | null } | null; - events: Array<{ id: string; label: string; description: string; timestamp: string | null; tone: Tone }>; - }; - nextAction: { - code: string; - label: string; - description: string; - action: string | null; - environment: string | null; - tone: Tone; - }; - readiness: { - ready: boolean; - label: string; - checks: Array<{ code: string; label: string; message: string; help: string; ready: boolean; tone: Tone; href?: string }>; - blockers: Array<{ code: string; message: string; href?: string }>; - }; - environments: DeploymentEnvironmentCard[]; - timeline: DeploymentTimelineItem[]; - historyRows: DeploymentHistoryRow[]; - runner: { - status: string; - tone: Tone; - label: string; - lastHeartbeatAt: string | null; - activeJobCount: string; - capabilities: string[]; - }; - troubleshooting: Array<{ title: string; description: string; tone: Tone; href?: string }>; - activeDeployment: any | null; - activeStateUrl: string | null; - showSensitiveUnlock: boolean; -} - -export interface DeploymentEnvironmentCard { - environment: 'staging' | 'prod'; - label: string; - status: string; - tone: Tone; - url: string | null; - latestSummary: string; - latestCompletedAt: string | null; - workflowUrl: string | null; - monitorSummary: string; - monitor: { - status: string; - label: string; - tone: Tone; - checkedAt: string | null; - counts: { passed: number; warnings: number; failed: number; skipped: number }; - checks: Array<{ key: string; label: string; status: string; summary: string; tone: Tone; url: string | null; inspectCommand: string | null }>; - }; - actions: DeploymentActionForm[]; -} - -export interface DeploymentActionForm { - action: string; - label: string; - environment: 'staging' | 'prod'; - disabled: boolean; - blockers: Array<{ code: string; message: string; href?: string }>; - requiresProductionConfirmation: boolean; - description: string; -} - -export interface DeploymentTimelineItem { - id: string; - phase: string; - title: string; - description: string; - status: string; - tone: Tone; - createdAt: string | null; - meta: string; -} - -export interface DeploymentHistoryRow { - id: string; - environment: string; - action: string; - status: string; - statusTone: Tone; - startedAt: string; - completedAt: string; - workflowUrl: string | null; - url: string | null; - requestedBy: string; -} - -function text(value: unknown, fallback = ''): string { - return typeof value === 'string' && value.trim() ? value.trim() : fallback; -} - -function titleCase(value: unknown, fallback = 'Not recorded'): string { - const normalized = text(value, fallback).replace(/[._-]+/gu, ' '); - return normalized.charAt(0).toUpperCase() + normalized.slice(1); -} - -function statusTone(status: unknown): Tone { - const value = text(status).toLowerCase(); - if (['succeeded', 'success', 'ready', 'online', 'complete', 'completed', 'active', 'healthy', 'passed'].includes(value)) return 'success'; - if (['queued', 'claimed', 'dispatching', 'running', 'monitoring', 'stale', 'unknown', 'repository_provisioning', 'content_bootstrap', 'workflow_installing', 'cloudflare_provisioning', 'initial_deploy_running', 'degraded', 'warning', 'skipped'].includes(value)) return 'warning'; - if (['failed', 'cancelled', 'timed_out', 'offline', 'blocked'].includes(value)) return 'danger'; - if (['installing', 'provisioning'].includes(value)) return 'info'; - return 'default'; -} - -function readinessHelp(code: unknown, label: unknown): string { - const value = text(code); - const fallback = `${titleCase(label, 'This check')} helps TreeSeed decide whether deployment can safely continue.`; - const descriptions: Record = { - project_exists: 'Confirms the project record exists in the API. Deployment cannot run without the project identity and ownership information.', - repository_configured: 'Confirms TreeSeed knows which GitHub repository should receive workflows, environment variables, and deployment commits.', - workflow_installable: 'Confirms the selected repository can accept the deployment workflow that TreeSeed dispatches for staging and production work.', - web_host_configured: 'Confirms a web hosting target exists, such as the Cloudflare host and deployment destination used to publish the site.', - staging_environment: 'Confirms the staging environment exists. Staging is the first place TreeSeed deploys and verifies project changes.', - production_environment: 'Confirms the production environment exists or can be initialized when production deployment is requested.', - runner_ready: 'Checks the Market operations runner state. Deployment work can be queued even if the runner is temporarily waiting to pick it up.', - no_active_operation: 'Prevents overlapping deployment work for the same target so one operation does not overwrite or confuse another.', - production_confirmation: 'Requires an explicit confirmation before production-changing actions, while staging and monitor actions can proceed without it.', - }; - return descriptions[value] ?? fallback; -} - -function dateLabel(value: unknown, fallback = 'Not recorded'): string { - const raw = text(value); - if (!raw) return fallback; - const date = new Date(raw); - if (Number.isNaN(date.getTime())) return raw; - return date.toLocaleString('en-US', { - month: 'short', - day: 'numeric', - hour: 'numeric', - minute: '2-digit', - }); -} - -function externalUrl(...values: unknown[]): string | null { - for (const value of values) { - const raw = text(value); - if (!raw) continue; - try { - const url = new URL(raw); - if (url.protocol === 'http:' || url.protocol === 'https:') return url.href; - } catch { - continue; - } - } - return null; -} - -function workflowUrl(deployment: any): string | null { - const workflow = deployment?.externalWorkflow ?? {}; - return externalUrl(workflow.url, workflow.htmlUrl, workflow.runUrl, workflow.workflowUrl); -} - -function deploymentUrl(deployment: any, environment: any, fallbackTarget: any): string | null { - return externalUrl( - deployment?.target?.url, - deployment?.target?.previewUrl, - environment?.baseUrl, - fallbackTarget?.url, - fallbackTarget?.previewUrl, - ); -} - -function latestForEnvironment(state: any, environment: 'staging' | 'prod') { - return state?.latestDeployments?.[environment] ?? safeArray(state?.recentDeployments).find((deployment: any) => deployment?.environment === environment) ?? null; -} - -function environmentRecord(state: any, environment: 'staging' | 'prod') { - return safeArray(state?.environments).find((entry: any) => entry?.environment === environment) ?? null; -} - -function actionForms(state: any, environment: 'staging' | 'prod'): DeploymentActionForm[] { - return safeArray(state?.actions) - .filter((entry: any) => entry?.environment === environment) - .map((entry: any) => { - const blockers = safeArray(entry?.blockedBy).filter((blocker: any) => blocker?.code !== 'production_confirmation_required'); - const requiresProductionConfirmation = environment === 'prod' && entry?.action !== 'monitor'; - return { - action: text(entry?.action, 'deploy_web'), - label: ACTION_LABELS[text(entry?.action)] ?? titleCase(entry?.action, 'Deploy'), - environment, - disabled: blockers.length > 0, - blockers: blockers.map((blocker: any) => ({ - code: text(blocker?.code, 'blocked'), - message: text(blocker?.message, 'This action is blocked.'), - ...(blocker?.href ? { href: String(blocker.href) } : {}), - })), - requiresProductionConfirmation, - description: requiresProductionConfirmation - ? 'Requires explicit production confirmation.' - : entry?.action === 'monitor' - ? 'Checks the latest deployment health.' - : 'Queues a Market operation for this environment.', - }; - }); -} - -function monitorCard(monitor: any): DeploymentEnvironmentCard['monitor'] { - const checks = safeArray(monitor?.checks).map((check: any) => { - const status = text(check?.status, 'skipped'); - return { - key: text(check?.key, 'monitor_check'), - label: text(check?.label, titleCase(check?.key, 'Monitor check')), - status, - summary: text(check?.summary, 'Monitor check recorded.'), - tone: statusTone(status), - url: externalUrl(check?.url), - inspectCommand: text(check?.inspectCommand) || null, - }; - }); - return { - status: text(monitor?.status, checks.length > 0 ? 'unknown' : 'not_recorded'), - label: titleCase(monitor?.status, checks.length > 0 ? 'Unknown' : 'Not recorded'), - tone: statusTone(monitor?.status), - checkedAt: monitor?.checkedAt ?? null, - counts: { - passed: checks.filter((check) => check.status === 'passed').length, - warnings: checks.filter((check) => check.status === 'warning').length, - failed: checks.filter((check) => check.status === 'failed').length, - skipped: checks.filter((check) => check.status === 'skipped').length, - }, - checks, - }; -} - -function environmentCard(state: any, environment: 'staging' | 'prod'): DeploymentEnvironmentCard { - const latest = latestForEnvironment(state, environment); - const record = environmentRecord(state, environment); - const url = deploymentUrl(latest, record, environment === 'staging' ? state?.target : null); - const monitor = state?.latestMonitors?.[environment] ?? null; - const monitorDisplay = monitorCard(monitor); - const status = text(latest?.status, record ? 'ready' : 'not configured'); - return { - environment, - label: ENVIRONMENT_LABELS[environment], - status, - tone: statusTone(status), - url, - latestSummary: text(latest?.summary, latest ? `${titleCase(latest?.action, 'Deployment')} is ${titleCase(status).toLowerCase()}.` : 'No deployment recorded.'), - latestCompletedAt: latest?.completedAt ?? latest?.finishedAt ?? null, - workflowUrl: workflowUrl(latest), - monitorSummary: text(monitor?.summary, monitor?.status ? `Monitor ${titleCase(monitor.status).toLowerCase()}.` : 'No monitor result recorded.'), - monitor: monitorDisplay, - actions: actionForms(state, environment), - }; -} - -function launchStatus(launch: any): DeploymentViewModel['launch'] { - if (!launch) { - return { - status: 'not_launched', - label: 'Not launched', - description: 'Launch records appear once project setup queues repository, workflow, or host work.', - tone: 'warning', - deployHref: null, - actions: [], - inspect: null, - events: [], - }; - } - const status = text(launch.status ?? launch.state, 'queued'); - return { - status, - label: titleCase(status, 'Queued'), - description: text(launch.summary ?? launch.message, 'Latest project launch activity is recorded.'), - tone: statusTone(status), - deployHref: text(launch.deployHref) || null, - actions: safeArray(launch.actions).map((action: any) => ({ - action: text(action?.action, 'launch_action'), - label: text(action?.label, titleCase(action?.action, 'Launch action')), - url: text(action?.url), - method: text(action?.method, 'POST'), - description: text(action?.description, 'Queue launch recovery work.'), - })).filter((action) => action.url), - inspect: launch.inspect ? { - summary: text(launch.inspect.summary, 'Inspect the launch failure details.'), - command: text(launch.inspect.command) || null, - } : null, - events: safeArray(launch.events).map((event: any, index) => ({ - id: text(event?.id, `launch-event-${index}`), - label: titleCase(event?.title ?? event?.kind ?? event?.phase ?? event?.status, 'Launch event'), - description: text(event?.summary ?? event?.message, 'Launch event recorded.'), - timestamp: event?.createdAt ?? event?.timestamp ?? null, - tone: statusTone(event?.status ?? event?.severity), - })), - }; -} - -function nextAction(state: any, launch: DeploymentViewModel['launch']): DeploymentViewModel['nextAction'] { - const raw = state?.nextAction ?? {}; - const code = text(raw.code, 'deployment_ready'); - const label = text(raw.label, code === 'deploy_staging' ? 'Deploy staging' : 'Next action'); - let tone: Tone = 'info'; - if (code === 'launch_recovery') tone = 'danger'; - if (code === 'deploy_staging' || code === 'deployment_ready') tone = 'success'; - if (code === 'launch_active' || code === 'deployment_active') tone = 'warning'; - return { - code, - label, - description: text(raw.description, launch.description), - action: text(raw.action) || null, - environment: text(raw.environment) || null, - tone, - }; -} - -function phaseForEvent(kind: unknown): string { - const value = text(kind).toLowerCase(); - if (value.includes('preflight')) return 'Preflight'; - if (value.includes('workflow')) return 'Workflow'; - if (value.includes('monitor')) return 'Monitor'; - if (value.includes('cancel') || value.includes('succeeded') || value.includes('failed')) return 'Completion'; - if (value.includes('operation')) return 'Operation'; - return 'Request'; -} - -function eventTitle(event: any): string { - const kind = text(event?.kind, 'deployment.event').replace(/^deployment\./u, ''); - return titleCase(kind, 'Deployment event'); -} - -export function buildDeploymentTimeline(events: any[]): DeploymentTimelineItem[] { - return safeArray(events) - .slice() - .sort((left: any, right: any) => { - const sequence = Number(left?.sequence ?? 0) - Number(right?.sequence ?? 0); - if (sequence !== 0) return sequence; - return Date.parse(text(left?.createdAt)) - Date.parse(text(right?.createdAt)); - }) - .map((event: any, index) => { - const status = text(event?.status, text(event?.severity, 'recorded')); - return { - id: text(event?.id, `deployment-event-${index}`), - phase: phaseForEvent(event?.kind), - title: eventTitle(event), - description: text(event?.message, 'Deployment event recorded.'), - status, - tone: statusTone(status === 'error' ? 'failed' : status), - createdAt: event?.createdAt ?? null, - meta: [dateLabel(event?.createdAt, ''), titleCase(status, '')].filter(Boolean).join(' · '), - }; - }); -} - -function historyRows(state: any): DeploymentHistoryRow[] { - return safeArray(state?.recentDeployments).map((deployment: any) => { - const environment = text(deployment?.environment, 'staging') === 'prod' ? 'prod' : 'staging'; - const record = environmentRecord(state, environment); - return { - id: text(deployment?.id, `deployment-${environment}`), - environment: ENVIRONMENT_LABELS[environment], - action: ACTION_LABELS[text(deployment?.action)] ?? titleCase(deployment?.action, 'Deployment'), - status: titleCase(deployment?.status, 'Queued'), - statusTone: statusTone(deployment?.status), - startedAt: dateLabel(deployment?.startedAt ?? deployment?.createdAt), - completedAt: dateLabel(deployment?.completedAt ?? deployment?.finishedAt), - workflowUrl: workflowUrl(deployment), - url: deploymentUrl(deployment, record, state?.target), - requestedBy: text(deployment?.requestedByUserId ?? deployment?.triggeredByType, 'Market operation'), - }; - }); -} - -function buildSummary(state: any, environments: DeploymentEnvironmentCard[], launch: DeploymentViewModel['launch']) { - const latestSuccess = safeArray(state?.recentDeployments).find((deployment: any) => deployment?.status === 'succeeded') ?? null; - const active = safeArray(state?.activeOperations)[0] ?? null; - const staging = environments.find((environment) => environment.environment === 'staging'); - const production = environments.find((environment) => environment.environment === 'prod'); - return [ - { - label: 'Readiness', - value: state?.readiness?.ready ? 'Ready' : 'Blocked', - description: state?.readiness?.ready ? 'Deployment actions can be queued.' : 'Resolve readiness blockers first.', - tone: state?.readiness?.ready ? 'success' as Tone : 'warning' as Tone, - }, - { - label: 'Staging URL', - value: staging?.url ? 'Available' : 'Not recorded', - description: staging?.url ?? 'Staging URL appears after host setup or deploy.', - tone: staging?.url ? 'success' as Tone : 'default' as Tone, - href: staging?.url, - }, - { - label: 'Production URL', - value: production?.url ? 'Available' : 'Not recorded', - description: production?.url ?? 'Production URL appears after production setup.', - tone: production?.url ? 'success' as Tone : 'default' as Tone, - href: production?.url, - }, - { - label: 'Active operation', - value: active ? titleCase(active.status, 'Active') : 'None', - description: active ? text(active.summary, `${titleCase(active.action)} for ${ENVIRONMENT_LABELS[active.environment] ?? active.environment}.`) : 'No deployment operation is active.', - tone: active ? statusTone(active.status) : 'default' as Tone, - }, - { - label: 'Last success', - value: latestSuccess ? dateLabel(latestSuccess.completedAt ?? latestSuccess.finishedAt ?? latestSuccess.createdAt) : 'None', - description: latestSuccess ? text(latestSuccess.summary, 'Latest successful deployment.') : 'Successful deployments appear here.', - tone: latestSuccess ? 'success' as Tone : 'default' as Tone, - }, - { - label: 'Launch', - value: launch.label, - description: launch.description, - tone: launch.tone, - }, - ]; -} - -function troubleshooting(state: any, history: DeploymentHistoryRow[]): DeploymentViewModel['troubleshooting'] { - const hints: DeploymentViewModel['troubleshooting'] = []; - const seen = new Set(); - const pushHint = (hint: DeploymentViewModel['troubleshooting'][number]) => { - const key = `${hint.description}:${hint.href ?? ''}`.toLowerCase().replace(/\s+/gu, ' ').trim(); - if (!key || seen.has(key)) return; - seen.add(key); - hints.push(hint); - }; - const latestFailed = safeArray(state?.recentDeployments).find((deployment: any) => ['failed', 'timed_out', 'cancelled'].includes(deployment?.status)); - const inspectCommand = text(latestFailed?.error?.inspectCommand ?? latestFailed?.error?.command, ''); - if (latestFailed) { - const environment = titleCase(latestFailed.environment, 'Deployment'); - pushHint({ - title: `${environment} deployment ${titleCase(latestFailed.status, 'stopped').toLowerCase()}`, - description: text(latestFailed.error?.summary ?? latestFailed.error?.message, inspectCommand || 'Review the latest deployment event timeline for details.'), - tone: statusTone(latestFailed.status), - }); - } - if (state?.launch?.status === 'failed' || state?.launch?.status === 'cancelled') { - pushHint({ - title: state.launch.status === 'failed' ? 'Project launch failed' : 'Project launch cancelled', - description: text(state.launch.error?.summary ?? state.launch.summary, 'Use launch retry or resume to continue setup.'), - tone: statusTone(state.launch.status), - }); - } - for (const blocker of safeArray(state?.readiness?.blockers)) { - pushHint({ - title: titleCase(text(blocker?.code, 'blocked').replace(/[_-]+/gu, ' '), 'Blocked'), - description: text(blocker?.message, 'Resolve this readiness blocker before deploying.'), - tone: 'warning', - ...(blocker?.href ? { href: String(blocker.href) } : {}), - }); - } - if (hints.length === 0 && history.length === 0) { - pushHint({ - title: 'No deployment history yet', - description: 'Queue a staging deploy when readiness checks pass.', - tone: 'info', - }); - } - return hints.slice(0, 3); -} - -function hasCredentialSessionBlocker(state: any): boolean { - const blockers = [ - ...safeArray(state?.readiness?.blockers), - ...safeArray(state?.readiness?.checks), - ]; - return blockers.some((entry: any) => /credential|session|sensitive/iu.test(`${entry?.code ?? ''} ${entry?.message ?? ''}`)); -} - -export function buildDeploymentViewModel(state: any, events: any[] = []): DeploymentViewModel { - const project = state?.project ?? {}; - const launch = launchStatus(state?.launch); - const environments = [ - environmentCard(state, 'staging'), - environmentCard(state, 'prod'), - ]; - const history = historyRows(state); - const activeDeployment = safeArray(state?.activeOperations)[0] ?? null; - const runnerStatus = text(state?.runner?.status, 'unknown'); - return { - project: { - id: text(project.id, 'project'), - name: text(project.name, text(project.slug, 'Project')), - slug: text(project.slug, text(project.handle, text(project.id, 'project'))), - }, - summary: buildSummary(state, environments, launch), - launch, - nextAction: nextAction(state, launch), - readiness: { - ready: Boolean(state?.readiness?.ready), - label: state?.readiness?.ready ? 'Ready' : 'Blocked', - checks: safeArray(state?.readiness?.checks).map((check: any) => ({ - code: text(check?.code, 'check'), - label: text(check?.label, titleCase(check?.code, 'Readiness check')), - message: text(check?.message, 'Readiness check recorded.'), - help: text(check?.help, readinessHelp(check?.code, check?.label ?? check?.code)), - ready: Boolean(check?.ready), - tone: check?.ready ? 'success' : 'warning', - ...(check?.href ? { href: String(check.href) } : {}), - })), - blockers: safeArray(state?.readiness?.blockers).map((blocker: any) => ({ - code: text(blocker?.code, 'blocked'), - message: text(blocker?.message, 'Deployment is blocked.'), - ...(blocker?.href ? { href: String(blocker.href) } : {}), - })), - }, - environments, - timeline: buildDeploymentTimeline(events), - historyRows: history, - runner: { - status: runnerStatus, - tone: statusTone(runnerStatus), - label: titleCase(runnerStatus, 'Unknown'), - lastHeartbeatAt: state?.runner?.lastHeartbeatAt ?? null, - activeJobCount: state?.runner?.activeJobCount == null ? 'Not reported' : String(state.runner.activeJobCount), - capabilities: safeArray(state?.runner?.capabilities).map((capability) => String(capability)).filter(Boolean), - }, - troubleshooting: troubleshooting(state, history), - activeDeployment, - activeStateUrl: state?.project?.id ? `/v1/projects/${encodeURIComponent(state.project.id)}/deployment-state` : null, - showSensitiveUnlock: hasCredentialSessionBlocker(state), - }; -} - -export function isDeploymentTerminal(status: unknown): boolean { - return TERMINAL_DEPLOYMENT_STATUSES.has(text(status)); -} - -export function isDeploymentActive(status: unknown): boolean { - return ACTIVE_DEPLOYMENT_STATUSES.has(text(status)); -} diff --git a/src/view-models/ecommerce-governance.vm.ts b/src/view-models/ecommerce-governance.vm.ts deleted file mode 100644 index 2af3fb46..00000000 --- a/src/view-models/ecommerce-governance.vm.ts +++ /dev/null @@ -1,177 +0,0 @@ -import type { DashboardViewModel, FeedbackContext, HelpContext, ResolvedAction } from '@treeseed/ui'; -import { ApiClientFacade } from '../lib/market/api-client'; -import type { OperationalContext } from './shared'; - -function metric(label: string, value: string | number, description?: string, href?: string) { - return { label, value, description, href }; -} - -function help(input: { capabilityId: string; title: string; path: string; resourceType: string; context: 'team' | 'admin' | 'market' }): HelpContext { - return { - capabilityId: input.capabilityId, - topicIds: [input.capabilityId], - shell: 'product', - context: input.context, - resourceType: input.resourceType, - routePattern: input.path, - canonicalPath: input.path, - template: 'dashboard', - summary: `${input.title} uses canonical ProductShell dashboards with policy-shaped API data and resolved actions.`, - topics: [{ - id: input.capabilityId, - title: input.title, - summary: `${input.title} uses canonical ProductShell dashboards with policy-shaped API data and resolved actions.`, - visibility: 'team', - source: 'capability', - }], - relatedDocs: [{ - topicId: input.capabilityId, - title: input.title, - href: input.path, - visibility: 'team', - source: 'capability', - current: true, - }], - relatedActions: [], - searchScope: 'team', - visibility: 'team', - feedbackType: 'question', - }; -} - -function feedback(input: { capabilityId: string; title: string; path: string; resourceType: string; teamId?: string }): FeedbackContext { - return { - url: input.path, - canonicalPath: input.path, - title: input.title, - capabilityId: input.capabilityId, - shell: 'product', - context: input.teamId ? 'team' : 'admin', - teamId: input.teamId, - resourceType: input.resourceType, - submissionEndpoint: '/v1/feedback', - allowAnonymous: false, - screenshotPolicy: 'optional', - attachmentStoragePolicy: 'private', - routePattern: input.path, - policy: input.teamId ? 'team' : 'admin', - source: 'page', - }; -} - -export function canManageTeamCommerce(access: any): boolean { - const manageableRoles = new Set(['team_owner', 'project_lead']); - return Boolean(access?.roles?.some((role: string) => manageableRoles.has(role))); -} - -export async function loadCommonsGovernanceDashboard(Astro: any, context: OperationalContext) { - const api = new ApiClientFacade(Astro); - const [summary, proposals, questions, decisions, events] = await Promise.all([ - api.getCommonsSummary().catch(() => null), - api.listCommonsProposals({ limit: 8 }).catch(() => []), - api.listCommonsQuestions({ limit: 8 }).catch(() => []), - api.listCommonsDecisions({ limit: 8 }).catch(() => []), - api.listCommonsEvents({ limit: 12 }).catch(() => []), - ]); - const dashboard: DashboardViewModel = { - title: 'TreeSeed Commons', - description: 'Operate participant questions, proposals, voting, and bounded steward decisions.', - context: { - id: 'commons-signal', - title: 'Commons signal', - description: 'Participation counts are advisory capacity signals, not legal membership or payout governance.', - items: [ - metric('Active participants', summary?.counts?.activeParticipants ?? 0, undefined, '/app/commons/participants'), - metric('Active proposals', summary?.counts?.activeProposals ?? 0, undefined, '/app/commons/proposals'), - metric('Open questions', summary?.counts?.openQuestions ?? 0, undefined, '/app/commons/questions'), - metric('Accepted decisions', summary?.counts?.acceptedDecisions ?? 0, undefined, '/app/commons/decisions'), - ], - }, - primaryResources: proposals.map((proposal: any) => ({ - id: String(proposal.id), - title: String(proposal.title ?? proposal.id), - description: String(proposal.summary ?? 'No summary supplied yet.'), - href: `/app/commons/proposals/${encodeURIComponent(String(proposal.id))}`, - status: String(proposal.status ?? 'draft'), - meta: String(proposal.scope ?? 'treeseed commons'), - })), - activity: events.map((event: any) => ({ - id: String(event.id ?? `${event.eventType}-${event.createdAt}`), - title: String(event.eventType ?? 'Governance event'), - description: String(event.nextState ?? ''), - timestamp: event.createdAt, - tone: 'info', - })), - }; - const actions: ResolvedAction[] = [ - { id: 'commons.backfill', label: 'Backfill participants', state: 'allowed', method: 'POST' }, - { id: 'commons.participants', label: 'Participants', state: 'allowed', href: '/app/commons/participants' }, - ]; - return { - context, - dashboard, - actions, - proposals, - questions, - decisions, - events, - helpContext: help({ capabilityId: 'commons.steward-dashboard', title: 'Commons stewardship', path: '/app/commons', resourceType: 'commons-governance', context: 'admin' }), - feedbackContext: feedback({ capabilityId: 'commons.steward-dashboard', title: 'Commons stewardship', path: '/app/commons', resourceType: 'commons-governance' }), - }; -} - -export function buildTeamCommerceDashboard(input: { - path: string; - team: any; - vendor: any | null; - stripeAccount: any | null; - commerceMonitor: any | null; - canManageTeam: boolean; - formError?: string; - statusMessage?: string; -}) { - const readiness = input.vendor?.salesEnabled && input.stripeAccount?.accountStatus === 'enabled' ? 'ready' : input.vendor ? 'setup' : 'not requested'; - const dashboard: DashboardViewModel = { - title: 'Commerce settings', - description: 'Manage seller readiness, Stripe status, ownership evidence, and marketplace governance for this team.', - context: { - id: 'seller-readiness', - title: 'Seller readiness', - description: 'Seller approval, payment readiness, and cooperative ownership records are tracked separately.', - items: [ - metric('Vendor status', input.vendor?.status ?? 'not requested'), - metric('Trust level', input.vendor?.trustLevel ?? 'none'), - metric('Sales enabled', input.vendor?.salesEnabled ? 'yes' : 'no'), - metric('Stripe status', input.stripeAccount?.accountStatus ?? 'not linked'), - ], - }, - status: { - id: 'payment-readiness', - title: 'Payment readiness', - items: [ - metric('Charges', input.stripeAccount?.chargesEnabled ? 'enabled' : 'not enabled'), - metric('Payouts', input.stripeAccount?.payoutsEnabled ? 'enabled' : 'not enabled'), - metric('Requirements due', input.stripeAccount?.requirementsCurrentlyDue?.length ?? 0), - metric('Overall', readiness), - ], - }, - alerts: [ - ...(input.formError ? [{ id: 'form-error', title: 'Action failed', description: input.formError, tone: 'danger' as const }] : []), - ...(input.statusMessage ? [{ id: 'status', title: 'Saved', description: input.statusMessage, tone: 'success' as const }] : []), - ], - }; - const actions: ResolvedAction[] = input.canManageTeam - ? [ - { id: 'commerce.request-vendor', label: 'Request seller capability', state: input.vendor ? 'hidden' : 'allowed', method: 'POST' }, - { id: 'commerce.connect-stripe', label: input.stripeAccount?.accountStatus === 'enabled' ? 'Update Stripe' : 'Connect Stripe', state: input.vendor?.status === 'approved' ? 'allowed' : 'requiresSetup', method: 'POST' }, - { id: 'commerce.refresh-status', label: 'Refresh status', state: input.vendor?.status === 'approved' ? 'allowed' : 'requiresSetup', method: 'POST' }, - ] - : [{ id: 'commerce.readonly', label: 'Seller readiness', state: 'readOnly', reason: 'Team manager access is required.' }]; - return { - dashboard, - actions, - helpContext: help({ capabilityId: 'commerce.team-settings', title: 'Team commerce settings', path: input.path, resourceType: 'commerce-vendor', context: 'team' }), - feedbackContext: feedback({ capabilityId: 'commerce.team-settings', title: 'Team commerce settings', path: input.path, resourceType: 'commerce-vendor', teamId: input.team?.id }), - commerceMonitor: input.commerceMonitor, - }; -} diff --git a/src/view-models/governance.vm.ts b/src/view-models/governance.vm.ts deleted file mode 100644 index 9f597d4e..00000000 --- a/src/view-models/governance.vm.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { loadAppContext } from './app-access.js'; -import { type OperationalContext, type OperationalMetric } from './shared.js'; -import { - buildGovernanceApprovalProjection, - buildGovernanceProjection, - type GovernanceApprovalProjection, - type GovernanceCapacityConstraint, - type GovernanceEvent, - type GovernancePolicyItem, - type GovernanceReviewItem, -} from '../lib/market/governance-projection.js'; - -export interface GovernanceViewModel { - context: OperationalContext; - metrics: OperationalMetric[]; - pendingApprovals: GovernanceReviewItem[]; - escalations: GovernanceReviewItem[]; - reviewQueue: GovernanceReviewItem[]; - reviewTimeline: GovernanceEvent[]; - policies: GovernancePolicyItem[]; - policyViolations: GovernanceCapacityConstraint[]; - capacityConstraints: GovernanceCapacityConstraint[]; - auditTrail: GovernanceEvent[]; -} - -export async function loadGovernanceViewModel(input: any): Promise { - const context = await loadAppContext(input); - const projection = await buildGovernanceProjection({ - store: context.store, - principal: context.principal, - teams: context.teams, - projects: context.projects, - }); - - return { - context, - ...projection, - }; -} - -export interface GovernanceApprovalViewModel { - context: OperationalContext; - detail: GovernanceApprovalProjection | null; -} - -export async function loadGovernanceApprovalViewModel(input: any, approvalId: string): Promise { - const context = await loadAppContext(input); - const detail = await buildGovernanceApprovalProjection({ - store: context.store, - principal: context.principal, - teams: context.teams, - projects: context.projects, - approvalId, - }); - return { - context, - detail, - }; -} diff --git a/src/view-models/infrastructure.vm.ts b/src/view-models/infrastructure.vm.ts deleted file mode 100644 index 99e5d3e6..00000000 --- a/src/view-models/infrastructure.vm.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { - buildInfrastructureProjection, - type InfrastructureProjection, -} from '../lib/market/infrastructure-projection.js'; -import { loadInfrastructureSeedState } from '../lib/market/infrastructure-seeds.js'; -import { - type OperationalContext, - type OperationalMetric, -} from './shared.js'; -import { loadAppContext } from './app-access.js'; - -export interface InfrastructureViewModel extends InfrastructureProjection { - context: OperationalContext; - metrics: OperationalMetric[]; -} - -export async function loadInfrastructureViewModel(input: any, url?: URL): Promise { - const context = await loadAppContext(input); - const locals = input?.locals ?? input; - const seedState = context.store - ? await loadInfrastructureSeedState({ - store: context.store, - team: context.activeTeam, - principal: context.principal, - locals, - url, - }).catch(() => null) - : null; - const projection = context.store - ? await buildInfrastructureProjection({ - store: context.store, - principal: context.principal, - team: context.activeTeam, - projects: context.projects, - seedState, - }) - : emptyInfrastructureProjection(); - - return { - context, - ...projection, - }; -} - -function emptyInfrastructureProjection(): InfrastructureProjection { - return { - metrics: [], - projects: [], - repositories: [], - deployments: [], - capacity: [], - workers: [], - hosts: [], - integrations: [], - resources: [], - seeds: [], - policies: [], - diagnostics: [], - }; -} diff --git a/src/view-models/knowledge-content.ts b/src/view-models/knowledge-content.ts deleted file mode 100644 index a0d0c3b7..00000000 --- a/src/view-models/knowledge-content.ts +++ /dev/null @@ -1,26 +0,0 @@ -const operationalCollections = ['books', 'decisions', 'notes', 'objectives', 'proposals', 'questions', 'docs', 'knowledge_packs'] as const; - -export async function loadKnowledgeContentEntries(): Promise { - const content = await import(/* @vite-ignore */ 'astro:content').catch(() => null); - if (!content?.getCollection) return []; - const { getCollection } = content as { getCollection: unknown }; - const loader = getCollection as unknown as (collection: string, filter?: (entry: any) => boolean) => Promise; - const groups = await Promise.all(operationalCollections.map(async (collection) => { - try { - const entries = await loader(collection, ({ data }) => !data?.draft); - return entries.map((entry) => ({ - ...entry, - collection, - sourceCollection: collection, - slug: entry.slug ?? slugFromId(entry.id), - })); - } catch { - return []; - } - })); - return groups.flat(); -} - -function slugFromId(id: unknown): string { - return String(id ?? 'entry').replace(/^.*\//u, '').replace(/[^a-zA-Z0-9_-]+/gu, '-').toLowerCase(); -} diff --git a/src/view-models/knowledge-distribution.vm.ts b/src/view-models/knowledge-distribution.vm.ts deleted file mode 100644 index 4ca0f7d7..00000000 --- a/src/view-models/knowledge-distribution.vm.ts +++ /dev/null @@ -1,598 +0,0 @@ -import type { - CollectionViewModel, - DashboardViewModel, - DistributionItem, - DistributionStatus, - DistributionSummaryViewModel, - EntitlementState, - FeedbackContext, - HelpContext, - OverlayStatusViewModel, - ResolvedAction, - ResourceSummary, -} from '@treeseed/ui'; -import { - listMarketplaceKnowledgePacks, - listMarketplaceSiteTemplates, - resolveMarketplaceCatalogItem, - resolveMarketplaceSiteTemplate, -} from '../lib/market/public-access.js'; -import { loadAppContext } from './app-access.js'; -import { loadKnowledgeViewModel, loadKnowledgeArtifactViewModel, type KnowledgeViewModel } from './knowledge.vm.js'; -import { compact, describeState, safeArray, teamLabel, type OperationalContext } from './shared.js'; - -export type KnowledgeDistributionKind = - | 'artifacts' - | 'packs' - | 'templates' - | 'releases' - | 'books' - | 'capabilities' - | 'imports'; - -export interface KnowledgeDistributionBundle { - context: OperationalContext; - dashboard: DashboardViewModel; - distribution: DistributionSummaryViewModel; - actions: ResolvedAction[]; - helpContext: HelpContext; - feedbackContext: FeedbackContext; - overlayStatus: OverlayStatusViewModel; -} - -export interface KnowledgeCollectionBundle { - context: OperationalContext; - collection: CollectionViewModel; - distribution: DistributionSummaryViewModel; - actions: ResolvedAction[]; - helpContext: HelpContext; - feedbackContext: FeedbackContext; - overlayStatus: OverlayStatusViewModel; -} - -export interface KnowledgeDetailBundle { - context: OperationalContext; - title: string; - description?: string; - eyebrow: string; - metadata: Array<{ key: string; value: string }>; - distribution: DistributionSummaryViewModel; - actions: ResolvedAction[]; - helpContext: HelpContext; - feedbackContext: FeedbackContext; - overlayStatus: OverlayStatusViewModel; - found: boolean; -} - -export interface KnowledgePublishBundle { - context: OperationalContext; - title: string; - description: string; - actions: ResolvedAction[]; - helpContext: HelpContext; - feedbackContext: FeedbackContext; - projects: Array<{ id: string; label: string }>; - distribution: DistributionSummaryViewModel; -} - -export interface PublicMarketplaceCollectionBundle { - collection: CollectionViewModel; - distribution: DistributionSummaryViewModel; - actions: ResolvedAction[]; - helpContext: HelpContext; - feedbackContext: FeedbackContext; -} - -export interface PublicMarketplaceDetailBundle { - title: string; - description?: string; - eyebrow: string; - metadata: Array<{ key: string; value: string }>; - distribution: DistributionSummaryViewModel; - actions: ResolvedAction[]; - helpContext: HelpContext; - feedbackContext: FeedbackContext; - found: boolean; - templateItem?: any; -} - -const collectionLabels: Record = { - artifacts: { title: 'Artifacts', description: 'Generated artifacts ready for review, packaging, release, import, or download.', singular: 'Artifact' }, - packs: { title: 'Knowledge packs', description: 'Packaged reusable knowledge imports for teams and projects.', singular: 'Knowledge pack' }, - templates: { title: 'Workflow imports', description: 'Reusable project and workflow templates created from team artifacts.', singular: 'Workflow import' }, - releases: { title: 'Releases', description: 'Release records, reviews, and publication readiness states.', singular: 'Release' }, - books: { title: 'Books and pages', description: 'Knowledge Hub books and runtime reader pages prepared for distribution.', singular: 'Book or page' }, - capabilities: { title: 'Capabilities', description: 'Capability bundles that package actions, schema, permissions, and help.', singular: 'Capability' }, - imports: { title: 'Imports', description: 'Entitlement-aware install, download, and import activity.', singular: 'Import' }, -}; - -function idOf(value: any, fallback = 'item'): string { - return compact(value?.id, compact(value?.slug, compact(value?.artifactId, fallback))); -} - -function routeFeedback(url: URL, context: OperationalContext | null, path: string, title: string, resourceType: string): FeedbackContext { - return { - url: url.href, - canonicalPath: path, - title, - shell: path.startsWith('/app') ? 'product' : 'public', - context: path.startsWith('/app') ? 'team' : 'market', - teamId: context?.activeTeam?.id, - resourceType, - submissionEndpoint: path.startsWith('/app') ? '/v1/feedback' : '/api/feedback/submit', - allowAnonymous: !path.startsWith('/app'), - screenshotPolicy: 'optional', - attachmentStoragePolicy: path.startsWith('/app') ? 'private' : 'public', - routePattern: path, - policy: path.startsWith('/app') ? 'team' : 'public', - }; -} - -function routeHelp(path: string, title: string, resourceType: string, template: HelpContext['template']): HelpContext { - const publicSurface = !path.startsWith('/app'); - return { - topicIds: [`distribution-${resourceType}`], - shell: publicSurface ? 'public' : 'product', - context: publicSurface ? 'market' : 'team', - resourceType, - routePattern: path, - canonicalPath: path, - template, - summary: `${title} uses resolved entitlement, packaging, install, import, and download actions before exposing delivery paths.`, - topics: [{ - id: `distribution-${resourceType}`, - title, - summary: 'Distribution routes resolve policy, entitlement, delivery, help, and feedback context before rendering.', - visibility: publicSurface ? 'public' : 'team', - source: 'capability', - }], - relatedDocs: [{ - topicId: `distribution-${resourceType}`, - title, - href: path, - visibility: publicSurface ? 'public' : 'team', - summary: 'Distribution and capability delivery.', - source: 'capability', - current: true, - }], - relatedActions: [], - searchScope: publicSurface ? 'market' : 'team', - searchPlaceholder: 'Search distribution help', - visibility: publicSurface ? 'public' : 'team', - feedbackType: 'question', - }; -} - -function action(id: string, label: string, href: string | undefined, allowed: boolean, reason = 'Select a team before using this action.'): ResolvedAction { - return { id, label, href, state: allowed ? 'allowed' : 'requiresSetup', reason: allowed ? undefined : reason }; -} - -function statusFrom(value: unknown): DistributionStatus { - const state = compact(value, '').toLowerCase(); - if (['published', 'active', 'ready', 'completed', 'approved'].includes(state)) return 'published'; - if (['installed', 'imported'].includes(state)) return 'installed'; - if (['pending', 'review', 'under_review', 'waiting_for_approval'].includes(state)) return 'review'; - if (['queued', 'packaging', 'running'].includes(state)) return 'packaging'; - if (['failed', 'blocked', 'rejected'].includes(state)) return 'blocked'; - if (!state) return 'draft'; - return 'draft'; -} - -function dashboardToneFromStatus(status: DistributionStatus): 'default' | 'info' | 'success' | 'warning' | 'danger' | 'muted' { - if (status === 'published' || status === 'installed') return 'success'; - if (status === 'review' || status === 'packaging') return 'info'; - if (status === 'blocked' || status === 'unavailable') return 'danger'; - if (status === 'draft') return 'muted'; - return 'default'; -} - -function entitlementFrom(value: any, fallback: EntitlementState): EntitlementState { - const visibility = compact(value?.visibility, compact(value?.offerMode, '')).toLowerCase(); - if (visibility.includes('public') || visibility.includes('free')) return 'public'; - if (visibility.includes('team')) return 'team'; - if (visibility.includes('project')) return 'project'; - if (visibility.includes('paid') || visibility.includes('purchase')) return 'purchased'; - return fallback; -} - -function artifactHref(item: any): string { - const category = encodeURIComponent(compact(item?.category, compact(item?.type, 'artifacts')).toLowerCase().replace(/[^a-z0-9]+/gu, '-')); - return `/app/knowledge/${category}/${encodeURIComponent(idOf(item, 'artifact'))}`; -} - -function itemFromArtifact(item: any): DistributionItem { - const title = compact(item?.title, compact(item?.name, 'Knowledge artifact')); - return { - id: idOf(item, title), - title, - description: compact(item?.description, compact(item?.summary, 'Generated knowledge artifact')), - status: statusFrom(item?.state ?? item?.status), - href: item?.href ?? artifactHref(item), - entitlement: 'team', - delivery: statusFrom(item?.state ?? item?.status) === 'published' ? 'contentProxy' : 'queued', - meta: compact(item?.type, compact(item?.category, 'artifact')), - action: { - id: 'artifact.review', - label: 'Review', - state: 'allowed', - href: item?.href ?? artifactHref(item), - entitlement: 'team', - delivery: 'contentProxy', - }, - }; -} - -function releaseItems(vm: KnowledgeViewModel): DistributionItem[] { - return safeArray(vm.releases).map((release: any) => { - const id = idOf(release, compact(release?.releaseTag, 'release')); - return { - id, - title: compact(release?.title, compact(release?.releaseTag, compact(release?.version, 'Release'))), - description: compact(release?.summary, compact(release?.environment, 'Knowledge release record')), - status: statusFrom(release?.state ?? release?.status), - href: `/app/knowledge/releases/${encodeURIComponent(id)}`, - entitlement: 'team', - delivery: 'contentProxy', - meta: describeState(release?.status ?? release?.state, 'recorded'), - action: { id: 'release.review', label: 'Review release', state: 'allowed', href: `/app/knowledge/releases/${encodeURIComponent(id)}/review`, entitlement: 'team' }, - }; - }); -} - -function syntheticItems(kind: KnowledgeDistributionKind, context: OperationalContext): DistributionItem[] { - if (kind === 'books') { - return context.projects.map((project: any) => ({ - id: idOf(project, 'project-book'), - title: `${compact(project?.name, compact(project?.slug, 'Project'))} Knowledge Hub`, - description: 'Project books and runtime reader pages ready for publication review.', - status: 'draft', - href: `/app/knowledge/books/${encodeURIComponent(compact(project?.slug, idOf(project, 'project')))}`, - entitlement: 'team', - delivery: 'contentProxy', - meta: 'runtime reader', - })); - } - if (kind === 'capabilities') { - return ['questions', 'services', 'operating-loop', 'knowledge-distribution'].map((capability) => ({ - id: capability, - title: capability.split('-').map((part) => part[0]?.toUpperCase() + part.slice(1)).join(' '), - description: 'Capability metadata, resource schema, help, feedback, and resolved actions.', - status: capability === 'knowledge-distribution' ? 'published' : 'review', - href: `/app/knowledge/capabilities/${capability}`, - entitlement: 'team', - delivery: 'contentProxy', - meta: 'capability', - })); - } - if (kind === 'imports') { - return safeArray(context.projects).map((project: any) => ({ - id: idOf(project, 'project-import'), - title: `${compact(project?.name, 'Project')} import readiness`, - description: 'Install, import, and download actions resolve entitlement before delivery.', - status: 'draft', - href: `/app/knowledge/imports/${encodeURIComponent(compact(project?.slug, idOf(project, 'project')))}`, - entitlement: 'team', - delivery: 'queued', - meta: 'import flow', - })); - } - return []; -} - -function itemsForKind(vm: KnowledgeViewModel, kind: KnowledgeDistributionKind): DistributionItem[] { - if (kind === 'artifacts') return safeArray(vm.artifacts).map(itemFromArtifact); - if (kind === 'releases') return releaseItems(vm); - if (kind === 'packs') return [...safeArray(vm.imports), ...safeArray(vm.artifacts)].filter((item: any) => String(`${item.type} ${item.category} ${item.kind}`).toLowerCase().includes('pack')).map(itemFromArtifact); - if (kind === 'templates') return safeArray(vm.artifacts).filter((item: any) => String(`${item.type} ${item.category}`).toLowerCase().includes('template')).map(itemFromArtifact); - return syntheticItems(kind, vm.context); -} - -function collectionFromItems(kind: KnowledgeDistributionKind, items: DistributionItem[], url: URL): CollectionViewModel { - const labels = collectionLabels[kind]; - const query = url.searchParams.get('q') ?? ''; - const status = url.searchParams.get('status') ?? ''; - const filtered = items.filter((item) => { - const text = `${item.title} ${item.description ?? ''} ${item.meta ?? ''}`.toLowerCase(); - return (!query || text.includes(query.toLowerCase())) && (!status || item.status === status); - }); - return { - title: labels.title, - description: labels.description, - columns: [ - { key: 'title', label: labels.singular }, - { key: 'status', label: 'Status' }, - { key: 'entitlement', label: 'Entitlement' }, - { key: 'delivery', label: 'Delivery' }, - ], - rows: filtered.map((item) => ({ - title: item.href ? `${item.title}` : item.title, - status: item.status, - entitlement: item.entitlement ?? 'team', - delivery: item.delivery ?? 'queued', - })), - resources: filtered.map((item) => ({ - id: item.id, - title: item.title, - description: item.description, - href: item.href, - status: item.status, - meta: [item.entitlement, item.delivery, item.meta].filter(Boolean).join(' · '), - })), - filters: [ - { key: 'q', label: 'Search', type: 'search', value: query }, - { key: 'status', label: 'Status', type: 'select', value: status, options: [ - { label: 'Any status', value: '' }, - { label: 'Draft', value: 'draft' }, - { label: 'Review', value: 'review' }, - { label: 'Published', value: 'published' }, - { label: 'Blocked', value: 'blocked' }, - ] }, - ], - emptyTitle: `No ${labels.title.toLowerCase()} yet`, - emptyDescription: 'Distribution resources appear after project work, packaging, publication, or marketplace import activity.', - }; -} - -function distribution(title: string, description: string, items: DistributionItem[]): DistributionSummaryViewModel { - return { - title, - description, - items, - emptyTitle: `No ${title.toLowerCase()} yet`, - emptyDescription: 'Create, package, publish, install, or import resources to populate this distribution surface.', - }; -} - -function overlayStatus(routePattern: string, resourceType: string, signedIn: boolean, teamReady: boolean): OverlayStatusViewModel { - if (!signedIn) { - return { - state: 'requiresSignIn', - label: 'Sign in required', - message: 'Overlay editing is only bootstrapped for authorized product readers.', - routePattern, - resourceType, - action: { id: 'overlay.sign-in', label: 'Sign in', state: 'allowed', href: `/auth/sign-in?returnTo=${encodeURIComponent(routePattern)}` }, - }; - } - if (!teamReady) { - return { state: 'denied', label: 'Team required', message: 'Select a team before overlay editing can be offered.', routePattern, resourceType }; - } - return { - state: 'preview', - label: 'Overlay gated', - message: 'Editor and search bundles load only after an authorized edit intent.', - routePattern, - resourceType, - action: { id: 'overlay.intent', label: 'Prepare overlay', state: 'allowed', href: `${routePattern}#overlay` }, - }; -} - -export async function loadKnowledgeDistributionDashboard(input: any): Promise { - const vm = await loadKnowledgeViewModel(input); - const context = vm.context; - const items = [ - ...itemsForKind(vm, 'artifacts').slice(0, 3), - ...itemsForKind(vm, 'releases').slice(0, 2), - ...itemsForKind(vm, 'books').slice(0, 2), - ...itemsForKind(vm, 'capabilities').slice(0, 2), - ]; - const teamReady = Boolean(context.activeTeam); - const actions = [ - action('knowledge.publish', 'Publish/package', '/app/knowledge/publish', teamReady), - action('knowledge.imports', 'Review imports', '/app/knowledge/imports', teamReady), - ]; - return { - context, - dashboard: { - title: 'Knowledge distribution', - description: 'Artifacts, books, releases, capabilities, marketplace listings, imports, and overlay readiness for the active team.', - context: { - id: 'knowledge-context', - title: 'Distribution context', - items: [ - { label: 'Active team', value: context.activeTeam ? teamLabel(context.activeTeam) : 'None', tone: context.activeTeam ? 'success' : 'warning' }, - { label: 'Projects', value: context.projects.length, href: '/app/projects', description: 'Sources for package and publish actions' }, - ], - }, - status: { - id: 'knowledge-status', - title: 'Distribution status', - items: [ - { label: 'Artifacts', value: vm.artifacts.length, href: '/app/knowledge/artifacts', tone: vm.artifacts.length ? 'success' : 'muted' }, - { label: 'Releases', value: vm.releases.length, href: '/app/knowledge/releases', tone: vm.releases.length ? 'info' : 'muted' }, - { label: 'Imports', value: vm.imports.length, href: '/app/knowledge/imports', tone: vm.imports.length ? 'info' : 'muted' }, - ], - }, - nextActions: [ - { id: 'publish', title: 'Package or publish', description: 'Request export, template, pack, or release actions through the API operation path.', href: '/app/knowledge/publish', status: 'Resolved action' }, - { id: 'market-packs', title: 'Public knowledge imports', description: 'Review public acquisition surfaces and entitlement-aware install paths.', href: '/market/knowledge-packs', status: 'Marketplace' }, - { id: 'market-templates', title: 'Workflow imports', description: 'Inspect public workflow import listings and installation readiness.', href: '/market/templates', status: 'Marketplace' }, - ], - primaryResources: Object.entries(collectionLabels).map(([kind, labels]) => ({ id: kind, title: labels.title, description: labels.description, href: `/app/knowledge/${kind === 'artifacts' ? 'artifacts' : kind}` })), - activity: items.map((item) => ({ id: item.id, title: item.title, description: item.description, href: item.href, tone: dashboardToneFromStatus(item.status), meta: item.meta })), - }, - distribution: distribution('Distribution highlights', 'Recent resources with entitlement, delivery, and action state resolved.', items), - actions, - helpContext: routeHelp('/app/knowledge', 'Knowledge distribution', 'knowledge-distribution', 'dashboard'), - feedbackContext: routeFeedback(input.url, context, '/app/knowledge', 'Knowledge distribution', 'knowledge-distribution'), - overlayStatus: overlayStatus('/app/knowledge', 'knowledge-distribution', Boolean(context.principal), teamReady), - }; -} - -export async function loadKnowledgeDistributionCollection(input: any, kind: KnowledgeDistributionKind): Promise { - const vm = await loadKnowledgeViewModel(input); - const labels = collectionLabels[kind]; - const items = itemsForKind(vm, kind); - const path = `/app/knowledge/${kind}`; - const actions = [ - action(`knowledge.${kind}.publish`, 'Publish/package', '/app/knowledge/publish', Boolean(vm.context.activeTeam)), - action(`knowledge.${kind}.market`, 'Marketplace', kind === 'templates' ? '/market/templates' : '/market/knowledge-packs', true), - ]; - return { - context: vm.context, - collection: collectionFromItems(kind, items, input.url), - distribution: distribution(`${labels.title} distribution`, labels.description, items.slice(0, 6)), - actions, - helpContext: routeHelp(path, labels.title, `knowledge-${kind}`, 'collection'), - feedbackContext: routeFeedback(input.url, vm.context, path, labels.title, `knowledge-${kind}`), - overlayStatus: overlayStatus(path, `knowledge-${kind}`, Boolean(vm.context.principal), Boolean(vm.context.activeTeam)), - }; -} - -export async function loadKnowledgeDistributionDetail(input: any, kind: KnowledgeDistributionKind, slug: string): Promise { - const fullVm = await loadKnowledgeViewModel(input); - const artifactVm = kind === 'artifacts' ? await loadKnowledgeArtifactViewModel(input, slug) : null; - const context = fullVm.context; - const items = itemsForKind(fullVm, kind); - const projection = kind === 'artifacts' && artifactVm?.artifact - ? itemFromArtifact(artifactVm.artifact) - : items.find((item) => item.id === slug || item.href?.endsWith(`/${slug}`)) - ?? (['book', 'seed-book', 'current-book', 'primary-book'].includes(slug) ? items[0] ?? null : null); - const title = projection?.title ?? collectionLabels[kind].singular; - const path = `/app/knowledge/${kind}/${slug}`; - return { - context, - title, - description: projection?.description ?? `This ${collectionLabels[kind].singular.toLowerCase()} is not available to the active team.`, - eyebrow: collectionLabels[kind].singular, - metadata: [ - { key: 'Status', value: projection?.status ?? 'not found' }, - { key: 'Entitlement', value: projection?.entitlement ?? 'team' }, - { key: 'Delivery', value: projection?.delivery ?? 'contentProxy' }, - { key: 'Policy', value: 'resolved before artifact delivery' }, - ], - distribution: distribution(`${title} delivery`, 'Policy-safe delivery and install/import state for this resource.', projection ? [projection] : []), - actions: [ - action('distribution.install', 'Install/import', '/app/knowledge/imports', Boolean(context.activeTeam)), - action('distribution.review', 'Review release', kind === 'releases' ? `${path}/review` : undefined, kind === 'releases' && Boolean(context.activeTeam)), - ], - helpContext: routeHelp(path, title, `knowledge-${kind}`, 'detail'), - feedbackContext: routeFeedback(input.url, context, path, title, `knowledge-${kind}`), - overlayStatus: overlayStatus(path, `knowledge-${kind}`, Boolean(context.principal), Boolean(context.activeTeam)), - found: Boolean(projection), - }; -} - -export async function loadKnowledgePublishSettings(input: any): Promise { - const context = await loadAppContext(input); - const path = '/app/knowledge/publish'; - return { - context, - title: 'Publish and package', - description: 'Request export, template package, knowledge pack, or publish operations for one project.', - actions: [action('knowledge.publish.submit', 'Submit through API', undefined, Boolean(context.activeTeam))], - helpContext: routeHelp(path, 'Publish and package', 'knowledge-publish', 'settings'), - feedbackContext: routeFeedback(input.url, context, path, 'Publish and package', 'knowledge-publish'), - projects: context.projects.map((project: any) => ({ id: idOf(project, 'project'), label: compact(project?.name, compact(project?.slug, idOf(project, 'project'))) })), - distribution: distribution('Publish actions', 'Each action is queued through the existing project operation API path.', [ - { id: 'export', title: 'Export bundle', status: 'draft', entitlement: 'team', delivery: 'contentProxy', meta: 'share/export' }, - { id: 'template', title: 'Package workflow import', status: 'draft', entitlement: 'team', delivery: 'contentProxy', meta: 'share/package-template' }, - { id: 'pack', title: 'Package knowledge import', status: 'draft', entitlement: 'team', delivery: 'contentProxy', meta: 'share/package-knowledge-pack' }, - { id: 'publish', title: 'Publish release', status: 'review', entitlement: 'team', delivery: 'contentProxy', meta: 'share/publish' }, - ]), - }; -} - -export async function loadSellerDashboard(input: any): Promise { - const context = await loadAppContext(input); - const path = '/app/market/seller'; - const items: DistributionItem[] = [ - { id: 'profile', title: 'Seller profile', description: 'Team publisher identity for public listings.', status: context.activeTeam ? 'review' : 'blocked', entitlement: 'team', delivery: 'queued', href: '/app/teams' }, - { id: 'listings', title: 'Listings', description: 'Knowledge packs, workflow imports, and capabilities awaiting review.', status: 'draft', entitlement: 'team', delivery: 'queued', href: '/app/knowledge' }, - ]; - return { - context, - dashboard: { - title: 'Seller dashboard', - description: 'Publisher readiness for listings, release review, install/download audit, and policy-filtered notifications.', - context: { id: 'seller-context', title: 'Seller context', items: [{ label: 'Team', value: context.activeTeam ? teamLabel(context.activeTeam) : 'None', tone: context.activeTeam ? 'success' : 'warning' }] }, - status: { id: 'seller-status', title: 'Listing readiness', items: [{ label: 'Listings', value: items.length, href: '/app/knowledge' }, { label: 'Reviews', value: 0, href: '/app/knowledge/releases' }] }, - nextActions: [{ id: 'publish', title: 'Package a listing', description: 'Create a template, pack, capability, or release review request.', href: '/app/knowledge/publish' }], - }, - distribution: distribution('Seller readiness', 'Public listing and entitlement readiness for the active team.', items), - actions: [action('seller.publish', 'Package listing', '/app/knowledge/publish', Boolean(context.activeTeam))], - helpContext: routeHelp(path, 'Seller dashboard', 'seller', 'dashboard'), - feedbackContext: routeFeedback(input.url, context, path, 'Seller dashboard', 'seller'), - overlayStatus: overlayStatus(path, 'seller', Boolean(context.principal), Boolean(context.activeTeam)), - }; -} - -export async function loadPublicMarketplaceCollection(input: any, kind: 'knowledge-packs' | 'templates'): Promise { - const path = `/market/${kind}`; - const rawItems = kind === 'knowledge-packs' ? await listMarketplaceKnowledgePacks(input) : (await listMarketplaceSiteTemplates(input)).items; - const items: DistributionItem[] = safeArray(rawItems).map((entry: any) => { - const slug = compact(entry?.slug, idOf(entry, 'listing')); - const href = `/market/${kind}/${encodeURIComponent(slug)}`; - return { - id: slug, - title: compact(entry?.name, compact(entry?.title, 'Marketplace listing')), - description: compact(entry?.summary, compact(entry?.description, 'Reusable TreeSeed distribution listing')), - status: 'published', - href, - entitlement: entitlementFrom(entry, 'public'), - delivery: 'cdn', - meta: compact(entry?.category, kind === 'templates' ? 'workflow import' : 'knowledge import'), - action: { id: 'market.install', label: 'Install/import', state: 'requiresEntitlement', href, entitlement: entitlementFrom(entry, 'public'), delivery: 'cdn' }, - }; - }); - const labels = kind === 'templates' ? collectionLabels.templates : collectionLabels.packs; - return { - collection: collectionFromItems(kind === 'templates' ? 'templates' : 'packs', items, input.url), - distribution: distribution(labels.title, labels.description, items), - actions: [{ id: 'market.browse', label: 'Browse', state: 'allowed', href: path }], - helpContext: routeHelp(path, labels.title, kind, 'collection'), - feedbackContext: routeFeedback(input.url, null, path, labels.title, kind), - }; -} - -export async function loadPublicMarketplaceDetail(input: any, kind: 'knowledge-packs' | 'templates', slug: string): Promise { - const path = `/market/${kind}/${slug}`; - if (kind === 'templates') { - const template = await resolveMarketplaceSiteTemplate(input, slug); - const item = template.item; - const title = compact(item?.title, 'Workflow import'); - return { - title, - description: compact(item?.description, 'Workflow import detail'), - eyebrow: 'Workflow Import', - metadata: [ - { key: 'Entitlement', value: entitlementFrom(item, 'public') }, - { key: 'Delivery', value: 'CDN after policy resolution' }, - { key: 'Import version', value: compact(item?.compatibility?.templateVersion, 'unknown') }, - { key: 'Fulfillment', value: compact(item?.fulfillment?.mode, 'unknown') }, - ], - distribution: distribution(title, 'Entitlement-aware install/import state for this workflow import.', item ? [{ id: slug, title, description: item.description, status: 'published', entitlement: entitlementFrom(item, 'public'), delivery: 'cdn', meta: compact(item?.category, 'workflow import') }] : []), - actions: [{ id: 'market.template.install', label: 'Install/import', state: item ? 'requiresEntitlement' : 'disabledWithReason', href: item ? `/auth/sign-in?returnTo=${encodeURIComponent(path)}` : undefined, reason: item ? undefined : 'Listing unavailable.' }], - helpContext: routeHelp(path, title, 'market-template', 'detail'), - feedbackContext: routeFeedback(input.url, null, path, title, 'market-template'), - found: Boolean(template.rendered && item), - templateItem: item, - }; - } - const { entry, artifacts } = await resolveMarketplaceCatalogItem(input, 'knowledge_pack', slug); - const title = compact(entry?.title, 'Knowledge import'); - return { - title, - description: compact(entry?.summary, 'Knowledge import detail'), - eyebrow: 'Knowledge Import', - metadata: [ - { key: 'Entitlement', value: entitlementFrom(entry, 'public') }, - { key: 'Offer mode', value: describeState(entry?.offerMode, 'unknown') }, - { key: 'Delivery', value: 'CDN or content proxy after entitlement validation' }, - { key: 'Artifact versions', value: String(safeArray(artifacts).length) }, - ], - distribution: distribution(title, 'Published artifact versions are exposed only through resolved delivery actions.', safeArray(artifacts).map((artifact: any) => ({ - id: compact(artifact?.version, 'version'), - title: compact(artifact?.version, 'Artifact version'), - description: compact(artifact?.kind, 'Catalog artifact'), - status: 'published', - entitlement: entitlementFrom(entry, 'public'), - delivery: 'cdn', - meta: compact(artifact?.publishedAt, 'published'), - }))), - actions: [{ id: 'market.pack.install', label: 'Install/import', state: entry ? 'requiresEntitlement' : 'disabledWithReason', href: entry ? `/auth/sign-in?returnTo=${encodeURIComponent(path)}` : undefined, reason: entry ? undefined : 'Listing unavailable.' }], - helpContext: routeHelp(path, title, 'market-knowledge-pack', 'detail'), - feedbackContext: routeFeedback(input.url, null, path, title, 'market-knowledge-pack'), - found: Boolean(entry), - }; -} diff --git a/src/view-models/knowledge.vm.ts b/src/view-models/knowledge.vm.ts deleted file mode 100644 index d7490dce..00000000 --- a/src/view-models/knowledge.vm.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { - buildKnowledgeArtifactProjection, - buildKnowledgeProjection, - type KnowledgeArtifactProjection, - type KnowledgeProjection, -} from '../lib/market/knowledge-projection.js'; -import { - type OperationalContext, - type OperationalMetric, -} from './shared.js'; -import { loadAppContext } from './app-access.js'; -import { loadKnowledgeContentEntries } from './knowledge-content.js'; - -export interface KnowledgeViewModel extends KnowledgeProjection { - context: OperationalContext; - metrics: OperationalMetric[]; -} - -export interface KnowledgeArtifactViewModel { - context: OperationalContext; - artifact: KnowledgeArtifactProjection | null; -} - -export async function loadKnowledgeViewModel(input: any): Promise { - const context = await loadAppContext(input); - const contentEntries = await loadKnowledgeContentEntries().catch(() => []); - const projection = context.store - ? await buildKnowledgeProjection({ - store: context.store, - principal: context.principal, - teams: context.teams, - projects: context.projects, - contentEntries, - }) - : emptyKnowledgeProjection(); - - return { - context, - ...projection, - }; -} - -export async function loadKnowledgeArtifactViewModel(input: any, artifactId: string): Promise { - const context = await loadAppContext(input); - const contentEntries = await loadKnowledgeContentEntries().catch(() => []); - const artifact = context.store - ? await buildKnowledgeArtifactProjection({ - store: context.store, - principal: context.principal, - teams: context.teams, - projects: context.projects, - contentEntries, - artifactId, - }) - : null; - - return { context, artifact }; -} - -function emptyKnowledgeProjection(): KnowledgeProjection { - return { - metrics: [ - { label: 'Knowledge artifacts', value: 0, tone: 'muted' }, - { label: 'Operational imports', value: 0 }, - { label: 'Referenced repositories', value: 0 }, - { label: 'Linked approvals', value: 0 }, - { label: 'Releases', value: 0 }, - ], - categories: ['Architecture', 'Operations', 'Research', 'Implementation', 'Decisions', 'Reports', 'Releases', 'Imports'], - artifacts: [], - imports: [], - reports: [], - releases: [], - relationshipSummary: { - workdays: 0, - repositories: 0, - approvals: 0, - releases: 0, - decisions: 0, - }, - }; -} diff --git a/src/view-models/operating-loop.vm.ts b/src/view-models/operating-loop.vm.ts deleted file mode 100644 index 289560ab..00000000 --- a/src/view-models/operating-loop.vm.ts +++ /dev/null @@ -1,858 +0,0 @@ -import type { - ActivityTimelineViewModel, - AllocationTreeNode, - AllocationViewModel, - CollectionViewModel, - DashboardViewModel, - FeedbackContext, - HelpContext, - OperatingStatus, - ResolvedAction, - ResourceSummary, - WorkQueueViewModel, - WorkspaceViewModel, -} from '@treeseed/ui'; -import { createApiFacade } from '../lib/market/api-client.js'; -import { buildGovernanceApprovalProjection, buildGovernanceProjection } from '../lib/market/governance-projection.js'; -import { buildWorkdayProjection } from '../lib/market/workday-projection.js'; -import { loadAppContext, persistActiveTeamSelection, resolveAppProject, type AppResolution } from './app-access.js'; -import { compact, describeState, normalizeWorkdayEntry, safeArray, teamLabel, toneForState, type OperationalContext } from './shared.js'; -import { loadWorkContentEntries, workContentEntriesFor, type WorkContentCollection, type WorkContentEntry } from './work-content.js'; - -export const DIRECTION_COLLECTIONS = ['objectives', 'notes', 'proposals', 'decisions'] as const; -export type DirectionCollection = typeof DIRECTION_COLLECTIONS[number]; - -export type OperatingBundle = T & { - context: OperationalContext; - actions: ResolvedAction[]; - helpContext: HelpContext; - feedbackContext: FeedbackContext; -}; - -const collectionLabels: Record = { - objectives: { singular: 'objective', plural: 'Objectives', typeLabel: 'Horizon', typeName: 'timeHorizon' }, - notes: { singular: 'note', plural: 'Notes', typeLabel: 'Type' }, - proposals: { singular: 'proposal', plural: 'Proposals', typeLabel: 'Proposal type', typeName: 'proposalType' }, - decisions: { singular: 'decision', plural: 'Decisions', typeLabel: 'Decision type', typeName: 'decisionType' }, - questions: { singular: 'question', plural: 'Questions', typeLabel: 'Question type', typeName: 'questionType' }, -}; - -function statusFrom(value: unknown): OperatingStatus { - const state = compact(value, '').toLowerCase(); - if (['active', 'running', 'executing', 'leased'].includes(state)) return 'running'; - if (['pending', 'queued', 'waiting', 'waiting_for_approval', 'under_review', 'approval_required'].includes(state)) return 'waiting'; - if (['blocked', 'paused_by_policy'].includes(state)) return 'blocked'; - if (['failed', 'rejected', 'cancelled', 'expired'].includes(state)) return 'failed'; - if (['completed', 'approved', 'succeeded', 'success', 'ready', 'live'].includes(state)) return 'completed'; - if (['needs_review', 'needs-review', 'escalated'].includes(state)) return 'needsReview'; - return 'unknown'; -} - -function feedbackContext(input: { - url: URL; - title: string; - context: FeedbackContext['context']; - routePattern: string; - teamId?: string; - projectId?: string; - resourceType?: string; - resourceId?: string; -}): FeedbackContext { - return { - url: input.url.href, - canonicalPath: input.routePattern, - title: input.title, - shell: 'product', - context: input.context, - teamId: input.teamId, - projectId: input.projectId, - resourceType: input.resourceType, - resourceId: input.resourceId, - submissionEndpoint: '/v1/feedback', - allowAnonymous: false, - screenshotPolicy: 'optional', - attachmentStoragePolicy: 'private', - routePattern: input.routePattern, - policy: input.context === 'project' ? 'project' : 'team', - }; -} - -function helpContext(input: { - title: string; - context: HelpContext['context']; - routePattern: string; - template: HelpContext['template']; - topicId: string; - summary: string; - resourceType?: string; - resourceId?: string; - actions?: ResolvedAction[]; -}): HelpContext { - return { - topicIds: [input.topicId], - shell: 'product', - context: input.context, - resourceType: input.resourceType, - resourceId: input.resourceId, - routePattern: input.routePattern, - canonicalPath: input.routePattern, - template: input.template, - summary: input.summary, - topics: [{ - id: input.topicId, - title: input.title, - summary: input.summary, - visibility: input.context === 'project' ? 'project' : 'team', - source: 'capability', - }], - relatedDocs: [{ - topicId: input.topicId, - title: input.title, - href: input.routePattern, - visibility: input.context === 'project' ? 'project' : 'team', - summary: input.summary, - source: 'capability', - current: true, - }], - relatedActions: input.actions ?? [], - searchScope: input.context === 'project' ? 'project' : 'team', - searchPlaceholder: `Search ${input.title.toLowerCase()} help`, - visibility: input.context === 'project' ? 'project' : 'team', - feedbackType: 'question', - }; -} - -function action(id: string, label: string, href?: string, state: ResolvedAction['state'] = 'allowed', reason?: string): ResolvedAction { - return { id, label, href, state, reason }; -} - -function rowFromEntry(entry: WorkContentEntry) { - return { - name: entry.title, - type: entry.type, - status: entry.status, - related: entry.relations.length ? entry.relations.join(', ') : 'none', - updated: entry.date, - }; -} - -function resourceFromEntry(entry: WorkContentEntry): ResourceSummary { - return { - id: entry.id, - title: entry.title, - description: entry.summary || entry.description || `${collectionLabels[entry.collection].singular} record`, - href: entry.href, - status: entry.status, - meta: entry.type, - }; -} - -function isStableSeedSlug(slug: string, singular: string) { - return slug === singular || slug === `seed-${singular}` || slug === `current-${singular}` || slug === `primary-${singular}`; -} - -function entryMatchesSlug(candidate: any, slug: string) { - const id = String(candidate.id ?? '').replace(/\.(md|mdx)$/u, ''); - const dataId = String(candidate.data?.id ?? ''); - const dataSlug = String(candidate.data?.slug ?? ''); - return id === slug || dataId === slug || dataId.replace(/^[^:]+:/u, '') === slug || dataSlug === slug; -} - -function syntheticDirectionEntry(collection: DirectionCollection, slug: string) { - const singular = collectionLabels[collection].singular; - const title = `${singular[0]?.toUpperCase() ?? ''}${singular.slice(1)} guarantee seed`; - return { - id: `${slug}.md`, - body: `Local guarantee seed ${singular} rendered by the ${collection} product surface.`, - data: { - id: `${singular}:${slug}`, - slug, - title, - description: `Deterministic local ${singular} for guarantee review.`, - summary: `This ${singular} keeps the ${collection} detail and edit route executable in local guarantee runs.`, - status: 'recorded', - date: new Date('2026-01-01T00:00:00.000Z'), - }, - }; -} - -export async function loadWorkDashboard(input: any, url: URL): Promise> { - const context = await loadAppContext(input); - const [entries, governance] = await Promise.all([ - loadWorkContentEntries(), - buildGovernanceProjection({ store: context.store, principal: context.principal, teams: context.teams, projects: context.projects }).catch(() => null), - ]); - const pending = safeArray(governance?.reviewQueue); - const blocked = safeArray(governance?.capacityConstraints).filter((item: any) => ['blocked', 'approval_required', 'paused_by_policy', 'waiting_for_budget'].includes(String(item.state ?? '').toLowerCase())); - const actions = [ - action('work.objective.create', 'New objective', '/app/work/objectives/new', context.activeTeam ? 'allowed' : 'requiresSetup', context.activeTeam ? undefined : 'Select a team first.'), - action('work.review.open', 'Review queue', '/app/work/review'), - ]; - const queue: WorkQueueViewModel = { - title: 'Operating queue', - description: 'Direction, approvals, blockers, and failed work that need attention.', - items: [ - ...pending.slice(0, 6).map((item: any) => ({ - id: compact(item.approvalId, compact(item.id, 'approval')), - title: compact(item.title, 'Approval requested'), - description: compact(item.description, compact(item.summary, 'Waiting for human review.')), - status: statusFrom(item.state) as OperatingStatus, - project: compact(item.projectName, 'Team'), - href: `/app/work/decisions/${encodeURIComponent(compact(item.approvalId, compact(item.id, 'approval')))}`, - })), - ...blocked.slice(0, 6).map((item: any) => ({ - id: compact(item.id, compact(item.title, 'blocked')), - title: compact(item.title, 'Capacity routing blocked'), - description: compact(item.description, compact(item.state, 'Blocked work')), - status: statusFrom(item.state) as OperatingStatus, - project: compact(item.projectName, 'Team'), - href: '/app/work/review', - })), - ], - emptyTitle: 'No work needs review', - emptyDescription: 'Approvals, blockers, failed tasks, and needs-review items appear here.', - }; - const timeline: ActivityTimelineViewModel = { - title: 'Operating timeline', - description: 'Recent direction and governance events.', - items: [ - ...entries.slice(0, 8).map((entry) => ({ - id: `${entry.collection}-${entry.id}`, - title: entry.title, - description: `${collectionLabels[entry.collection].singular} · ${entry.status}`, - status: statusFrom(entry.status), - timestamp: entry.date, - meta: entry.collection, - href: entry.href, - })), - ...safeArray(governance?.auditTrail).slice(0, 6).map((event: any) => ({ - id: compact(event.id, compact(event.title, 'audit')), - title: compact(event.title, 'Audit event'), - description: compact(event.description, compact(event.summary, 'Recorded event')), - status: statusFrom(event.state), - timestamp: compact(event.timestamp, compact(event.createdAt, '')), - meta: 'audit', - href: event.href, - })), - ], - }; - const dashboard: DashboardViewModel = { - title: 'Work operating loop', - description: 'Direction records, allocation signals, workday supervision, review queues, blockers, failures, and audit context.', - context: { - id: 'work-context', - title: 'Where you are', - items: [ - { label: 'Active team', value: context.activeTeam ? teamLabel(context.activeTeam) : 'None', tone: context.activeTeam ? 'success' : 'warning' }, - { label: 'Projects', value: context.projects.length, href: '/app/projects' }, - { label: 'Direction records', value: entries.length }, - ], - }, - status: { - id: 'work-status', - title: 'Operating state', - items: [ - { label: 'Approvals', value: pending.length, href: '/app/work/review', tone: pending.length ? 'warning' : 'success' }, - { label: 'Blocked work', value: blocked.length, href: '/app/work/review', tone: blocked.length ? 'danger' : 'success' }, - { label: 'Questions', value: workContentEntriesFor(entries, 'questions').length, href: '/app/work/questions' }, - ], - }, - allocation: { - id: 'work-allocation', - title: 'Allocation', - items: [ - { label: 'Team portfolio', value: 'Open', href: '/app/capacity/allocation', description: 'Projects, workstreams, agent classes, agents, provider grants' }, - { label: 'Workday runs', value: 'Open', href: '/app/capacity/workday-runs', description: 'Portfolio workday evidence' }, - ], - }, - nextActions: [ - { id: 'review', title: 'Review blocked work', description: 'Approvals, routing blockers, failed tasks, and needs-review items.', href: '/app/work/review', status: pending.length || blocked.length ? 'Needs attention' : 'Ready' }, - { id: 'allocation', title: 'Open allocation tree', description: 'Adjust desired allocation and inspect usage states.', href: '/app/capacity/allocation', status: 'Allocation' }, - ], - primaryResources: DIRECTION_COLLECTIONS.map((collection) => ({ - id: collection, - title: collectionLabels[collection].plural, - description: `Review ${collectionLabels[collection].plural.toLowerCase()} in the operating loop.`, - href: `/app/work/${collection}`, - status: String(workContentEntriesFor(entries, collection).length), - })), - activity: timeline.items.slice(0, 8).map((item) => ({ - id: item.id, - title: item.title, - description: item.description, - timestamp: item.timestamp, - href: item.href, - meta: item.meta, - tone: toneForState(item.status) as any, - })), - }; - return { - context, - dashboard, - queue, - timeline, - actions, - helpContext: helpContext({ title: 'Work operating loop', context: 'team', routePattern: '/app/work', template: 'dashboard', topicId: 'work-operating-loop', summary: 'Use Work to guide direction, review blockers, supervise workdays, and fold output back into knowledge.', actions }), - feedbackContext: feedbackContext({ url, title: 'Work operating loop', context: 'team', routePattern: '/app/work', teamId: context.activeTeam?.id, resourceType: 'work-operating-loop' }), - }; -} - -export async function loadDirectionCollection(input: any, collection: DirectionCollection, url: URL): Promise> { - const context = await loadAppContext(input); - const entries = workContentEntriesFor(await loadWorkContentEntries(), collection); - const actions = [action(`work.${collection}.create`, `New ${collectionLabels[collection].singular}`, `/app/work/${collection}/new`, context.activeTeam ? 'allowed' : 'requiresSetup')]; - return { - context, - collection: { - title: collectionLabels[collection].plural, - description: `Project direction ${collectionLabels[collection].plural.toLowerCase()} in the recurring operating loop.`, - rows: entries.map(rowFromEntry), - columns: [{ key: 'name', label: collectionLabels[collection].singular }, { key: 'type', label: collectionLabels[collection].typeLabel }, { key: 'status', label: 'State' }, { key: 'related', label: 'Related' }, { key: 'updated', label: 'Updated' }], - resources: entries.map(resourceFromEntry), - filters: [{ key: 'status', label: 'State', type: 'select', value: '', options: [{ label: 'All states', value: '' }, { label: 'Live', value: 'live' }, { label: 'Planned', value: 'planned' }, { label: 'In progress', value: 'in progress' }] }], - emptyTitle: `No ${collectionLabels[collection].plural.toLowerCase()} yet`, - emptyDescription: `Create a ${collectionLabels[collection].singular} to guide workdays and reviews.`, - }, - actions, - helpContext: helpContext({ title: collectionLabels[collection].plural, context: 'team', routePattern: `/app/work/${collection}`, template: 'collection', topicId: `work-${collection}`, summary: `${collectionLabels[collection].plural} are direction records in the Work operating loop.`, resourceType: collection, actions }), - feedbackContext: feedbackContext({ url, title: collectionLabels[collection].plural, context: 'team', routePattern: `/app/work/${collection}`, teamId: context.activeTeam?.id, resourceType: collection }), - }; -} - -export async function loadDirectionDetail(input: any, collection: DirectionCollection, slug: string, url: URL): Promise; form: { title: string; collection: DirectionCollection; projectId: string; slug: string; data: Record; body: string } | null }>> { - const context = await loadAppContext(input); - const content = await import(/* @vite-ignore */ 'astro:content').catch(() => null); - const entries = content?.getCollection ? await content.getCollection(collection, ({ data }: any) => !data?.draft).catch(() => []) : []; - const entry = entries.find((candidate: any) => entryMatchesSlug(candidate, slug)) - ?? (isStableSeedSlug(slug, collectionLabels[collection].singular) ? safeArray(entries)[0] ?? syntheticDirectionEntry(collection, slug) : null); - const data = entry?.data ?? {}; - const title = compact(data.title, `${collectionLabels[collection].singular} not found`); - const actions = entry - ? [ - action(`work.${collection}.edit`, 'Edit', `/app/work/${collection}/${encodeURIComponent(slug)}/edit`), - action(`work.${collection}.back`, 'Back', `/app/work/${collection}`), - ] - : [action(`work.${collection}.back`, 'Back', `/app/work/${collection}`)]; - return { - context, - entry, - metadata: [ - { key: 'State', value: compact(data.status, 'recorded') }, - { key: collectionLabels[collection].typeLabel, value: compact(data[collectionLabels[collection].typeName ?? 'type'], compact(data.type, collectionLabels[collection].singular)) }, - { key: 'Date', value: data.date instanceof Date ? data.date.toISOString().slice(0, 10) : compact(data.date, 'not recorded') }, - { key: 'Source slug', value: slug }, - ], - form: entry ? { title, collection, projectId: compact(url.searchParams.get('projectId'), compact(context.projects[0]?.id, '')), slug, data, body: compact(entry.body, '') } : null, - actions, - helpContext: helpContext({ title, context: 'team', routePattern: `/app/work/${collection}/[slug]`, template: 'detail', topicId: `work-${collection}-detail`, summary: `Review one ${collectionLabels[collection].singular} and its operating-loop context.`, resourceType: collection, resourceId: slug, actions }), - feedbackContext: feedbackContext({ url, title, context: 'team', routePattern: `/app/work/${collection}/[slug]`, teamId: context.activeTeam?.id, resourceType: collection, resourceId: slug }), - }; -} - -function allocationTree(context: OperationalContext, selectedProjectId?: string): AllocationTreeNode[] { - return [{ - id: compact(context.activeTeam?.id, 'team'), - label: context.activeTeam ? teamLabel(context.activeTeam) : 'No team', - level: 'team', - status: context.activeTeam ? 'ready' : 'waiting', - value: '100%', - current: !selectedProjectId, - href: '/app/capacity/allocation', - children: context.projects.map((project: any) => ({ - id: compact(project.id, compact(project.slug, 'project')), - label: compact(project.name, compact(project.slug, 'Project')), - level: 'project', - status: selectedProjectId === project.id ? 'running' : 'ready', - value: compact(project.allocationPercent, ''), - href: `/app/capacity/allocation/projects/${encodeURIComponent(compact(project.id, 'project'))}`, - current: selectedProjectId === project.id, - children: [ - { id: `${project.id}-planning`, label: 'Planning mode', level: 'mode', status: 'ready', href: `/app/capacity/allocation/projects/${encodeURIComponent(project.id)}/modes/planning` }, - { id: `${project.id}-acting`, label: 'Acting mode', level: 'mode', status: 'waiting', href: `/app/capacity/allocation/projects/${encodeURIComponent(project.id)}/modes/acting` }, - ], - })), - }]; -} - -export async function loadAllocationDashboard(input: any, url: URL, selectedProjectId = ''): Promise> { - const context = await loadAppContext(input); - const team = context.activeTeam; - const [access, portfolio, projectAllocation] = team && context.store - ? await Promise.all([ - context.store.getTeamAccessSummary?.(team.id).catch?.(() => null) ?? null, - context.store.getTeamPortfolioAllocation?.(team.id).catch?.(() => null) ?? null, - selectedProjectId ? context.store.getProjectAgentClassAllocation?.(selectedProjectId).catch?.(() => null) ?? null : null, - ]) - : [null, null, null]; - const canManage = Boolean(safeArray(access?.roles).some((role: string) => ['owner', 'team_owner', 'project_lead'].includes(role))); - const selectedProject = context.projects.find((project: any) => project.id === selectedProjectId) ?? null; - const projects = safeArray(portfolio?.projects).length ? safeArray(portfolio.projects) : context.projects; - const providers = safeArray(portfolio?.providers); - const slices = selectedProject - ? safeArray(projectAllocation?.slices) - : safeArray(portfolio?.slices).length ? safeArray(portfolio.slices) : projects.map((project: any) => ({ id: project.id, name: project.name ?? project.slug, percentage: projects.length ? Math.round(1000 / projects.length) / 10 : 100 })); - const allocation: AllocationViewModel = { - title: selectedProject ? `${compact(selectedProject.name, selectedProject.slug)} allocation` : 'Team portfolio allocation', - description: selectedProject ? 'Project workstream, mode, agent class, and agent allocation.' : 'Portfolio allocation across projects and provider grants.', - scopeLabel: selectedProject ? 'Project allocation' : 'Team portfolio', - tree: allocationTree(context, selectedProject?.id), - items: slices.map((slice: any) => ({ - id: compact(slice.id, compact(slice.key, compact(slice.name, 'slice'))), - label: compact(slice.name, compact(slice.label, compact(slice.id, 'Allocation slice'))), - status: statusFrom(slice.status ?? 'ready'), - desired: slice.percentage == null ? undefined : `${slice.percentage}%`, - inheritedLimit: slice.limit ?? slice.inheritedLimit ?? (selectedProject ? 'Project policy' : 'Team policy'), - override: slice.override ?? slice.overrideState, - scheduledReservation: slice.scheduledReservation ?? slice.reservedCredits, - activeAssignment: slice.activeAssignment ?? slice.activeAssignments, - actualUsage: slice.actualUsage ?? slice.usedCredits, - message: compact(slice.message, selectedProject ? 'Project allocation slice.' : 'Portfolio allocation slice.'), - href: selectedProject ? `/app/capacity/allocation/projects/${encodeURIComponent(selectedProject.id)}` : `/app/capacity/allocation/projects/${encodeURIComponent(compact(slice.id, 'project'))}`, - })), - actions: [action('allocation.services', 'Services', '/app/services'), action('allocation.providers', 'Providers', '/app/capacity/providers')], - emptyTitle: selectedProject ? 'No project allocation yet' : 'No portfolio allocation yet', - emptyDescription: 'Allocation appears after projects and providers are configured.', - }; - const actions = [ - action('allocation.save', canManage ? 'Save allocation' : 'Read only', undefined, canManage ? 'allowed' : 'readOnly', canManage ? undefined : 'Team admins can update allocation.'), - action('allocation.providers', 'Providers', '/app/capacity/providers'), - ]; - const dashboard: DashboardViewModel = { - title: 'Capacity allocation', - description: 'Desired allocation, inherited limits, overrides, scheduled reservations, active assignments, and actual usage.', - context: { - id: 'allocation-context', - title: 'Where you are', - items: [ - { label: 'Active team', value: team ? teamLabel(team) : 'None', tone: team ? 'success' : 'warning' }, - { label: 'Projects', value: projects.length, href: '/app/projects' }, - { label: 'Providers', value: providers.length, href: '/app/capacity/providers', tone: providers.length ? 'success' : 'warning' }, - ], - }, - allocation: { - id: 'allocation-status', - title: 'Allocation states', - items: [ - { label: 'Desired allocation', value: slices.length, description: 'Configured allocation slices' }, - { label: 'Scheduled reservations', value: slices.filter((slice: any) => slice.scheduledReservation || slice.reservedCredits).length }, - { label: 'Actual usage', value: slices.filter((slice: any) => slice.actualUsage || slice.usedCredits).length }, - ], - }, - }; - return { - context, - dashboard, - allocation, - canManage, - portfolio, - selectedProject, - actions, - helpContext: helpContext({ title: 'Capacity allocation', context: 'team', routePattern: '/app/capacity/allocation', template: 'dashboard', topicId: 'allocation-operating-loop', summary: 'Allocation shows desired shares, inherited limits, overrides, reservations, assignments, and actual usage.', actions }), - feedbackContext: feedbackContext({ url, title: 'Capacity allocation', context: 'team', routePattern: '/app/capacity/allocation', teamId: team?.id, resourceType: 'allocation' }), - }; -} - -export async function resolveProjectForRoute(input: any, projectParam: string): Promise<{ context: OperationalContext; resolution: AppResolution; project: any | null; team: any | null }> { - const context = await loadAppContext(input); - const resolution = await resolveAppProject(context, projectParam); - if (resolution.team?.id && input?.cookies) persistActiveTeamSelection(input, resolution.team); - return { context, resolution, project: resolution.resource, team: resolution.team ?? context.activeTeam }; -} - -export async function loadProjectWorkdayCollection(input: any, projectParam: string, url: URL): Promise> { - const { context, resolution, project } = await resolveProjectForRoute(input, projectParam); - const api = createApiFacade(input); - const workdays = project - ? [ - ...safeArray(await api.listProjectWorkdaySummaries(project.id, null).catch(() => [])), - ...safeArray(await api.listRuntimeWorkDays(project.id, { limit: 1000 }).catch(() => [])), - ].map((entry) => normalizeWorkdayEntry(project, entry)) - : []; - const unique = workdays.filter((entry, index, all) => all.findIndex((candidate) => candidate.id === entry.id) === index); - const resources = unique.map((workday: any) => ({ - id: workday.id, - title: workday.objective, - description: `${describeState(workday.state)} · ${workday.kind}`, - href: `/app/projects/${encodeURIComponent(project?.id ?? projectParam)}/workdays/${encodeURIComponent(workday.id)}`, - status: describeState(workday.state), - meta: workday.updatedAt ?? workday.startedAt ?? '', - })); - const queue: WorkQueueViewModel = { - title: 'Workday queue', - description: 'Running, blocked, failed, completed, and needs-review workdays.', - items: unique.slice(0, 8).map((workday: any) => ({ - id: workday.id, - title: workday.objective, - status: statusFrom(workday.state), - description: describeState(workday.kind, 'workday'), - project: compact(project?.name, compact(project?.slug, 'Project')), - href: `/app/projects/${encodeURIComponent(project?.id ?? projectParam)}/workdays/${encodeURIComponent(workday.id)}`, - })), - emptyTitle: 'No workdays yet', - emptyDescription: 'Workdays appear after agents begin operating on project work.', - }; - const actions = [action('workday.request', 'Request workday', undefined, project ? 'allowed' : 'requiresSetup'), action('workday.runs', 'Portfolio runs', '/app/capacity/workday-runs')]; - return { - context, - resolution, - project, - collection: { - title: 'Project workdays', - description: 'Agent workdays, logs, outputs, capacity, and review state.', - rows: unique.map((workday: any) => ({ name: workday.objective, state: describeState(workday.state), kind: workday.kind, updated: workday.updatedAt ?? workday.startedAt ?? '' })), - columns: [{ key: 'name', label: 'Workday' }, { key: 'state', label: 'State' }, { key: 'kind', label: 'Kind' }, { key: 'updated', label: 'Updated' }], - resources, - emptyTitle: 'No workdays', - emptyDescription: 'Request a workday when the project is ready for agent work.', - }, - queue, - actions, - helpContext: helpContext({ title: 'Project workdays', context: 'project', routePattern: '/app/projects/[projectId]/workdays', template: 'collection', topicId: 'project-workdays', summary: 'Project workdays show running, blocked, failed, completed, and needs-review agent work.', resourceType: 'workday', actions }), - feedbackContext: feedbackContext({ url, title: 'Project workdays', context: 'project', routePattern: '/app/projects/[projectId]/workdays', teamId: resolution.team?.id, projectId: project?.id, resourceType: 'workday' }), - }; -} - -export async function loadProjectWorkdayWorkspace(input: any, projectParam: string, workdayId: string, url: URL): Promise> { - const { context, resolution, project } = await resolveProjectForRoute(input, projectParam); - const api = createApiFacade(input); - const resolvedWorkdayId = project && isStableSeedSlug(workdayId, 'workday') - ? compact(safeArray(await api.listProjectWorkdaySummaries(project.id, null).catch(() => []))[0]?.id, workdayId) - : workdayId; - const projection = project ? await buildWorkdayProjection({ store: api, principal: context.principal, projects: [project], workdayId: resolvedWorkdayId }).catch(() => null) : null; - const workday = projection?.workday ?? null; - const workspace: WorkspaceViewModel | null = workday ? { - title: workday.objective ?? workday.id, - description: 'Workday workspace with allocation, queue, timeline, outputs, and audit context.', - context: { - id: 'workday-context', - title: 'Where you are', - items: [ - { label: 'Project', value: compact(project?.name, compact(project?.slug, 'Project')), href: project ? `/app/projects/${encodeURIComponent(project.id)}` : undefined }, - { label: 'State', value: describeState(workday.state), tone: toneForState(workday.state) as any }, - { label: 'Credits used', value: workday.budget?.capacityUsed ?? projection?.capacity?.usedCredits ?? 0 }, - ], - }, - allocation: { - title: 'Capacity state', - scopeLabel: 'Workday', - items: [ - { id: 'reserved', label: 'Scheduled reservations', status: 'running', scheduledReservation: projection?.capacity?.reservations?.length ?? 0, message: 'Reservations requested by task admission.' }, - { id: 'actual', label: 'Actual usage', status: 'completed', actualUsage: projection?.capacity?.usedCredits ?? workday.budget?.capacityUsed ?? 0, message: 'Actual reported usage.' }, - { id: 'routing', label: 'Routing decisions', status: projection?.capacity?.routingDecisions?.length ? 'needsReview' : 'ready', activeAssignment: projection?.capacity?.routingDecisions?.length ?? 0, message: 'Admission and routing evidence.' }, - ], - }, - queue: { - title: 'Agent work', - items: safeArray(projection?.agentActivity).map((agent: any) => ({ - id: compact(agent.id, compact(agent.name, 'agent')), - title: compact(agent.name, compact(agent.id, 'Agent')), - status: agent.failedCount > 0 ? 'failed' : agent.completedCount > 0 ? 'completed' : agent.taskCount > 0 ? 'running' : 'waiting', - description: `${agent.taskCount ?? 0} tasks · ${agent.failedCount ?? 0} failed`, - agent: compact(agent.id, ''), - href: project ? `/app/projects/${encodeURIComponent(project.id)}/agents/${encodeURIComponent(compact(agent.id, 'agent'))}` : undefined, - })), - emptyTitle: 'No agent work yet', - }, - timeline: { - title: 'Activity and audit timeline', - items: safeArray(projection?.timeline).slice(-80).map((event: any) => ({ - id: compact(event.id, compact(event.title, 'event')), - title: compact(event.title, 'Event'), - description: compact(event.description, ''), - status: statusFrom(event.state), - timestamp: compact(event.timestamp, ''), - meta: compact(event.phase, compact(event.category, 'event')), - })), - }, - resources: safeArray(projection?.artifacts).map((artifact: any) => ({ - id: compact(artifact.id, compact(artifact.title, 'artifact')), - title: compact(artifact.title, 'Artifact'), - description: compact(artifact.description, compact(artifact.type, 'Generated output')), - href: artifact.href, - status: compact(artifact.state, compact(artifact.type, 'output')), - })), - } : null; - const actions = [ - action('workday.followup', 'Request follow-up', undefined, project ? 'allowed' : 'requiresSetup'), - action('workday.back', 'Back to workdays', project ? `/app/projects/${encodeURIComponent(project.id)}/workdays` : '/app/projects'), - ]; - return { - context, - resolution, - project, - workspace, - actions, - helpContext: helpContext({ title: 'Workday workspace', context: 'project', routePattern: '/app/projects/[projectId]/workdays/[workdayId]', template: 'workspace', topicId: 'workday-workspace', summary: 'Inspect workday state, blockers, failures, outputs, allocation, and audit evidence.', resourceType: 'workday', resourceId: resolvedWorkdayId, actions }), - feedbackContext: feedbackContext({ url, title: 'Workday workspace', context: 'project', routePattern: '/app/projects/[projectId]/workdays/[workdayId]', teamId: resolution.team?.id, projectId: project?.id, resourceType: 'workday', resourceId: resolvedWorkdayId }), - }; -} - -export async function loadAgentCollection(input: any, projectParam: string, url: URL): Promise> { - const { context, resolution, project } = await resolveProjectForRoute(input, projectParam); - const content = await import(/* @vite-ignore */ 'astro:content').catch(() => null); - const [agentContent, agentSummary] = project ? await Promise.all([ - content?.getCollection ? content.getCollection('agents', ({ data }: any) => data?.enabled !== false).catch(() => []) : [], - context.store?.getProjectAgentsSummary?.(project.id, context.principal).catch?.(() => null) ?? null, - ]) : [[], null]; - const runtimeBySlug = new Map(safeArray(agentSummary?.agents).map((agent: any) => [String(agent.agentSlug ?? agent.slug ?? ''), agent])); - const resources = safeArray(agentContent).map((entry: any) => { - const slug = String(entry.data?.slug ?? entry.id ?? ''); - const runtime = runtimeBySlug.get(slug) as any; - return { - id: slug, - title: compact(entry.data?.name, compact(entry.data?.title, slug)), - description: compact(entry.data?.summary, compact(entry.data?.description, 'Project agent')), - href: project ? `/app/projects/${encodeURIComponent(project.id)}/agents/${encodeURIComponent(slug)}` : undefined, - status: compact(runtime?.status, compact(entry.data?.runtimeStatus, 'configured')), - meta: compact(entry.data?.handler, compact(runtime?.handler, 'agent')), - }; - }); - const actions = [action('agent.create', 'New agent', project ? `/app/projects/${encodeURIComponent(project.id)}/agents/new` : undefined, project ? 'allowed' : 'requiresSetup')]; - return { - context, - resolution, - project, - collection: { - title: 'Project agents', - description: 'Agent definitions, status, current work, and allocation context.', - rows: resources.map((resource) => ({ name: resource.title, handler: resource.meta, status: resource.status })), - columns: [{ key: 'name', label: 'Agent' }, { key: 'handler', label: 'Handler' }, { key: 'status', label: 'Status' }], - resources, - emptyTitle: 'No agents', - emptyDescription: 'Create an agent definition before scheduling project work.', - }, - actions, - helpContext: helpContext({ title: 'Project agents', context: 'project', routePattern: '/app/projects/[projectId]/agents', template: 'collection', topicId: 'project-agents', summary: 'Agents own configured work semantics and operating state.', resourceType: 'agent', actions }), - feedbackContext: feedbackContext({ url, title: 'Project agents', context: 'project', routePattern: '/app/projects/[projectId]/agents', teamId: resolution.team?.id, projectId: project?.id, resourceType: 'agent' }), - }; -} - -export async function loadAgentWorkspace(input: any, projectParam: string, agentSlug: string, url: URL): Promise | null }>> { - const { context, resolution, project } = await resolveProjectForRoute(input, projectParam); - const content = await import(/* @vite-ignore */ 'astro:content').catch(() => null); - const [agentEntries, summary] = project ? await Promise.all([ - content?.getCollection ? content.getCollection('agents', ({ data }: any) => data?.enabled !== false).catch(() => []) : [], - context.store?.getProjectAgentsSummary?.(project.id, context.principal).catch?.(() => null) ?? null, - ]) : [[], null]; - const entry = safeArray(agentEntries).find((candidate: any) => String(candidate.data?.slug ?? candidate.id ?? '') === agentSlug || String(candidate.data?.id ?? '').replace(/^agent:/u, '') === agentSlug) - ?? (isStableSeedSlug(agentSlug, 'agent') ? safeArray(agentEntries)[0] ?? null : null); - const runtime = safeArray(summary?.agents).find((agent: any) => String(agent.agentSlug ?? agent.slug ?? '') === agentSlug) - ?? (isStableSeedSlug(agentSlug, 'agent') ? safeArray(summary?.agents)[0] ?? null : null); - const data = entry?.data ?? {}; - const title = compact(data.name, compact(data.title, compact(agentSlug, 'Agent'))); - const workspace: WorkspaceViewModel | null = entry || runtime ? { - title, - description: compact(data.description, compact(runtime?.lastMessage, 'Agent operating state.')), - context: { - id: 'agent-context', - title: 'Where you are', - items: [ - { label: 'Project', value: compact(project?.name, compact(project?.slug, 'Project')) }, - { label: 'Handler', value: compact(data.handler, compact(runtime?.handler, 'agent')) }, - { label: 'Status', value: compact(runtime?.status, compact(data.runtimeStatus, 'configured')), tone: toneForState(runtime?.status ?? data.runtimeStatus) as any }, - ], - }, - allocation: { - title: 'Agent allocation', - scopeLabel: 'Agent', - items: [ - { id: 'desired', label: 'Desired share', status: 'ready', desired: data.allocationPercent ?? 'Inherited', inheritedLimit: 'Agent class policy', message: 'Agent inherits project and class allocation until explicitly overridden.' }, - { id: 'active', label: 'Current work', status: runtime?.currentTask ? 'running' : 'waiting', activeAssignment: runtime?.currentTask ?? 'none', message: 'Current assigned task.' }, - ], - }, - queue: { - title: 'Agent work queue', - items: runtime?.currentTask ? [{ id: 'current', title: runtime.currentTask, status: 'running', agent: agentSlug, description: 'Current task' }] : [], - emptyTitle: 'No active task', - }, - timeline: { - title: 'Agent activity', - items: runtime?.lastRunAt ? [{ id: 'last-run', title: 'Last run recorded', status: statusFrom(runtime.status), timestamp: runtime.lastRunAt, meta: agentSlug }] : [], - }, - } : null; - const actions = [ - action('agent.run', 'Run', undefined, project ? 'allowed' : 'requiresSetup'), - action('agent.pause', 'Pause', undefined, project ? 'allowed' : 'requiresSetup'), - action('agent.resume', 'Resume', undefined, project ? 'allowed' : 'requiresSetup'), - ]; - return { - context, - resolution, - project, - entry, - workspace, - form: entry ? { ...data, slug: agentSlug, body: compact(entry.body, '') } : null, - actions, - helpContext: helpContext({ title: 'Agent workspace', context: 'project', routePattern: '/app/projects/[projectId]/agents/[agentSlug]', template: 'workspace', topicId: 'agent-workspace', summary: 'Review agent status, current work, allocation, and safe action requests.', resourceType: 'agent', resourceId: agentSlug, actions }), - feedbackContext: feedbackContext({ url, title: 'Agent workspace', context: 'project', routePattern: '/app/projects/[projectId]/agents/[agentSlug]', teamId: resolution.team?.id, projectId: project?.id, resourceType: 'agent', resourceId: agentSlug }), - }; -} - -export async function loadReviewQueue(input: any, url: URL): Promise> { - const context = await loadAppContext(input); - const governance = await buildGovernanceProjection({ store: context.store, principal: context.principal, teams: context.teams, projects: context.projects }); - const items = [ - ...safeArray(governance.reviewQueue).map((item: any) => ({ - id: compact(item.approvalId, compact(item.id, 'approval')), - title: compact(item.title, 'Approval requested'), - description: compact(item.description, compact(item.summary, 'Waiting for review')), - status: statusFrom(item.state), - project: compact(item.projectName, 'Team'), - href: `/app/work/decisions/${encodeURIComponent(compact(item.approvalId, compact(item.id, 'approval')))}`, - })), - ...safeArray(governance.capacityConstraints).map((item: any) => ({ - id: compact(item.id, compact(item.title, 'blocker')), - title: compact(item.title, 'Capacity blocker'), - description: compact(item.description, compact(item.state, 'Blocked work')), - status: statusFrom(item.state), - project: compact(item.projectName, 'Team'), - href: '/app/capacity/allocation', - })), - ]; - const actions = [action('review.decisions', 'Decisions', '/app/work/decisions'), action('review.allocation', 'Allocation', '/app/capacity/allocation')]; - return { - context, - collection: { - title: 'Review queue', - description: 'Approvals, blocked routing, failed tasks, needs-review work, and follow-up actions.', - rows: items.map((item) => ({ name: item.title, status: item.status, project: item.project, description: item.description })), - columns: [{ key: 'name', label: 'Item' }, { key: 'status', label: 'State' }, { key: 'project', label: 'Project' }, { key: 'description', label: 'Description' }], - resources: items.map((item) => ({ id: item.id, title: item.title, description: item.description, href: item.href, status: item.status, meta: item.project })), - emptyTitle: 'No work needs review', - emptyDescription: 'Approvals, blocked work, failed tasks, and needs-review items appear here.', - }, - queue: { title: 'Needs attention', items, emptyTitle: 'No review items' }, - timeline: { - title: 'Review audit timeline', - items: safeArray(governance.auditTrail).map((event: any) => ({ - id: compact(event.id, compact(event.title, 'audit')), - title: compact(event.title, 'Audit event'), - description: compact(event.description, compact(event.summary, 'Recorded event')), - status: statusFrom(event.state), - timestamp: compact(event.timestamp, compact(event.createdAt, '')), - meta: 'audit', - href: event.href, - })), - }, - actions, - helpContext: helpContext({ title: 'Review queue', context: 'team', routePattern: '/app/work/review', template: 'collection', topicId: 'work-review-queue', summary: 'Review approvals, blocked routing, failed tasks, and needs-review work.', resourceType: 'review', actions }), - feedbackContext: feedbackContext({ url, title: 'Review queue', context: 'team', routePattern: '/app/work/review', teamId: context.activeTeam?.id, resourceType: 'review' }), - }; -} - -export async function loadDecisionDetail(input: any, approvalId: string, url: URL) { - const context = await loadAppContext(input); - const detail = await buildGovernanceApprovalProjection({ store: context.store, principal: context.principal, teams: context.teams, projects: context.projects, approvalId }); - const actions = [action('decision.back', 'Back to decisions', '/app/work/decisions')]; - return { - context, - detail, - actions, - helpContext: helpContext({ title: 'Decision review', context: 'team', routePattern: '/app/work/decisions/[slug]', template: 'detail', topicId: 'decision-review', summary: 'Review proposal and approval context, then record a decision.', resourceType: 'decision', resourceId: approvalId, actions }), - feedbackContext: feedbackContext({ url, title: 'Decision review', context: 'team', routePattern: '/app/work/decisions/[slug]', teamId: context.activeTeam?.id, resourceType: 'decision', resourceId: approvalId }), - }; -} - -export async function loadWorkdayRunCollection(input: any, url: URL): Promise> { - const context = await loadAppContext(input); - const api = createApiFacade(input); - const team = context.activeTeam; - const runs = team ? safeArray(await api.listWorkdayRuns(team.id).catch(() => [])) : []; - const items = runs.map((run: any) => ({ - id: compact(run.id, 'run'), - title: compact(run.id, 'Workday run'), - description: `${compact(run.scenarioId, 'portfolio planning')} · ${compact(run.capacityProviderId, compact(run.parameters?.providerId, 'local'))}`, - status: statusFrom(run.status), - project: `${safeArray(run.actual?.projects).length || run.summary?.projectCount || 0} projects`, - href: `/app/capacity/workday-runs/${encodeURIComponent(compact(run.id, 'run'))}`, - })); - const actions = [action('workday.run.create', 'Create workday run', undefined, team ? 'allowed' : 'requiresSetup'), action('workday.runtime', 'Runtime diagnostics', '/app/capacity/runtime')]; - return { - context, - collection: { - title: 'Workday runs', - description: 'Portfolio-wide workday runs, effectiveness checks, project coverage, failures, and audit evidence.', - rows: items.map((item) => ({ name: item.title, status: item.status, coverage: item.project, description: item.description })), - columns: [{ key: 'name', label: 'Run' }, { key: 'status', label: 'State' }, { key: 'coverage', label: 'Coverage' }, { key: 'description', label: 'Provider' }], - resources: items.map((item) => ({ id: item.id, title: item.title, description: item.description, href: item.href, status: item.status, meta: item.project })), - emptyTitle: 'No workday runs', - emptyDescription: 'Create a run when the team is ready to exercise the operating loop.', - }, - queue: { - title: 'Run status', - description: 'Running, blocked, failed, completed, and needs-review portfolio runs.', - items, - emptyTitle: 'No run status yet', - }, - actions, - helpContext: helpContext({ title: 'Workday runs', context: 'team', routePattern: '/app/capacity/workday-runs', template: 'collection', topicId: 'workday-runs', summary: 'Portfolio workday runs prove the allocation and operating loop end to end.', resourceType: 'workday-run', actions }), - feedbackContext: feedbackContext({ url, title: 'Workday runs', context: 'team', routePattern: '/app/capacity/workday-runs', teamId: team?.id, resourceType: 'workday-run' }), - }; -} - -export async function loadWorkdayRunWorkspace(input: any, runId: string, url: URL): Promise> { - const context = await loadAppContext(input); - const api = createApiFacade(input); - const team = context.activeTeam; - const payload = team ? await api.getWorkdayRun(team.id, runId).catch(() => null) : null; - const run = payload?.run ?? null; - const events = safeArray(payload?.events); - const projects = safeArray(run?.actual?.projects); - const workdayIds = projects.map((project: any) => project.workdayId).filter(Boolean); - const executionRuns = team && workdayIds.length - ? (await Promise.all(workdayIds.map((workdayId: string) => api.listExecutionRuns(team.id, { workdayId, limit: 100 }).catch(() => [])))).flat() - : []; - const workspace: WorkspaceViewModel | null = run ? { - title: compact(run.id, 'Workday run'), - description: compact(run.scenarioId, 'Portfolio operating-loop run.'), - context: { - id: 'workday-run-context', - title: 'Run summary', - items: [ - { label: 'State', value: compact(run.status, 'unknown'), tone: toneForState(run.status) as any }, - { label: 'Projects', value: projects.length || run.summary?.projectCount || 0 }, - { label: 'Score', value: run.summary?.score ?? run.metrics?.score ?? 'learning' }, - { label: 'Provider', value: compact(run.capacityProviderId, compact(run.parameters?.providerId, 'local')) }, - ], - }, - queue: { - title: 'Project coverage', - items: projects.map((project: any) => ({ - id: compact(project.projectId, compact(project.slug, 'project')), - title: compact(project.slug, compact(project.projectId, 'Project')), - status: statusFrom(project.status), - description: `${project.assignments ?? 0} assignments · ${safeArray(project.blockers).length} blockers`, - href: project.workdayId && project.projectId ? `/app/projects/${encodeURIComponent(project.projectId)}/workdays/${encodeURIComponent(project.workdayId)}` : undefined, - })), - emptyTitle: 'No project evidence', - }, - timeline: { - title: 'Audit timeline', - items: events.map((event: any) => ({ - id: compact(event.id, compact(event.title, 'event')), - title: compact(event.title, compact(event.eventType, 'Event')), - description: compact(event.message, compact(event.eventType, 'Recorded event')), - status: statusFrom(event.status), - timestamp: compact(event.createdAt, ''), - meta: compact(event.projectId, compact(event.workdayId, 'run')), - })), - emptyTitle: 'No audit events', - }, - resources: executionRuns.flatMap((entry: any) => safeArray(entry.contentArtifactRefs).map((artifact: any, index: number) => ({ - id: `${entry.id}-${index}`, - title: compact(artifact.contentPath, 'Content artifact'), - description: compact(artifact.artifactKind, 'Generated output'), - status: compact(entry.status, 'recorded'), - meta: compact(artifact.producedByAgent, compact(entry.agent?.agentId, 'agent')), - }))), - } : null; - const actions = [action('workday.runs.back', 'All runs', '/app/capacity/workday-runs'), action('workday.rerun', 'Create follow-up run', undefined, team ? 'allowed' : 'requiresSetup')]; - return { - context, - workspace, - run, - actions, - helpContext: helpContext({ title: 'Workday run', context: 'team', routePattern: '/app/capacity/workday-runs/[runId]', template: 'workspace', topicId: 'workday-run-detail', summary: 'Inspect portfolio workday status, project coverage, outputs, failures, and audit evidence.', resourceType: 'workday-run', resourceId: runId, actions }), - feedbackContext: feedbackContext({ url, title: 'Workday run', context: 'team', routePattern: '/app/capacity/workday-runs/[runId]', teamId: team?.id, resourceType: 'workday-run', resourceId: runId }), - }; -} diff --git a/src/view-models/private-knowledge.vm.ts b/src/view-models/private-knowledge.vm.ts deleted file mode 100644 index 55db5c8a..00000000 --- a/src/view-models/private-knowledge.vm.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { buildPrivateKnowledgeReaderViewModel, type RuntimeReaderViewModel } from '@treeseed/core'; -import { createApiFacade } from '../lib/market/api-client.ts'; -import { loadAppContext, resolveAppProject } from './app-access.ts'; - -export interface PrivateKnowledgePageViewModel { - project: { - id: string; - teamId: string; - name: string; - slug: string; - } | null; - teams: unknown[]; - activeTeam: unknown | null; - reader: RuntimeReaderViewModel; - statusCode: number; -} - -function statusFromReader(reader: RuntimeReaderViewModel) { - if (reader.status === 'not_found') return 404; - if (reader.status === 'unavailable') return 200; - if (reader.status === 'denied') return 403; - if (reader.status === 'requires_sign_in') return 401; - return 200; -} - -function errorStatus(error: unknown) { - return Number((error as { status?: number } | null)?.status ?? 500); -} - -function safeSlug(slug: unknown) { - const clean = String(slug ?? '').trim().replace(/^\/+|\/+$/gu, ''); - return clean && !clean.includes('..') ? clean : 'index'; -} - -function currentRoute(projectId: string, slug: string) { - return slug === 'index' - ? `/app/projects/${encodeURIComponent(projectId)}/knowledge` - : `/app/projects/${encodeURIComponent(projectId)}/knowledge/${slug}`; -} - -export async function loadPrivateKnowledgePageViewModel(context: any, projectId: string, slug: unknown): Promise { - const api = createApiFacade(context); - const appContext = await loadAppContext(context).catch(() => null); - const projectResolution = appContext ? await resolveAppProject(appContext, projectId).catch(() => null) : null; - const resolvedProjectId = projectResolution?.resource?.id ?? projectId; - const normalizedSlug = safeSlug(slug); - const route = currentRoute(resolvedProjectId, normalizedSlug); - const teams = await api.listTeamsForPrincipal().catch(() => []); - try { - const access = await api.validatePrivateKnowledgeAccess(resolvedProjectId, { slug: normalizedSlug, route }); - const project = access.project ?? null; - const reader = await buildPrivateKnowledgeReaderViewModel({ - locals: context.locals, - projectId: resolvedProjectId, - teamId: project?.teamId ?? '', - slug: normalizedSlug === 'index' ? '' : normalizedSlug, - access: 'allowed', - }); - if (reader.status === 'ready') { - await api.recordPrivateKnowledgeOutcome(resolvedProjectId, { slug: normalizedSlug, route, outcome: 'read' }).catch(() => null); - } else if (reader.status === 'not_found') { - await api.recordPrivateKnowledgeOutcome(resolvedProjectId, { slug: normalizedSlug, route, outcome: 'not_found' }).catch(() => null); - } - const activeTeam = Array.isArray(teams) - ? teams.find((team: any) => team.id === project?.teamId || team.teamId === project?.teamId) ?? null - : null; - return { project, teams, activeTeam, reader, statusCode: statusFromReader(reader) }; - } catch (error) { - const status = errorStatus(error); - const access = status === 401 ? 'requires_sign_in' : 'denied'; - const reader = await buildPrivateKnowledgeReaderViewModel({ - locals: context.locals, - projectId: resolvedProjectId, - teamId: '', - slug: normalizedSlug === 'index' ? '' : normalizedSlug, - access, - }); - return { project: null, teams, activeTeam: null, reader, statusCode: statusFromReader(reader) }; - } -} diff --git a/src/view-models/service-readiness.vm.ts b/src/view-models/service-readiness.vm.ts deleted file mode 100644 index aa24c519..00000000 --- a/src/view-models/service-readiness.vm.ts +++ /dev/null @@ -1,317 +0,0 @@ -import type { - CollectionViewModel, - DashboardViewModel, - FeedbackContext, - HelpContext, - ReadinessItem, - ReadinessSummaryViewModel, - ResolvedAction, - ResourceSummary, -} from '@treeseed/ui'; -import { - hostEnvironmentSummary, - hostProviderFor, - hostPurposeFor, - hostReadinessSummary, - hostTypeFor, - hostTypeLabel, - ownershipLabel, - providerLabel, -} from '../lib/market/control-ui.js'; -import { listTreeseedManagedHostsFromConfig } from '../lib/market/managed-hosts.js'; -import { compact, describeState, safeArray, teamLabel, toneForState, type OperationalContext } from './shared.js'; - -export type ServiceReadinessBundle = { - dashboard: DashboardViewModel; - readiness: ReadinessSummaryViewModel; - actions: ResolvedAction[]; - helpContext: HelpContext; - feedbackContext: FeedbackContext; -}; - -export type ServiceInventory = { - team: any | null; - hosts: any[]; - providers: any[]; - executionProvidersByProvider: Map; - grantsByProvider: Map; - treeDx: any | null; -}; - -const hostGroups = [ - { type: 'repository', title: 'Repository hosts', newHref: '/app/hosts/repository/new' }, - { type: 'web', title: 'Web hosts', newHref: '/app/hosts/web/new' }, - { type: 'email', title: 'Email hosts', newHref: '/app/hosts/email/new' }, - { type: 'capacity-provider', title: 'Capacity provider hosts', newHref: '/app/hosts/capacity-provider/new' }, - { type: 'ai', title: 'AI hosts', newHref: '/app/hosts/ai/new' }, -]; - -function idOf(value: any, fallback = 'item') { - return compact(value?.id, compact(value?.slug, fallback)); -} - -function hostTypeOf(host: any) { - return compact(host?._hostType, hostTypeFor(host)); -} - -function hostHref(host: any) { - return `/app/hosts/${encodeURIComponent(hostTypeOf(host))}/${encodeURIComponent(idOf(host, 'host'))}`; -} - -function providerHref(provider: any) { - return `/app/capacity/providers/${encodeURIComponent(idOf(provider, 'provider'))}`; -} - -function readinessStatusFrom(value: unknown): ReadinessItem['status'] { - const tone = toneForState(value); - if (tone === 'success') return 'ready'; - if (tone === 'danger') return 'blocked'; - if (tone === 'warning' || tone === 'info') return 'warning'; - return 'unknown'; -} - -function feedbackContext(url: URL, team: any | null): FeedbackContext { - return { - url: url.href, - canonicalPath: '/app/services', - title: 'Services dashboard', - shell: 'product', - context: 'team', - teamId: team?.id, - resourceType: 'service-readiness', - submissionEndpoint: '/v1/feedback', - allowAnonymous: false, - screenshotPolicy: 'optional', - attachmentStoragePolicy: 'private', - routePattern: '/app/services', - policy: 'team', - }; -} - -function helpContext(): HelpContext { - return { - topicIds: ['services-readiness'], - shell: 'product', - context: 'team', - resourceType: 'service-readiness', - routePattern: '/app/services', - canonicalPath: '/app/services', - template: 'dashboard', - summary: 'Services summarize hosts, integrations, capacity providers, credentials, diagnostics, and recovery actions for the active team.', - topics: [{ - id: 'services-readiness', - title: 'Service readiness', - summary: 'Use services to review setup and drill into hosts, credentials, capacity providers, and advanced diagnostics.', - visibility: 'team', - source: 'capability', - }], - relatedDocs: [{ - topicId: 'services-readiness', - title: 'Service readiness', - href: '/app/services', - visibility: 'team', - summary: 'Hosts, capacity, integrations, credentials, diagnostics, and recovery.', - source: 'capability', - current: true, - }], - relatedActions: [], - searchScope: 'team', - searchPlaceholder: 'Search services help', - visibility: 'team', - feedbackType: 'question', - }; -} - -export async function loadServiceInventory(context: OperationalContext, runtime: any): Promise { - const team = context.activeTeam; - if (!team || !context.store) { - return { team: null, hosts: [], providers: [], executionProvidersByProvider: new Map(), grantsByProvider: new Map(), treeDx: null }; - } - const platformRepositoryHost = { - id: 'platform:github:hosted-hubs', - provider: 'github', - ownership: 'treeseed_managed', - name: 'TreeSeed Hosted Repositories', - accountLabel: 'TreeSeed GitHub organization', - status: 'active', - _hostType: 'repository', - }; - const [managedHosts, repositoryHosts, teamHosts, treeDx, providers] = await Promise.all([ - listTreeseedManagedHostsFromConfig(team.id, runtime).catch(() => []), - context.store.listRepositoryHosts?.(team.id, { includePlatform: true }).catch?.(() => []) ?? [], - context.store.listTeamWebHosts?.(team.id).catch?.(() => []) ?? [], - context.store.getTeamTreeDx?.(team.id).catch?.(() => null) ?? null, - context.store.listTeamCapacityProviders?.(team.id).catch?.(() => []) ?? [], - ]); - const repositoryInventory = safeArray(repositoryHosts).some((host: any) => host.id === platformRepositoryHost.id) - ? safeArray(repositoryHosts) - : [platformRepositoryHost, ...safeArray(repositoryHosts)]; - const hosts = [ - ...repositoryInventory.map((host: any) => ({ ...host, _hostType: 'repository' })), - ...safeArray(managedHosts).map((host: any) => ({ ...host, _hostType: hostTypeFor(host) })), - ...safeArray(teamHosts).map((host: any) => ({ ...host, _hostType: hostTypeFor(host) })), - ]; - const executionProviderEntries = await Promise.all(safeArray(providers).map(async (provider: any) => [ - idOf(provider, 'provider'), - await context.store.listExecutionProviders?.(team.id, idOf(provider, 'provider')).catch?.(() => []) ?? [], - ] as const)); - const grantEntries = await Promise.all(safeArray(providers).map(async (provider: any) => [ - idOf(provider, 'provider'), - await context.store.listCapacityGrants?.(team.id, { providerId: idOf(provider, 'provider') }).catch?.(() => []) ?? [], - ] as const)); - return { - team, - hosts, - providers: safeArray(providers), - executionProvidersByProvider: new Map(executionProviderEntries), - grantsByProvider: new Map(grantEntries), - treeDx, - }; -} - -export function buildServicesDashboard(context: OperationalContext, inventory: ServiceInventory, url: URL): ServiceReadinessBundle { - const team = inventory.team ?? context.activeTeam; - const hostsByType = new Map(hostGroups.map((group) => [group.type, inventory.hosts.filter((host) => hostTypeOf(host) === group.type)])); - const readyHosts = inventory.hosts.filter((host) => readinessStatusFrom(host.status ?? host.readiness) === 'ready').length; - const readyProviders = inventory.providers.filter((provider) => readinessStatusFrom(provider.connectionState ?? provider.status) === 'ready').length; - const treeDxInstance = inventory.treeDx?.instance ?? null; - const readinessItems: ReadinessItem[] = [ - { id: 'repository-hosts', label: 'Repository hosts', status: (hostsByType.get('repository')?.length ?? 0) > 0 ? 'ready' : 'warning', message: `${hostsByType.get('repository')?.length ?? 0} repository host records available.`, href: '/app/hosts' }, - { id: 'web-hosts', label: 'Web hosts', status: (hostsByType.get('web')?.length ?? 0) > 0 ? 'ready' : 'warning', message: `${hostsByType.get('web')?.length ?? 0} web hosts available for project deployment.`, href: '/app/hosts' }, - { id: 'capacity-providers', label: 'Capacity providers', status: inventory.providers.length > 0 ? readyProviders > 0 ? 'ready' : 'warning' : 'blocked', message: inventory.providers.length > 0 ? `${inventory.providers.length} provider records, ${readyProviders} ready.` : 'Create a capacity provider before running project workdays.', href: '/app/capacity/providers' }, - { id: 'treedx', label: 'TreeDX Knowledge Library', status: treeDxInstance ? readinessStatusFrom(treeDxInstance.status ?? 'ready') : 'warning', message: treeDxInstance ? `Library ${describeState(treeDxInstance.status, 'ready')}.` : 'Set up the team Knowledge Library binding.', href: '/app/hosts/knowledge-library' }, - { id: 'runtime-diagnostics', label: 'Runtime diagnostics', status: 'unknown', message: 'Advanced runtime diagnostics are available for operators.', href: '/app/capacity/runtime', advanced: true }, - ]; - const actions: ResolvedAction[] = [ - { id: 'service.host.create', label: 'New host', state: team ? 'allowed' : 'requiresSetup', href: '/app/hosts/new', reason: team ? undefined : 'Create or select a team first.' }, - { id: 'service.provider.create', label: 'New provider', state: team ? 'allowed' : 'requiresSetup', href: '/app/capacity/providers/new', reason: team ? undefined : 'Create or select a team first.' }, - ]; - return { - dashboard: { - title: 'Services dashboard', - description: 'Team hosts, integrations, credentials, capacity providers, diagnostics, and recovery paths.', - context: { - id: 'services-context', - title: 'Where you are', - items: [ - { label: 'Active team', value: team ? teamLabel(team) : 'None', description: team ? 'Team service readiness context' : 'Create or select a team', tone: team ? 'success' : 'warning' }, - { label: 'Projects', value: context.projects.length, description: 'Project consumers of services', href: '/app/projects' }, - ], - }, - status: { - id: 'services-status', - title: 'Readiness summary', - items: [ - { label: 'Hosts', value: `${readyHosts}/${inventory.hosts.length}`, description: 'Ready host records', href: '/app/hosts', tone: readyHosts === inventory.hosts.length && inventory.hosts.length > 0 ? 'success' : 'warning' }, - { label: 'Capacity', value: `${readyProviders}/${inventory.providers.length}`, description: 'Ready capacity providers', href: '/app/capacity/providers', tone: readyProviders > 0 ? 'success' : 'warning' }, - { label: 'Knowledge Library', value: treeDxInstance ? 'Connected' : 'Needed', description: 'TreeDX binding', href: '/app/hosts/knowledge-library', tone: treeDxInstance ? 'success' : 'warning' }, - ], - }, - setup: { - id: 'services-setup', - title: 'Setup progress', - items: [ - { label: 'Repository', value: hostsByType.get('repository')?.length ?? 0, href: '/app/hosts', description: hostPurposeFor('repository') }, - { label: 'Web', value: hostsByType.get('web')?.length ?? 0, href: '/app/hosts', description: hostPurposeFor('web') }, - { label: 'AI', value: hostsByType.get('ai')?.length ?? 0, href: '/app/hosts', description: hostPurposeFor('ai') }, - ], - }, - nextActions: [ - { id: 'hosts', title: 'Review host inventory', description: 'Manage reusable team credentials by workflow purpose.', href: '/app/hosts', status: 'Hosts' }, - { id: 'providers', title: 'Review capacity providers', description: 'Check provider connection, native capacity, and credential rotation.', href: '/app/capacity/providers', status: 'Capacity' }, - { id: 'diagnostics', title: 'Open runtime diagnostics', description: 'Advanced runtime records stay behind operator drilldown.', href: '/app/capacity/runtime', status: 'Advanced' }, - ], - primaryResources: [ - ...hostGroups.map((group) => ({ - id: group.type, - title: group.title, - description: hostPurposeFor(group.type), - href: '/app/hosts', - status: `${hostsByType.get(group.type)?.length ?? 0} configured`, - })), - { id: 'capacity-providers', title: 'Capacity providers', description: 'Provider lifecycle and readiness.', href: '/app/capacity/providers', status: `${inventory.providers.length} configured` }, - ], - activity: [{ id: 'services-loaded', title: 'Service readiness loaded', description: team ? `${teamLabel(team)} service context is ready to inspect.` : 'No team selected.', tone: team ? 'info' : 'warning' }], - }, - readiness: { - title: 'Service readiness', - description: 'Readiness, setup, and advanced diagnostics for the active team.', - items: readinessItems, - }, - actions, - helpContext: helpContext(), - feedbackContext: feedbackContext(url, team), - }; -} - -export function buildHostCollection(inventory: ServiceInventory): CollectionViewModel { - const resources: ResourceSummary[] = inventory.hosts.map((host) => ({ - id: idOf(host, 'host'), - title: compact(host.name, compact(host.accountLabel, `${hostTypeLabel(hostTypeOf(host))} host`)), - description: `${hostTypeLabel(hostTypeOf(host))} - ${providerLabel(host.provider ?? hostProviderFor(hostTypeOf(host)))} - ${ownershipLabel(host.ownership)}`, - href: hostHref(host), - status: hostReadinessSummary(host), - meta: hostEnvironmentSummary(host), - })); - return { - title: 'Hosts', - description: 'Reusable team host credentials grouped by service purpose.', - rows: [], - columns: [], - resources, - filters: [{ - key: 'type', - label: 'Host type', - type: 'select', - value: '', - options: [{ label: 'All host types', value: '' }, ...hostGroups.map((group) => ({ label: hostTypeLabel(group.type), value: group.type }))], - }], - emptyTitle: 'No hosts yet', - emptyDescription: 'Create a host from the services dashboard or from project/provider setup.', - }; -} - -export function buildProviderCollection(inventory: ServiceInventory): CollectionViewModel { - return { - title: 'Capacity providers', - description: 'Capacity provider readiness, connection, native capacity, allocation summary, and credential actions.', - rows: [], - columns: [], - resources: inventory.providers.map((provider) => { - const id = idOf(provider, 'provider'); - const execution = inventory.executionProvidersByProvider.get(id) ?? []; - const grants = inventory.grantsByProvider.get(id) ?? []; - return { - id, - title: compact(provider.name, 'Capacity provider'), - description: `${describeState(provider.connectionState ?? provider.status, 'waiting')} - ${execution.length} native provider records - ${grants.length} allocation grants`, - href: providerHref(provider), - status: describeState(provider.connectionState ?? provider.status, 'waiting'), - meta: compact(provider.launchMode, 'self_hosted'), - }; - }), - emptyTitle: 'No capacity providers yet', - emptyDescription: 'Create a provider to make capacity available for project workdays.', - }; -} - -export function hostMetadata(host: any): Array<{ key: string; value: string }> { - const type = hostTypeOf(host); - return [ - { key: 'Type', value: hostTypeLabel(type) }, - { key: 'Provider', value: providerLabel(host.provider ?? hostProviderFor(type)) }, - { key: 'Ownership', value: ownershipLabel(host.ownership) }, - { key: 'Readiness', value: hostReadinessSummary(host) }, - { key: 'Environments', value: hostEnvironmentSummary(host) }, - ]; -} - -export function providerMetadata(provider: any, executionProviders: any[] = [], grants: any[] = []): Array<{ key: string; value: string }> { - return [ - { key: 'State', value: describeState(provider.connectionState ?? provider.status, 'waiting') }, - { key: 'Launch mode', value: compact(provider.launchMode, 'self_hosted') }, - { key: 'Last heartbeat', value: compact(provider.lastSeenAt, compact(provider.metadata?.lastSeenAt, 'never')) }, - { key: 'Native providers', value: String(executionProviders.length) }, - { key: 'Allocation grants', value: String(grants.length) }, - ]; -} diff --git a/src/view-models/shared.ts b/src/view-models/shared.ts index fc51a8e9..7faa11aa 100644 --- a/src/view-models/shared.ts +++ b/src/view-models/shared.ts @@ -1,35 +1,8 @@ -export type OperationalTone = 'default' | 'muted' | 'info' | 'success' | 'warning' | 'danger' | 'accent'; - -export interface OperationalMetric { - label: string; - value: string | number; - description?: string; - tone?: OperationalTone; -} - -export interface OperationalLink { - label: string; - href: string; -} - export interface OperationalContext { store: any | null; principal: any | null; teams: any[]; activeTeam: any | null; - projects: any[]; -} - -export interface OperationalEvent { - id: string; - title: string; - description?: string; - category: 'objective' | 'research' | 'execution' | 'governance' | 'knowledge' | 'infrastructure'; - state?: string; - tone?: OperationalTone; - timestamp?: string | null; - href?: string; - meta?: string; } export function safeArray(value: unknown): T[] { @@ -40,134 +13,6 @@ export function compact(value: unknown, fallback = ''): string { return typeof value === 'string' && value.trim() ? value.trim() : fallback; } -export function numberValue(value: unknown, fallback = 0): number { - const next = Number(value); - return Number.isFinite(next) ? next : fallback; -} - export function teamLabel(team: any | null): string { - return compact(team?.displayName, compact(team?.name, compact(team?.slug, 'Organization'))); -} - -export function projectHref(projectId: unknown): string { - return projectId ? `/app/projects/${encodeURIComponent(compact(projectId, 'project'))}` : '/app/projects'; -} - -export function workdayHref(workdayId: unknown): string { - return `/app/work/objectives#work-${anchorPart(workdayId)}`; -} - -export function approvalHref(approvalId: unknown): string { - return approvalId ? `/app/work/decisions/${encodeURIComponent(compact(approvalId, 'decision'))}` : '/app/work/decisions'; -} - -export function knowledgeHref(artifactId: unknown): string { - return artifactId ? `/app/knowledge/operations/${anchorPart(artifactId).toLowerCase()}` : '/app/knowledge/artifacts'; -} - -export function anchorPart(value: unknown): string { - return compact(value, 'item').replace(/[^a-zA-Z0-9_-]+/gu, '-'); -} - -export function latestDate(...values: unknown[]): string | null { - return values.map((value) => compact(value, '')).find(Boolean) ?? null; -} - -export function compareDatesDesc(left?: string | null, right?: string | null): number { - return Date.parse(right ?? '') - Date.parse(left ?? ''); -} - -export function toneForState(state: unknown): OperationalTone { - const value = compact(state, '').toLowerCase(); - if (['completed', 'approved', 'published', 'succeeded', 'success', 'active', 'ready'].includes(value)) return 'success'; - if (['pending', 'queued', 'waiting_for_approval', 'under_review', 'approval_required'].includes(value)) return 'warning'; - if (['failed', 'rejected', 'blocked', 'critical', 'expired'].includes(value)) return 'danger'; - if (['paused', 'escalated', 'running', 'executing', 'verifying'].includes(value)) return 'info'; - return 'default'; -} - -export function describeState(state: unknown, fallback = 'not recorded'): string { - return compact(state, fallback).replaceAll('_', ' '); -} - -export async function loadProjectBundle(context: OperationalContext, project: any): Promise { - const store = context.store; - if (!store || !project) { - return { - project, - summary: null, - agents: null, - workdays: [], - approvals: [], - capacity: null, - releases: null, - }; - } - - const [summary, agents, workdays, approvals, capacity, releases] = await Promise.all([ - typeof store.getProjectSummary === 'function' ? store.getProjectSummary(project.id, context.principal).catch(() => null) : null, - typeof store.getProjectAgentsSummary === 'function' ? store.getProjectAgentsSummary(project.id, context.principal).catch(() => null) : null, - typeof store.listProjectWorkdaySummaries === 'function' ? store.listProjectWorkdaySummaries(project.id, null).catch(() => []) : [], - typeof store.listApprovalRequestsForProject === 'function' ? store.listApprovalRequestsForProject(project.id, 50).catch(() => []) : [], - typeof store.getProjectCapacitySummary === 'function' ? store.getProjectCapacitySummary(project.id, 'staging').catch(() => null) : null, - typeof store.getProjectReleasesSummary === 'function' ? store.getProjectReleasesSummary(project.id, context.principal).catch(() => null) : null, - ]); - - return { - project, - summary, - agents, - workdays: safeArray(workdays), - approvals: safeArray(approvals), - capacity, - releases, - }; -} - -export function normalizeWorkdayEntry(project: any, entry: any, source = 'summary'): any { - const workdayId = compact(entry?.workDayId, compact(entry?.work_day_id, compact(entry?.id, 'workday'))); - const summary = entry?.summary && typeof entry.summary === 'object' ? entry.summary : {}; - const docsAutomation = summary?.docsAutomation && typeof summary.docsAutomation === 'object' ? summary.docsAutomation : {}; - const contentSnapshot = summary?.contentSnapshot && typeof summary.contentSnapshot === 'object' ? summary.contentSnapshot : {}; - return { - id: workdayId, - recordId: compact(entry?.id, workdayId), - projectId: compact(entry?.projectId, compact(project?.id, '')), - projectName: compact(project?.name, compact(project?.slug, 'Project')), - projectSlug: compact(project?.slug, ''), - environment: compact(entry?.environment, 'staging'), - kind: compact(entry?.kind, source), - state: compact(entry?.state, compact(entry?.status, 'active')), - objective: compact(summary?.objective, compact(summary?.title, compact(contentSnapshot?.title, `Operational workday ${workdayId}`))), - startedAt: latestDate(entry?.startedAt, entry?.started_at, summary?.startedAt), - endedAt: latestDate(entry?.endedAt, entry?.ended_at, summary?.endedAt), - updatedAt: latestDate(entry?.updatedAt, entry?.updated_at, entry?.createdAt, entry?.created_at), - summary, - docsAutomation, - contentSnapshot, - href: workdayHref(workdayId), - tone: toneForState(entry?.state ?? entry?.status), - }; -} - -export function operationEventFromApproval(approval: any): OperationalEvent { - const id = compact(approval?.id, 'approval'); - return { - id: `approval-${id}`, - title: compact(approval?.title, 'Approval requested'), - description: compact(approval?.summary, describeState(approval?.kind, 'Operational review')), - category: 'governance', - state: compact(approval?.state, 'pending'), - tone: toneForState(approval?.state ?? approval?.severity), - timestamp: latestDate(approval?.createdAt, approval?.created_at, approval?.decidedAt, approval?.decided_at), - href: approvalHref(id), - meta: describeState(approval?.severity, 'review'), - }; -} - -export function artifactTitle(artifact: any): string { - return compact( - artifact?.title, - compact(artifact?.name, compact(artifact?.draftId, compact(artifact?.reportId, compact(artifact?.id, 'Operational artifact')))), - ); + return compact(team?.displayName, compact(team?.name, compact(team?.slug, 'Team'))); } diff --git a/src/view-models/ui-foundation/questions.vm.ts b/src/view-models/ui-foundation/questions.vm.ts deleted file mode 100644 index 3bdacfdb..00000000 --- a/src/view-models/ui-foundation/questions.vm.ts +++ /dev/null @@ -1,514 +0,0 @@ -import type { - CollectionViewModel, - FeedbackContext, - HelpContext, - HelpTopic, - PageViewModel, - ResolvedAction, - ResolvedActionState, - ResourceSummary, -} from '@treeseed/ui'; -import { - QUESTION_ACTION_IDS, - QUESTION_CAPABILITY, - QUESTION_RESOURCE_SCHEMA, - QUESTION_TYPE_OPTIONS, - questionCollectionFilters, -} from '../../capabilities/questions.js'; -import type { GovernanceViewModel } from '../governance.vm.js'; -import type { KnowledgeViewModel } from '../knowledge.vm.js'; -import type { OperationalContext } from '../shared.js'; -import { - type WorkContentEntry, - workContentRelationSummary, -} from '../work-content.js'; - -type QuestionType = typeof QUESTION_TYPE_OPTIONS[number]['value']; - -export interface QuestionDetailSource { - id: string; - slug: string; - title: string; - description: string; - summary: string; - status: string; - questionType: string; - motivation: string; - primaryContributor: string; - date: string; - body: string; - draft: boolean; - relatedObjectives: string[]; - relatedBooks: string[]; - href: string; -} - -export interface QuestionsPolicy { - read: ResolvedActionState; - create: ResolvedActionState; - edit: ResolvedActionState; - save: ResolvedActionState; - export: ResolvedActionState; - reason?: string; - remediation?: string; -} - -export interface QuestionsCollectionViewModel extends PageViewModel { - collection: CollectionViewModel; - operationalCollection: CollectionViewModel; - help: HelpContext; - feedback: FeedbackContext; - policy: QuestionsPolicy; -} - -export interface QuestionDetailViewModel extends PageViewModel { - question: QuestionDetailSource | null; - metadata: Array<{ key: string; value: string }>; - relatedRows: Array>; - help: HelpContext; - feedback: FeedbackContext; - policy: QuestionsPolicy; - notFound: boolean; -} - -export interface QuestionFormViewModel extends PageViewModel { - mode: 'create' | 'edit'; - question: QuestionDetailSource | null; - projectOptions: Array<{ label: string; value: string }>; - selectedProjectId: string; - formAction: string; - statusMessageId: string; - help: HelpContext; - feedback: FeedbackContext; - policy: QuestionsPolicy; - notFound: boolean; -} - -interface CollectionInput { - governance: GovernanceViewModel; - knowledge: KnowledgeViewModel | null; - questionEntries: WorkContentEntry[]; - approvalQuestions: Array>; - artifactQuestions: Array>; - url: URL; -} - -interface DetailInput { - context: OperationalContext; - question: QuestionDetailSource | null; - url: URL; -} - -interface FormInput extends DetailInput { - mode: 'create' | 'edit'; -} - -export function resolveQuestionsPolicy(context: Pick): QuestionsPolicy { - const principal = context.principal; - if (!principal) { - return statePolicy('requiresSignIn', 'Sign in to view project questions.', 'Sign in and select a team to continue.'); - } - const permissions = new Set((principal.permissions ?? []) as string[]); - if (permissions.has('questions:deny') || permissions.has('work:deny')) { - return statePolicy('denied', 'Your current role cannot access project questions.', 'Ask a team owner for project work access.'); - } - if (!context.activeTeam || context.projects.length === 0) { - return statePolicy('requiresSetup', 'Project questions need an active team and project.', 'Create or select a team with at least one project.'); - } - const canManage = ['*', '*:*:*', 'projects:*:team', 'projects:manage:team', 'work:manage:team', 'questions:manage'].some((permission) => permissions.has(permission)); - if (!canManage) { - return { - read: 'readOnly', - create: 'readOnly', - edit: 'readOnly', - save: 'readOnly', - export: 'disabledWithReason', - reason: 'This role can inspect questions but cannot change them.', - remediation: 'Ask a team owner for project work management access.', - }; - } - return { - read: 'allowed', - create: 'allowed', - edit: 'allowed', - save: 'allowed', - export: 'disabledWithReason', - reason: 'Exports arrive with the direction-resource vertical.', - }; -} - -export function buildQuestionsPageViewModel(input: CollectionInput): QuestionsCollectionViewModel { - const { governance, knowledge, questionEntries, approvalQuestions, artifactQuestions, url } = input; - const policy = resolveQuestionsPolicy(governance.context); - const filters = filterValues(url); - const filteredQuestions = filterQuestions(questionEntries, filters); - const actions = collectionActions(policy); - const help = helpContext(url, 'collection', actions, governance.context); - const feedback = feedbackContext(url, 'Questions', governance.context); - const collection: CollectionViewModel = { - title: 'Question records', - description: 'Source content questions from the active TreeSeed workspace.', - columns: [ - { key: 'question', label: 'Question' }, - { key: 'type', label: 'Type' }, - { key: 'state', label: 'State' }, - { key: 'visibility', label: 'Visibility' }, - { key: 'related', label: 'Related' }, - ], - filters: questionCollectionFilters(filters), - rows: filteredQuestions.map((entry) => ({ - question: entry.title, - type: entry.type, - state: entry.status, - visibility: 'published', - related: workContentRelationSummary(entry), - })), - resources: filteredQuestions.map(questionResourceSummary), - emptyTitle: QUESTION_RESOURCE_SCHEMA.collection?.emptyTitle ?? 'No question content yet', - emptyDescription: filteredQuestions.length === questionEntries.length - ? QUESTION_RESOURCE_SCHEMA.collection?.emptyDescription - : 'No questions match the current filters.', - }; - const operationalCollection = operationalSignals(approvalQuestions, artifactQuestions); - return { - title: 'Questions', - description: 'List questions from content, decisions, and artifacts.', - capability: QUESTION_CAPABILITY, - schema: QUESTION_RESOURCE_SCHEMA, - collection, - operationalCollection, - help, - feedback, - actions, - navigation: workNavigation(), - breadcrumbs: [{ label: 'Work', href: '/app/work' }, { label: 'Questions' }], - permissions: permissions(policy), - policy, - }; -} - -export function buildQuestionDetailViewModel(input: DetailInput): QuestionDetailViewModel { - const { context, question, url } = input; - const policy = resolveQuestionsPolicy(context); - const actions = detailActions(policy, question); - return { - title: question?.title ?? 'Question not found', - description: question?.description ?? 'This question record is not available.', - capability: { ...QUESTION_CAPABILITY, template: 'detail' }, - schema: QUESTION_RESOURCE_SCHEMA, - question, - metadata: question ? questionMetadata(question) : [], - relatedRows: question ? relatedRows(question) : [], - help: helpContext(url, 'detail', actions, context, question), - feedback: feedbackContext(url, question?.title ?? 'Question', context, question), - actions, - navigation: workNavigation(), - breadcrumbs: [ - { label: 'Work', href: '/app/work' }, - { label: 'Questions', href: '/app/work/questions' }, - { label: question?.title ?? 'Missing question' }, - ], - permissions: permissions(policy), - policy, - notFound: !question, - }; -} - -export function buildQuestionFormViewModel(input: FormInput): QuestionFormViewModel { - const { context, question, url, mode } = input; - const policy = resolveQuestionsPolicy(context); - const actions = formActions(policy, mode); - const selectedProjectId = stringValue(url.searchParams.get('projectId'), stringValue(context.projects[0]?.id, '')); - const title = mode === 'create' ? 'New question' : question?.title ?? 'Question not found'; - return { - title, - description: mode === 'create' ? 'Create a project question content record.' : 'Edit the canonical question content record.', - capability: { ...QUESTION_CAPABILITY, template: 'settings' }, - schema: QUESTION_RESOURCE_SCHEMA, - mode, - question, - projectOptions: context.projects.map((project: any) => ({ label: stringValue(project.name ?? project.slug, project.id), value: stringValue(project.id, '') })), - selectedProjectId, - formAction: `/v1/projects/${encodeURIComponent(selectedProjectId)}/local-content/questions`, - statusMessageId: mode === 'create' ? 'question-create-status' : 'question-edit-status', - help: helpContext(url, 'settings', actions, context, question), - feedback: feedbackContext(url, title, context, question), - actions, - navigation: workNavigation(), - breadcrumbs: [ - { label: 'Work', href: '/app/work' }, - { label: 'Questions', href: '/app/work/questions' }, - { label: mode === 'create' ? 'New' : 'Edit' }, - ], - permissions: permissions(policy), - policy, - notFound: mode === 'edit' && !question, - }; -} - -export function normalizeQuestionEntry(entry: any, slugFallback = ''): QuestionDetailSource | null { - if (!entry) return null; - const data = entry.data ?? {}; - const slug = stringValue(String(entry.id ?? slugFallback).replace(/\.(mdx|md)$/u, ''), slugFallback); - return { - id: stringValue(data.id, `question:${slug}`), - slug, - title: stringValue(data.title, titleFromSlug(slug)), - description: stringValue(data.description, ''), - summary: stringValue(data.summary, ''), - status: stringValue(data.status, 'recorded'), - questionType: stringValue(data.questionType ?? data.question_type, 'strategy'), - motivation: stringValue(data.motivation, ''), - primaryContributor: relationId(data.primaryContributor ?? data.primary_contributor), - date: dateValue(data.date), - body: stringValue(entry.body, ''), - draft: Boolean(data.draft), - relatedObjectives: relationValues(data.relatedObjectives ?? data.related_objectives), - relatedBooks: relationValues(data.relatedBooks ?? data.related_books), - href: `/app/work/questions/${encodeURIComponent(slug)}`, - }; -} - -function statePolicy(state: ResolvedActionState, reason: string, remediation: string): QuestionsPolicy { - return { read: state, create: state, edit: state, save: state, export: 'disabledWithReason', reason, remediation }; -} - -function collectionActions(policy: QuestionsPolicy): ResolvedAction[] { - return [ - action(QUESTION_ACTION_IDS.create, 'New question', policy.create, '/app/work/questions/new', policy), - action(QUESTION_ACTION_IDS.export, 'Export', policy.export, undefined, { reason: 'Exports arrive with a later packaging vertical.' }), - ]; -} - -function detailActions(policy: QuestionsPolicy, question: QuestionDetailSource | null): ResolvedAction[] { - return [ - action(QUESTION_ACTION_IDS.edit, 'Edit', question ? policy.edit : 'hidden', question ? `${question.href}/edit` : undefined, policy), - action(QUESTION_ACTION_IDS.export, 'Export', question ? policy.export : 'hidden', undefined, { reason: 'Exports arrive with a later packaging vertical.' }), - ]; -} - -function formActions(policy: QuestionsPolicy, mode: 'create' | 'edit'): ResolvedAction[] { - return [ - action(QUESTION_ACTION_IDS.save, mode === 'create' ? 'Create question' : 'Save question', mode === 'create' ? policy.create : policy.save, undefined, policy), - { id: 'question.cancel', label: 'Cancel', state: 'allowed', href: '/app/work/questions', method: 'GET', confirmation: 'none', auditSensitivity: 'normal' }, - ]; -} - -function action(id: string, label: string, state: ResolvedActionState, href: string | undefined, policy: Pick): ResolvedAction { - return { - id, - label, - state, - href, - reason: state === 'allowed' || state === 'hidden' ? undefined : policy.reason, - remediation: state === 'allowed' || state === 'hidden' ? undefined : policy.remediation, - method: href ? 'GET' : 'POST', - confirmation: 'none', - auditSensitivity: 'normal', - }; -} - -function permissions(policy: QuestionsPolicy): Record { - return { - [QUESTION_ACTION_IDS.read]: policy.read, - [QUESTION_ACTION_IDS.create]: policy.create, - [QUESTION_ACTION_IDS.edit]: policy.edit, - [QUESTION_ACTION_IDS.save]: policy.save, - [QUESTION_ACTION_IDS.export]: policy.export, - }; -} - -function filterValues(url: URL) { - return { - q: stringValue(url.searchParams.get('q'), ''), - status: stringValue(url.searchParams.get('status'), ''), - questionType: stringValue(url.searchParams.get('questionType'), '') as QuestionType, - }; -} - -function filterQuestions(entries: WorkContentEntry[], filters: ReturnType): WorkContentEntry[] { - const q = filters.q.toLowerCase(); - return entries.filter((entry) => { - if (q && !`${entry.title} ${entry.summary} ${entry.description} ${entry.status} ${entry.type}`.toLowerCase().includes(q)) return false; - if (filters.status && entry.status !== filters.status) return false; - if (filters.questionType && entry.type !== filters.questionType) return false; - return true; - }); -} - -function operationalSignals(approvalQuestions: Array>, artifactQuestions: Array>): CollectionViewModel { - const rows = [ - ...approvalQuestions.map((item) => ({ - question: stringValue(item.title, 'Question decision'), - source: 'Decision', - state: stringValue(item.state, 'pending'), - target: `/app/work/decisions/${encodeURIComponent(stringValue(item.approvalId ?? item.id, ''))}`, - })), - ...artifactQuestions.map((artifact) => ({ - question: stringValue(artifact.title, 'Question artifact'), - source: 'Artifact', - state: stringValue(artifact.state, 'generated'), - target: stringValue(artifact.href, '/app/knowledge/artifacts'), - })), - ]; - return { - title: 'Question signals', - description: 'Question-like records across decisions and generated artifacts.', - columns: [ - { key: 'question', label: 'Question' }, - { key: 'source', label: 'Source' }, - { key: 'state', label: 'State' }, - { key: 'target', label: 'Target' }, - ], - rows, - emptyTitle: 'No questions found', - emptyDescription: 'Questions appear here when decisions or research artifacts include them.', - }; -} - -function helpContext(url: URL, template: 'collection' | 'detail' | 'settings', actions: ResolvedAction[], context: OperationalContext, question?: QuestionDetailSource | null): HelpContext { - const routePattern = template === 'collection' - ? '/app/work/questions' - : template === 'detail' - ? '/app/work/questions/[slug]' - : question - ? '/app/work/questions/[slug]/edit' - : '/app/work/questions/new'; - const actionTopic = actions.find((actionItem) => actionItem.state !== 'allowed' && actionItem.reason); - const visibility: HelpTopic['visibility'] = context.activeTeam ? 'team' : 'authenticated'; - const topics: HelpTopic[] = [ - { - id: 'questions', - title: 'Project questions', - summary: QUESTION_CAPABILITY.help?.summary ?? 'Questions capture project uncertainty.', - href: '/app/work/questions', - visibility, - source: 'capability', - }, - ...(actionTopic ? [{ - id: `action:${actionTopic.id}`, - title: `${actionTopic.label} availability`, - summary: [actionTopic.reason, actionTopic.remediation].filter(Boolean).join(' '), - visibility, - source: 'action-state' as const, - }] : []), - ]; - return { - capabilityId: QUESTION_CAPABILITY.id, - topicIds: ['work-content', 'questions'], - shell: 'product', - context: 'project', - resourceType: 'question', - resourceId: question?.id, - routePattern, - canonicalPath: question?.href ?? '/app/work/questions', - template, - summary: QUESTION_CAPABILITY.help?.summary, - topics, - relatedDocs: topics.map((topic, index) => ({ - topicId: topic.id, - title: topic.title, - href: topic.href ?? `${url.pathname}#${encodeURIComponent(topic.id)}`, - visibility: topic.visibility, - summary: topic.summary, - source: topic.source, - current: index === 0, - })), - relatedActions: actions, - searchScope: 'project', - searchPlaceholder: 'Search question help and action guidance', - visibility: context.activeTeam ? 'team' : 'authenticated', - feedbackType: 'question', - }; -} - -function feedbackContext(url: URL, title: string, context: OperationalContext, question?: QuestionDetailSource | null): FeedbackContext { - return { - url: url.toString(), - canonicalPath: question?.href ?? '/app/work/questions', - title, - capabilityId: QUESTION_CAPABILITY.id, - shell: 'product', - context: 'project', - teamId: context.activeTeam?.id, - projectId: context.projects[0]?.id, - resourceType: 'question', - resourceId: question?.id, - environment: 'local', - submissionEndpoint: '/v1/feedback', - allowAnonymous: false, - screenshotPolicy: 'optional', - attachmentStoragePolicy: 'private', - routePattern: question ? '/app/work/questions/[slug]' : '/app/work/questions', - policy: context.activeTeam ? 'team' : 'authenticated', - }; -} - -function workNavigation(): Array<{ label: string; href: string }> { - return [ - { label: 'Objectives', href: '/app/work/objectives' }, - { label: 'Questions', href: '/app/work/questions' }, - { label: 'Notes', href: '/app/work/notes' }, - { label: 'Proposals', href: '/app/work/proposals' }, - { label: 'Decisions', href: '/app/work/decisions' }, - ]; -} - -function questionResourceSummary(entry: WorkContentEntry): ResourceSummary { - return { - id: entry.id, - title: entry.title, - description: entry.summary || entry.description, - href: entry.href, - status: entry.status, - meta: `${entry.type} · ${workContentRelationSummary(entry)}`, - }; -} - -function questionMetadata(question: QuestionDetailSource): Array<{ key: string; value: string }> { - return [ - { key: 'Status', value: question.status }, - { key: 'Visibility', value: question.draft ? 'draft' : 'published' }, - { key: 'Question type', value: question.questionType }, - { key: 'Contributor', value: question.primaryContributor || 'not recorded' }, - { key: 'Date', value: question.date }, - { key: 'Content id', value: question.id }, - { key: 'Source slug', value: question.slug }, - ].filter((item) => item.value); -} - -function relatedRows(question: QuestionDetailSource): Array> { - return [ - ...question.relatedObjectives.map((value) => ({ kind: 'Objective', reference: value })), - ...question.relatedBooks.map((value) => ({ kind: 'Book', reference: value })), - ]; -} - -function relationValues(value: unknown): string[] { - if (Array.isArray(value)) return value.map(relationId).filter(Boolean); - const single = relationId(value); - return single ? [single] : []; -} - -function relationId(value: unknown): string { - if (typeof value === 'string') return value.replace(/^[^:]+:/u, ''); - if (value && typeof value === 'object') { - const record = value as Record; - return stringValue(record.id ?? record.slug ?? record.collection, ''); - } - return ''; -} - -function stringValue(value: unknown, fallback = ''): string { - return typeof value === 'string' && value.trim() ? value.trim() : fallback; -} - -function dateValue(value: unknown): string { - if (value instanceof Date) return value.toISOString().slice(0, 10); - if (typeof value === 'string' && value.trim()) return value.trim().slice(0, 10); - return ''; -} - -function titleFromSlug(slug: string): string { - return slug.replace(/[-_]+/gu, ' ').replace(/\b\w/gu, (match) => match.toUpperCase()); -} diff --git a/src/view-models/work-content.ts b/src/view-models/work-content.ts deleted file mode 100644 index 2f0114d6..00000000 --- a/src/view-models/work-content.ts +++ /dev/null @@ -1,108 +0,0 @@ -const workContentCollections = ['questions', 'objectives', 'notes', 'proposals', 'decisions'] as const; - -export type WorkContentCollection = typeof workContentCollections[number]; - -export interface WorkContentEntry { - id: string; - collection: WorkContentCollection; - title: string; - description: string; - summary: string; - status: string; - date: string; - type: string; - primaryContributor: string; - relations: string[]; - href: string; -} - -export async function loadWorkContentEntries(): Promise { - const content = await import(/* @vite-ignore */ 'astro:content').catch(() => null); - if (!content?.getCollection) return []; - const loader = content.getCollection as (collection: string, filter?: (entry: any) => boolean) => Promise; - const groups = await Promise.all(workContentCollections.map(async (collection) => { - try { - const entries = await loader(collection, ({ data }) => !data?.draft); - return entries.map((entry) => normalizeWorkContentEntry(collection, entry)); - } catch { - return []; - } - })); - return groups.flat().sort((left, right) => Date.parse(right.date) - Date.parse(left.date)); -} - -export function workContentEntriesFor(entries: WorkContentEntry[], collection: WorkContentCollection): WorkContentEntry[] { - return entries.filter((entry) => entry.collection === collection); -} - -export function workContentRelationSummary(entry: WorkContentEntry): string { - return entry.relations.length > 0 ? entry.relations.join(', ') : 'No linked records'; -} - -function normalizeWorkContentEntry(collection: WorkContentCollection, entry: any): WorkContentEntry { - const data = entry?.data && typeof entry.data === 'object' ? entry.data : {}; - const id = String(entry?.id ?? entry?.slug ?? data.id ?? 'content'); - return { - id, - collection, - title: stringValue(data.title, titleFromId(id)), - description: stringValue(data.description, ''), - summary: stringValue(data.summary, ''), - status: stringValue(data.status, 'recorded'), - date: dateValue(data.date), - type: typeFor(collection, data), - primaryContributor: stringValue(data.primaryContributor ?? data.primary_contributor, ''), - relations: relationsFor(collection, data), - href: `/app/work/${collection}/${encodeURIComponent(id)}`, - }; -} - -function typeFor(collection: WorkContentCollection, data: Record): string { - if (collection === 'questions') return stringValue(data.questionType ?? data.question_type, 'question'); - if (collection === 'objectives') return stringValue(data.timeHorizon ?? data.time_horizon, 'objective'); - if (collection === 'proposals') return stringValue(data.proposalType ?? data.proposal_type, 'proposal'); - if (collection === 'decisions') return stringValue(data.decisionType ?? data.decision_type, 'decision'); - return 'note'; -} - -function relationsFor(collection: WorkContentCollection, data: Record): string[] { - const relations = [ - ...relationValues(data.relatedObjectives ?? data.related_objectives, 'objective'), - ...relationValues(data.relatedQuestions ?? data.related_questions, 'question'), - ...relationValues(data.relatedNotes ?? data.related_notes, 'note'), - ...relationValues(data.relatedProposals ?? data.related_proposals, 'proposal'), - ...relationValues(data.relatedBooks ?? data.related_books, 'book'), - ]; - if (collection === 'proposals') { - relations.push(...relationValues(data.decision ? [data.decision] : [], 'decision')); - } - return relations.slice(0, 6); -} - -function relationValues(value: unknown, prefix: string): string[] { - if (!Array.isArray(value)) return []; - return value.map((item) => `${prefix}:${relationId(item)}`).filter((item) => item !== `${prefix}:`); -} - -function relationId(value: unknown): string { - if (typeof value === 'string') return value; - if (value && typeof value === 'object') { - const record = value as Record; - return String(record.id ?? record.slug ?? record.collection ?? ''); - } - return ''; -} - -function stringValue(value: unknown, fallback: string): string { - return typeof value === 'string' && value.trim() ? value.trim() : fallback; -} - -function dateValue(value: unknown): string { - if (value instanceof Date) return value.toISOString().slice(0, 10); - if (typeof value === 'string' && value.trim()) return value.trim().slice(0, 10); - return ''; -} - -function titleFromId(id: string): string { - return id.replace(/[-_]+/gu, ' ').replace(/\b\w/gu, (match) => match.toUpperCase()); -} diff --git a/src/view-models/workday.vm.ts b/src/view-models/workday.vm.ts deleted file mode 100644 index 3ff18e7b..00000000 --- a/src/view-models/workday.vm.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { - compareDatesDesc, - loadProjectBundle, - normalizeWorkdayEntry, - type OperationalContext, - type OperationalMetric, -} from './shared.js'; -import { loadAppContext } from './app-access.js'; -import { buildWorkdayProjection, type OperationalPhase, type OperationalTimelineEvent } from '../lib/market/workday-projection.js'; - -export interface WorkdayListViewModel { - context: OperationalContext; - metrics: OperationalMetric[]; - workdays: any[]; -} - -export interface WorkdayDetailViewModel extends WorkdayListViewModel { - workday: any | null; - phases: OperationalPhase[]; - timeline: OperationalTimelineEvent[]; - artifacts: any[]; - repositoryContext: any[]; - governance: OperationalTimelineEvent[]; - capacity: any; - knowledgeOutputs: any[]; - agentActivity: any[]; -} - -export async function loadWorkdayListViewModel(input: any): Promise { - const context = await loadAppContext(input); - const bundles = await Promise.all(context.projects.map((project: any) => loadProjectBundle(context, project))); - const workdays = bundles - .flatMap((bundle: any) => [ - ...bundle.workdays.map((entry: any) => normalizeWorkdayEntry(bundle.project, entry)), - ...(bundle.agents?.currentWorkday ? [normalizeWorkdayEntry(bundle.project, bundle.agents.currentWorkday, 'runtime')] : []), - ]) - .filter((entry: any, index: number, all: any[]) => all.findIndex((candidate: any) => candidate.id === entry.id) === index) - .sort((left: any, right: any) => compareDatesDesc(left.updatedAt, right.updatedAt)); - const activeCount = workdays.filter((entry: any) => !['completed', 'failed', 'rejected'].includes(String(entry.state).toLowerCase())).length; - const completedCount = workdays.filter((entry: any) => String(entry.state).toLowerCase() === 'completed').length; - - return { - context, - workdays, - metrics: [ - { label: 'Tracked workdays', value: workdays.length }, - { label: 'Active', value: activeCount, tone: activeCount ? 'info' : 'muted' }, - { label: 'Completed', value: completedCount, tone: completedCount ? 'success' : 'muted' }, - { label: 'Projects represented', value: new Set(workdays.map((entry: any) => entry.projectId)).size }, - ], - }; -} - -export async function loadWorkdayDetailViewModel(input: any, workdayId: string): Promise { - const list = await loadWorkdayListViewModel(input); - const workday = list.workdays.find((entry: any) => entry.id === workdayId || entry.recordId === workdayId) ?? null; - if (!workday || !list.context.store) { - return { - ...list, - workday, - phases: [], - timeline: [], - artifacts: [], - repositoryContext: [], - governance: [], - capacity: null, - knowledgeOutputs: [], - agentActivity: [], - }; - } - - const projection = await buildWorkdayProjection({ - store: list.context.store, - principal: list.context.principal, - projects: list.context.projects, - workdayId, - }); - - return { - ...list, - workday: projection?.workday ?? workday, - phases: projection?.phases ?? [], - timeline: projection?.timeline ?? [], - artifacts: projection?.artifacts ?? [], - repositoryContext: projection?.repositoryContext ?? [], - governance: projection?.governance ?? [], - capacity: projection?.capacity ?? null, - knowledgeOutputs: projection?.knowledgeOutputs ?? [], - agentActivity: projection?.agentActivity ?? [], - }; -} diff --git a/test/admin-package.test.ts b/test/admin-package.test.ts index ada3f928..4888e5de 100644 --- a/test/admin-package.test.ts +++ b/test/admin-package.test.ts @@ -1,42 +1,49 @@ import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs'; import { extname, join, relative, resolve } from 'node:path'; -import { createRequire } from 'node:module'; import { describe, expect, it } from 'vitest'; import adminPlugin, { ADMIN_CAPABILITIES, ADMIN_ENV_SCHEMA } from '../src/plugin'; import type { TreeseedPluginSiteContext, TreeseedSiteExtensionContribution } from '@treeseed/sdk/platform/plugin'; import { ADMIN_ROUTES } from '../src/routes'; import { DEFAULT_ADMIN_COMMERCE_PROVIDER } from '../src/commerce'; -import { - buildAdminGitHubActionsSecretDeploymentBody, - buildAdminClientEncryptedEscrowBody, - DEFAULT_SECRET_MANAGER_PROVIDERS, - describeAdminSecretCapabilityState, - describeAdminClientEncryptedEscrowStatus, -} from '../src/secret-managers'; -import { hostEncryptedPayloadToClientEscrowEnvelope } from '../src/lib/host-crypto'; - -const require = createRequire(import.meta.url); +import { DEFAULT_SECRET_MANAGER_PROVIDERS } from '../src/secret-managers'; + +const EXPECTED_ROUTES = [ + '/app', + '/app/account', + '/app/teams', + '/app/teams/new', + '/app/teams/[teamId]/edit', + '/app/teams/[teamId]/delete', + '/app/teams/[teamId]/members', + '/auth/register', + '/auth/check-email', + '/auth/confirm-email', + '/auth/sign-in', + '/auth/logout', + '/auth/forgot-password', + '/auth/reset-password', + '/auth/username', + '/auth/device/approve', + '/auth/callback/[provider]', + '/u/[username]', + '/t/[name]', + '/team-invites/[token]/accept', + '/v1/[...all]', +].sort(); function filesUnder(root: string): string[] { - const resolved = resolve(root); - if (!existsSync(resolved)) return []; - const entries: string[] = []; - for (const name of readdirSync(resolved)) { - const path = join(resolved, name); - const stat = statSync(path); - if (stat.isDirectory()) { - entries.push(...filesUnder(path)); - } else { - entries.push(relative(process.cwd(), path).replace(/\\/gu, '/')); - } - } - return entries; + if (!existsSync(root)) return []; + return readdirSync(root).flatMap((name) => { + const path = join(root, name); + return statSync(path).isDirectory() + ? filesUnder(path) + : [relative(process.cwd(), path).replace(/\\/gu, '/')]; + }); } function routePatternFromPage(path: string) { - const normalized = path.replace(/\\/gu, '/').replace(/^src\/pages/u, '').replace(/\.(astro|ts|js)$/u, ''); - const route = normalized.replace(/\/index$/u, '') || '/'; - return route; + const normalized = path.replace(/^src\/pages/u, '').replace(/\.(astro|ts)$/u, ''); + return normalized.replace(/\/index$/u, '') || '/'; } function exportTargets(value: unknown): string[] { @@ -56,365 +63,67 @@ function resolveSiteHooks(): TreeseedSiteExtensionContribution { } satisfies TreeseedPluginSiteContext); } -function readUiExportedFile(specifier: string) { - return readFileSync(require.resolve(specifier), 'utf8'); -} - -describe('@treeseed/admin package boundaries', () => { - it('registers the distributable admin route surfaces', () => { - expect(ADMIN_ROUTES).toEqual(expect.arrayContaining([ - expect.objectContaining({ pattern: '/app' }), - expect.objectContaining({ pattern: '/auth/sign-in' }), - expect.objectContaining({ pattern: '/app/commons' }), - expect.objectContaining({ pattern: '/app/commons/participants' }), - expect.objectContaining({ pattern: '/app/commons/proposals/[proposalId]' }), - expect.objectContaining({ pattern: '/app/teams/[teamId]/commerce' }), - expect.objectContaining({ pattern: '/app/teams/[teamId]/commerce/products' }), - expect.objectContaining({ pattern: '/app/teams/[teamId]/commerce/products/[productId]/governance' }), - expect.objectContaining({ pattern: '/app/teams/[teamId]/commerce/sales' }), - expect.objectContaining({ pattern: '/app/teams/[teamId]/commerce/services' }), - expect.objectContaining({ pattern: '/app/teams/[teamId]/commerce/services/[requestId]' }), - expect.objectContaining({ pattern: '/app/teams/[teamId]/commerce/capacity' }), - expect.objectContaining({ pattern: '/app/teams/[teamId]/commerce/capacity/[listingId]' }), - expect.objectContaining({ pattern: '/market' }), - expect.objectContaining({ pattern: '/team-invites/[token]/accept' }), - expect.objectContaining({ pattern: '/v1/[...all]' }), - ])); +describe('@treeseed/admin identity and team surface', () => { + it('registers exactly the retained routes and resources', () => { + const pageFiles = filesUnder('src/pages').filter((path) => /\.(astro|ts)$/u.test(path)); + expect(ADMIN_ROUTES.map((route) => route.pattern).sort()).toEqual(EXPECTED_ROUTES); + expect(pageFiles.map(routePatternFromPage).sort()).toEqual(EXPECTED_ROUTES); + expect(ADMIN_ROUTES.map((route) => route.resourcePath).sort()).toEqual( + pageFiles.map((path) => path.replace(/^src\//u, '')).sort(), + ); }); - it('contributes UI package styles from the admin plugin', () => { - const siteHooks = resolveSiteHooks(); - const css = siteHooks.customCss ?? []; - expect(css).toContain('@treeseed/ui/styles/tokens.css'); - expect(css).toContain('@treeseed/ui/styles/app-shell.css'); - expect(css).toContain('@treeseed/ui/styles/market.css'); - expect(ADMIN_CAPABILITIES.ecommerce.bundled).toBe(false); - expect(siteHooks.envSchema).toBe(ADMIN_ENV_SCHEMA); - expect(Object.keys(ADMIN_ENV_SCHEMA)).toEqual(expect.arrayContaining([ - 'TREESEED_BETTER_AUTH_SECRET', - 'TREESEED_WEB_SERVICE_SECRET', - 'TREESEED_MARKET_API_BASE_URL', - 'TREESEED_ADMIN_SECRET_MANAGER_PROVIDER', - ])); + it('keeps navigation limited to identity and team management', () => { + const appLayout = readFileSync('src/layouts/TreeseedAppLayout.astro', 'utf8'); + for (const target of ['/app/', '/app/account', '/app/teams', '/app/teams/new']) { + expect(appLayout).toContain(target); + } + for (const target of ['/app/projects', '/app/capacity', '/app/work', '/app/knowledge', '/market', '/cart', '/seller']) { + expect(appLayout).not.toContain(target); + } }); - it('uses @treeseed/ui exports without importing root source paths', () => { + it('uses public package boundaries and retained UI styles', () => { const sources = filesUnder('src') .filter((path) => /\.(astro|tsx?|jsx?|mjs|cjs)$/u.test(path)) .map((path) => [path, readFileSync(path, 'utf8')] as const); expect(sources.some(([, source]) => source.includes('@treeseed/ui/'))).toBe(true); for (const [path, source] of sources) { - expect(source, path).not.toMatch(/from ['"](?:\.\.\/)+src\//u); - expect(source, path).not.toMatch(/from ['"]src\//u); expect(source, path).not.toMatch(/packages\/(?:ui|core|sdk|api)\/src/u); expect(source, path).not.toMatch(/(?:from|import)\s*['"](?:\.\.\/){3,}src\//u); } + const css = resolveSiteHooks().customCss ?? []; + expect(css).toContain('@treeseed/ui/styles/app-shell.css'); + expect(css).not.toContain('@treeseed/ui/styles/operations.css'); + expect(css).not.toContain('@treeseed/ui/styles/market.css'); + expect(ADMIN_CAPABILITIES.ecommerce.bundled).toBe(false); + expect(Object.keys(ADMIN_ENV_SCHEMA)).toContain('TREESEED_BETTER_AUTH_SECRET'); }); - it('loads complete UI style bundles in public and app layouts', () => { - const appLayout = readFileSync('src/layouts/TreeseedAppLayout.astro', 'utf8'); - for (const style of [ - '@treeseed/ui/styles/tokens.css', - '@treeseed/ui/styles/theme.css', - '@treeseed/ui/styles/ui.css', - '@treeseed/ui/styles/forms.css', - '@treeseed/ui/styles/app-shell.css', - '@treeseed/ui/styles/app-controls.css', - '@treeseed/ui/styles/auth.css', - '@treeseed/ui/styles/operations.css', - ]) { - expect(appLayout).toContain(style); - } - - const publicLayout = readFileSync('src/layouts/TreeseedPublicLayout.astro', 'utf8'); - for (const style of [ - '@treeseed/ui/styles/tokens.css', - '@treeseed/ui/styles/theme.css', - '@treeseed/ui/styles/ui.css', - '@treeseed/ui/styles/forms.css', - '@treeseed/ui/styles/app-shell.css', - '@treeseed/ui/styles/site.css', - '@treeseed/ui/styles/market.css', - ]) { - expect(publicLayout).toContain(style); - } - }); - - it('uses UI-owned app controls and rich markdown editor on project pages', () => { - const appControls = readUiExportedFile('@treeseed/ui/styles/app-controls.css'); - const forms = readUiExportedFile('@treeseed/ui/styles/forms.css'); - const projectCreate = readFileSync('src/pages/app/projects/new.astro', 'utf8'); - const projectSettings = readFileSync('src/pages/app/projects/[projectId]/settings.astro', 'utf8'); - const appLayout = readFileSync('src/layouts/TreeseedAppLayout.astro', 'utf8'); - - for (const marker of ['.ts-icon-button', '.ts-link-button', '.ts-default-label', '.ts-project-lineage-card']) { - expect(appControls).toContain(marker); - } - expect(forms).toContain('.ts-rich-markdown-editor'); - expect(appLayout).toContain('class="ts-icon-button"'); - for (const page of [projectCreate, projectSettings]) { - expect(page).toContain('data-rich-markdown-editor'); - expect(page).toContain('initializeRichMarkdownEditors'); - expect(page).toContain("@treeseed/ui/react"); - expect(page).not.toContain('core-objective-mdx-editor.tsx'); - expect(page).not.toContain('ts-core-objective-editor'); - } - }); - - it('keeps route registration exact for all admin-owned pages', () => { - const pageRoutes = filesUnder('src/pages') - .filter((path) => /\.(astro|ts)$/u.test(path)) - .map(routePatternFromPage) - .sort(); - const registeredRoutes = ADMIN_ROUTES.map((route) => route.pattern).sort(); - const registeredResources = ADMIN_ROUTES.map((route) => route.resourcePath).filter((path): path is string => typeof path === 'string').sort(); - const pageResources = filesUnder('src/pages') - .filter((path) => /\.(astro|ts)$/u.test(path)) - .map((path) => path.replace(/^src\//u, '')) - .sort(); - - expect(registeredRoutes).toEqual(pageRoutes); - expect(registeredResources).toEqual(pageResources); - for (const resourcePath of registeredResources) { - expect(existsSync(resolve(process.cwd(), 'src', resourcePath)), resourcePath).toBe(true); - } - }); - - it('renders capacity runtime execution visibility through SDK projections only', () => { - const runtimePage = readFileSync('src/pages/app/capacity/runtime.astro', 'utf8'); - expect(runtimePage).toContain('@treeseed/sdk/agent-capacity'); - expect(runtimePage).toContain('summarizeExecutionProviderVisibility'); - expect(runtimePage).toContain("label: 'Execution'"); - expect(runtimePage).toContain("label: 'External'"); - expect(runtimePage).toContain("label: 'Capabilities'"); - expect(runtimePage).toContain("label: 'Artifacts'"); - expect(runtimePage).not.toContain('packages/api'); - expect(runtimePage).not.toContain('provider/runner'); + it('retains domain facades without route-specific UI dependencies', () => { + const packageJson = JSON.parse(readFileSync('package.json', 'utf8')) as { dependencies?: Record }; + expect(packageJson.dependencies).not.toHaveProperty('@mdxeditor/editor'); + expect(packageJson.dependencies).not.toHaveProperty('libsodium-wrappers-sumo'); + expect(packageJson.dependencies).not.toHaveProperty('@treeseed/api'); + expect(DEFAULT_ADMIN_COMMERCE_PROVIDER.id).toBe('none'); + expect(DEFAULT_SECRET_MANAGER_PROVIDERS[0]?.id).toBe('treeseed-local-encrypted'); + expect(readFileSync('src/lib/market/api-client.ts', 'utf8')).toContain('getCommerceVendorSalesSummary'); }); - it('builds declarations for every exported JavaScript module', () => { + it('builds declarations and valid package exports', () => { const distFiles = filesUnder('dist'); - const javascriptModules = distFiles - .filter((path) => extname(path) === '.js') - .map((path) => path.slice('dist/'.length, -'.js'.length)); - const declarations = new Set(distFiles - .filter((path) => path.endsWith('.d.ts')) - .map((path) => path.slice('dist/'.length, -'.d.ts'.length))); - const missingDeclarations = javascriptModules.filter((modulePath) => !declarations.has(modulePath)); - - expect(missingDeclarations).toEqual([]); - }); - - it('ships package-local verify, release gate, and publish workflows', () => { - const verifyWorkflow = readFileSync('.github/workflows/verify.yml', 'utf8'); - const releaseGateWorkflow = readFileSync('.github/workflows/release-gate.yml', 'utf8'); - const publishWorkflow = readFileSync('.github/workflows/publish.yml', 'utf8'); - const packageManifest = readFileSync('treeseed.package.yaml', 'utf8'); - const checkTagScript = readFileSync('scripts/assert-release-tag-version.ts', 'utf8'); - const publishScript = readFileSync('scripts/publish-package.ts', 'utf8'); - - expect(packageManifest).toContain('workflow: verify.yml'); - expect(verifyWorkflow).toContain('npm run verify:direct'); - expect(releaseGateWorkflow).toContain('npm run verify:local'); - expect(releaseGateWorkflow).not.toContain('trsd hosting apply'); - expect(existsSync('.github/workflows/deploy.yml')).toBe(false); - expect(publishWorkflow).toContain("startsWith(github.ref, 'refs/tags/')"); - expect(publishWorkflow).toContain("!contains(github.ref_name, '-')"); - expect(publishWorkflow).toContain('npm publish --access public'); - expect(publishWorkflow).toContain('gh release create "${GITHUB_REF_NAME}"'); - expect(checkTagScript).toContain('^\\d+\\.\\d+\\.\\d+$'); - expect(publishScript).toContain('Refusing to publish'); - expect(publishScript).toContain('process.exit(result.status ?? 1)'); - }); - - it('keeps package exports and dependencies release-ready', () => { - const packageJson = JSON.parse(readFileSync('package.json', 'utf8')) as { - dependencies?: Record; - devDependencies?: Record; - peerDependencies?: Record; - peerDependenciesMeta?: Record; - exports?: Record; - }; - const targets = Object.values(packageJson.exports ?? {}).flatMap(exportTargets); - const missingTargets = targets + const declarations = new Set(distFiles.filter((path) => path.endsWith('.d.ts')).map((path) => path.slice(5, -5))); + const missing = distFiles.filter((path) => extname(path) === '.js').map((path) => path.slice(5, -3)).filter((path) => !declarations.has(path)); + expect(missing).toEqual([]); + const packageJson = JSON.parse(readFileSync('package.json', 'utf8')) as { exports?: Record }; + const missingTargets = Object.values(packageJson.exports ?? {}).flatMap(exportTargets) .filter((target) => !target.includes('*')) - .filter((target) => !existsSync(resolve(process.cwd(), target))); - + .filter((target) => !existsSync(resolve(target))); expect(missingTargets).toEqual([]); - expect(packageJson.dependencies).not.toHaveProperty('@treeseed/api'); - expect(packageJson.dependencies).not.toHaveProperty('@treeseed/agent'); - expect(packageJson.peerDependencies).not.toHaveProperty('@treeseed/api'); - expect(packageJson.peerDependenciesMeta?.['@treeseed/api']).toBeUndefined(); - expect(packageJson.devDependencies).not.toHaveProperty('@treeseed/api'); - expect(packageJson.dependencies).toHaveProperty('@mdxeditor/editor'); - }); - - it('falls back to local encrypted secrets and does not require commerce', async () => { - expect(DEFAULT_SECRET_MANAGER_PROVIDERS[0]?.id).toBe('treeseed-local-encrypted'); - expect(DEFAULT_SECRET_MANAGER_PROVIDERS.map((provider) => provider.id)).toEqual(expect.arrayContaining([ - 'treeseed-local-encrypted', - 'github-actions', - 'cloudflare', - 'railway', - ])); - - const checkoutUrl = await DEFAULT_ADMIN_COMMERCE_PROVIDER.checkoutUrl?.({}, { mode: 'one_time' }); - const entitlement = await DEFAULT_ADMIN_COMMERCE_PROVIDER.resolveEntitlement?.({}, { offerMode: 'free' }); - expect(checkoutUrl).toBeNull(); - expect(entitlement?.allowed).toBe(true); }); - it('builds client-encrypted escrow payloads and safe status labels', () => { - const body = buildAdminClientEncryptedEscrowBody({ - id: 'escrow-1', - secretId: 'secret-1', - name: 'TREESEED_PROJECT_SECRET', - secretClass: 'customer_project_secret', - ciphertext: 'base64-ciphertext', - ciphertextRef: 'api://projects/project-1/secrets/escrow/escrow-1', - algorithm: 'xchacha20-poly1305', - nonce: 'base64-nonce', - salt: 'base64-salt', - kdf: 'argon2id', - kdfParams: { memoryKiB: 65536, iterations: 3, parallelism: 1 }, - wrappingKeyId: 'client-key-1', - encryptionVersion: 'v1', - deploymentIntent: { targetMode: 'github_actions_secret_enclave' }, - }); - - expect(body).toMatchObject({ - ciphertext: 'base64-ciphertext', - recoveryPolicy: 'reentry_required', - }); - expect(JSON.stringify(body)).not.toContain('passphrase'); - expect(() => buildAdminClientEncryptedEscrowBody({ - ...body, - passphrase: 'do-not-send', - } as any)).toThrow(); - expect(describeAdminClientEncryptedEscrowStatus({ - ...body, - status: 'migrated', - migratedTo: 'github_actions_secret_enclave', - })).toMatchObject({ - label: 'migrated', - escrowed: false, - migrated: true, - }); - expect(buildAdminGitHubActionsSecretDeploymentBody({ - repository: 'owner/repo', - scope: 'environment', - environment: 'production', - secretName: 'TREESEED_SECRET', - encryptedValue: 'github-encrypted-value', - keyId: 'key-1', - })).toMatchObject({ - custodyMode: 'github_actions_secret_enclave', - encryptedValue: 'github-encrypted-value', - }); - expect(() => buildAdminGitHubActionsSecretDeploymentBody({ - repository: 'owner/repo', - scope: 'environment', - environment: 'production', - secretName: 'TREESEED_SECRET', - encryptedValue: 'github-encrypted-value', - keyId: 'key-1', - rawSecret: 'do-not-send', - } as any)).toThrow(); - expect(describeAdminSecretCapabilityState({ - custodyMode: 'host_env_injection', - })).toMatchObject({ - label: 'host-injected', - hostInjected: true, - }); - expect(describeAdminSecretCapabilityState({ - custodyMode: 'client_encrypted_escrow', - id: 'escrow-1', - secretId: 'secret-1', - ciphertextRef: 'api://projects/project-1/secrets/escrow/escrow-1', - algorithm: 'xchacha20-poly1305', - wrappingKeyId: 'client-key-1', - expiresAt: '2000-01-01T00:00:00.000Z', - })).toMatchObject({ - label: 're-entry required', - reentryRequired: true, - }); - const hostEnvelope = hostEncryptedPayloadToClientEscrowEnvelope({ - version: 1, - algorithm: 'secretbox', - kdf: { algorithm: 'argon2id', opsLimit: 2, memLimit: 8192 }, - salt: 'base64-salt', - nonce: 'base64-nonce', - ciphertext: 'base64-ciphertext', - }, { - id: 'host-escrow-1', - secretId: 'host-secret-1', - ciphertextRef: 'admin://teams/team-1/hosts/web/draft/credentials', - wrappingKeyId: 'admin-sensitive-unlock-passphrase', - deploymentIntent: { targetMode: 'host_env_injection' }, - }); - expect(hostEnvelope).toMatchObject({ - ciphertext: 'base64-ciphertext', - kdf: 'argon2id', - deploymentIntent: { targetMode: 'host_env_injection' }, - }); - expect(JSON.stringify(hostEnvelope)).not.toContain('passphrase-value'); - }); - - it('requires a host commerce provider for commercial offer modes', async () => { - for (const mode of ['one_time', 'one_time_current_version', 'subscription', 'subscription_updates', 'professional_hosting', 'scoped_contract'] as const) { - const entitlement = await DEFAULT_ADMIN_COMMERCE_PROVIDER.resolveEntitlement?.({}, { offerMode: mode }); - expect(entitlement?.allowed, mode).toBe(false); - expect(entitlement?.checkoutUrl, mode).toBeNull(); - expect(entitlement?.reason, mode).toContain('commerce provider'); - } - }); - - it('does not bundle payment ecommerce implementation', () => { - const packageJson = JSON.parse(readFileSync('package.json', 'utf8')) as { - dependencies?: Record; - devDependencies?: Record; - peerDependencies?: Record; - }; - const sources = filesUnder('src') - .filter((path) => /\.(astro|tsx?|jsx?|mjs|cjs)$/u.test(path)) - .map((path) => [path, readFileSync(path, 'utf8')] as const); - const paymentImplementationTerms = /\b(checkout session|payment intent|seller payout|application fee|webhook secret)\b/iu; - const offenders = sources - .filter(([, source]) => paymentImplementationTerms.test(source) || /from ['"](?:stripe|@stripe\/stripe-js)['"]/u.test(source)) - .map(([path]) => path); - const apiClient = readFileSync('src/lib/market/api-client.ts', 'utf8'); - - expect(packageJson.dependencies).not.toHaveProperty('stripe'); - expect(packageJson.dependencies).not.toHaveProperty('@stripe/stripe-js'); - expect(packageJson.devDependencies).not.toHaveProperty('stripe'); - expect(packageJson.peerDependencies).not.toHaveProperty('stripe'); - expect(offenders).toEqual([]); - expect(apiClient).toContain('getCommerceVendorSalesSummary'); - expect(apiClient).toContain('getCommonsSummary'); - expect(apiClient).toContain('listCommonsProposals'); - expect(apiClient).toContain('stewardDecisionForCommonsProposal'); - expect(apiClient).toContain('backfillCommonsParticipants'); - expect(apiClient).toContain('getCommerceVendorMonitoring'); - expect(apiClient).toContain('listCommerceMarketplaceProducts'); - expect(apiClient).toContain('getCommerceOwnershipWorkflow'); - expect(apiClient).toContain('updateCommerceOwnershipRecord'); - expect(apiClient).toContain('createCommerceSuccessionEvent'); - expect(apiClient).toContain('createCommerceOrderRefund'); - expect(apiClient).toContain('fulfillCommerceOrderItemArtifact'); - expect(apiClient).toContain('listCommerceServiceRequests'); - expect(apiClient).toContain('createCommerceServiceQuote'); - expect(apiClient).not.toContain('checkoutCommerceServiceContract'); - expect(apiClient).toContain('fulfillCommerceServiceContract'); - expect(apiClient).toContain('listCommerceCapacityListings'); - expect(apiClient).toContain('createCommerceCapacityListing'); - expect(apiClient).toContain('submitCommerceCapacityListing'); - expect(apiClient).toContain('approveCommerceCapacityListing'); - expect(apiClient).toContain('listCommerceCapacityListingInquiries'); - expect(apiClient).toContain('approveCommerceCapacityInquiryForScoping'); - expect(DEFAULT_ADMIN_COMMERCE_PROVIDER.id).toBe('none'); - }); - - it('does not own a hostable site manifest', () => { - expect(existsSync(resolve(process.cwd(), 'treeseed.site.yaml'))).toBe(false); + it('keeps hosted deployment suspended', () => { + expect(existsSync('.github/workflows/deploy.yml')).toBe(false); + expect(readFileSync('.github/workflows/release-gate.yml', 'utf8')).not.toContain('trsd hosting apply'); }); }); From 4b188616b6bf06df47119608aa1c5584078cc26e Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Thu, 16 Jul 2026 14:52:43 -0400 Subject: [PATCH 005/315] build(ui): sync package dependency references Changes: - Updates 52 files across ui: 22, config: 17, source: 8, build: 2, tests: 2, docs: 1. - Touches README.md, guarantees/user/account/delete-user.guarantee.yaml, guarantees/user/account/edit-account-settings.guarantee.yaml, guarantees/user/account/manage-appearance.guarantee.yaml, guarantees/user/account/manage-notifications.guarantee.yaml, guarantees/user/account/manage-sessions.guarantee.yaml, .... - Plans package version/tag 0.12.59-dev.staging.20260716T154320Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/ui: github:treeseed-ai/ui#0f10f2a452d570eb3d4aa31a246c62f3adf49aa2 -> github:treeseed-ai/ui#2d626565a8cfce92efa3c7e102d27106d0145039 - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#42d9e8308e1eb7bdb31a6d204e6b0aa7358e775a -> github:treeseed-ai/sdk#14cef4cbec20b1224be1d0daa1a798c206c69987 - dependencies.@treeseed/core: github:treeseed-ai/core#92947586ed8829b36921018c61d81a2f655f0410 -> github:treeseed-ai/core#fb8bcbac2144d9a814169142d3bdebea1a14ded1 --- README.md | 6 +- .../user/account/delete-user.guarantee.yaml | 6 +- .../edit-account-settings.guarantee.yaml | 4 +- .../account/manage-appearance.guarantee.yaml | 6 +- .../manage-notifications.guarantee.yaml | 47 ++ .../account/manage-sessions.guarantee.yaml | 6 +- .../account/scenes/delete-user.scene.yaml | 6 +- .../scenes/manage-appearance.scene.yaml | 6 +- .../scenes/manage-notifications.scene.yaml | 83 +++ .../account/scenes/manage-sessions.scene.yaml | 6 +- .../account/view-user-profile.guarantee.yaml | 4 +- .../auth/forgot-reset-password.guarantee.yaml | 4 +- .../user/auth/register-user.guarantee.yaml | 4 +- .../user/auth/scenes/register-user.scene.yaml | 10 +- .../user/auth/user-login.guarantee.yaml | 4 +- .../user/auth/user-logout.guarantee.yaml | 4 +- .../user/auth/verify-email.guarantee.yaml | 4 +- guarantees/verifiers/ui.verifiers.yaml | 5 + package-lock.json | 22 +- package.json | 6 +- src/layouts/TreeseedAppLayout.astro | 21 +- src/lib/auth/account.ts | 7 - src/lib/auth/csrf.ts | 26 + src/lib/auth/flow.ts | 4 +- src/lib/market/api-client.ts | 28 + src/middleware.ts | 29 +- src/pages/app/account.astro | 489 ------------------ src/pages/app/account/appearance.astro | 19 + src/pages/app/account/delete.astro | 19 + src/pages/app/account/index.astro | 20 + src/pages/app/account/notifications.astro | 18 + src/pages/app/account/sessions.astro | 18 + src/pages/app/teams/[teamId]/delete.astro | 4 + src/pages/app/teams/[teamId]/edit.astro | 4 + src/pages/app/teams/[teamId]/members.astro | 6 +- src/pages/app/teams/new.astro | 4 + src/pages/auth/callback/[provider].ts | 19 +- src/pages/auth/confirm-email.astro | 21 +- src/pages/auth/device/approve.astro | 69 +-- src/pages/auth/forgot-password.astro | 15 +- src/pages/auth/logout.astro | 30 -- src/pages/auth/logout.ts | 21 + src/pages/auth/register.astro | 147 +----- src/pages/auth/reset-password.astro | 18 +- src/pages/auth/username.astro | 40 +- src/pages/u/[username].astro | 19 +- src/pages/v1/[...all].ts | 26 +- src/plugin.ts | 4 +- src/routes.ts | 86 ++- src/view-models/account-settings.ts | 120 +++++ test/admin-package.test.ts | 16 +- test/shims/sdk-platform-plugin.ts | 27 + 52 files changed, 734 insertions(+), 903 deletions(-) create mode 100644 guarantees/user/account/manage-notifications.guarantee.yaml create mode 100644 guarantees/user/account/scenes/manage-notifications.scene.yaml create mode 100644 src/lib/auth/csrf.ts delete mode 100644 src/pages/app/account.astro create mode 100644 src/pages/app/account/appearance.astro create mode 100644 src/pages/app/account/delete.astro create mode 100644 src/pages/app/account/index.astro create mode 100644 src/pages/app/account/notifications.astro create mode 100644 src/pages/app/account/sessions.astro delete mode 100644 src/pages/auth/logout.astro create mode 100644 src/pages/auth/logout.ts create mode 100644 src/view-models/account-settings.ts diff --git a/README.md b/README.md index f726852d..753644c5 100644 --- a/README.md +++ b/README.md @@ -14,13 +14,15 @@ Add `@treeseed/admin/plugin` to the host `treeseed.site.yaml`, use the config he ## Current route surface -- `/app` and `/app/account` +- `/app` and focused account routes for Identity, Sessions, Notifications, Appearance, and Delete - `/app/teams`, team creation, edit, delete, membership, and active-team selection - registration, verification, sign-in/out, recovery, OAuth callback, username, and device approval - `/u/[username]` and `/t/[name]` identity-only public profiles - invitation acceptance and the shared `/v1/[...all]` API facade -`ADMIN_ROUTES` is exported from `@treeseed/admin/routes` and is tested against the package page tree. There are no project, capacity, host, work, knowledge, catalog, seller, commerce, or Markdown-preview routes and no compatibility redirects for them. +`ADMIN_ROUTES` and `ADMIN_SUPPORT_ROUTES` are exported from `@treeseed/admin/routes`, use the SDK route-capability contract, and are tested against the package page tree. Account routes contain only focused controllers and standardized UI-package composition. There are no project, capacity, host, work, knowledge, catalog, seller, commerce, or Markdown-preview routes and no compatibility redirects for them. + +Browser mutations use one double-submit CSRF contract at the cookie-to-bearer boundary. Registration checks both permanent username availability and privacy-safe email usability. Provider state/nonce/PKCE, account policy, notifications, personal themes, and deletion cleanup remain API-owned; Admin owns only session glue and focused view models. ## Preserved non-UI contracts diff --git a/guarantees/user/account/delete-user.guarantee.yaml b/guarantees/user/account/delete-user.guarantee.yaml index 3de8964f..f22e643b 100644 --- a/guarantees/user/account/delete-user.guarantee.yaml +++ b/guarantees/user/account/delete-user.guarantee.yaml @@ -6,7 +6,7 @@ subtype: account journey: Delete User ownerPackage: "@treeseed/admin" summary: Perform a destructive account removal with ownership and membership checks; needs policy around teams projects content and provider-owned auth records. -status: active +status: planned dependencies: journeys: - 4 @@ -38,7 +38,7 @@ scene: acceptance: true demo: true training: true - entryRoute: /app/account + entryRoute: /app/account/delete componentContract: destructive-confirmation service journey expectedEvidence: - playwright_trace @@ -73,4 +73,4 @@ notes: surface: admin-ui run: timeoutSeconds: 300 - requiredForRelease: true + requiredForRelease: false diff --git a/guarantees/user/account/edit-account-settings.guarantee.yaml b/guarantees/user/account/edit-account-settings.guarantee.yaml index 82bfa283..074bfd51 100644 --- a/guarantees/user/account/edit-account-settings.guarantee.yaml +++ b/guarantees/user/account/edit-account-settings.guarantee.yaml @@ -6,7 +6,7 @@ subtype: account journey: Edit Account Settings ownerPackage: "@treeseed/admin" summary: Edit user profile preferences owned by the admin/account surface; persistence should live in the API or auth metadata and not in root Market-only state. -status: active +status: planned dependencies: journeys: - 4 @@ -73,4 +73,4 @@ notes: surface: admin-ui run: timeoutSeconds: 300 - requiredForRelease: true + requiredForRelease: false diff --git a/guarantees/user/account/manage-appearance.guarantee.yaml b/guarantees/user/account/manage-appearance.guarantee.yaml index 5bd7c6de..e04693ed 100644 --- a/guarantees/user/account/manage-appearance.guarantee.yaml +++ b/guarantees/user/account/manage-appearance.guarantee.yaml @@ -6,7 +6,7 @@ subtype: account journey: Manage Appearance ownerPackage: "@treeseed/admin" summary: Set theme and interface preferences for the admin shell; should use reusable UI/theme tokens and persist per user where available. -status: active +status: planned dependencies: journeys: - 4 @@ -38,7 +38,7 @@ scene: acceptance: true demo: true training: true - entryRoute: /app/account + entryRoute: /app/account/appearance componentContract: record-modal-form service journey expectedEvidence: - playwright_trace @@ -73,4 +73,4 @@ notes: surface: admin-ui run: timeoutSeconds: 300 - requiredForRelease: true + requiredForRelease: false diff --git a/guarantees/user/account/manage-notifications.guarantee.yaml b/guarantees/user/account/manage-notifications.guarantee.yaml new file mode 100644 index 00000000..4556d1ae --- /dev/null +++ b/guarantees/user/account/manage-notifications.guarantee.yaml @@ -0,0 +1,47 @@ +schemaVersion: treeseed.guarantee/v1 +id: guarantee.user.account.manage-notifications.008 +journeyIndex: 8 +type: user +subtype: account +journey: Manage Notifications +ownerPackage: "@treeseed/admin" +summary: Configure global content-type notification preferences, exact per-project replacements, and one email cadence without weakening project authorization. +status: planned +dependencies: + journeys: [4] + guarantees: [guarantee.user.auth.user-login.004] +actors: + allowed: [verified_user] + forbidden: [anonymous_user, unauthorized_user] +devices: + required: [desktop_chromium, mobile_chromium] +gates: [core] +preconditions: + fixtures: [integrated_treeseed_project] + notes: + - Keep planned until the UI scene and API verifier produce repeatable local database and delivery evidence. +scene: + required: true + manifest: ./scenes/manage-notifications.scene.yaml + mode: { acceptance: true, demo: true, training: true } + entryRoute: /app/account/notifications + componentContract: notification-preference-panel + expectedEvidence: [playwright_trace, scene_video, screenshot_on_failure, console_log, network_log] +api: + required: true + verifierRefs: [api.auth.notifications] +content: { required: false, verifierRefs: [] } +audit: { required: false, verifierRefs: [] } +negativeCases: + - id: anonymous-denied + actor: anonymous_user + verifierRefs: [api.auth.me.requires-user] +evidence: + required: [playwright_trace, scene_video, api_verification_log] + optional: [mailpit_message] +notes: + - Proves replacement inheritance, project authorization filtering, immediate in-app visibility, and independent email cadence. +surface: admin-ui +run: + timeoutSeconds: 300 + requiredForRelease: false diff --git a/guarantees/user/account/manage-sessions.guarantee.yaml b/guarantees/user/account/manage-sessions.guarantee.yaml index 7229dabb..85c556be 100644 --- a/guarantees/user/account/manage-sessions.guarantee.yaml +++ b/guarantees/user/account/manage-sessions.guarantee.yaml @@ -6,7 +6,7 @@ subtype: account journey: Manage Sessions ownerPackage: "@treeseed/admin" summary: List and revoke active sessions through the auth/session facade; this may be missing if the selected auth provider does not expose session management yet. -status: active +status: planned dependencies: journeys: - 4 @@ -38,7 +38,7 @@ scene: acceptance: true demo: true training: true - entryRoute: /app/account + entryRoute: /app/account/sessions componentContract: record-operations service journey expectedEvidence: - playwright_trace @@ -73,4 +73,4 @@ notes: surface: admin-ui run: timeoutSeconds: 300 - requiredForRelease: true + requiredForRelease: false diff --git a/guarantees/user/account/scenes/delete-user.scene.yaml b/guarantees/user/account/scenes/delete-user.scene.yaml index d79eb092..17dadd2a 100644 --- a/guarantees/user/account/scenes/delete-user.scene.yaml +++ b/guarantees/user/account/scenes/delete-user.scene.yaml @@ -80,15 +80,15 @@ workflow: - id: open-entry-route title: Open Delete User action: - goto: /app/account + goto: /app/account/delete expect: - urlIncludes: /app/account + urlIncludes: /app/account/delete - id: inspect-service-surface title: Inspect Delete User service surface action: keyboard: Tab expect: - urlIncludes: /app/account + urlIncludes: /app/account/delete chapters: [] overlays: [] diagrams: [] diff --git a/guarantees/user/account/scenes/manage-appearance.scene.yaml b/guarantees/user/account/scenes/manage-appearance.scene.yaml index e6d4764b..a5c03d78 100644 --- a/guarantees/user/account/scenes/manage-appearance.scene.yaml +++ b/guarantees/user/account/scenes/manage-appearance.scene.yaml @@ -80,15 +80,15 @@ workflow: - id: open-entry-route title: Open Manage Appearance action: - goto: /app/account + goto: /app/account/appearance expect: - urlIncludes: /app/account + urlIncludes: /app/account/appearance - id: inspect-service-surface title: Inspect Manage Appearance service surface action: keyboard: Tab expect: - urlIncludes: /app/account + urlIncludes: /app/account/appearance chapters: [] overlays: [] diagrams: [] diff --git a/guarantees/user/account/scenes/manage-notifications.scene.yaml b/guarantees/user/account/scenes/manage-notifications.scene.yaml new file mode 100644 index 00000000..694a091a --- /dev/null +++ b/guarantees/user/account/scenes/manage-notifications.scene.yaml @@ -0,0 +1,83 @@ +schemaVersion: treeseed.scene/v1 +id: user.account.manage-notifications.008 +title: Manage Notifications +description: Configure canonical account notification preferences and capture reviewable evidence. +audience: [operator, evaluator] +journey: + kind: service + proves: + - Notification cadence is independent from immediate in-app visibility. + - Global content types apply unless an authorized project exact-replacement override is selected. + - The notification preference implementation is the shared UI-package component. + minimumSteps: 4 + requiresInteractiveAction: true + consumesState: + - { key: auth.owner, kind: user } +mode: { test: true, demo: true, training: true } +target: + app: market + environment: local + baseUrl: auto + browser: chromium + viewport: { width: 1600, height: 900 } +devices: + defaultProfile: desktop_chromium + profiles: + - id: desktop_chromium + title: Desktop Chromium + orientation: landscape + viewport: { width: 1600, height: 900 } + video: { width: 1600, height: 900 } + output: { width: 1920, height: 1080 } + deviceScaleFactor: 1 + isMobile: false + hasTouch: false + - id: mobile_chromium + title: Mobile Chromium + orientation: portrait + viewport: { width: 390, height: 844 } + video: { width: 390, height: 844 } + output: { width: 390, height: 844 } + deviceScaleFactor: 2 + isMobile: true + hasTouch: true +setup: + dev: { required: true, reuseExisting: true } + auth: { role: owner, required: true } +artifacts: { trace: true, video: true, screenshots: true, console: true, network: true, timeline: true, appLogs: true } +workflow: + - id: open-notifications + title: Open notification preferences + action: { goto: /app/account/notifications } + expect: { urlIncludes: /app/account/notifications, text: Notification preferences } + - id: select-weekly + title: Select weekly email cadence + action: { click: { role: radio, name: Weekly } } + expect: { text: In-app notifications remain immediate. } + - id: select-questions + title: Select questions globally + action: { click: { role: checkbox, name: Questions } } + expect: { text: These choices apply to every project } + - id: save-preferences + title: Save notification preferences + action: { click: { role: button, name: Save notification preferences } } + expect: { urlIncludes: /app/account/notifications, text: Notification preferences saved. } +chapters: [] +overlays: [] +diagrams: [] +render: + remotion: + composition: treeseed-training-default + output: { format: mp4, fps: 30, resolution: { width: 1920, height: 1080 } } + capture: + viewport: { width: 1600, height: 900 } + video: { width: 1600, height: 900 } + evidenceFit: fixed-browser +runtime: + mode: training + timeouts: { sceneSeconds: 300, chapterSeconds: 120, stepSeconds: 60 } + checkpoints: { enabled: true, defaultResumable: true, everyStep: true } + progress: { heartbeatSeconds: 15 } + failure: { continueOnFailure: false } +training: {} +visualAudit: { enabled: false } diff --git a/guarantees/user/account/scenes/manage-sessions.scene.yaml b/guarantees/user/account/scenes/manage-sessions.scene.yaml index d68decf5..cf3c65a7 100644 --- a/guarantees/user/account/scenes/manage-sessions.scene.yaml +++ b/guarantees/user/account/scenes/manage-sessions.scene.yaml @@ -80,15 +80,15 @@ workflow: - id: open-entry-route title: Open Manage Sessions action: - goto: /app/account + goto: /app/account/sessions expect: - urlIncludes: /app/account + urlIncludes: /app/account/sessions - id: inspect-service-surface title: Inspect Manage Sessions service surface action: keyboard: Tab expect: - urlIncludes: /app/account + urlIncludes: /app/account/sessions chapters: [] overlays: [] diagrams: [] diff --git a/guarantees/user/account/view-user-profile.guarantee.yaml b/guarantees/user/account/view-user-profile.guarantee.yaml index c3d35413..eb3f7373 100644 --- a/guarantees/user/account/view-user-profile.guarantee.yaml +++ b/guarantees/user/account/view-user-profile.guarantee.yaml @@ -6,7 +6,7 @@ subtype: account journey: View User Profile ownerPackage: "@treeseed/admin" summary: Show public user identity and profile metadata without project, catalog, or knowledge distribution details. -status: active +status: planned dependencies: journeys: - 1 @@ -73,4 +73,4 @@ notes: surface: admin-ui run: timeoutSeconds: 300 - requiredForRelease: true + requiredForRelease: false diff --git a/guarantees/user/auth/forgot-reset-password.guarantee.yaml b/guarantees/user/auth/forgot-reset-password.guarantee.yaml index 5c77131f..95d9c774 100644 --- a/guarantees/user/auth/forgot-reset-password.guarantee.yaml +++ b/guarantees/user/auth/forgot-reset-password.guarantee.yaml @@ -7,7 +7,7 @@ journey: Forgot / Reset Password ownerPackage: "@treeseed/admin" summary: Request and complete password reset through the auth provider; missing pieces should be handled as auth integration work instead of custom user-table mutation. -status: active +status: planned dependencies: journeys: - 1 @@ -74,4 +74,4 @@ notes: surface: admin-ui run: timeoutSeconds: 300 - requiredForRelease: true + requiredForRelease: false diff --git a/guarantees/user/auth/register-user.guarantee.yaml b/guarantees/user/auth/register-user.guarantee.yaml index 4bc30374..5ef0c3de 100644 --- a/guarantees/user/auth/register-user.guarantee.yaml +++ b/guarantees/user/auth/register-user.guarantee.yaml @@ -7,7 +7,7 @@ journey: Register User ownerPackage: "@treeseed/admin" summary: Create an account record and start email verification through the auth provider used by the admin/core runtime; this is product plumbing rather than a Treeseed content operation. -status: active +status: planned dependencies: journeys: [] guarantees: [] @@ -71,4 +71,4 @@ notes: surface: admin-ui run: timeoutSeconds: 300 - requiredForRelease: true + requiredForRelease: false diff --git a/guarantees/user/auth/scenes/register-user.scene.yaml b/guarantees/user/auth/scenes/register-user.scene.yaml index e52a5a1b..713ab91b 100644 --- a/guarantees/user/auth/scenes/register-user.scene.yaml +++ b/guarantees/user/auth/scenes/register-user.scene.yaml @@ -127,6 +127,12 @@ workflow: value: review-{{runShort}} expect: text: Username is available. + - id: verify-username-immutability + title: Verify permanent username disclosure + action: + keyboard: Tab + expect: + text: Your username is public and cannot be changed after registration. - id: enter-email title: Enter email action: @@ -138,9 +144,7 @@ workflow: # independently traceable without reusing a prior registration. value: adrian.webb+review-{{runShort}}@knowledge.coop expect: - visible: - - role: textbox - name: Email + text: Email is available. - id: enter-password title: Enter password action: diff --git a/guarantees/user/auth/user-login.guarantee.yaml b/guarantees/user/auth/user-login.guarantee.yaml index 61f7f7ca..d8dd7c29 100644 --- a/guarantees/user/auth/user-login.guarantee.yaml +++ b/guarantees/user/auth/user-login.guarantee.yaml @@ -7,7 +7,7 @@ journey: User Login ownerPackage: "@treeseed/admin" summary: Establish an authenticated session for Market/admin surfaces; downstream journeys assume API calls carry the authenticated user context. -status: active +status: planned dependencies: journeys: - 2 @@ -74,4 +74,4 @@ notes: surface: admin-ui run: timeoutSeconds: 300 - requiredForRelease: true + requiredForRelease: false diff --git a/guarantees/user/auth/user-logout.guarantee.yaml b/guarantees/user/auth/user-logout.guarantee.yaml index fdaef724..5be9032a 100644 --- a/guarantees/user/auth/user-logout.guarantee.yaml +++ b/guarantees/user/auth/user-logout.guarantee.yaml @@ -6,7 +6,7 @@ subtype: auth journey: User Logout ownerPackage: "@treeseed/admin" summary: End the provider session and clear local admin state before redirecting to the anonymous sign-in surface. -status: active +status: planned dependencies: journeys: - 4 @@ -74,4 +74,4 @@ notes: surface: admin-ui run: timeoutSeconds: 300 - requiredForRelease: true + requiredForRelease: false diff --git a/guarantees/user/auth/verify-email.guarantee.yaml b/guarantees/user/auth/verify-email.guarantee.yaml index a5850533..032771f4 100644 --- a/guarantees/user/auth/verify-email.guarantee.yaml +++ b/guarantees/user/auth/verify-email.guarantee.yaml @@ -7,7 +7,7 @@ journey: Verify Email ownerPackage: "@treeseed/admin" summary: Complete auth-provider verification then redirect into the authenticated Market/admin shell; implementation should not bypass the provider session model. -status: active +status: planned dependencies: journeys: - 1 @@ -75,4 +75,4 @@ notes: surface: admin-ui run: timeoutSeconds: 300 - requiredForRelease: true + requiredForRelease: false diff --git a/guarantees/verifiers/ui.verifiers.yaml b/guarantees/verifiers/ui.verifiers.yaml index 68a6a9c9..b9f6dd45 100644 --- a/guarantees/verifiers/ui.verifiers.yaml +++ b/guarantees/verifiers/ui.verifiers.yaml @@ -41,6 +41,11 @@ verifiers: caseId: auth.appearance.team-owner ownerPackage: "@treeseed/api" description: Authenticated users can update appearance preference. + api.auth.notifications: + kind: apiAcceptanceCase + caseId: auth.notifications.team-owner + ownerPackage: "@treeseed/api" + description: Authenticated users can replace global and authorized-project notification preferences without data leakage. api.auth.account.blockers: kind: apiAcceptanceCase caseId: auth.account-blockers.team-viewer diff --git a/package-lock.json b/package-lock.json index 293ec322..fd49a5f5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,9 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#92947586ed8829b36921018c61d81a2f655f0410", - "@treeseed/sdk": "github:treeseed-ai/sdk#42d9e8308e1eb7bdb31a6d204e6b0aa7358e775a", - "@treeseed/ui": "github:treeseed-ai/ui#0f10f2a452d570eb3d4aa31a246c62f3adf49aa2", + "@treeseed/core": "github:treeseed-ai/core#fb8bcbac2144d9a814169142d3bdebea1a14ded1", + "@treeseed/sdk": "github:treeseed-ai/sdk#14cef4cbec20b1224be1d0daa1a798c206c69987", + "@treeseed/ui": "github:treeseed-ai/ui#2d626565a8cfce92efa3c7e102d27106d0145039", "react": "^19.2.5", "react-dom": "^19.2.6" }, @@ -6931,8 +6931,8 @@ } }, "node_modules/@treeseed/core": { - "version": "0.12.60-dev.fix-local-dev-unhealthy-restart.20260716T025813Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#92947586ed8829b36921018c61d81a2f655f0410", + "version": "0.12.60-dev.staging.20260716T185112Z", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#fb8bcbac2144d9a814169142d3bdebea1a14ded1", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6943,8 +6943,8 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#42d9e8308e1eb7bdb31a6d204e6b0aa7358e775a", - "@treeseed/ui": "github:treeseed-ai/ui#0f10f2a452d570eb3d4aa31a246c62f3adf49aa2", + "@treeseed/sdk": "github:treeseed-ai/sdk#14cef4cbec20b1224be1d0daa1a798c206c69987", + "@treeseed/ui": "github:treeseed-ai/ui#2d626565a8cfce92efa3c7e102d27106d0145039", "astro": "^5.6.1", "esbuild": "^0.28.0", "katex": "^0.16.22", @@ -8947,8 +8947,8 @@ } }, "node_modules/@treeseed/sdk": { - "version": "0.12.63-dev.fix-local-dev-unhealthy-restart.20260716T025755Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#42d9e8308e1eb7bdb31a6d204e6b0aa7358e775a", + "version": "0.12.63-dev.staging.20260716T185056Z", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#14cef4cbec20b1224be1d0daa1a798c206c69987", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", @@ -9644,8 +9644,8 @@ } }, "node_modules/@treeseed/ui": { - "version": "0.12.18-dev.fix-railway-staged-apply.20260716T010046Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#0f10f2a452d570eb3d4aa31a246c62f3adf49aa2", + "version": "0.12.18-dev.staging.20260716T185026Z", + "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#2d626565a8cfce92efa3c7e102d27106d0145039", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", diff --git a/package.json b/package.json index e82fb835..3bc68167 100644 --- a/package.json +++ b/package.json @@ -47,9 +47,9 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#92947586ed8829b36921018c61d81a2f655f0410", - "@treeseed/sdk": "github:treeseed-ai/sdk#42d9e8308e1eb7bdb31a6d204e6b0aa7358e775a", - "@treeseed/ui": "github:treeseed-ai/ui#0f10f2a452d570eb3d4aa31a246c62f3adf49aa2", + "@treeseed/core": "github:treeseed-ai/core#fb8bcbac2144d9a814169142d3bdebea1a14ded1", + "@treeseed/sdk": "github:treeseed-ai/sdk#14cef4cbec20b1224be1d0daa1a798c206c69987", + "@treeseed/ui": "github:treeseed-ai/ui#2d626565a8cfce92efa3c7e102d27106d0145039", "react": "^19.2.5", "react-dom": "^19.2.6" }, diff --git a/src/layouts/TreeseedAppLayout.astro b/src/layouts/TreeseedAppLayout.astro index b585b922..017a187f 100644 --- a/src/layouts/TreeseedAppLayout.astro +++ b/src/layouts/TreeseedAppLayout.astro @@ -8,6 +8,9 @@ import '@treeseed/ui/styles/app-controls.css'; import '@treeseed/ui/styles/auth.css'; import ProductShell from '@treeseed/ui/components/astro/shell/ProductShell.astro'; import { resolveAuthenticatedThemePreference } from '../lib/auth/appearance'; +import { compileGuidedThemePalette } from '@treeseed/ui/theme'; +import { createApiFacade } from '../lib/market/api-client'; +import { ensureCsrfToken } from '../lib/auth/csrf'; interface TeamEntry { id: string; @@ -33,6 +36,16 @@ const { } = Astro.props as Props; const appearance = await resolveAuthenticatedThemePreference(Astro); +const api = createApiFacade(Astro); +const [personalThemes, notifications] = await Promise.all([ + api.personalThemes().catch(() => []), + api.accountNotifications(8).catch(() => []), +]); +const customSchemes = Object.fromEntries(personalThemes.flatMap((theme) => { + try { return [[theme.schemeId, compileGuidedThemePalette(theme.palette, theme.baseScheme)]]; } catch { return []; } +})); +const themeConfig = { schemes: customSchemes }; +const csrfToken = ensureCsrfToken(Astro); const teamOptions = teams.map((team) => ({ id: team.id, label: team.displayName ?? team.name ?? team.slug ?? team.id, @@ -44,6 +57,9 @@ const teamOptions = teams.map((team) => ({ description={description} currentPath={currentPath} appearance={appearance} + themeConfig={themeConfig} + notifications={notifications} + notificationCsrfToken={csrfToken} brand={{ name: 'TreeSeed', tag: 'Identity and teams', @@ -55,6 +71,7 @@ const teamOptions = teams.map((team) => ({ { label: 'Start', href: '/app/' }, { label: 'Teams', href: '/app/teams' }, ]} + siteItems={[{ label: 'Home', href: '/' }]} quickActions={[ activeTeam ? { label: 'Manage team', href: `/app/teams/${encodeURIComponent(activeTeam.id)}/edit`, variant: 'primary' as const } @@ -62,7 +79,7 @@ const teamOptions = teams.map((team) => ({ ]} accountActions={[ { label: 'Account', href: '/app/account', variant: 'secondary' as const }, - { label: 'Sign out', href: '/v1/auth/logout?returnTo=/', variant: 'secondary' as const, reload: true }, + { label: 'Sign out', action: '/auth/logout', method: 'post' as const, hiddenFields: { csrfToken }, variant: 'secondary' as const }, ]} >
@@ -107,7 +124,7 @@ const teamOptions = teams.map((team) => ({ if (detail.persist !== true || !detail.scheme || !detail.mode) return; fetch('/v1/auth/web/appearance', { method: 'PATCH', - headers: { accept: 'application/json', 'content-type': 'application/json' }, + headers: { accept: 'application/json', 'content-type': 'application/json', 'x-treeseed-csrf': document.cookie.split('; ').find((entry) => entry.startsWith('ts_csrf='))?.split('=').slice(1).join('=') || '' }, body: JSON.stringify({ colorScheme: detail.scheme, themeMode: detail.mode }), keepalive: true, }).catch(() => {}); diff --git a/src/lib/auth/account.ts b/src/lib/auth/account.ts index 4987c624..ec620807 100644 --- a/src/lib/auth/account.ts +++ b/src/lib/auth/account.ts @@ -39,16 +39,9 @@ export interface PublicUserProfile { id: string; username: string; displayName: string | null; - email: string | null; image: string | null; joinedAt: string; }; - activity: { - teams: Array<{ id: string; slug: string; name: string; createdAt?: string }>; - projects: Array<{ id: string; teamId: string; slug: string; name: string; description?: string | null; createdAt?: string }>; - catalogItems: Array<{ id: string; teamId: string; kind: string; slug: string; title: string; summary?: string | null; visibility?: string }>; - knowledgePacks: Array<{ id: string; teamId: string; slug: string; name: string; summary?: string | null; visibility?: string }>; - }; } function normalizeOptionalString(value: FormDataEntryValue | null) { diff --git a/src/lib/auth/csrf.ts b/src/lib/auth/csrf.ts new file mode 100644 index 00000000..859d7213 --- /dev/null +++ b/src/lib/auth/csrf.ts @@ -0,0 +1,26 @@ +import type { APIContext } from 'astro'; +import { randomBytes, timingSafeEqual } from 'node:crypto'; +import { WEB_CSRF_COOKIE, csrfCookieOptions } from './config'; + +export const WEB_CSRF_HEADER = 'x-treeseed-csrf'; + +export function ensureCsrfToken(context: Pick) { + const existing = context.cookies.get(WEB_CSRF_COOKIE)?.value; + if (existing) return existing; + const token = randomBytes(32).toString('base64url'); + context.cookies.set(WEB_CSRF_COOKIE, token, csrfCookieOptions(context.url, 7 * 24 * 60 * 60)); + return token; +} + +export function csrfMatches(context: Pick, candidate: unknown) { + const expected = context.cookies.get(WEB_CSRF_COOKIE)?.value ?? ''; + const actual = typeof candidate === 'string' ? candidate : ''; + if (!expected || !actual) return false; + const left = Buffer.from(expected); + const right = Buffer.from(actual); + return left.length === right.length && timingSafeEqual(left, right); +} + +export function requireCsrf(context: Pick, candidate: unknown) { + if (!csrfMatches(context, candidate)) throw Object.assign(new Error('The form expired. Refresh the page and try again.'), { status: 403, code: 'csrf' }); +} diff --git a/src/lib/auth/flow.ts b/src/lib/auth/flow.ts index e05b0804..686f2699 100644 --- a/src/lib/auth/flow.ts +++ b/src/lib/auth/flow.ts @@ -78,9 +78,9 @@ export function authProviderCapabilities(context: Pick) { } export function providerSignInPath(context: Pick, provider: SupportedAuthProvider, returnTo = normalizeReturnTo(context)) { - const target = new URL(`/v1/auth/oauth/${provider}/start`, resolveApiBaseUrl(context.locals)); + const target = new URL(`/v1/auth/oauth/${provider}/start`, context.url.origin); target.searchParams.set('returnTo', returnTo); - target.searchParams.set('callbackUrl', `${context.url.origin}/auth/callback/${provider}?returnTo=${encodeURIComponent(returnTo)}`); + target.searchParams.set('callbackUrl', `${context.url.origin}/auth/callback/${provider}`); return target.toString(); } diff --git a/src/lib/market/api-client.ts b/src/lib/market/api-client.ts index 3a9d6156..3afeb6a3 100644 --- a/src/lib/market/api-client.ts +++ b/src/lib/market/api-client.ts @@ -1,6 +1,7 @@ import type { APIContext } from 'astro'; import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; import { getSiteAuthConfig } from '../auth/config'; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; type AstroLike = Pick; @@ -161,6 +162,33 @@ export class ApiClientFacade { return this.context.locals.auth?.principal ?? null; } + accountIdentity() { return this.request('GET', '/v1/auth/web/account/identity'); } + authProviders() { return this.request('GET', '/v1/auth/providers'); } + requestPasswordReset(email: string) { return this.request<{ accepted: true }>('POST', '/v1/auth/web/password-reset/request', { body: { email } }); } + completePasswordReset(token: string, newPassword: string) { return this.request<{ changed: true }>('POST', '/v1/auth/web/password-reset/complete', { body: { token, newPassword } }); } + confirmEmail(token: string) { return this.request('POST', '/v1/auth/web/confirm-email', { body: { token } }); } + approveDevice(userCode: string) { return this.request<{ approved: true }>('POST', '/v1/auth/device/approve', { body: { userCode } }); } + claimUsername(username: string) { return this.request('PATCH', '/v1/auth/web/username', { body: { username } }); } + updateAccountProfile(body: { firstName: string; lastName: string; image?: string | null }) { return this.request('PATCH', '/v1/auth/web/profile', { body }); } + addAccountEmail(email: string) { return this.request('POST', '/v1/auth/web/emails', { body: { email } }); } + resendAccountEmail(emailId: string) { return this.request('POST', `/v1/auth/web/emails/${encodeURIComponent(emailId)}/verify`, { body: {} }); } + setPrimaryAccountEmail(emailId: string) { return this.request('POST', `/v1/auth/web/emails/${encodeURIComponent(emailId)}/primary`, { body: {} }); } + deleteAccountEmail(emailId: string) { return this.request('DELETE', `/v1/auth/web/emails/${encodeURIComponent(emailId)}`); } + updateAccountPassword(body: { currentPassword?: string; password: string; reauthenticationGrantId?: string }) { return this.request<{ changed: true }>('PATCH', '/v1/auth/web/password', { body }); } + unlinkAccountProvider(identityId: string) { return this.request('DELETE', `/v1/auth/web/providers/${encodeURIComponent(identityId)}`); } + accountSessions() { return this.request('GET', '/v1/auth/web/sessions'); } + revokeAccountSession(sessionId: string) { return this.request('POST', `/v1/auth/web/sessions/${encodeURIComponent(sessionId)}/revoke`, { body: {} }); } + notificationPreferences() { return this.request('GET', '/v1/auth/web/notifications/preferences'); } + accountNotifications(limit = 20) { return this.request('GET', `/v1/auth/web/notifications?limit=${encodeURIComponent(String(limit))}`); } + updateNotificationPreferences(body: NotificationPreferences) { return this.request('PUT', '/v1/auth/web/notifications/preferences', { body }); } + listProjectsForPrincipal() { return this.request('GET', '/v1/projects'); } + personalThemes() { return this.request('GET', '/v1/auth/web/themes'); } + createPersonalTheme(body: PersonalThemeDraft) { return this.request('POST', '/v1/auth/web/themes', { body }); } + updatePersonalTheme(id: string, body: PersonalThemeDraft) { return this.request('PATCH', `/v1/auth/web/themes/${encodeURIComponent(id)}`, { body }); } + deletePersonalTheme(id: string) { return this.request('DELETE', `/v1/auth/web/themes/${encodeURIComponent(id)}`); } + accountDeletionBlockers() { return this.request<{ blockers: AccountDeletionBlocker[]; canDelete: boolean }>('GET', '/v1/auth/web/account/deletion-blockers'); } + deleteCurrentAccount(body: { confirmation: string; currentPassword?: string; reauthenticationGrantId?: string }) { return this.request<{ deleted: true }>('DELETE', '/v1/auth/web/account', { body }); } + listTeamsForPrincipal() { return this.request('GET', '/v1/teams'); } diff --git a/src/middleware.ts b/src/middleware.ts index a92528d0..b4b757b4 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -3,18 +3,25 @@ import { resolveEditorialPreview } from '@treeseed/core/middleware/editorial-pre import { getSiteAuthConfig, localAuthCanonicalRedirectUrl } from './lib/auth/config'; import { apiAccessTokenFromCookies, clearApiAccessTokenCookie, resolveApiBaseUrl } from './lib/market/api-client'; import { ensureLocalCloudflareRuntime } from './lib/runtime/local-cloudflare'; +import { ensureCsrfToken } from './lib/auth/csrf'; const DEV_RESET_COOKIE = 'ts_market_dev_reset'; const PUBLIC_ROUTE_PREFIXES = [ '/auth/', '/u/', '/t/', - '/knowledge', + '/team-invites/', + '/agents', '/books', - '/book', + '/contact', + '/decisions', + '/docs-runtime', '/notes', - '/chronicles', - '/profiles', + '/objectives', + '/people', + '/proposals', + '/questions', + '/ui', '/v1/', '/_astro/', ]; @@ -51,13 +58,22 @@ function envValue(context: any, name: string) { } function isPublicRoute(pathname: string) { + if (pathname === '/app' || pathname.startsWith('/app/')) return false; if (pathname === '/' || pathname === '/favicon.svg' || pathname === '/logo.svg' || pathname === '/robots.txt') return true; if (PUBLIC_ROUTE_PREFIXES.some((prefix) => pathname === prefix.slice(0, -1) || pathname.startsWith(prefix))) return true; - return PUBLIC_FILE_EXTENSIONS.some((extension) => pathname.endsWith(extension)); + if (PUBLIC_FILE_EXTENSIONS.some((extension) => pathname.endsWith(extension))) return true; + return true; } function authRedirectFor(context: any) { - if (context.locals.auth?.principal) return null; + if (context.locals.auth?.principal) { + const username = String(context.locals.auth.principal.metadata?.username ?? '').trim(); + if (!username && !isPublicRoute(context.url.pathname) && context.url.pathname !== '/auth/username') { + const returnTo = `${context.url.pathname}${context.url.search}`; + return context.redirect(`/auth/username?returnTo=${encodeURIComponent(returnTo)}`, 302); + } + return null; + } if (isPublicRoute(context.url.pathname)) return null; const returnTo = `${context.url.pathname}${context.url.search}`; return context.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(returnTo)}`, 302); @@ -105,6 +121,7 @@ async function loadApiBackedWebSession(context: any) { export const onRequest = defineMiddleware(async (context, next) => { await ensureLocalCloudflareRuntime(context.locals); + ensureCsrfToken(context); const config = getSiteAuthConfig(context); const resetCookieBoundary = applyLocalDevResetCookieBoundary(context); const canonicalLocalUrl = localAuthCanonicalRedirectUrl(context.url, config.siteBaseUrl); diff --git a/src/pages/app/account.astro b/src/pages/app/account.astro deleted file mode 100644 index fdd13892..00000000 --- a/src/pages/app/account.astro +++ /dev/null @@ -1,489 +0,0 @@ ---- -import TreeseedAppLayout from '../../layouts/TreeseedAppLayout.astro'; -import '@treeseed/ui/styles/ui.css'; -import '@treeseed/ui/styles/forms.css'; -import '@treeseed/ui/styles/auth.css'; -import Panel from '@treeseed/ui/components/astro/surface/Panel.astro'; -import Field from '@treeseed/ui/components/astro/forms/Field.astro'; -import TextInput from '@treeseed/ui/components/astro/forms/TextInput.astro'; -import Button from '@treeseed/ui/components/astro/forms/Button.astro'; -import FormActions from '@treeseed/ui/components/astro/forms/FormActions.astro'; -import PasswordMeter from '@treeseed/ui/components/astro/forms/PasswordMeter.astro'; -import Badge from '@treeseed/ui/components/astro/data/Badge.astro'; -import StatusPill from '@treeseed/ui/components/astro/data/StatusPill.astro'; -import KeyValueList from '@treeseed/ui/components/astro/data/KeyValueList.astro'; -import { DELETE_ACCOUNT_CONFIRMATION } from '../../lib/auth/delete-confirmation'; -import { loadAppContext } from '../../view-models/app-access.js'; - -if (!Astro.locals.auth?.principal) { - return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent('/app/account')}`); -} - -const context = await loadAppContext(Astro); -const api = context.store; -const requestAccountList = async (path: string) => api ? await api.request('GET', path).catch(() => []) : []; -const [emailAddresses, webSessions] = await Promise.all([ - requestAccountList('/v1/auth/web/emails'), - requestAccountList('/v1/auth/web/sessions'), -]); -const accounts: any[] = []; -const principal = Astro.locals.auth.principal; -const currentSessionId = Astro.locals.auth?.session?.id ?? (typeof principal.metadata?.sessionId === 'string' ? principal.metadata.sessionId : null); -const fallbackCurrentSession = currentSessionId - ? { - id: currentSessionId, - provider: 'market_api', - email: Astro.locals.auth?.session?.email ?? null, - displayName: Astro.locals.auth?.session?.displayName ?? null, - ipAddress: null, - userAgent: null, - authenticatedAt: null, - lastSeenAt: null, - expiresAt: Astro.locals.auth?.session?.expiresAt ?? null, - revokedAt: null, - current: true, - } - : null; -const sessionMap = new Map(); -for (const session of webSessions) { - if (!session?.id) continue; - sessionMap.set(session.id, { - provider: 'web', - userAgent: null, - authenticatedAt: null, - lastSeenAt: null, - ...session, - current: Boolean(session.current || session.id === currentSessionId), - }); -} -if (fallbackCurrentSession && !sessionMap.has(fallbackCurrentSession.id)) { - sessionMap.set(fallbackCurrentSession.id, fallbackCurrentSession); -} -const sessions = Array.from(sessionMap.values()); -const passwordStatus = Astro.url.searchParams.get('password') ?? ''; -const profileStatus = Astro.url.searchParams.get('profile') ?? ''; -const emailStatus = Astro.url.searchParams.get('email') ?? ''; -const deleteStatus = Astro.url.searchParams.get('delete') ?? ''; -const statusMessage = Astro.url.searchParams.get('message') ?? ''; -const hasCredential = accounts.some((account: any) => account.providerId === 'credential'); -const roles = principal.roles ?? []; -const permissions = principal.permissions ?? []; -const isPlatformAdmin = roles.includes('platform_admin') || permissions.includes('*:*:*'); -const verifiedEmailCount = emailAddresses.filter((email: any) => email.verified).length; -const emailItems = emailAddresses.map((email: any) => ({ - ...email, - deleteDisabled: email.verified && verifiedEmailCount <= 1, -})); -const currentName = principal.displayName ?? ''; -const currentImage = typeof principal.metadata?.image === 'string' ? principal.metadata.image : ''; -const currentUsername = typeof principal.metadata?.username === 'string' ? principal.metadata.username : ''; -const deletionBlockers: any[] = []; -const profileStatusLabels: Record = { - updated: 'Profile updated', - missing_name: 'Display name is required', - invalid_image: 'Profile image must be an HTTPS URL', - failed: 'Profile update failed', -}; -const emailStatusLabels: Record = { - sent: 'Verification email sent. Open the link to finish adding this email.', - verified: 'Email verified', - primary: 'Primary email updated', - deleted: 'Email removed', - missing: 'Email is required', - confirm: 'At least one verified email is required', - last_verified_email: 'At least one verified email is required', - not_configured: statusMessage || 'Auth email is not configured', - failed: statusMessage || 'Email update failed', -}; -const deleteStatusLabels: Record = { - confirm: `Type "${DELETE_ACCOUNT_CONFIRMATION}" to delete this account.`, - blocked: 'Account deletion is blocked until the items below are resolved', - password_required: 'Current password is required to delete this account', - invalid_password: 'Current password was not accepted', - reauth_required: 'Sign in again before deleting this provider-only account', - failed: 'Account deletion failed', -}; -const passwordStatusLabels: Record = { - updated: 'Password updated', - missing: 'Password and confirmation are required', - mismatch: 'Passwords do not match', - weak: 'Password does not meet the strength rules', - change_failed: 'Password change failed', - set_failed: 'Password update failed', -}; -const permissionSummary = isPlatformAdmin - ? 'This account has every global permission through the platform_admin role.' - : 'This account is limited to assigned global roles and market team membership.'; -const activeAccountTab: string = deleteStatus - ? 'danger' - : (passwordStatus ? 'security' : 'profile'); -const accountTabs = [ - { id: 'profile', label: 'Profile' }, - { id: 'security', label: 'Security' }, - { id: 'sessions', label: 'Sessions' }, - { id: 'danger', label: 'Delete' }, -]; ---- - - - - - - diff --git a/src/pages/app/account/appearance.astro b/src/pages/app/account/appearance.astro new file mode 100644 index 00000000..aeab3ed8 --- /dev/null +++ b/src/pages/app/account/appearance.astro @@ -0,0 +1,19 @@ +--- +import TreeseedAppLayout from '../../../layouts/TreeseedAppLayout.astro'; +import SettingsTemplate from '@treeseed/ui/components/astro/templates/SettingsTemplate.astro'; +import PersonalThemeManager from '@treeseed/ui/components/astro/account/PersonalThemeManager.astro'; +import { resolveAuthenticatedThemePreference } from '../../../lib/auth/appearance'; +import { handleAppearanceRequest, loadAccountFrame } from '../../../view-models/account-settings'; + +if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent('/app/account/appearance')}`); +const frame = await loadAccountFrame(Astro, 'appearance'); +const response = await handleAppearanceRequest(Astro, frame.api); +if (response) return response; +const [themes, appearance] = await Promise.all([frame.api.personalThemes(), resolveAuthenticatedThemePreference(Astro)]); +--- + + + + + + diff --git a/src/pages/app/account/delete.astro b/src/pages/app/account/delete.astro new file mode 100644 index 00000000..92a6647e --- /dev/null +++ b/src/pages/app/account/delete.astro @@ -0,0 +1,19 @@ +--- +import TreeseedAppLayout from '../../../layouts/TreeseedAppLayout.astro'; +import SettingsTemplate from '@treeseed/ui/components/astro/templates/SettingsTemplate.astro'; +import AccountDeletionPanel from '@treeseed/ui/components/astro/account/AccountDeletionPanel.astro'; +import { handleDeletionRequest, loadAccountFrame } from '../../../view-models/account-settings'; + +if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent('/app/account/delete')}`); +const frame = await loadAccountFrame(Astro, 'delete'); +const response = await handleDeletionRequest(Astro, frame.api); +if (response) return response; +const [identity, deletion, providers] = await Promise.all([frame.api.accountIdentity(), frame.api.accountDeletionBlockers(), frame.api.authProviders()]); +const reauthenticationGrantId = Astro.url.searchParams.get('reauthenticationGrantId'); +--- + + + + provider.provider)} callbackBaseUrl={Astro.url.origin} reauthenticationGrantId={reauthenticationGrantId} csrfToken={frame.csrfToken} error={frame.error} /> + + diff --git a/src/pages/app/account/index.astro b/src/pages/app/account/index.astro new file mode 100644 index 00000000..91a9cab1 --- /dev/null +++ b/src/pages/app/account/index.astro @@ -0,0 +1,20 @@ +--- +import TreeseedAppLayout from '../../../layouts/TreeseedAppLayout.astro'; +import SettingsTemplate from '@treeseed/ui/components/astro/templates/SettingsTemplate.astro'; +import AccountIdentitySettings from '@treeseed/ui/components/astro/account/AccountIdentitySettings.astro'; +import { handleIdentityRequest, loadAccountFrame } from '../../../view-models/account-settings'; + +if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent('/app/account')}`); +const frame = await loadAccountFrame(Astro, 'identity'); +const response = await handleIdentityRequest(Astro, frame.api); +if (response) return response; +const identity = await frame.api.accountIdentity(); +const providers = await frame.api.authProviders(); +const passwordGrantId = Astro.url.searchParams.get('reauthenticationGrantId'); +--- + + + + + + diff --git a/src/pages/app/account/notifications.astro b/src/pages/app/account/notifications.astro new file mode 100644 index 00000000..8202912b --- /dev/null +++ b/src/pages/app/account/notifications.astro @@ -0,0 +1,18 @@ +--- +import TreeseedAppLayout from '../../../layouts/TreeseedAppLayout.astro'; +import SettingsTemplate from '@treeseed/ui/components/astro/templates/SettingsTemplate.astro'; +import NotificationPreferencePanel from '@treeseed/ui/components/astro/account/NotificationPreferencePanel.astro'; +import { handleNotificationRequest, loadAccountFrame, NOTIFICATION_CONTENT_CAPABILITIES } from '../../../view-models/account-settings'; + +if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent('/app/account/notifications')}`); +const frame = await loadAccountFrame(Astro, 'notifications'); +const response = await handleNotificationRequest(Astro, frame.api); +if (response) return response; +const [preferences, projects] = await Promise.all([frame.api.notificationPreferences(), frame.api.listProjectsForPrincipal()]); +--- + + + + + + diff --git a/src/pages/app/account/sessions.astro b/src/pages/app/account/sessions.astro new file mode 100644 index 00000000..e3077324 --- /dev/null +++ b/src/pages/app/account/sessions.astro @@ -0,0 +1,18 @@ +--- +import TreeseedAppLayout from '../../../layouts/TreeseedAppLayout.astro'; +import SettingsTemplate from '@treeseed/ui/components/astro/templates/SettingsTemplate.astro'; +import SessionManager from '@treeseed/ui/components/astro/account/SessionManager.astro'; +import { handleSessionRequest, loadAccountFrame } from '../../../view-models/account-settings'; + +if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent('/app/account/sessions')}`); +const frame = await loadAccountFrame(Astro, 'sessions'); +const response = await handleSessionRequest(Astro, frame.api); +if (response) return response; +const sessions = await frame.api.accountSessions(); +--- + + + + + + diff --git a/src/pages/app/teams/[teamId]/delete.astro b/src/pages/app/teams/[teamId]/delete.astro index ed353e4c..44ecc4f3 100644 --- a/src/pages/app/teams/[teamId]/delete.astro +++ b/src/pages/app/teams/[teamId]/delete.astro @@ -10,6 +10,7 @@ import TreeseedAppLayout from '../../../../layouts/TreeseedAppLayout.astro'; import { escapeHtml as esc } from '../../../../lib/market/control-ui.js'; import { ApiClientFacade } from '../../../../lib/market/api-client'; import { loadAppContext, persistActiveTeamSelection, resolveAppTeam } from '../../../../view-models/app-access.js'; +import { ensureCsrfToken, requireCsrf } from '../../../../lib/auth/csrf'; const teamParam = String(Astro.params.teamId ?? ''); if (!Astro.locals.auth?.principal) { @@ -33,10 +34,12 @@ const blockerRows = Object.entries(blockers ?? {}) const hasDeletionBlockers = blockerRows.length > 0; const confirmation = team ? `DELETE ${team.name}` : ''; let formError = ''; +const csrfToken = ensureCsrfToken(Astro); let confirmationValue = ''; if (Astro.request.method === 'POST' && team && canManageTeam) { const data = await Astro.request.formData(); + requireCsrf(Astro, data.get('csrfToken')); confirmationValue = String(data.get('confirmation') ?? ''); if (hasDeletionBlockers) { formError = 'Blocking records must be removed before this team can be deleted.'; @@ -65,6 +68,7 @@ if (Astro.request.method === 'POST' && team && canManageTeam) {
+ {formError && } diff --git a/src/pages/app/teams/[teamId]/edit.astro b/src/pages/app/teams/[teamId]/edit.astro index 80f16af2..90af1826 100644 --- a/src/pages/app/teams/[teamId]/edit.astro +++ b/src/pages/app/teams/[teamId]/edit.astro @@ -9,6 +9,7 @@ import Panel from '@treeseed/ui/components/astro/surface/Panel.astro'; import TreeseedAppLayout from '../../../../layouts/TreeseedAppLayout.astro'; import { ApiClientFacade } from '../../../../lib/market/api-client'; import { loadAppContext, persistActiveTeamSelection, resolveAppTeam } from '../../../../view-models/app-access.js'; +import { ensureCsrfToken, requireCsrf } from '../../../../lib/auth/csrf'; const teamId = String(Astro.params.teamId ?? ''); if (!Astro.locals.auth?.principal) { @@ -27,6 +28,7 @@ if (!team) Astro.response.status = teamResolution.status === 'forbidden' ? 403 : else if (!canManageTeam) Astro.response.status = 403; let formError = ''; +const csrfToken = ensureCsrfToken(Astro); const saved = Astro.url.searchParams.get('saved') === '1'; const formValues = { name: team?.name ?? '', @@ -37,6 +39,7 @@ const formValues = { if (Astro.request.method === 'POST' && team && canManageTeam) { const data = await Astro.request.formData(); + requireCsrf(Astro, data.get('csrfToken')); const body = { name: String(data.get('name') ?? '').trim(), displayName: String(data.get('displayName') ?? '').trim(), @@ -64,6 +67,7 @@ if (Astro.request.method === 'POST' && team && canManageTeam) {
+ {formError && } {saved && !formError &&

Saved.

}
diff --git a/src/pages/app/teams/[teamId]/members.astro b/src/pages/app/teams/[teamId]/members.astro index 8de74a53..e9182e86 100644 --- a/src/pages/app/teams/[teamId]/members.astro +++ b/src/pages/app/teams/[teamId]/members.astro @@ -10,6 +10,7 @@ import PlainTable from '@treeseed/ui/components/astro/app/controls/PlainTable.as import TreeseedAppLayout from '../../../../layouts/TreeseedAppLayout.astro'; import { escapeHtml as esc } from '../../../../lib/market/control-ui.js'; import { loadAppContext, persistActiveTeamSelection, resolveAppTeam } from '../../../../view-models/app-access.js'; +import { ensureCsrfToken } from '../../../../lib/auth/csrf'; const teamParam = String(Astro.params.teamId ?? ''); if (!Astro.locals.auth?.principal) { @@ -18,6 +19,7 @@ if (!Astro.locals.auth?.principal) { const context = await loadAppContext(Astro); const teamResolution = resolveAppTeam(context, teamParam); const team = teamResolution.resource; +const csrfToken = ensureCsrfToken(Astro); if (teamResolution.team?.id && teamResolution.team.id !== context.activeTeam?.id) persistActiveTeamSelection(Astro, teamResolution.team); const manageableRoles = new Set(['team_owner', 'project_lead']); const access = team && context.store && typeof context.store.getTeamAccessSummary === 'function' @@ -89,11 +91,11 @@ const rows = members.map((member: any) => ({ )} - diff --git a/src/pages/auth/reset-password.astro b/src/pages/auth/reset-password.astro index 466aff56..1c63e606 100644 --- a/src/pages/auth/reset-password.astro +++ b/src/pages/auth/reset-password.astro @@ -9,7 +9,7 @@ import PasswordMeter from '@treeseed/ui/components/astro/forms/PasswordMeter.ast import { resolveAnonymousThemePreference } from '../../lib/auth/appearance'; import { normalizeReturnTo, redirectAuthenticatedToApp } from '../../lib/auth/flow'; import { passwordMeetsPolicy, passwordPolicyMessage } from '../../lib/auth/password-policy'; -import { resolveApiBaseUrl } from '../../lib/market/api-client'; +import { createApiFacade } from '../../lib/market/api-client'; export const prerender = false; @@ -22,6 +22,7 @@ const returnTo = normalizeReturnTo(Astro); let token = Astro.url.searchParams.get('token') ?? ''; let error = Astro.url.searchParams.get('error') ? 'This password reset link is invalid or expired.' : ''; const appearance = resolveAnonymousThemePreference(Astro); +const api = createApiFacade(Astro); if (Astro.request.method === 'POST') { const form = await Astro.request.formData(); @@ -37,19 +38,12 @@ if (Astro.request.method === 'POST') { } else if (!passwordMeetsPolicy(password)) { error = passwordPolicyMessage(); } else { - const response = await fetch(`${resolveApiBaseUrl(Astro.locals)}/v1/auth/web/password-reset/complete`, { - method: 'POST', - headers: { accept: 'application/json', 'content-type': 'application/json' }, - body: JSON.stringify({ - token, - newPassword: password, - }), - }); - if (response.ok) { + try { + await api.completePasswordReset(token, password); return Astro.redirect(`/auth/sign-in?reset=complete&returnTo=${encodeURIComponent(returnTo)}`, 303); + } catch (resetError) { + error = resetError instanceof Error ? resetError.message : 'Unable to reset password.'; } - const payload = await response.json().catch(() => null) as { message?: string; error?: string } | null; - error = payload?.message ?? payload?.error ?? 'Unable to reset password.'; } } --- diff --git a/src/pages/auth/username.astro b/src/pages/auth/username.astro index f80a7f0f..4bd3cdfd 100644 --- a/src/pages/auth/username.astro +++ b/src/pages/auth/username.astro @@ -1,25 +1,35 @@ --- import AuthShell from '@treeseed/ui/components/astro/auth/AuthShell.astro'; import AuthCard from '@treeseed/ui/components/astro/auth/AuthCard.astro'; -import Button from '@treeseed/ui/components/astro/forms/Button.astro'; -import FormActions from '@treeseed/ui/components/astro/forms/FormActions.astro'; -import { resolveAnonymousThemePreference } from '../../lib/auth/appearance'; +import UsernameClaimForm from '@treeseed/ui/components/astro/auth/UsernameClaimForm.astro'; +import { resolveAuthenticatedThemePreference } from '../../lib/auth/appearance'; import { normalizeReturnTo } from '../../lib/auth/flow'; +import { ensureCsrfToken, requireCsrf } from '../../lib/auth/csrf'; +import { createApiFacade, setApiAccessTokenCookie } from '../../lib/market/api-client'; export const prerender = false; - +if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname + Astro.url.search)}`, 302); const returnTo = normalizeReturnTo(Astro); -const appearance = resolveAnonymousThemePreference(Astro); +const existing = String(Astro.locals.auth.principal.metadata?.username ?? ''); +if (existing) return Astro.redirect(returnTo, 302); +let error = Astro.url.searchParams.get('error') ?? ''; +let value = ''; +if (Astro.request.method === 'POST') { + const form = await Astro.request.formData(); + value = String(form.get('username') ?? ''); + try { + requireCsrf(Astro, form.get('csrfToken')); + const result = await createApiFacade(Astro).claimUsername(value); + if (result.accessToken) setApiAccessTokenCookie(Astro, result.accessToken, Number(result.expiresInSeconds ?? 900)); + const redirect = Astro.redirect(returnTo, 303); + for (const cookie of Astro.cookies.headers()) redirect.headers.append('set-cookie', cookie); + return redirect; + } catch (caught) { error = caught instanceof Error ? caught.message : 'Username could not be assigned.'; } +} +const appearance = await resolveAuthenticatedThemePreference(Astro); --- - - - - - - + + + diff --git a/src/pages/u/[username].astro b/src/pages/u/[username].astro index 0deeaaa4..5d2403fc 100644 --- a/src/pages/u/[username].astro +++ b/src/pages/u/[username].astro @@ -1,8 +1,6 @@ --- import TreeseedPublicLayout from '../../layouts/TreeseedPublicLayout.astro'; -import PublicProfileHeader from '@treeseed/ui/components/astro/public/PublicProfileHeader.astro'; -import PublicSection from '@treeseed/ui/components/astro/public/PublicSection.astro'; -import PublicStack from '@treeseed/ui/components/astro/public/PublicStack.astro'; +import ProfileTemplate from '@treeseed/ui/components/astro/templates/ProfileTemplate.astro'; import { normalizeUsername, validateUsername } from '../../lib/auth/profile-validation'; import { resolvePublicUserProfile } from '../../lib/market/public-access.js'; @@ -28,16 +26,7 @@ const joinedDate = user.joinedAt description={`Public TreeSeed identity for @${user.username}.`} currentPath={`/u/${user.username}`} > - - - -

This profile confirms the public username and display identity associated with a TreeSeed account.

-
-
+ +

This profile confirms the public username and display identity associated with a TreeSeed account.

+
diff --git a/src/pages/v1/[...all].ts b/src/pages/v1/[...all].ts index 298e7f2a..e7d9e55e 100644 --- a/src/pages/v1/[...all].ts +++ b/src/pages/v1/[...all].ts @@ -6,6 +6,7 @@ import { resolveApiBaseUrl, setApiAccessTokenCookie, } from '../../lib/market/api-client'; +import { csrfMatches, WEB_CSRF_HEADER } from '../../lib/auth/csrf'; export const prerender = false; @@ -77,17 +78,20 @@ export const ALL: APIRoute = async (context) => { upstream.search = context.url.search; const headers = copyClientHeaders(context.request); + const incomingMethod = context.request.method.toUpperCase(); + if (!['GET', 'HEAD', 'OPTIONS'].includes(incomingMethod)) { + const candidate = context.request.headers.get(WEB_CSRF_HEADER); + if (!csrfMatches(context, candidate)) { + return new Response(JSON.stringify({ ok: false, error: 'The request failed CSRF validation.', code: 'csrf' }), { status: 403, headers: { 'content-type': 'application/json' } }); + } + } const token = apiAccessTokenFromCookies(context); for (const [name, value] of apiServiceHeaders(context, { skipUserAssertion: Boolean(token) })) { headers.set(name, value); } if (token) headers.set('authorization', `Bearer ${token}`); - let method = context.request.method.toUpperCase(); - const logoutRedirect = path === 'auth/logout' && method === 'GET' - ? (context.url.searchParams.get('returnTo') ?? '/') - : null; - if (logoutRedirect) method = 'POST'; + const method = context.request.method.toUpperCase(); const body = ['GET', 'HEAD'].includes(method) ? undefined : await context.request.arrayBuffer(); const response = await fetch(upstream, { method, @@ -100,18 +104,6 @@ export const ALL: APIRoute = async (context) => { for (const [name, value] of response.headers) { if (!hopByHopHeaders.has(name.toLowerCase())) responseHeaders.set(name, value); } - if (logoutRedirect) { - clearApiAccessTokenCookie(context); - for (const cookie of context.cookies.headers()) { - responseHeaders.append('set-cookie', cookie); - } - const target = logoutRedirect.startsWith('/') && !logoutRedirect.startsWith('//') ? logoutRedirect : '/'; - responseHeaders.set('location', target); - return new Response(null, { - status: 303, - headers: responseHeaders, - }); - } if (isAuthPath(path) && (response.headers.get('content-type') ?? '').includes('application/json')) { const envelope = await response.clone().json().catch(() => null); const token = envelope?.payload?.accessToken; diff --git a/src/plugin.ts b/src/plugin.ts index 27fe88d3..ba0133df 100644 --- a/src/plugin.ts +++ b/src/plugin.ts @@ -1,7 +1,7 @@ import { envField } from 'astro/config'; import { defineTreeseedPlugin } from '@treeseed/sdk/platform/plugin'; import type { TreeseedPlugin } from '@treeseed/sdk/platform/plugin'; -import { ADMIN_ROUTES } from './routes.js'; +import { ADMIN_ROUTES, ADMIN_SUPPORT_ROUTES } from './routes.js'; import { DEFAULT_ADMIN_COMMERCE_PROVIDER } from './commerce.js'; import { DEFAULT_SECRET_MANAGER_PROVIDERS } from './secret-managers.js'; @@ -112,7 +112,7 @@ const adminPlugin: TreeseedPlugin = defineTreeseedPlugin({ id: '@treeseed/admin', siteLayers: [{ root: '.', kinds: ['pages', 'styles', 'components'] }], siteHooks: { - routes: ADMIN_ROUTES, + routes: [...ADMIN_ROUTES, ...ADMIN_SUPPORT_ROUTES], customCss: [ '@treeseed/ui/styles/tokens.css', '@treeseed/ui/styles/theme.css', diff --git a/src/routes.ts b/src/routes.ts index 71828ce1..4cf79e16 100644 --- a/src/routes.ts +++ b/src/routes.ts @@ -1,25 +1,63 @@ -import type { TreeseedSiteRouteContribution } from '@treeseed/sdk/platform/plugin'; +import { defineTreeseedRoute, validateTreeseedRouteCapabilities, type TreeseedRouteCapability, type TreeseedSiteRouteContribution } from '@treeseed/sdk/platform/plugin'; -export const ADMIN_ROUTES: TreeseedSiteRouteContribution[] = [ - { pattern: '/app', resourcePath: 'pages/app/index.astro' }, - { pattern: '/app/account', resourcePath: 'pages/app/account.astro' }, - { pattern: '/app/teams', resourcePath: 'pages/app/teams/index.astro' }, - { pattern: '/app/teams/new', resourcePath: 'pages/app/teams/new.astro' }, - { pattern: '/app/teams/[teamId]/edit', resourcePath: 'pages/app/teams/[teamId]/edit.astro' }, - { pattern: '/app/teams/[teamId]/delete', resourcePath: 'pages/app/teams/[teamId]/delete.astro' }, - { pattern: '/app/teams/[teamId]/members', resourcePath: 'pages/app/teams/[teamId]/members.astro' }, - { pattern: '/auth/register', resourcePath: 'pages/auth/register.astro' }, - { pattern: '/auth/check-email', resourcePath: 'pages/auth/check-email.astro' }, - { pattern: '/auth/confirm-email', resourcePath: 'pages/auth/confirm-email.astro' }, - { pattern: '/auth/sign-in', resourcePath: 'pages/auth/sign-in.astro' }, - { pattern: '/auth/logout', resourcePath: 'pages/auth/logout.astro' }, - { pattern: '/auth/forgot-password', resourcePath: 'pages/auth/forgot-password.astro' }, - { pattern: '/auth/reset-password', resourcePath: 'pages/auth/reset-password.astro' }, - { pattern: '/auth/username', resourcePath: 'pages/auth/username.astro' }, - { pattern: '/auth/device/approve', resourcePath: 'pages/auth/device/approve.astro' }, - { pattern: '/auth/callback/[provider]', resourcePath: 'pages/auth/callback/[provider].ts' }, - { pattern: '/u/[username]', resourcePath: 'pages/u/[username].astro' }, - { pattern: '/t/[name]', resourcePath: 'pages/t/[name].astro' }, - { pattern: '/team-invites/[token]/accept', resourcePath: 'pages/team-invites/[token]/accept.astro' }, - { pattern: '/v1/[...all]', resourcePath: 'pages/v1/[...all].ts' }, -]; +type CapabilityInput = Partial & Pick; + +function adminRoute(pattern: string, resourcePath: string, input: CapabilityInput): TreeseedSiteRouteContribution { + const auth = pattern.startsWith('/auth'); + const personal = pattern === '/app' || pattern.startsWith('/app/account'); + const team = pattern.startsWith('/app/teams') || pattern.startsWith('/t/') || pattern.startsWith('/team-invites'); + const support = pattern.startsWith('/v1/'); + return defineTreeseedRoute({ pattern, resourcePath, capability: { + owner: 'admin', + responseKind: support ? 'proxy' : pattern === '/auth/logout' || pattern.startsWith('/team-invites') ? 'redirect' : 'page', + archetype: auth ? 'auth-form' : pattern === '/app' ? 'dashboard' : pattern.startsWith('/u/') || pattern.startsWith('/t/') ? 'profile' : pattern.includes('/delete') || personal ? 'settings' : pattern.endsWith('/new') ? 'wizard' : 'collection', + shell: auth ? 'AuthShell' : personal || pattern.startsWith('/app/teams') ? 'AuthenticatedAppShell' : support ? 'Standalone' : 'PublicSingleColumnShell', + template: auth ? 'AuthCard' : pattern === '/app' ? 'DashboardTemplate' : pattern.startsWith('/u/') || pattern.startsWith('/t/') ? 'ProfileTemplate' : support ? 'Standalone' : pattern.endsWith('/new') ? 'WizardTemplate' : pattern.startsWith('/app/account') || pattern.includes('/delete') ? 'SettingsTemplate' : 'CollectionTemplate', + surface: auth ? 'auth' : personal ? 'personal' : team ? 'team' : support ? 'system' : 'public', + resourceType: auth ? 'auth-session' : personal ? 'account' : team ? 'team' : support ? 'api-proxy' : 'user-profile', + accessPolicy: auth ? ['anonymous-safe auth flow', 'safe return URL'] : support ? ['target API policy'] : pattern.startsWith('/u/') || pattern.startsWith('/t/') ? ['public read'] : ['signed-in principal'], + viewModelDependencies: ['Admin auth/session API facade'], + navigation: auth || support || pattern.includes('/delete') ? 'hidden' : personal ? 'secondary' : 'contextual', + states: ['loading', 'forbidden', 'unavailable', 'validation', 'conflict', 'retry', 'success', 'not-found'], + selector: `route-${input.id.replaceAll('.', '-')}`, + status: 'active', + guarantees: [], + ...input, + } }); +} + +export const ADMIN_ROUTES: readonly TreeseedSiteRouteContribution[] = validateTreeseedRouteCapabilities([ + adminRoute('/app', 'pages/app/index.astro', { id: 'admin.app.start', description: 'Authenticated identity and active-team start dashboard.', guarantees: ['guarantee.route.registry'] }), + adminRoute('/app/account', 'pages/app/account/index.astro', { id: 'admin.account.identity', description: 'Identity, immutable username, verified email, password, and connected-provider settings.', guarantees: ['guarantee.user.account.edit-account-settings.006'] }), + adminRoute('/app/account/sessions', 'pages/app/account/sessions.astro', { id: 'admin.account.sessions', description: 'Account session collection with current-session protection and revocation.', guarantees: ['guarantee.user.account.manage-sessions.007'] }), + adminRoute('/app/account/notifications', 'pages/app/account/notifications.astro', { id: 'admin.account.notifications', description: 'Global and per-project content notification preferences and email cadence.', guarantees: ['guarantee.user.account.manage-notifications.011'] }), + adminRoute('/app/account/appearance', 'pages/app/account/appearance.astro', { id: 'admin.account.appearance', description: 'Personal theme creation and management; activation remains in the shell selector.', guarantees: ['guarantee.user.account.manage-appearance.009'] }), + adminRoute('/app/account/delete', 'pages/app/account/delete.astro', { id: 'admin.account.delete', description: 'Blocked, reauthenticated, exact-confirmation account deletion.', guarantees: ['guarantee.user.account.delete-user.011'] }), + adminRoute('/app/teams', 'pages/app/teams/index.astro', { id: 'admin.team.collection', description: 'Teams available to the principal and active-team selection.' }), + adminRoute('/app/teams/new', 'pages/app/teams/new.astro', { id: 'admin.team.create', description: 'Authenticated team creation.' }), + adminRoute('/app/teams/[teamId]/edit', 'pages/app/teams/[teamId]/edit.astro', { id: 'admin.team.edit', description: 'Authorized team identity settings.' }), + adminRoute('/app/teams/[teamId]/delete', 'pages/app/teams/[teamId]/delete.astro', { id: 'admin.team.delete', description: 'Authorized, blocker-aware team deletion.' }), + adminRoute('/app/teams/[teamId]/members', 'pages/app/teams/[teamId]/members.astro', { id: 'admin.team.members', description: 'Team membership, invitation, role, and removal operations.' }), + adminRoute('/auth/register', 'pages/auth/register.astro', { id: 'admin.auth.register', description: 'Credential registration with username/email availability and immutable username disclosure.', guarantees: ['guarantee.user.auth.register-user.001'] }), + adminRoute('/auth/check-email', 'pages/auth/check-email.astro', { id: 'admin.auth.check-email', description: 'Hidden verification/reset check-inbox continuation.', archetype: 'message', template: 'MessageTemplate' }), + adminRoute('/auth/confirm-email', 'pages/auth/confirm-email.astro', { id: 'admin.auth.confirm-email', description: 'Email-confirmation token result and recovery.', archetype: 'message', guarantees: ['guarantee.user.auth.verify-email.002'] }), + adminRoute('/auth/sign-in', 'pages/auth/sign-in.astro', { id: 'admin.auth.sign-in', description: 'Credential and configured-provider sign-in.', guarantees: ['guarantee.user.auth.user-login.004'] }), + adminRoute('/auth/logout', 'pages/auth/logout.ts', { id: 'admin.auth.logout', description: 'CSRF-safe POST session termination; non-mutating GET redirect.', responseKind: 'redirect', archetype: 'redirect', accessPolicy: ['GET is non-mutating', 'POST requires signed-in session and double-submit CSRF'], guarantees: ['guarantee.user.auth.user-logout.005'] }), + adminRoute('/auth/forgot-password', 'pages/auth/forgot-password.astro', { id: 'admin.auth.forgot-password', description: 'Privacy-safe password-reset request.' }), + adminRoute('/auth/reset-password', 'pages/auth/reset-password.astro', { id: 'admin.auth.reset-password', description: 'Token-bound password reset.', guarantees: ['guarantee.user.auth.forgot-reset-password.003'] }), + adminRoute('/auth/username', 'pages/auth/username.astro', { id: 'admin.auth.username-claim', description: 'Permanent username claim for first-time provider users.', accessPolicy: ['restricted provider-onboarding session', 'username not already assigned', 'safe return URL'] }), + adminRoute('/auth/device/approve', 'pages/auth/device/approve.astro', { id: 'admin.auth.device-approve', description: 'Authenticated CLI/device authorization approval.', accessPolicy: ['signed-in principal', 'valid pending device request'] }), + adminRoute('/auth/callback/[provider]', 'pages/auth/callback/[provider].ts', { id: 'admin.auth.provider-callback', description: 'Hidden configured-provider callback with one-time state, nonce, PKCE, and safe redirect.', responseKind: 'redirect', archetype: 'redirect', accessPolicy: ['configured provider', 'one-time database state', 'nonce and PKCE validation', 'safe return URL'] }), + adminRoute('/u/[username]', 'pages/u/[username].astro', { id: 'admin.profile.user', description: 'Public identity-only user profile.', guarantees: ['guarantee.user.account.view-user-profile.010'] }), + adminRoute('/t/[name]', 'pages/t/[name].astro', { id: 'admin.profile.team', description: 'Public identity-only team profile.' }), + adminRoute('/team-invites/[token]/accept', 'pages/team-invites/[token]/accept.astro', { id: 'admin.team.invite-accept', description: 'Idempotent invitation acceptance and safe destination.' }), +]); + +export const ADMIN_SUPPORT_ROUTES: readonly TreeseedSiteRouteContribution[] = validateTreeseedRouteCapabilities([ + adminRoute('/v1/[...all]', 'pages/v1/[...all].ts', { + id: 'admin.support.api-proxy', + description: 'Same-origin authenticated API facade with double-submit CSRF enforcement.', + responseKind: 'proxy', archetype: 'action', shell: 'Standalone', template: 'Standalone', surface: 'system', resourceType: 'api-proxy', + accessPolicy: ['target API policy', 'double-submit CSRF for cookie-authenticated mutation'], navigation: 'hidden', + }), +]); diff --git a/src/view-models/account-settings.ts b/src/view-models/account-settings.ts new file mode 100644 index 00000000..61cd754a --- /dev/null +++ b/src/view-models/account-settings.ts @@ -0,0 +1,120 @@ +import type { APIContext } from 'astro'; +import { NOTIFICATION_CONTENT_CAPABILITIES, normalizeNotificationPreferences, type PersonalThemeDraft } from '@treeseed/sdk/account-contracts'; +import { validateGuidedThemePalette } from '@treeseed/ui/theme'; +import { ensureCsrfToken, requireCsrf } from '../lib/auth/csrf'; +import { clearApiAccessTokenCookie, createApiFacade } from '../lib/market/api-client'; +import { loadAppContext } from './app-access'; + +export const ACCOUNT_SECTIONS = [ + { id: 'identity', label: 'Identity', href: '/app/account' }, + { id: 'sessions', label: 'Sessions', href: '/app/account/sessions' }, + { id: 'notifications', label: 'Notifications', href: '/app/account/notifications' }, + { id: 'appearance', label: 'Appearance', href: '/app/account/appearance' }, + { id: 'delete', label: 'Delete', href: '/app/account/delete' }, +] as const; + +function redirectStatus(context: APIContext, route: string, status: string, error = false) { + const target = new URL(route, context.url.origin); + target.searchParams.set(error ? 'error' : 'status', status); + return context.redirect(`${target.pathname}${target.search}`, 303); +} + +function errorMessage(error: unknown) { + return error instanceof Error ? error.message : 'The account operation failed.'; +} + +export async function loadAccountFrame(context: APIContext, section: typeof ACCOUNT_SECTIONS[number]['id']) { + const app = await loadAppContext(context); + return { + app, + api: createApiFacade(context), + csrfToken: ensureCsrfToken(context), + sections: ACCOUNT_SECTIONS.map((entry) => ({ ...entry, current: entry.id === section })), + status: context.url.searchParams.get('status'), + error: context.url.searchParams.get('error'), + }; +} + +export async function handleIdentityRequest(context: APIContext, api: ReturnType) { + if (context.request.method !== 'POST') return null; + const form = await context.request.formData(); + requireCsrf(context, form.get('csrfToken')); + const intent = String(form.get('intent') ?? ''); + try { + if (intent === 'profile') await api.updateAccountProfile({ firstName: String(form.get('firstName') ?? ''), lastName: String(form.get('lastName') ?? ''), image: String(form.get('image') ?? '') || null }); + else if (intent === 'add-email') await api.addAccountEmail(String(form.get('email') ?? '')); + else if (intent === 'resend-email') await api.resendAccountEmail(String(form.get('emailId') ?? '')); + else if (intent === 'primary-email') await api.setPrimaryAccountEmail(String(form.get('emailId') ?? '')); + else if (intent === 'delete-email') await api.deleteAccountEmail(String(form.get('emailId') ?? '')); + else if (intent === 'password') await api.updateAccountPassword({ currentPassword: String(form.get('currentPassword') ?? ''), password: String(form.get('password') ?? ''), reauthenticationGrantId: String(form.get('reauthenticationGrantId') ?? '') || undefined }); + else if (intent === 'unlink-provider') await api.unlinkAccountProvider(String(form.get('identityId') ?? '')); + else throw new Error('Unknown account action.'); + return redirectStatus(context, '/app/account', intent === 'profile' ? 'Identity saved.' : intent === 'password' ? 'Password updated.' : 'Account updated.'); + } catch (error) { + return redirectStatus(context, '/app/account', errorMessage(error), true); + } +} + +export async function handleSessionRequest(context: APIContext, api: ReturnType) { + if (context.request.method !== 'POST') return null; + const form = await context.request.formData(); + requireCsrf(context, form.get('csrfToken')); + try { + await api.revokeAccountSession(String(form.get('sessionId') ?? '')); + return redirectStatus(context, '/app/account/sessions', 'Session revoked.'); + } catch (error) { return redirectStatus(context, '/app/account/sessions', errorMessage(error), true); } +} + +export async function handleNotificationRequest(context: APIContext, api: ReturnType) { + if (context.request.method !== 'POST') return null; + const form = await context.request.formData(); + requireCsrf(context, form.get('csrfToken')); + const overrideProjects = form.getAll('overrideProjects').map(String); + const preferences = normalizeNotificationPreferences({ + emailCadence: String(form.get('emailCadence') ?? 'daily') as any, + timeZone: String(form.get('timeZone') ?? 'UTC'), + globalContentTypes: form.getAll('globalContentTypes').map(String), + projectOverrides: overrideProjects.map((projectId) => ({ projectId, contentTypes: form.getAll(`projectTypes:${projectId}`).map(String) })), + }); + try { + await api.updateNotificationPreferences(preferences); + return redirectStatus(context, '/app/account/notifications', 'Notification preferences saved.'); + } catch (error) { return redirectStatus(context, '/app/account/notifications', errorMessage(error), true); } +} + +function themeDraft(form: FormData): PersonalThemeDraft { + const palette = { + light: { canvas: String(form.get('light.canvas') ?? ''), surface: String(form.get('light.surface') ?? ''), text: String(form.get('light.text') ?? ''), accent: String(form.get('light.accent') ?? '') }, + dark: { canvas: String(form.get('dark.canvas') ?? ''), surface: String(form.get('dark.surface') ?? ''), text: String(form.get('dark.text') ?? ''), accent: String(form.get('dark.accent') ?? '') }, + }; + const validation = validateGuidedThemePalette(palette); + if (!validation.ok) throw new Error(validation.errors.join(' ')); + return { name: String(form.get('name') ?? '').trim(), baseScheme: String(form.get('baseScheme') ?? 'fern'), palette }; +} + +export async function handleAppearanceRequest(context: APIContext, api: ReturnType) { + if (context.request.method !== 'POST') return null; + const form = await context.request.formData(); + requireCsrf(context, form.get('csrfToken')); + const intent = String(form.get('intent') ?? ''); + try { + if (intent === 'create-theme') await api.createPersonalTheme(themeDraft(form)); + else if (intent === 'update-theme') await api.updatePersonalTheme(String(form.get('themeId') ?? ''), themeDraft(form)); + else if (intent === 'delete-theme') await api.deletePersonalTheme(String(form.get('themeId') ?? '')); + else throw new Error('Unknown appearance action.'); + return redirectStatus(context, '/app/account/appearance', intent === 'delete-theme' ? 'Theme deleted.' : 'Theme saved.'); + } catch (error) { return redirectStatus(context, '/app/account/appearance', errorMessage(error), true); } +} + +export async function handleDeletionRequest(context: APIContext, api: ReturnType) { + if (context.request.method !== 'POST') return null; + const form = await context.request.formData(); + requireCsrf(context, form.get('csrfToken')); + try { + await api.deleteCurrentAccount({ confirmation: String(form.get('confirmation') ?? ''), currentPassword: String(form.get('currentPassword') ?? ''), reauthenticationGrantId: String(form.get('reauthenticationGrantId') ?? '') || undefined }); + clearApiAccessTokenCookie(context); + return context.redirect('/auth/sign-in?deleted=1', 303); + } catch (error) { return redirectStatus(context, '/app/account/delete', errorMessage(error), true); } +} + +export { NOTIFICATION_CONTENT_CAPABILITIES }; diff --git a/test/admin-package.test.ts b/test/admin-package.test.ts index 4888e5de..15b1a799 100644 --- a/test/admin-package.test.ts +++ b/test/admin-package.test.ts @@ -3,13 +3,17 @@ import { extname, join, relative, resolve } from 'node:path'; import { describe, expect, it } from 'vitest'; import adminPlugin, { ADMIN_CAPABILITIES, ADMIN_ENV_SCHEMA } from '../src/plugin'; import type { TreeseedPluginSiteContext, TreeseedSiteExtensionContribution } from '@treeseed/sdk/platform/plugin'; -import { ADMIN_ROUTES } from '../src/routes'; +import { ADMIN_ROUTES, ADMIN_SUPPORT_ROUTES } from '../src/routes'; import { DEFAULT_ADMIN_COMMERCE_PROVIDER } from '../src/commerce'; import { DEFAULT_SECRET_MANAGER_PROVIDERS } from '../src/secret-managers'; const EXPECTED_ROUTES = [ '/app', '/app/account', + '/app/account/sessions', + '/app/account/notifications', + '/app/account/appearance', + '/app/account/delete', '/app/teams', '/app/teams/new', '/app/teams/[teamId]/edit', @@ -28,8 +32,8 @@ const EXPECTED_ROUTES = [ '/u/[username]', '/t/[name]', '/team-invites/[token]/accept', - '/v1/[...all]', ].sort(); +const EXPECTED_SUPPORT_ROUTES = ['/v1/[...all]']; function filesUnder(root: string): string[] { if (!existsSync(root)) return []; @@ -67,8 +71,9 @@ describe('@treeseed/admin identity and team surface', () => { it('registers exactly the retained routes and resources', () => { const pageFiles = filesUnder('src/pages').filter((path) => /\.(astro|ts)$/u.test(path)); expect(ADMIN_ROUTES.map((route) => route.pattern).sort()).toEqual(EXPECTED_ROUTES); - expect(pageFiles.map(routePatternFromPage).sort()).toEqual(EXPECTED_ROUTES); - expect(ADMIN_ROUTES.map((route) => route.resourcePath).sort()).toEqual( + expect(ADMIN_SUPPORT_ROUTES.map((route) => route.pattern).sort()).toEqual(EXPECTED_SUPPORT_ROUTES); + expect(pageFiles.map(routePatternFromPage).sort()).toEqual([...EXPECTED_ROUTES, ...EXPECTED_SUPPORT_ROUTES].sort()); + expect([...ADMIN_ROUTES, ...ADMIN_SUPPORT_ROUTES].map((route) => route.resourcePath).sort()).toEqual( pageFiles.map((path) => path.replace(/^src\//u, '')).sort(), ); }); @@ -79,7 +84,8 @@ describe('@treeseed/admin identity and team surface', () => { expect(appLayout).toContain(target); } for (const target of ['/app/projects', '/app/capacity', '/app/work', '/app/knowledge', '/market', '/cart', '/seller']) { - expect(appLayout).not.toContain(target); + const escaped = target.replace(/[.*+?^${}()|[\]\\]/gu, '\\$&'); + expect(appLayout).not.toMatch(new RegExp(`(?:href|action)\\s*[:=]\\s*['"\\x60]${escaped}`, 'u')); } }); diff --git a/test/shims/sdk-platform-plugin.ts b/test/shims/sdk-platform-plugin.ts index 8b9ce7cc..01673225 100644 --- a/test/shims/sdk-platform-plugin.ts +++ b/test/shims/sdk-platform-plugin.ts @@ -2,8 +2,35 @@ export type TreeseedPlugin = Record; export type TreeseedSiteRouteContribution = { pattern: string; resourcePath: string; + capability?: TreeseedRouteCapability; +}; +export type TreeseedRouteCapability = { + id: string; + owner: 'market' | 'admin' | 'core'; + responseKind: string; + archetype: string; + shell: string; + template: string; + surface: 'auth' | 'public' | 'personal' | 'team' | 'content' | 'system'; + resourceType: string; + accessPolicy: string[]; + viewModelDependencies: string[]; + navigation: string; + states: string[]; + selector: string; + status: string; + guarantees: string[]; + description: string; }; export function defineTreeseedPlugin(plugin: T): T { return plugin; } + +export function defineTreeseedRoute(route: T): T { + return route; +} + +export function validateTreeseedRouteCapabilities(routes: T): T { + return routes; +} From ec77c7868fbcefa2ef571b9ab8f93b8eddb5b603 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Sun, 19 Jul 2026 22:32:32 -0400 Subject: [PATCH 006/315] build(docs): complete agent capacity backend Intent: - Save hint: complete agent capacity backend Changes: - Updates 11 files across docs: 8, build: 2, source: 1. - Touches docs/src/content/agents/architect.mdx, docs/src/content/agents/engineer.mdx, docs/src/content/agents/releaser.mdx, docs/src/content/agents/reporter.mdx, docs/src/content/agents/researcher.mdx, docs/src/content/agents/reviewer.mdx, .... - Plans package version/tag 0.12.59-dev.staging.20260716T154320Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/ui: github:treeseed-ai/ui#2d626565a8cfce92efa3c7e102d27106d0145039 -> github:treeseed-ai/ui#a80348465ad81259d2c0b26b1a5b32ded531d563 - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#14cef4cbec20b1224be1d0daa1a798c206c69987 -> github:treeseed-ai/sdk#5f6ea344a98555079790742a99fb303781f79fed - dependencies.@treeseed/core: github:treeseed-ai/core#fb8bcbac2144d9a814169142d3bdebea1a14ded1 -> github:treeseed-ai/core#b3c2fab3a0e8327a2972fa577a6779afe7eac4c9 --- docs/src/content/agents/architect.mdx | 8 ++ docs/src/content/agents/engineer.mdx | 23 ++++- docs/src/content/agents/releaser.mdx | 10 ++- docs/src/content/agents/reporter.mdx | 15 +++- docs/src/content/agents/researcher.mdx | 8 ++ docs/src/content/agents/reviewer.mdx | 8 ++ docs/src/content/agents/technical-writer.mdx | 8 ++ docs/src/content/agents/tester.mdx | 23 ++++- package-lock.json | 16 ++-- package.json | 6 +- src/lib/market/api-client.ts | 95 -------------------- 11 files changed, 102 insertions(+), 118 deletions(-) diff --git a/docs/src/content/agents/architect.mdx b/docs/src/content/agents/architect.mdx index c58beacc..d85bd55d 100644 --- a/docs/src/content/agents/architect.mdx +++ b/docs/src/content/agents/architect.mdx @@ -86,6 +86,8 @@ activityProfiles: - treeseed.content.read - treedx.build_context - treedx.read_repository_files + - treeseed.repository.read_file + - treeseed.repository.search - treedx.search_workspace - treedx.read_workspace_file - treeseed.status @@ -161,6 +163,8 @@ activityProfiles: - treeseed.content.read - treedx.build_context - treedx.read_repository_files + - treeseed.repository.read_file + - treeseed.repository.search - treedx.search_workspace - treedx.read_workspace_file - treeseed.status @@ -228,6 +232,8 @@ activityProfiles: - treeseed.content.read - treedx.build_context - treedx.read_repository_files + - treeseed.repository.read_file + - treeseed.repository.search - treedx.search_workspace - treedx.read_workspace_file - treeseed.status @@ -295,6 +301,8 @@ activityProfiles: - treeseed.content.read - treedx.build_context - treedx.read_repository_files + - treeseed.repository.read_file + - treeseed.repository.search - treedx.search_workspace - treedx.read_workspace_file - treeseed.status diff --git a/docs/src/content/agents/engineer.mdx b/docs/src/content/agents/engineer.mdx index ee9e3137..afea1b40 100644 --- a/docs/src/content/agents/engineer.mdx +++ b/docs/src/content/agents/engineer.mdx @@ -39,14 +39,14 @@ activityProfiles: planning: activityType: planning enabled: true - handler: actor + handler: writer prompt: system: | You are the Engineer for this TreeSeed project. Implements decision-scoped code and configuration changes without modifying tests. Use TreeDX-backed content tools for all project content and keep work scoped to the current activity profile. task: planning branchPolicy: - kind: read-only - base: main + kind: staging-content + base: staging contentAccess: read: models: @@ -77,7 +77,7 @@ activityProfiles: - validate - commit commit: - allowed: false + allowed: true tools: allowed: - treeseed.content.describe @@ -85,9 +85,18 @@ activityProfiles: - treeseed.content.read - treedx.build_context - treedx.read_repository_files + - treeseed.repository.read_file + - treeseed.repository.search - treedx.search_workspace - treedx.read_workspace_file - treeseed.status + - treeseed.content.create + - treeseed.content.update + - treeseed.content.link + - treeseed.content.validate + - treeseed.content.commit + - treedx.write_workspace_file + - treedx.commit_workspace outputs: messageTypes: [] modelMutations: @@ -153,6 +162,8 @@ activityProfiles: - treeseed.content.read - treedx.build_context - treedx.read_repository_files + - treeseed.repository.read_file + - treeseed.repository.search - treedx.search_workspace - treedx.read_workspace_file - treeseed.status @@ -220,6 +231,8 @@ activityProfiles: - treeseed.content.read - treedx.build_context - treedx.read_repository_files + - treeseed.repository.read_file + - treeseed.repository.search - treedx.search_workspace - treedx.read_workspace_file - treeseed.status @@ -293,6 +306,8 @@ activityProfiles: - treeseed.content.read - treedx.build_context - treedx.read_repository_files + - treeseed.repository.read_file + - treeseed.repository.search - treedx.search_workspace - treedx.read_workspace_file - treeseed.status diff --git a/docs/src/content/agents/releaser.mdx b/docs/src/content/agents/releaser.mdx index c526f6ea..d032e33e 100644 --- a/docs/src/content/agents/releaser.mdx +++ b/docs/src/content/agents/releaser.mdx @@ -39,7 +39,7 @@ activityProfiles: planning: activityType: planning enabled: true - handler: releaser + handler: writer prompt: system: | You are the Releaser for this TreeSeed project. Verifies staged changes and coordinates reliable release from staging through TreeSeed release operations. Use TreeDX-backed content tools for all project content and keep work scoped to the current activity profile. @@ -86,6 +86,8 @@ activityProfiles: - treeseed.content.read - treedx.build_context - treedx.read_repository_files + - treeseed.repository.read_file + - treeseed.repository.search - treedx.search_workspace - treedx.read_workspace_file - treeseed.status @@ -164,6 +166,8 @@ activityProfiles: - treeseed.content.read - treedx.build_context - treedx.read_repository_files + - treeseed.repository.read_file + - treeseed.repository.search - treedx.search_workspace - treedx.read_workspace_file - treeseed.status @@ -231,6 +235,8 @@ activityProfiles: - treeseed.content.read - treedx.build_context - treedx.read_repository_files + - treeseed.repository.read_file + - treeseed.repository.search - treedx.search_workspace - treedx.read_workspace_file - treeseed.status @@ -299,6 +305,8 @@ activityProfiles: - treeseed.content.read - treedx.build_context - treedx.read_repository_files + - treeseed.repository.read_file + - treeseed.repository.search - treedx.search_workspace - treedx.read_workspace_file - treeseed.status diff --git a/docs/src/content/agents/reporter.mdx b/docs/src/content/agents/reporter.mdx index 9bec2f43..b808cc5f 100644 --- a/docs/src/content/agents/reporter.mdx +++ b/docs/src/content/agents/reporter.mdx @@ -44,8 +44,8 @@ activityProfiles: You are the Reporter for this TreeSeed project. Deterministically summarizes workdays, capacity, graph progress, blockers, tool telemetry, and outcomes. Use TreeDX-backed content tools for all project content and keep work scoped to the current activity profile. task: reporting branchPolicy: - kind: read-only - base: main + kind: staging-content + base: staging contentAccess: read: models: @@ -76,7 +76,7 @@ activityProfiles: - validate - commit commit: - allowed: false + allowed: true tools: allowed: - treeseed.content.describe @@ -84,9 +84,18 @@ activityProfiles: - treeseed.content.read - treedx.build_context - treedx.read_repository_files + - treeseed.repository.read_file + - treeseed.repository.search - treedx.search_workspace - treedx.read_workspace_file - treeseed.status + - treeseed.content.create + - treeseed.content.update + - treeseed.content.link + - treeseed.content.validate + - treeseed.content.commit + - treedx.write_workspace_file + - treedx.commit_workspace outputs: messageTypes: [] modelMutations: diff --git a/docs/src/content/agents/researcher.mdx b/docs/src/content/agents/researcher.mdx index 25183f76..68a8b8fa 100644 --- a/docs/src/content/agents/researcher.mdx +++ b/docs/src/content/agents/researcher.mdx @@ -86,6 +86,8 @@ activityProfiles: - treeseed.content.read - treedx.build_context - treedx.read_repository_files + - treeseed.repository.read_file + - treeseed.repository.search - treedx.search_workspace - treedx.read_workspace_file - treeseed.status @@ -161,6 +163,8 @@ activityProfiles: - treeseed.content.read - treedx.build_context - treedx.read_repository_files + - treeseed.repository.read_file + - treeseed.repository.search - treedx.search_workspace - treedx.read_workspace_file - treeseed.status @@ -228,6 +232,8 @@ activityProfiles: - treeseed.content.read - treedx.build_context - treedx.read_repository_files + - treeseed.repository.read_file + - treeseed.repository.search - treedx.search_workspace - treedx.read_workspace_file - treeseed.status @@ -295,6 +301,8 @@ activityProfiles: - treeseed.content.read - treedx.build_context - treedx.read_repository_files + - treeseed.repository.read_file + - treeseed.repository.search - treedx.search_workspace - treedx.read_workspace_file - treeseed.status diff --git a/docs/src/content/agents/reviewer.mdx b/docs/src/content/agents/reviewer.mdx index c41b0d40..0a74f639 100644 --- a/docs/src/content/agents/reviewer.mdx +++ b/docs/src/content/agents/reviewer.mdx @@ -86,6 +86,8 @@ activityProfiles: - treeseed.content.read - treedx.build_context - treedx.read_repository_files + - treeseed.repository.read_file + - treeseed.repository.search - treedx.search_workspace - treedx.read_workspace_file - treeseed.status @@ -161,6 +163,8 @@ activityProfiles: - treeseed.content.read - treedx.build_context - treedx.read_repository_files + - treeseed.repository.read_file + - treeseed.repository.search - treedx.search_workspace - treedx.read_workspace_file - treeseed.status @@ -228,6 +232,8 @@ activityProfiles: - treeseed.content.read - treedx.build_context - treedx.read_repository_files + - treeseed.repository.read_file + - treeseed.repository.search - treedx.search_workspace - treedx.read_workspace_file - treeseed.status @@ -295,6 +301,8 @@ activityProfiles: - treeseed.content.read - treedx.build_context - treedx.read_repository_files + - treeseed.repository.read_file + - treeseed.repository.search - treedx.search_workspace - treedx.read_workspace_file - treeseed.status diff --git a/docs/src/content/agents/technical-writer.mdx b/docs/src/content/agents/technical-writer.mdx index 3c42c337..838fdc5b 100644 --- a/docs/src/content/agents/technical-writer.mdx +++ b/docs/src/content/agents/technical-writer.mdx @@ -85,6 +85,8 @@ activityProfiles: - treeseed.content.read - treedx.build_context - treedx.read_repository_files + - treeseed.repository.read_file + - treeseed.repository.search - treedx.search_workspace - treedx.read_workspace_file - treeseed.status @@ -160,6 +162,8 @@ activityProfiles: - treeseed.content.read - treedx.build_context - treedx.read_repository_files + - treeseed.repository.read_file + - treeseed.repository.search - treedx.search_workspace - treedx.read_workspace_file - treeseed.status @@ -227,6 +231,8 @@ activityProfiles: - treeseed.content.read - treedx.build_context - treedx.read_repository_files + - treeseed.repository.read_file + - treeseed.repository.search - treedx.search_workspace - treedx.read_workspace_file - treeseed.status @@ -294,6 +300,8 @@ activityProfiles: - treeseed.content.read - treedx.build_context - treedx.read_repository_files + - treeseed.repository.read_file + - treeseed.repository.search - treedx.search_workspace - treedx.read_workspace_file - treeseed.status diff --git a/docs/src/content/agents/tester.mdx b/docs/src/content/agents/tester.mdx index 3a845d3d..f5c97805 100644 --- a/docs/src/content/agents/tester.mdx +++ b/docs/src/content/agents/tester.mdx @@ -39,14 +39,14 @@ activityProfiles: planning: activityType: planning enabled: true - handler: actor + handler: writer prompt: system: | You are the Tester for this TreeSeed project. Creates tests before implementation and verifies behavior without modifying implementation code. Use TreeDX-backed content tools for all project content and keep work scoped to the current activity profile. task: planning branchPolicy: - kind: read-only - base: main + kind: staging-content + base: staging contentAccess: read: models: @@ -77,7 +77,7 @@ activityProfiles: - validate - commit commit: - allowed: false + allowed: true tools: allowed: - treeseed.content.describe @@ -85,9 +85,18 @@ activityProfiles: - treeseed.content.read - treedx.build_context - treedx.read_repository_files + - treeseed.repository.read_file + - treeseed.repository.search - treedx.search_workspace - treedx.read_workspace_file - treeseed.status + - treeseed.content.create + - treeseed.content.update + - treeseed.content.link + - treeseed.content.validate + - treeseed.content.commit + - treedx.write_workspace_file + - treedx.commit_workspace outputs: messageTypes: [] modelMutations: @@ -153,6 +162,8 @@ activityProfiles: - treeseed.content.read - treedx.build_context - treedx.read_repository_files + - treeseed.repository.read_file + - treeseed.repository.search - treedx.search_workspace - treedx.read_workspace_file - treeseed.status @@ -220,6 +231,8 @@ activityProfiles: - treeseed.content.read - treedx.build_context - treedx.read_repository_files + - treeseed.repository.read_file + - treeseed.repository.search - treedx.search_workspace - treedx.read_workspace_file - treeseed.status @@ -293,6 +306,8 @@ activityProfiles: - treeseed.content.read - treedx.build_context - treedx.read_repository_files + - treeseed.repository.read_file + - treeseed.repository.search - treedx.search_workspace - treedx.read_workspace_file - treeseed.status diff --git a/package-lock.json b/package-lock.json index fd49a5f5..f7f80038 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,9 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#fb8bcbac2144d9a814169142d3bdebea1a14ded1", - "@treeseed/sdk": "github:treeseed-ai/sdk#14cef4cbec20b1224be1d0daa1a798c206c69987", - "@treeseed/ui": "github:treeseed-ai/ui#2d626565a8cfce92efa3c7e102d27106d0145039", + "@treeseed/core": "github:treeseed-ai/core#b3c2fab3a0e8327a2972fa577a6779afe7eac4c9", + "@treeseed/sdk": "github:treeseed-ai/sdk#5f6ea344a98555079790742a99fb303781f79fed", + "@treeseed/ui": "github:treeseed-ai/ui#a80348465ad81259d2c0b26b1a5b32ded531d563", "react": "^19.2.5", "react-dom": "^19.2.6" }, @@ -6932,7 +6932,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.staging.20260716T185112Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#fb8bcbac2144d9a814169142d3bdebea1a14ded1", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#b3c2fab3a0e8327a2972fa577a6779afe7eac4c9", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6943,8 +6943,8 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#14cef4cbec20b1224be1d0daa1a798c206c69987", - "@treeseed/ui": "github:treeseed-ai/ui#2d626565a8cfce92efa3c7e102d27106d0145039", + "@treeseed/sdk": "github:treeseed-ai/sdk#5f6ea344a98555079790742a99fb303781f79fed", + "@treeseed/ui": "github:treeseed-ai/ui#a80348465ad81259d2c0b26b1a5b32ded531d563", "astro": "^5.6.1", "esbuild": "^0.28.0", "katex": "^0.16.22", @@ -8948,7 +8948,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.staging.20260716T185056Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#14cef4cbec20b1224be1d0daa1a798c206c69987", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#5f6ea344a98555079790742a99fb303781f79fed", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", @@ -9645,7 +9645,7 @@ }, "node_modules/@treeseed/ui": { "version": "0.12.18-dev.staging.20260716T185026Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#2d626565a8cfce92efa3c7e102d27106d0145039", + "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#a80348465ad81259d2c0b26b1a5b32ded531d563", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", diff --git a/package.json b/package.json index 3bc68167..279b3075 100644 --- a/package.json +++ b/package.json @@ -47,9 +47,9 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#fb8bcbac2144d9a814169142d3bdebea1a14ded1", - "@treeseed/sdk": "github:treeseed-ai/sdk#14cef4cbec20b1224be1d0daa1a798c206c69987", - "@treeseed/ui": "github:treeseed-ai/ui#2d626565a8cfce92efa3c7e102d27106d0145039", + "@treeseed/core": "github:treeseed-ai/core#b3c2fab3a0e8327a2972fa577a6779afe7eac4c9", + "@treeseed/sdk": "github:treeseed-ai/sdk#5f6ea344a98555079790742a99fb303781f79fed", + "@treeseed/ui": "github:treeseed-ai/ui#a80348465ad81259d2c0b26b1a5b32ded531d563", "react": "^19.2.5", "react-dom": "^19.2.6" }, diff --git a/src/lib/market/api-client.ts b/src/lib/market/api-client.ts index 3afeb6a3..44dbf259 100644 --- a/src/lib/market/api-client.ts +++ b/src/lib/market/api-client.ts @@ -249,34 +249,6 @@ export class ApiClientFacade { return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/capacity?environment=${encodeURIComponent(environment)}`); } - getProjectCapacityOperations(projectId: string, environment = 'staging') { - return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/capacity/operations?environment=${encodeURIComponent(environment)}`); - } - - listProjectWorkdaySummaries(projectId: string, environment: string | null = null) { - const query = environment ? `?environment=${encodeURIComponent(environment)}` : ''; - return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/workdays${query}`); - } - - listRuntimeWorkDays(projectId: string, options: { limit?: number } = {}) { - return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/runtime/workdays?limit=${encodeURIComponent(String(options.limit ?? 100))}`); - } - - listRuntimeTasks(projectId: string, options: { workDayId?: string; limit?: number } = {}) { - const query = new URLSearchParams(); - if (options.workDayId) query.set('workDayId', options.workDayId); - query.set('limit', String(options.limit ?? 100)); - return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/runtime/tasks?${query}`); - } - - listRuntimeTaskEvents(projectId: string, taskId: string) { - return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/runtime/tasks/${encodeURIComponent(taskId)}/events`); - } - - listRuntimeTaskOutputs(projectId: string, taskId: string) { - return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/runtime/tasks/${encodeURIComponent(taskId)}/outputs`); - } - listApprovalRequestsForProject(projectId: string, limit = 100) { return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/approval-requests?limit=${encodeURIComponent(String(limit))}`); } @@ -393,22 +365,6 @@ export class ApiClientFacade { return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/permissions`); } - getTeamPortfolioAllocation(teamId: string) { - return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/capacity-allocation`); - } - - updateTeamPortfolioAllocation(teamId: string, body: Record) { - return this.request('PUT', `/v1/teams/${encodeURIComponent(teamId)}/capacity-allocation`, { body }); - } - - getProjectAgentClassAllocation(projectId: string) { - return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/capacity-allocation`); - } - - updateProjectAgentClassAllocation(projectId: string, body: Record) { - return this.request('PUT', `/v1/projects/${encodeURIComponent(projectId)}/capacity-allocation`, { body }); - } - getCommerceVendor(teamId: string) { return this.request('GET', `/v1/commerce/vendors/${encodeURIComponent(teamId)}`); } @@ -769,57 +725,6 @@ export class ApiClientFacade { return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/web-hosts/${encodeURIComponent(hostId)}`); } - listTeamCapacityProviders(teamId: string) { - return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/capacity-providers`); - } - - getCapacityProvider(teamId: string, providerId: string) { - return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/capacity-providers/${encodeURIComponent(providerId)}`); - } - - getCapacityProviderById(providerId: string) { - return this.request('GET', `/v1/capacity/providers/${encodeURIComponent(providerId)}`); - } - - updateCapacityProvider(teamId: string, providerId: string, body: Record) { - return this.request('PATCH', `/v1/teams/${encodeURIComponent(teamId)}/capacity-providers/${encodeURIComponent(providerId)}`, { body }); - } - - listCapacityGrants(teamId: string, filters: { projectId?: string | null; providerId?: string | null } = {}) { - const query = new URLSearchParams(); - if (filters.projectId) query.set('projectId', filters.projectId); - if (filters.providerId) query.set('providerId', filters.providerId); - return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/capacity-grants${query.toString() ? `?${query}` : ''}`); - } - - createCapacityGrant(teamId: string, body: Record) { - return this.request('POST', `/v1/teams/${encodeURIComponent(teamId)}/capacity-grants`, { body }); - } - - updateCapacityGrant(teamId: string, grantId: string, body: Record) { - return this.request('PATCH', `/v1/teams/${encodeURIComponent(teamId)}/capacity-grants/${encodeURIComponent(grantId)}`, { body }); - } - - listExecutionProviders(teamId: string, providerId: string) { - return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/capacity-providers/${encodeURIComponent(providerId)}/execution-providers`); - } - - createExecutionProvider(teamId: string, providerId: string, body: Record) { - return this.request('POST', `/v1/teams/${encodeURIComponent(teamId)}/capacity-providers/${encodeURIComponent(providerId)}/execution-providers`, { body }); - } - - updateExecutionProvider(teamId: string, providerId: string, executionProviderId: string, body: Record) { - return this.request('PATCH', `/v1/teams/${encodeURIComponent(teamId)}/capacity-providers/${encodeURIComponent(providerId)}/execution-providers/${encodeURIComponent(executionProviderId)}`, { body }); - } - - createExecutionProviderNativeLimit(teamId: string, providerId: string, executionProviderId: string, body: Record) { - return this.request('POST', `/v1/teams/${encodeURIComponent(teamId)}/capacity-providers/${encodeURIComponent(providerId)}/execution-providers/${encodeURIComponent(executionProviderId)}/native-limits`, { body }); - } - - listCapacityProviderDeployments(teamId: string, providerId: string) { - return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/capacity-providers/${encodeURIComponent(providerId)}/deployments`); - } - listCapacityAllocationSets(teamId: string) { return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/capacity/allocation-sets`); } From e8fa717b1df433d758ace44232a13d868ce1e539 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Mon, 20 Jul 2026 00:28:25 -0400 Subject: [PATCH 007/315] build(build): remove legacy Codex provider alias and close local Intent: - Save hint: remove legacy Codex provider alias and close local capacity audit Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.staging.20260716T154320Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#5f6ea344a98555079790742a99fb303781f79fed -> github:treeseed-ai/sdk#0e1e1f90fd9a4da3c33cf4397ca9dc6d43c00607 - dependencies.@treeseed/core: github:treeseed-ai/core#b3c2fab3a0e8327a2972fa577a6779afe7eac4c9 -> github:treeseed-ai/core#e83058c30b0a1dc074e805db90c44896f12f3e39 --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index f7f80038..cdca2119 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#b3c2fab3a0e8327a2972fa577a6779afe7eac4c9", - "@treeseed/sdk": "github:treeseed-ai/sdk#5f6ea344a98555079790742a99fb303781f79fed", + "@treeseed/core": "github:treeseed-ai/core#e83058c30b0a1dc074e805db90c44896f12f3e39", + "@treeseed/sdk": "github:treeseed-ai/sdk#0e1e1f90fd9a4da3c33cf4397ca9dc6d43c00607", "@treeseed/ui": "github:treeseed-ai/ui#a80348465ad81259d2c0b26b1a5b32ded531d563", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -6932,7 +6932,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.staging.20260716T185112Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#b3c2fab3a0e8327a2972fa577a6779afe7eac4c9", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#e83058c30b0a1dc074e805db90c44896f12f3e39", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6943,7 +6943,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#5f6ea344a98555079790742a99fb303781f79fed", + "@treeseed/sdk": "github:treeseed-ai/sdk#0e1e1f90fd9a4da3c33cf4397ca9dc6d43c00607", "@treeseed/ui": "github:treeseed-ai/ui#a80348465ad81259d2c0b26b1a5b32ded531d563", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8948,7 +8948,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.staging.20260716T185056Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#5f6ea344a98555079790742a99fb303781f79fed", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#0e1e1f90fd9a4da3c33cf4397ca9dc6d43c00607", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index 279b3075..ad487acc 100644 --- a/package.json +++ b/package.json @@ -47,8 +47,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#b3c2fab3a0e8327a2972fa577a6779afe7eac4c9", - "@treeseed/sdk": "github:treeseed-ai/sdk#5f6ea344a98555079790742a99fb303781f79fed", + "@treeseed/core": "github:treeseed-ai/core#e83058c30b0a1dc074e805db90c44896f12f3e39", + "@treeseed/sdk": "github:treeseed-ai/sdk#0e1e1f90fd9a4da3c33cf4397ca9dc6d43c00607", "@treeseed/ui": "github:treeseed-ai/ui#a80348465ad81259d2c0b26b1a5b32ded531d563", "react": "^19.2.5", "react-dom": "^19.2.6" From 4ec2469f7f71e3cccc5e5b464f9a2a777f46830f Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Mon, 20 Jul 2026 00:48:31 -0400 Subject: [PATCH 008/315] build(build): publish clean nested repositories and close save audit Intent: - Save hint: publish clean nested repositories and close save audit Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.staging.20260716T154320Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#0e1e1f90fd9a4da3c33cf4397ca9dc6d43c00607 -> github:treeseed-ai/sdk#e59fbd61debb66b49c18b37ae699c9b572b8bea6 - dependencies.@treeseed/core: github:treeseed-ai/core#e83058c30b0a1dc074e805db90c44896f12f3e39 -> github:treeseed-ai/core#15d576d9d9707a0284a6de35e992d3af8528cb71 --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index cdca2119..677fc85c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#e83058c30b0a1dc074e805db90c44896f12f3e39", - "@treeseed/sdk": "github:treeseed-ai/sdk#0e1e1f90fd9a4da3c33cf4397ca9dc6d43c00607", + "@treeseed/core": "github:treeseed-ai/core#15d576d9d9707a0284a6de35e992d3af8528cb71", + "@treeseed/sdk": "github:treeseed-ai/sdk#e59fbd61debb66b49c18b37ae699c9b572b8bea6", "@treeseed/ui": "github:treeseed-ai/ui#a80348465ad81259d2c0b26b1a5b32ded531d563", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -6932,7 +6932,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.staging.20260716T185112Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#e83058c30b0a1dc074e805db90c44896f12f3e39", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#15d576d9d9707a0284a6de35e992d3af8528cb71", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6943,7 +6943,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#0e1e1f90fd9a4da3c33cf4397ca9dc6d43c00607", + "@treeseed/sdk": "github:treeseed-ai/sdk#e59fbd61debb66b49c18b37ae699c9b572b8bea6", "@treeseed/ui": "github:treeseed-ai/ui#a80348465ad81259d2c0b26b1a5b32ded531d563", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8948,7 +8948,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.staging.20260716T185056Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#0e1e1f90fd9a4da3c33cf4397ca9dc6d43c00607", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#e59fbd61debb66b49c18b37ae699c9b572b8bea6", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index ad487acc..44320d34 100644 --- a/package.json +++ b/package.json @@ -47,8 +47,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#e83058c30b0a1dc074e805db90c44896f12f3e39", - "@treeseed/sdk": "github:treeseed-ai/sdk#0e1e1f90fd9a4da3c33cf4397ca9dc6d43c00607", + "@treeseed/core": "github:treeseed-ai/core#15d576d9d9707a0284a6de35e992d3af8528cb71", + "@treeseed/sdk": "github:treeseed-ai/sdk#e59fbd61debb66b49c18b37ae699c9b572b8bea6", "@treeseed/ui": "github:treeseed-ai/ui#a80348465ad81259d2c0b26b1a5b32ded531d563", "react": "^19.2.5", "react-dom": "^19.2.6" From 2bf6ed8fc337df9abf42e4e283636bf100a158e4 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Wed, 22 Jul 2026 16:40:06 -0400 Subject: [PATCH 009/315] build(build): complete local agent capacity production readiness Intent: - Save hint: complete local agent capacity production readiness Changes: - Updates 3 files across build: 2, docs: 1. - Touches docs/src/content/agents/reviewer.mdx, package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.staging.20260716T154320Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/ui: github:treeseed-ai/ui#a80348465ad81259d2c0b26b1a5b32ded531d563 -> github:treeseed-ai/ui#3ae6621a42733e85169505823de8ffadbb640f70 - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#e59fbd61debb66b49c18b37ae699c9b572b8bea6 -> github:treeseed-ai/sdk#5ae96e564f43944615d9a65e15855edbe8e56d4b - dependencies.@treeseed/core: github:treeseed-ai/core#15d576d9d9707a0284a6de35e992d3af8528cb71 -> github:treeseed-ai/core#f2c88f31606e69fe7b35d465cb84f4d60df0e6c3 --- docs/src/content/agents/reviewer.mdx | 3 ++- package-lock.json | 16 ++++++++-------- package.json | 6 +++--- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/docs/src/content/agents/reviewer.mdx b/docs/src/content/agents/reviewer.mdx index 0a74f639..64793ba8 100644 --- a/docs/src/content/agents/reviewer.mdx +++ b/docs/src/content/agents/reviewer.mdx @@ -258,7 +258,7 @@ activityProfiles: handler: writer prompt: system: | - You are the Reviewer for this TreeSeed project. Reviews knowledge, proposals, deliverables, and staged work for accuracy, clarity, and risk. Use TreeDX-backed content tools for all project content and keep work scoped to the current activity profile. + You are the Reviewer for this TreeSeed project. Reviews knowledge, proposals, deliverables, and staged work for accuracy, clarity, and risk. Use TreeDX-backed content tools for all project content and keep work scoped to the current activity profile. Finish every acting review by calling treeseed.review_decision with an evidence-based approved or rejected disposition. task: acting branchPolicy: kind: main-planning-content @@ -306,6 +306,7 @@ activityProfiles: - treedx.search_workspace - treedx.read_workspace_file - treeseed.status + - treeseed.review_decision - treeseed.content.create - treeseed.content.update - treeseed.content.link diff --git a/package-lock.json b/package-lock.json index 677fc85c..d059b8e7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,9 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#15d576d9d9707a0284a6de35e992d3af8528cb71", - "@treeseed/sdk": "github:treeseed-ai/sdk#e59fbd61debb66b49c18b37ae699c9b572b8bea6", - "@treeseed/ui": "github:treeseed-ai/ui#a80348465ad81259d2c0b26b1a5b32ded531d563", + "@treeseed/core": "github:treeseed-ai/core#f2c88f31606e69fe7b35d465cb84f4d60df0e6c3", + "@treeseed/sdk": "github:treeseed-ai/sdk#5ae96e564f43944615d9a65e15855edbe8e56d4b", + "@treeseed/ui": "github:treeseed-ai/ui#3ae6621a42733e85169505823de8ffadbb640f70", "react": "^19.2.5", "react-dom": "^19.2.6" }, @@ -6932,7 +6932,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.staging.20260716T185112Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#15d576d9d9707a0284a6de35e992d3af8528cb71", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#f2c88f31606e69fe7b35d465cb84f4d60df0e6c3", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6943,8 +6943,8 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#e59fbd61debb66b49c18b37ae699c9b572b8bea6", - "@treeseed/ui": "github:treeseed-ai/ui#a80348465ad81259d2c0b26b1a5b32ded531d563", + "@treeseed/sdk": "github:treeseed-ai/sdk#5ae96e564f43944615d9a65e15855edbe8e56d4b", + "@treeseed/ui": "github:treeseed-ai/ui#3ae6621a42733e85169505823de8ffadbb640f70", "astro": "^5.6.1", "esbuild": "^0.28.0", "katex": "^0.16.22", @@ -8948,7 +8948,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.staging.20260716T185056Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#e59fbd61debb66b49c18b37ae699c9b572b8bea6", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#5ae96e564f43944615d9a65e15855edbe8e56d4b", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", @@ -9645,7 +9645,7 @@ }, "node_modules/@treeseed/ui": { "version": "0.12.18-dev.staging.20260716T185026Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#a80348465ad81259d2c0b26b1a5b32ded531d563", + "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#3ae6621a42733e85169505823de8ffadbb640f70", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", diff --git a/package.json b/package.json index 44320d34..75868a40 100644 --- a/package.json +++ b/package.json @@ -47,9 +47,9 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#15d576d9d9707a0284a6de35e992d3af8528cb71", - "@treeseed/sdk": "github:treeseed-ai/sdk#e59fbd61debb66b49c18b37ae699c9b572b8bea6", - "@treeseed/ui": "github:treeseed-ai/ui#a80348465ad81259d2c0b26b1a5b32ded531d563", + "@treeseed/core": "github:treeseed-ai/core#f2c88f31606e69fe7b35d465cb84f4d60df0e6c3", + "@treeseed/sdk": "github:treeseed-ai/sdk#5ae96e564f43944615d9a65e15855edbe8e56d4b", + "@treeseed/ui": "github:treeseed-ai/ui#3ae6621a42733e85169505823de8ffadbb640f70", "react": "^19.2.5", "react-dom": "^19.2.6" }, From f3f6122d4e97a2401496af6635142ccd88ac8c12 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Wed, 22 Jul 2026 18:00:47 -0400 Subject: [PATCH 010/315] build(build): fix staging verification workflows Intent: - Save hint: fix staging verification workflows Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.staging.20260716T154320Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#5ae96e564f43944615d9a65e15855edbe8e56d4b -> github:treeseed-ai/sdk#689ab4dee96c4b288589b3b60f5989e038fc7f8a - dependencies.@treeseed/core: github:treeseed-ai/core#f2c88f31606e69fe7b35d465cb84f4d60df0e6c3 -> github:treeseed-ai/core#4c289dc0fb2041925ead7c1dd92f44aae33cc25f --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index d059b8e7..ece6f82f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#f2c88f31606e69fe7b35d465cb84f4d60df0e6c3", - "@treeseed/sdk": "github:treeseed-ai/sdk#5ae96e564f43944615d9a65e15855edbe8e56d4b", + "@treeseed/core": "github:treeseed-ai/core#4c289dc0fb2041925ead7c1dd92f44aae33cc25f", + "@treeseed/sdk": "github:treeseed-ai/sdk#689ab4dee96c4b288589b3b60f5989e038fc7f8a", "@treeseed/ui": "github:treeseed-ai/ui#3ae6621a42733e85169505823de8ffadbb640f70", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -6932,7 +6932,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.staging.20260716T185112Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#f2c88f31606e69fe7b35d465cb84f4d60df0e6c3", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#4c289dc0fb2041925ead7c1dd92f44aae33cc25f", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6943,7 +6943,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#5ae96e564f43944615d9a65e15855edbe8e56d4b", + "@treeseed/sdk": "github:treeseed-ai/sdk#689ab4dee96c4b288589b3b60f5989e038fc7f8a", "@treeseed/ui": "github:treeseed-ai/ui#3ae6621a42733e85169505823de8ffadbb640f70", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8948,7 +8948,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.staging.20260716T185056Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#5ae96e564f43944615d9a65e15855edbe8e56d4b", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#689ab4dee96c4b288589b3b60f5989e038fc7f8a", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index 75868a40..bd7b0b97 100644 --- a/package.json +++ b/package.json @@ -47,8 +47,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#f2c88f31606e69fe7b35d465cb84f4d60df0e6c3", - "@treeseed/sdk": "github:treeseed-ai/sdk#5ae96e564f43944615d9a65e15855edbe8e56d4b", + "@treeseed/core": "github:treeseed-ai/core#4c289dc0fb2041925ead7c1dd92f44aae33cc25f", + "@treeseed/sdk": "github:treeseed-ai/sdk#689ab4dee96c4b288589b3b60f5989e038fc7f8a", "@treeseed/ui": "github:treeseed-ai/ui#3ae6621a42733e85169505823de8ffadbb640f70", "react": "^19.2.5", "react-dom": "^19.2.6" From b4259d7e143d5dfc9415ab830f3d3d39844e9ea1 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Thu, 23 Jul 2026 17:35:03 -0400 Subject: [PATCH 011/315] build(source): sync package dependency references Changes: - Updates 189 files across source: 177, build: 6, config: 2, tests: 2, release: 1, workflow: 1. - Touches package-lock.json, package.json, scripts/check-file-lengths.ts, scripts/repair-api-client-extraction.ts, scripts/split-class-methods.ts, scripts/split-module-declarations.ts, .... - Plans package version/tag 0.12.59-dev.staging.20260716T154320Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/ui: github:treeseed-ai/ui#3ae6621a42733e85169505823de8ffadbb640f70 -> github:treeseed-ai/ui#9c6940f6ca0820c1478815dcbca0f298daf0dae3 - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#689ab4dee96c4b288589b3b60f5989e038fc7f8a -> github:treeseed-ai/sdk#2e95b2e65d3a8f224b79459c127875483883c7f8 - dependencies.@treeseed/core: github:treeseed-ai/core#4c289dc0fb2041925ead7c1dd92f44aae33cc25f -> github:treeseed-ai/core#2a00e061edbcf24c288aee73a43345d5f3db8005 --- package-lock.json | 16 +- package.json | 11 +- scripts/check-file-lengths.ts | 47 + scripts/repair-api-client-extraction.ts | 36 + scripts/split-class-methods.ts | 171 +++ scripts/split-module-declarations.ts | 150 +++ src/lib/market/api-client.ts | 1009 +++-------------- .../market/api-client/accept-team-invite.ts | 9 + .../api-client/account-deletion-blockers.ts | 10 + src/lib/market/api-client/account-identity.ts | 7 + .../api-client/account-notifications.ts | 7 + src/lib/market/api-client/account-sessions.ts | 7 + .../market/api-client/add-account-email.ts | 7 + .../api-client/answer-commons-question.ts | 9 + ...e-commerce-capacity-inquiry-for-scoping.ts | 9 + .../approve-commerce-capacity-listing.ts | 9 + .../approve-commerce-ownership-transfer.ts | 9 + src/lib/market/api-client/approve-device.ts | 9 + .../archive-commerce-capacity-listing.ts | 9 + src/lib/market/api-client/auth-providers.ts | 7 + .../backfill-commons-participants.ts | 9 + .../buyer-approve-commerce-service-quote.ts | 9 + .../cancel-commerce-capacity-inquiry.ts | 9 + .../cancel-commerce-ownership-transfer.ts | 9 + .../cancel-commerce-service-contract.ts | 9 + .../cancel-commerce-service-request.ts | 9 + src/lib/market/api-client/claim-username.ts | 7 + .../api-client/complete-password-reset.ts | 9 + src/lib/market/api-client/confirm-email.ts | 7 + ...reate-commerce-capacity-listing-inquiry.ts | 9 + .../create-commerce-capacity-listing.ts | 9 + .../create-commerce-order-refund.ts | 9 + .../create-commerce-service-quote.ts | 9 + .../create-commerce-service-request.ts | 9 + .../create-commerce-succession-event.ts | 9 + ...reate-commerce-vendor-stripe-login-link.ts | 9 + .../api-client/create-commons-proposal.ts | 9 + .../api-client/create-personal-theme.ts | 7 + .../api-client/create-tree-dx-mirror.ts | 9 + .../market/api-client/create-tree-dx-share.ts | 9 + .../market/api-client/create-workday-run.ts | 9 + .../api-client/decide-approval-request.ts | 9 + .../decline-commerce-capacity-inquiry.ts | 9 + .../market/api-client/delete-account-email.ts | 7 + .../api-client/delete-current-account.ts | 13 + .../api-client/delete-personal-theme.ts | 7 + .../delete-team-inbox-items-by-item-key.ts | 9 + .../end-commerce-stewardship-assignment.ts | 9 + .../evaluate-project-deletion-blockers.ts | 9 + .../evaluate-team-deletion-blockers.ts | 9 + .../fulfill-commerce-order-item-artifact.ts | 9 + .../fulfill-commerce-service-contract.ts | 9 + .../market/api-client/get-capacity-plan.ts | 9 + .../api-client/get-catalog-item-by-slug.ts | 9 + ...t-commerce-capacity-listing-for-product.ts | 9 + .../get-commerce-capacity-listing-inquiry.ts | 9 + .../get-commerce-capacity-listing.ts | 9 + .../get-commerce-marketplace-product.ts | 9 + .../get-commerce-ownership-workflow.ts | 9 + .../market/api-client/get-commerce-product.ts | 9 + .../get-commerce-service-contract.ts | 9 + .../get-commerce-service-request.ts | 9 + .../get-commerce-vendor-monitoring.ts | 11 + .../get-commerce-vendor-sales-summary.ts | 11 + .../get-commerce-vendor-stripe-status.ts | 10 + .../market/api-client/get-commerce-vendor.ts | 9 + .../api-client/get-commons-participant-me.ts | 9 + .../market/api-client/get-commons-proposal.ts | 9 + .../market/api-client/get-commons-summary.ts | 9 + .../get-decision-planning-status.ts | 9 + .../api-client/get-project-agents-summary.ts | 9 + .../get-project-by-team-and-slug.ts | 9 + ...et-project-capacity-runtime-diagnostics.ts | 10 + .../get-project-capacity-summary.ts | 9 + .../api-client/get-project-deployment.ts | 14 + .../market/api-client/get-project-details.ts | 9 + .../get-project-releases-summary.ts | 9 + .../get-project-repository-topology.ts | 9 + .../market/api-client/get-project-summary.ts | 9 + .../api-client/get-project-tree-dx-library.ts | 9 + .../get-provider-assignment-explanation.ts | 9 + .../market/api-client/get-repository-host.ts | 9 + .../api-client/get-team-access-summary.ts | 9 + src/lib/market/api-client/get-team-invite.ts | 9 + src/lib/market/api-client/get-team-tree-dx.ts | 9 + .../market/api-client/get-team-web-host.ts | 9 + .../get-workday-capacity-summary.ts | 9 + src/lib/market/api-client/get-workday-run.ts | 9 + src/lib/market/api-client/headers.ts | 15 + src/lib/market/api-client/interface.ts | 182 +++ .../link-commerce-service-contract-work.ts | 9 + .../list-approval-requests-for-project.ts | 9 + .../list-approval-requests-for-team.ts | 16 + .../list-audit-events-for-target.ts | 9 + .../list-capacity-allocation-sets.ts | 9 + .../list-capacity-ledger-entries.ts | 9 + ...-capacity-routing-decisions-for-project.ts | 9 + .../list-catalog-artifact-versions.ts | 9 + .../market/api-client/list-catalog-items.ts | 20 + ...ist-commerce-capacity-listing-inquiries.ts | 11 + .../list-commerce-capacity-listings.ts | 11 + .../list-commerce-marketplace-products.ts | 11 + .../api-client/list-commerce-products.ts | 11 + .../list-commerce-service-events.ts | 11 + .../list-commerce-service-quotes.ts | 9 + .../list-commerce-service-requests.ts | 11 + .../list-commerce-succession-events.ts | 9 + ...list-commerce-vendor-fulfillment-events.ts | 11 + ...list-commerce-vendor-sales-entitlements.ts | 11 + .../list-commerce-vendor-sales-orders.ts | 11 + .../list-commerce-vendor-sales-refunds.ts | 11 + ...ist-commerce-vendor-sales-subscriptions.ts | 11 + .../api-client/list-commons-decisions.ts | 15 + .../market/api-client/list-commons-events.ts | 15 + .../api-client/list-commons-participants.ts | 15 + .../api-client/list-commons-proposals.ts | 15 + .../api-client/list-commons-questions.ts | 15 + .../list-decision-capacity-plans.ts | 14 + .../list-decision-execution-inputs.ts | 9 + .../market/api-client/list-execution-runs.ts | 32 + .../market/api-client/list-knowledge-packs.ts | 9 + .../list-persisted-team-inbox-items.ts | 9 + .../api-client/list-project-agent-classes.ts | 9 + .../list-project-agent-fallback-outputs.ts | 20 + .../list-project-agent-mode-runs.ts | 17 + .../list-project-deployment-events.ts | 12 + .../api-client/list-project-deployments.ts | 23 + .../list-project-tree-dx-proxy-audit.ts | 17 + .../api-client/list-projects-for-principal.ts | 7 + .../api-client/list-provider-assignments.ts | 20 + .../list-provider-availability-sessions.ts | 17 + .../api-client/list-repository-hosts.ts | 12 + src/lib/market/api-client/list-seed-runs.ts | 9 + .../market/api-client/list-team-members.ts | 9 + .../market/api-client/list-team-projects.ts | 9 + .../market/api-client/list-team-web-hosts.ts | 9 + .../api-client/list-teams-for-principal.ts | 9 + .../market/api-client/list-tree-dx-mirrors.ts | 9 + .../market/api-client/list-tree-dx-shares.ts | 9 + .../market/api-client/list-workday-runs.ts | 17 + .../api-client/load-team-profile-by-name.ts | 9 + .../load-user-profile-by-username.ts | 9 + .../mark-commerce-vendor-stripe-return.ts | 9 + src/lib/market/api-client/methods.ts | 356 ++++++ .../api-client/notification-preferences.ts | 7 + src/lib/market/api-client/personal-themes.ts | 7 + .../api-client/provision-team-tree-dx.ts | 9 + .../record-private-knowledge-outcome.ts | 13 + .../reject-commerce-capacity-listing.ts | 9 + .../reject-commerce-ownership-transfer.ts | 9 + .../reject-commerce-service-quote.ts | 9 + .../api-client/request-commerce-vendor.ts | 9 + .../api-client/request-password-reset.ts | 9 + src/lib/market/api-client/request.ts | 23 + .../market/api-client/resend-account-email.ts | 7 + .../review-commerce-capacity-inquiry.ts | 9 + .../api-client/review-commons-proposal.ts | 9 + .../api-client/revoke-account-session.ts | 7 + .../api-client/revoke-commerce-entitlement.ts | 9 + .../api-client/set-primary-account-email.ts | 7 + .../start-commerce-service-scoping.ts | 9 + ...start-commerce-vendor-stripe-onboarding.ts | 9 + .../start-commons-proposal-voting.ts | 9 + .../steward-decision-for-commons-proposal.ts | 9 + .../submit-commerce-capacity-listing.ts | 9 + .../submit-commerce-ownership-transfer.ts | 9 + .../submit-commerce-service-quote.ts | 9 + .../suspend-commerce-capacity-listing.ts | 9 + .../api-client/unlink-account-provider.ts | 7 + .../api-client/update-account-password.ts | 13 + .../api-client/update-account-profile.ts | 11 + .../update-commerce-capacity-listing.ts | 9 + .../update-commerce-contribution.ts | 9 + .../update-commerce-governance-policy.ts | 9 + .../update-commerce-ownership-record.ts | 9 + .../update-commerce-service-request.ts | 9 + .../update-commerce-stewardship-assignment.ts | 9 + .../update-notification-preferences.ts | 7 + .../api-client/update-personal-theme.ts | 7 + .../update-project-repository-topology.ts | 9 + .../market/api-client/update-team-tree-dx.ts | 9 + .../upsert-project-tree-dx-library.ts | 9 + src/lib/market/api-client/url.ts | 9 + .../validate-private-knowledge-access.ts | 12 + .../vendor-approve-commerce-service-quote.ts | 9 + .../contract/package}/admin-package.test.ts | 10 +- .../support}/shims/sdk-platform-plugin.ts | 0 tsconfig.json | 2 +- vitest.config.ts | 4 +- 189 files changed, 2864 insertions(+), 897 deletions(-) create mode 100644 scripts/check-file-lengths.ts create mode 100644 scripts/repair-api-client-extraction.ts create mode 100644 scripts/split-class-methods.ts create mode 100644 scripts/split-module-declarations.ts create mode 100644 src/lib/market/api-client/accept-team-invite.ts create mode 100644 src/lib/market/api-client/account-deletion-blockers.ts create mode 100644 src/lib/market/api-client/account-identity.ts create mode 100644 src/lib/market/api-client/account-notifications.ts create mode 100644 src/lib/market/api-client/account-sessions.ts create mode 100644 src/lib/market/api-client/add-account-email.ts create mode 100644 src/lib/market/api-client/answer-commons-question.ts create mode 100644 src/lib/market/api-client/approve-commerce-capacity-inquiry-for-scoping.ts create mode 100644 src/lib/market/api-client/approve-commerce-capacity-listing.ts create mode 100644 src/lib/market/api-client/approve-commerce-ownership-transfer.ts create mode 100644 src/lib/market/api-client/approve-device.ts create mode 100644 src/lib/market/api-client/archive-commerce-capacity-listing.ts create mode 100644 src/lib/market/api-client/auth-providers.ts create mode 100644 src/lib/market/api-client/backfill-commons-participants.ts create mode 100644 src/lib/market/api-client/buyer-approve-commerce-service-quote.ts create mode 100644 src/lib/market/api-client/cancel-commerce-capacity-inquiry.ts create mode 100644 src/lib/market/api-client/cancel-commerce-ownership-transfer.ts create mode 100644 src/lib/market/api-client/cancel-commerce-service-contract.ts create mode 100644 src/lib/market/api-client/cancel-commerce-service-request.ts create mode 100644 src/lib/market/api-client/claim-username.ts create mode 100644 src/lib/market/api-client/complete-password-reset.ts create mode 100644 src/lib/market/api-client/confirm-email.ts create mode 100644 src/lib/market/api-client/create-commerce-capacity-listing-inquiry.ts create mode 100644 src/lib/market/api-client/create-commerce-capacity-listing.ts create mode 100644 src/lib/market/api-client/create-commerce-order-refund.ts create mode 100644 src/lib/market/api-client/create-commerce-service-quote.ts create mode 100644 src/lib/market/api-client/create-commerce-service-request.ts create mode 100644 src/lib/market/api-client/create-commerce-succession-event.ts create mode 100644 src/lib/market/api-client/create-commerce-vendor-stripe-login-link.ts create mode 100644 src/lib/market/api-client/create-commons-proposal.ts create mode 100644 src/lib/market/api-client/create-personal-theme.ts create mode 100644 src/lib/market/api-client/create-tree-dx-mirror.ts create mode 100644 src/lib/market/api-client/create-tree-dx-share.ts create mode 100644 src/lib/market/api-client/create-workday-run.ts create mode 100644 src/lib/market/api-client/decide-approval-request.ts create mode 100644 src/lib/market/api-client/decline-commerce-capacity-inquiry.ts create mode 100644 src/lib/market/api-client/delete-account-email.ts create mode 100644 src/lib/market/api-client/delete-current-account.ts create mode 100644 src/lib/market/api-client/delete-personal-theme.ts create mode 100644 src/lib/market/api-client/delete-team-inbox-items-by-item-key.ts create mode 100644 src/lib/market/api-client/end-commerce-stewardship-assignment.ts create mode 100644 src/lib/market/api-client/evaluate-project-deletion-blockers.ts create mode 100644 src/lib/market/api-client/evaluate-team-deletion-blockers.ts create mode 100644 src/lib/market/api-client/fulfill-commerce-order-item-artifact.ts create mode 100644 src/lib/market/api-client/fulfill-commerce-service-contract.ts create mode 100644 src/lib/market/api-client/get-capacity-plan.ts create mode 100644 src/lib/market/api-client/get-catalog-item-by-slug.ts create mode 100644 src/lib/market/api-client/get-commerce-capacity-listing-for-product.ts create mode 100644 src/lib/market/api-client/get-commerce-capacity-listing-inquiry.ts create mode 100644 src/lib/market/api-client/get-commerce-capacity-listing.ts create mode 100644 src/lib/market/api-client/get-commerce-marketplace-product.ts create mode 100644 src/lib/market/api-client/get-commerce-ownership-workflow.ts create mode 100644 src/lib/market/api-client/get-commerce-product.ts create mode 100644 src/lib/market/api-client/get-commerce-service-contract.ts create mode 100644 src/lib/market/api-client/get-commerce-service-request.ts create mode 100644 src/lib/market/api-client/get-commerce-vendor-monitoring.ts create mode 100644 src/lib/market/api-client/get-commerce-vendor-sales-summary.ts create mode 100644 src/lib/market/api-client/get-commerce-vendor-stripe-status.ts create mode 100644 src/lib/market/api-client/get-commerce-vendor.ts create mode 100644 src/lib/market/api-client/get-commons-participant-me.ts create mode 100644 src/lib/market/api-client/get-commons-proposal.ts create mode 100644 src/lib/market/api-client/get-commons-summary.ts create mode 100644 src/lib/market/api-client/get-decision-planning-status.ts create mode 100644 src/lib/market/api-client/get-project-agents-summary.ts create mode 100644 src/lib/market/api-client/get-project-by-team-and-slug.ts create mode 100644 src/lib/market/api-client/get-project-capacity-runtime-diagnostics.ts create mode 100644 src/lib/market/api-client/get-project-capacity-summary.ts create mode 100644 src/lib/market/api-client/get-project-deployment.ts create mode 100644 src/lib/market/api-client/get-project-details.ts create mode 100644 src/lib/market/api-client/get-project-releases-summary.ts create mode 100644 src/lib/market/api-client/get-project-repository-topology.ts create mode 100644 src/lib/market/api-client/get-project-summary.ts create mode 100644 src/lib/market/api-client/get-project-tree-dx-library.ts create mode 100644 src/lib/market/api-client/get-provider-assignment-explanation.ts create mode 100644 src/lib/market/api-client/get-repository-host.ts create mode 100644 src/lib/market/api-client/get-team-access-summary.ts create mode 100644 src/lib/market/api-client/get-team-invite.ts create mode 100644 src/lib/market/api-client/get-team-tree-dx.ts create mode 100644 src/lib/market/api-client/get-team-web-host.ts create mode 100644 src/lib/market/api-client/get-workday-capacity-summary.ts create mode 100644 src/lib/market/api-client/get-workday-run.ts create mode 100644 src/lib/market/api-client/headers.ts create mode 100644 src/lib/market/api-client/interface.ts create mode 100644 src/lib/market/api-client/link-commerce-service-contract-work.ts create mode 100644 src/lib/market/api-client/list-approval-requests-for-project.ts create mode 100644 src/lib/market/api-client/list-approval-requests-for-team.ts create mode 100644 src/lib/market/api-client/list-audit-events-for-target.ts create mode 100644 src/lib/market/api-client/list-capacity-allocation-sets.ts create mode 100644 src/lib/market/api-client/list-capacity-ledger-entries.ts create mode 100644 src/lib/market/api-client/list-capacity-routing-decisions-for-project.ts create mode 100644 src/lib/market/api-client/list-catalog-artifact-versions.ts create mode 100644 src/lib/market/api-client/list-catalog-items.ts create mode 100644 src/lib/market/api-client/list-commerce-capacity-listing-inquiries.ts create mode 100644 src/lib/market/api-client/list-commerce-capacity-listings.ts create mode 100644 src/lib/market/api-client/list-commerce-marketplace-products.ts create mode 100644 src/lib/market/api-client/list-commerce-products.ts create mode 100644 src/lib/market/api-client/list-commerce-service-events.ts create mode 100644 src/lib/market/api-client/list-commerce-service-quotes.ts create mode 100644 src/lib/market/api-client/list-commerce-service-requests.ts create mode 100644 src/lib/market/api-client/list-commerce-succession-events.ts create mode 100644 src/lib/market/api-client/list-commerce-vendor-fulfillment-events.ts create mode 100644 src/lib/market/api-client/list-commerce-vendor-sales-entitlements.ts create mode 100644 src/lib/market/api-client/list-commerce-vendor-sales-orders.ts create mode 100644 src/lib/market/api-client/list-commerce-vendor-sales-refunds.ts create mode 100644 src/lib/market/api-client/list-commerce-vendor-sales-subscriptions.ts create mode 100644 src/lib/market/api-client/list-commons-decisions.ts create mode 100644 src/lib/market/api-client/list-commons-events.ts create mode 100644 src/lib/market/api-client/list-commons-participants.ts create mode 100644 src/lib/market/api-client/list-commons-proposals.ts create mode 100644 src/lib/market/api-client/list-commons-questions.ts create mode 100644 src/lib/market/api-client/list-decision-capacity-plans.ts create mode 100644 src/lib/market/api-client/list-decision-execution-inputs.ts create mode 100644 src/lib/market/api-client/list-execution-runs.ts create mode 100644 src/lib/market/api-client/list-knowledge-packs.ts create mode 100644 src/lib/market/api-client/list-persisted-team-inbox-items.ts create mode 100644 src/lib/market/api-client/list-project-agent-classes.ts create mode 100644 src/lib/market/api-client/list-project-agent-fallback-outputs.ts create mode 100644 src/lib/market/api-client/list-project-agent-mode-runs.ts create mode 100644 src/lib/market/api-client/list-project-deployment-events.ts create mode 100644 src/lib/market/api-client/list-project-deployments.ts create mode 100644 src/lib/market/api-client/list-project-tree-dx-proxy-audit.ts create mode 100644 src/lib/market/api-client/list-projects-for-principal.ts create mode 100644 src/lib/market/api-client/list-provider-assignments.ts create mode 100644 src/lib/market/api-client/list-provider-availability-sessions.ts create mode 100644 src/lib/market/api-client/list-repository-hosts.ts create mode 100644 src/lib/market/api-client/list-seed-runs.ts create mode 100644 src/lib/market/api-client/list-team-members.ts create mode 100644 src/lib/market/api-client/list-team-projects.ts create mode 100644 src/lib/market/api-client/list-team-web-hosts.ts create mode 100644 src/lib/market/api-client/list-teams-for-principal.ts create mode 100644 src/lib/market/api-client/list-tree-dx-mirrors.ts create mode 100644 src/lib/market/api-client/list-tree-dx-shares.ts create mode 100644 src/lib/market/api-client/list-workday-runs.ts create mode 100644 src/lib/market/api-client/load-team-profile-by-name.ts create mode 100644 src/lib/market/api-client/load-user-profile-by-username.ts create mode 100644 src/lib/market/api-client/mark-commerce-vendor-stripe-return.ts create mode 100644 src/lib/market/api-client/methods.ts create mode 100644 src/lib/market/api-client/notification-preferences.ts create mode 100644 src/lib/market/api-client/personal-themes.ts create mode 100644 src/lib/market/api-client/provision-team-tree-dx.ts create mode 100644 src/lib/market/api-client/record-private-knowledge-outcome.ts create mode 100644 src/lib/market/api-client/reject-commerce-capacity-listing.ts create mode 100644 src/lib/market/api-client/reject-commerce-ownership-transfer.ts create mode 100644 src/lib/market/api-client/reject-commerce-service-quote.ts create mode 100644 src/lib/market/api-client/request-commerce-vendor.ts create mode 100644 src/lib/market/api-client/request-password-reset.ts create mode 100644 src/lib/market/api-client/request.ts create mode 100644 src/lib/market/api-client/resend-account-email.ts create mode 100644 src/lib/market/api-client/review-commerce-capacity-inquiry.ts create mode 100644 src/lib/market/api-client/review-commons-proposal.ts create mode 100644 src/lib/market/api-client/revoke-account-session.ts create mode 100644 src/lib/market/api-client/revoke-commerce-entitlement.ts create mode 100644 src/lib/market/api-client/set-primary-account-email.ts create mode 100644 src/lib/market/api-client/start-commerce-service-scoping.ts create mode 100644 src/lib/market/api-client/start-commerce-vendor-stripe-onboarding.ts create mode 100644 src/lib/market/api-client/start-commons-proposal-voting.ts create mode 100644 src/lib/market/api-client/steward-decision-for-commons-proposal.ts create mode 100644 src/lib/market/api-client/submit-commerce-capacity-listing.ts create mode 100644 src/lib/market/api-client/submit-commerce-ownership-transfer.ts create mode 100644 src/lib/market/api-client/submit-commerce-service-quote.ts create mode 100644 src/lib/market/api-client/suspend-commerce-capacity-listing.ts create mode 100644 src/lib/market/api-client/unlink-account-provider.ts create mode 100644 src/lib/market/api-client/update-account-password.ts create mode 100644 src/lib/market/api-client/update-account-profile.ts create mode 100644 src/lib/market/api-client/update-commerce-capacity-listing.ts create mode 100644 src/lib/market/api-client/update-commerce-contribution.ts create mode 100644 src/lib/market/api-client/update-commerce-governance-policy.ts create mode 100644 src/lib/market/api-client/update-commerce-ownership-record.ts create mode 100644 src/lib/market/api-client/update-commerce-service-request.ts create mode 100644 src/lib/market/api-client/update-commerce-stewardship-assignment.ts create mode 100644 src/lib/market/api-client/update-notification-preferences.ts create mode 100644 src/lib/market/api-client/update-personal-theme.ts create mode 100644 src/lib/market/api-client/update-project-repository-topology.ts create mode 100644 src/lib/market/api-client/update-team-tree-dx.ts create mode 100644 src/lib/market/api-client/upsert-project-tree-dx-library.ts create mode 100644 src/lib/market/api-client/url.ts create mode 100644 src/lib/market/api-client/validate-private-knowledge-access.ts create mode 100644 src/lib/market/api-client/vendor-approve-commerce-service-quote.ts rename {test => tests/contract/package}/admin-package.test.ts (93%) rename {test => tests/support}/shims/sdk-platform-plugin.ts (100%) diff --git a/package-lock.json b/package-lock.json index ece6f82f..c7fa319d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,9 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#4c289dc0fb2041925ead7c1dd92f44aae33cc25f", - "@treeseed/sdk": "github:treeseed-ai/sdk#689ab4dee96c4b288589b3b60f5989e038fc7f8a", - "@treeseed/ui": "github:treeseed-ai/ui#3ae6621a42733e85169505823de8ffadbb640f70", + "@treeseed/core": "github:treeseed-ai/core#2a00e061edbcf24c288aee73a43345d5f3db8005", + "@treeseed/sdk": "github:treeseed-ai/sdk#2e95b2e65d3a8f224b79459c127875483883c7f8", + "@treeseed/ui": "github:treeseed-ai/ui#9c6940f6ca0820c1478815dcbca0f298daf0dae3", "react": "^19.2.5", "react-dom": "^19.2.6" }, @@ -6932,7 +6932,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.staging.20260716T185112Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#4c289dc0fb2041925ead7c1dd92f44aae33cc25f", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#2a00e061edbcf24c288aee73a43345d5f3db8005", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6943,8 +6943,8 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#689ab4dee96c4b288589b3b60f5989e038fc7f8a", - "@treeseed/ui": "github:treeseed-ai/ui#3ae6621a42733e85169505823de8ffadbb640f70", + "@treeseed/sdk": "github:treeseed-ai/sdk#2e95b2e65d3a8f224b79459c127875483883c7f8", + "@treeseed/ui": "github:treeseed-ai/ui#9c6940f6ca0820c1478815dcbca0f298daf0dae3", "astro": "^5.6.1", "esbuild": "^0.28.0", "katex": "^0.16.22", @@ -8948,7 +8948,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.staging.20260716T185056Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#689ab4dee96c4b288589b3b60f5989e038fc7f8a", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#2e95b2e65d3a8f224b79459c127875483883c7f8", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", @@ -9645,7 +9645,7 @@ }, "node_modules/@treeseed/ui": { "version": "0.12.18-dev.staging.20260716T185026Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#3ae6621a42733e85169505823de8ffadbb640f70", + "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#9c6940f6ca0820c1478815dcbca0f298daf0dae3", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", diff --git a/package.json b/package.json index bd7b0b97..8ccb1b66 100644 --- a/package.json +++ b/package.json @@ -26,13 +26,14 @@ "access": "public" }, "scripts": { + "check:file-lengths": "node --import tsx ./scripts/check-file-lengths.ts", "setup": "npm install", "setup:ci": "npm ci --workspaces=false", "build": "npm run build:dist", "build:dist": "node --import tsx ./scripts/build-dist.ts", "prepare": "node --import tsx ./scripts/prepare.ts", "prepack": "npm run build:dist", - "check": "npm run build:dist && tsc --noEmit", + "check": "npm run check:file-lengths && npm run build:dist && tsc --noEmit", "test": "npm run test:unit", "test:unit": "vitest run --config ./vitest.config.ts", "lint": "npm run check", @@ -42,14 +43,14 @@ "verify": "TMPDIR=/tmp node --import tsx ./scripts/verify-driver.ts", "release:setup": "npm run setup:ci", "release:check-tag": "node --import tsx ./scripts/assert-release-tag-version.ts", - "release:verify": "npm run build:dist && npm run test:unit", + "release:verify": "npm run check:file-lengths && npm run build:dist && npm run test:unit", "release:publish": "node --import tsx ./scripts/publish-package.ts" }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#4c289dc0fb2041925ead7c1dd92f44aae33cc25f", - "@treeseed/sdk": "github:treeseed-ai/sdk#689ab4dee96c4b288589b3b60f5989e038fc7f8a", - "@treeseed/ui": "github:treeseed-ai/ui#3ae6621a42733e85169505823de8ffadbb640f70", + "@treeseed/core": "github:treeseed-ai/core#2a00e061edbcf24c288aee73a43345d5f3db8005", + "@treeseed/sdk": "github:treeseed-ai/sdk#2e95b2e65d3a8f224b79459c127875483883c7f8", + "@treeseed/ui": "github:treeseed-ai/ui#9c6940f6ca0820c1478815dcbca0f298daf0dae3", "react": "^19.2.5", "react-dom": "^19.2.6" }, diff --git a/scripts/check-file-lengths.ts b/scripts/check-file-lengths.ts new file mode 100644 index 00000000..acf383ae --- /dev/null +++ b/scripts/check-file-lengths.ts @@ -0,0 +1,47 @@ +import { existsSync, readFileSync } from 'node:fs'; +import { spawnSync } from 'node:child_process'; + +const hardMaximum = 500; +const targetMaximum = 350; +const codeExtensions = /\.(?:astro|cjs|ex|exs|go|js|jsx|mjs|py|rs|svelte|ts|tsx|vue)$/u; +const excludedSegments = new Set([ + '.agent-worktrees', '.git', '.treeseed', '_build', 'build', 'coverage', 'deps', 'dist', + 'generated', 'migrations', 'node_modules', 'snapshots', 'target', 'vendor', +]); + +function isExcluded(path: string) { + const segments = path.split('/'); + return segments.some((segment) => excludedSegments.has(segment)) + || segments.some((segment) => segment.startsWith('.treeseed-')) + || /(?:^|\.)generated\./u.test(segments.at(-1) ?? '') + || /-snapshots(?:\/|$)/u.test(path); +} + +function gitFiles(args: string[]) { + const result = spawnSync('git', ['ls-files', '-z', ...args], { encoding: 'utf8' }); + if (result.status !== 0) throw new Error(result.stderr || 'Unable to enumerate repository files.'); + return result.stdout.split('\0').filter(Boolean); +} + +const codeFiles = [...new Set([ + ...gitFiles([]), + ...gitFiles(['--others', '--exclude-standard']), +])].filter((path) => existsSync(path) && codeExtensions.test(path) && !isExcluded(path)); + +const overLimit: Array<{ path: string; lines: number }> = []; +const aboveTarget: Array<{ path: string; lines: number }> = []; +for (const path of codeFiles) { + const lines = readFileSync(path, 'utf8').split(/\r?\n/u).length; + if (lines > hardMaximum) overLimit.push({ path, lines }); + else if (lines > targetMaximum) aboveTarget.push({ path, lines }); +} + +aboveTarget.sort((left, right) => right.lines - left.lines); +overLimit.sort((left, right) => right.lines - left.lines); +if (aboveTarget.length > 0) console.warn(`File-length target: ${aboveTarget.length} handwritten file(s) are above ${targetMaximum} lines but within the hard limit.`); +if (overLimit.length > 0) { + console.error(`File-length policy failed: ${overLimit.length} handwritten file(s) exceed ${hardMaximum} lines:`); + for (const entry of overLimit) console.error(`- ${entry.lines} ${entry.path}`); + process.exit(1); +} +console.log(`File-length policy passed: no handwritten code exceeds ${hardMaximum} lines.`); diff --git a/scripts/repair-api-client-extraction.ts b/scripts/repair-api-client-extraction.ts new file mode 100644 index 00000000..917553e8 --- /dev/null +++ b/scripts/repair-api-client-extraction.ts @@ -0,0 +1,36 @@ +import { readFileSync, readdirSync, writeFileSync } from 'node:fs'; +import { resolve } from 'node:path'; + +const directory = resolve('src/lib/market/api-client'); +const methodFiles = readdirSync(directory) + .filter((file) => file.endsWith('.ts') && !['interface.ts', 'methods.ts'].includes(file)) + .sort(); +const methods: Array<{ file: string; name: string }> = []; + +for (const file of methodFiles) { + const path = resolve(directory, file); + let source = readFileSync(path, 'utf8'); + source = source.replace(/import \{ ([^}]+) \} from "\.\.\/api-client\.ts";/u, (_statement, names: string) => { + const imported = names.split(',').map((name) => name.trim()); + const types = imported.filter((name) => ['AstroLike', 'ApiClientFacade'].includes(name)); + const values = imported.filter((name) => !types.includes(name)); + return [ + types.length > 0 ? `import type { ${types.join(', ')} } from '../api-client.ts';` : '', + values.length > 0 ? `import { ${values.join(', ')} } from '../api-client.ts';` : '', + ].filter(Boolean).join('\n'); + }); + writeFileSync(path, source); + const match = /export (?:async )?function (\w+Method)\b/u.exec(source); + if (match) methods.push({ file, name: match[1]! }); +} + +const properties = methods.map(({ file, name }) => + `\t\t${name.replace(/Method$/u, '')}: typeof import('./${file}').${name};`).join('\n'); +writeFileSync(resolve(directory, 'interface.ts'), `declare module '../api-client.ts' { +\tinterface ApiClientFacade { +${properties} +\t} +} + +export {}; +`); diff --git a/scripts/split-class-methods.ts b/scripts/split-class-methods.ts new file mode 100644 index 00000000..2095a7fc --- /dev/null +++ b/scripts/split-class-methods.ts @@ -0,0 +1,171 @@ +import { mkdirSync, readFileSync, writeFileSync } from 'node:fs'; +import { basename, dirname, join } from 'node:path'; +import ts from 'typescript'; + +function kebab(value: string) { + return value.replace(/([a-z0-9])([A-Z])/g, '$1-$2').replace(/_/g, '-').toLowerCase(); +} + +function withoutAccessModifiers(modifiers: ts.NodeArray | undefined) { + return modifiers?.filter((modifier) => ![ + ts.SyntaxKind.PrivateKeyword, + ts.SyntaxKind.ProtectedKeyword, + ts.SyntaxKind.OverrideKeyword, + ts.SyntaxKind.AbstractKeyword, + ].includes(modifier.kind)); +} + +function adjustedImport(source: ts.SourceFile, statement: ts.ImportDeclaration) { + if (!ts.isStringLiteral(statement.moduleSpecifier) || !statement.moduleSpecifier.text.startsWith('.')) return statement; + return ts.factory.updateImportDeclaration( + statement, + statement.modifiers, + statement.importClause, + ts.factory.createStringLiteral(`../${statement.moduleSpecifier.text}`), + statement.attributes, + ); +} + +function declaredNames(statement: ts.Statement) { + if (ts.isVariableStatement(statement)) { + return statement.declarationList.declarations.flatMap((declaration) => ts.isIdentifier(declaration.name) ? [declaration.name.text] : []); + } + if (ts.isFunctionDeclaration(statement) || ts.isClassDeclaration(statement) || ts.isInterfaceDeclaration(statement) || ts.isTypeAliasDeclaration(statement) || ts.isEnumDeclaration(statement)) { + return statement.name && ts.isIdentifier(statement.name) ? [statement.name.text] : []; + } + return []; +} + +function exportTopLevel(statement: ts.Statement) { + if (statement.modifiers?.some((modifier) => modifier.kind === ts.SyntaxKind.ExportKeyword || modifier.kind === ts.SyntaxKind.DefaultKeyword)) return statement; + if (declaredNames(statement).length === 0) return statement; + const exportModifier = ts.factory.createModifier(ts.SyntaxKind.ExportKeyword); + const modifiers = ts.factory.createNodeArray([exportModifier, ...(statement.modifiers ?? [])]); + if (ts.isVariableStatement(statement)) return ts.factory.updateVariableStatement(statement, modifiers, statement.declarationList); + if (ts.isFunctionDeclaration(statement)) return ts.factory.updateFunctionDeclaration(statement, modifiers, statement.asteriskToken, statement.name, statement.typeParameters, statement.parameters, statement.type, statement.body); + if (ts.isClassDeclaration(statement)) return ts.factory.updateClassDeclaration(statement, modifiers, statement.name, statement.typeParameters, statement.heritageClauses, statement.members); + if (ts.isInterfaceDeclaration(statement)) return ts.factory.updateInterfaceDeclaration(statement, modifiers, statement.name, statement.typeParameters, statement.heritageClauses, statement.members); + if (ts.isTypeAliasDeclaration(statement)) return ts.factory.updateTypeAliasDeclaration(statement, modifiers, statement.name, statement.typeParameters, statement.type); + if (ts.isEnumDeclaration(statement)) return ts.factory.updateEnumDeclaration(statement, modifiers, statement.name, statement.members); + return statement; +} + +function split(path: string, requestedClass?: string) { + const text = readFileSync(path, 'utf8'); + const source = ts.createSourceFile(path, text, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS); + const classNode = source.statements.find((statement): statement is ts.ClassDeclaration => + ts.isClassDeclaration(statement) && Boolean(statement.name) && (!requestedClass || statement.name?.text === requestedClass)); + if (!classNode?.name) throw new Error(`${path}: class not found`); + const className = classNode.name.text; + const methods = classNode.members.filter((member): member is ts.MethodDeclaration => + ts.isMethodDeclaration(member) + && Boolean(member.body) + && !member.modifiers?.some((modifier) => modifier.kind === ts.SyntaxKind.StaticKeyword) + && ts.isIdentifier(member.name)); + if (methods.length === 0) throw new Error(`${path}: no extractable methods found`); + + const stem = basename(path, '.ts'); + const outputDir = join(dirname(path), stem); + mkdirSync(outputDir, { recursive: true }); + const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed }); + const imports = source.statements.filter(ts.isImportDeclaration); + const localNames = source.statements.flatMap(declaredNames); + const methodModuleImports: string[] = []; + const methodInstallations: string[] = []; + const interfaceMembers: ts.TypeElement[] = []; + const assignments: ts.Statement[] = []; + + for (const method of methods) { + const methodName = (method.name as ts.Identifier).text; + const fileStem = kebab(methodName); + const functionName = `${methodName}Method`; + const thisParameter = ts.factory.createParameterDeclaration(undefined, undefined, 'this', undefined, ts.factory.createTypeReferenceNode(className), undefined); + const functionNode = ts.factory.createFunctionDeclaration( + [ts.factory.createModifier(ts.SyntaxKind.ExportKeyword), ...(method.modifiers?.filter((modifier) => modifier.kind === ts.SyntaxKind.AsyncKeyword) ?? [])], + method.asteriskToken, + functionName, + method.typeParameters, + [thisParameter, ...method.parameters], + method.type, + method.body, + ); + const supportImport = ts.factory.createImportDeclaration( + undefined, + ts.factory.createImportClause(false, undefined, ts.factory.createNamedImports(localNames.map((name) => ts.factory.createImportSpecifier(false, undefined, ts.factory.createIdentifier(name))))), + ts.factory.createStringLiteral(`../${stem}.ts`), + undefined, + ); + const methodSource = [ + ...imports.map((statement) => adjustedImport(source, statement)), + supportImport, + functionNode, + ].map((node) => printer.printNode(ts.EmitHint.Unspecified, node, source)).join('\n'); + if (methodSource.split('\n').length > 500) throw new Error(`${path}: method ${methodName} generates ${methodSource.split('\n').length} lines`); + writeFileSync(join(outputDir, `${fileStem}.ts`), `${methodSource}\n`, 'utf8'); + methodModuleImports.push(`import { ${functionName} } from './${fileStem}.ts';`); + methodInstallations.push(`\tprototype.${methodName} = ${functionName};`); + interfaceMembers.push(ts.factory.createMethodSignature( + undefined, + method.name, + method.questionToken, + method.typeParameters, + method.parameters.map((parameter) => ts.factory.updateParameterDeclaration(parameter, parameter.modifiers, parameter.dotDotDotToken, parameter.name, parameter.questionToken ?? (parameter.initializer ? ts.factory.createToken(ts.SyntaxKind.QuestionToken) : undefined), parameter.type, undefined)), + method.type, + )); + } + writeFileSync(join(outputDir, 'methods.ts'), `import type { ${className} } from '../${stem}.ts';\n${methodModuleImports.join('\n')}\n\nexport function install${className}Methods(prototype: ${className}) {\n${methodInstallations.join('\n')}\n}\n`, 'utf8'); + const methodImport = ts.factory.createImportDeclaration( + undefined, + ts.factory.createImportClause(false, undefined, ts.factory.createNamespaceImport(ts.factory.createIdentifier('extractedMethods'))), + ts.factory.createStringLiteral(`./${stem}/methods.ts`), + undefined, + ); + const interfaceImport = ts.factory.createImportDeclaration(undefined, undefined, ts.factory.createStringLiteral(`./${stem}/interface.ts`), undefined); + + const retainedMembers = classNode.members + .filter((member) => !methods.includes(member as ts.MethodDeclaration)) + .map((member) => { + if (ts.isPropertyDeclaration(member)) return ts.factory.updatePropertyDeclaration(member, withoutAccessModifiers(member.modifiers), member.name, member.questionToken ?? member.exclamationToken, member.type, member.initializer); + if (ts.isConstructorDeclaration(member)) { + const parameters = member.parameters.map((parameter) => ts.factory.updateParameterDeclaration(parameter, withoutAccessModifiers(parameter.modifiers), parameter.dotDotDotToken, parameter.name, parameter.questionToken, parameter.type, parameter.initializer)); + return ts.factory.updateConstructorDeclaration(member, withoutAccessModifiers(member.modifiers), parameters, member.body); + } + return member; + }); + const updatedClass = ts.factory.updateClassDeclaration(classNode, classNode.modifiers, classNode.name, classNode.typeParameters, classNode.heritageClauses, retainedMembers); + const interfaceNode = ts.factory.createInterfaceDeclaration( + [ts.factory.createModifier(ts.SyntaxKind.ExportKeyword)], + className, + classNode.typeParameters, + undefined, + interfaceMembers, + ); + const interfaceText = `${imports.map((statement) => printer.printNode(ts.EmitHint.Unspecified, adjustedImport(source, statement), source)).join('\n')}\n\ndeclare module '../${stem}.ts' {\n${printer.printNode(ts.EmitHint.Unspecified, interfaceNode, source).replace(/^export /u, '').split('\n').map((line) => `\t${line}`).join('\n')}\n}\n\nexport {};\n`; + if (interfaceText.split('\n').length > 500) throw new Error(`${path}: extracted interface remains ${interfaceText.split('\n').length} lines`); + writeFileSync(join(outputDir, 'interface.ts'), interfaceText, 'utf8'); + assignments.push(ts.factory.createExpressionStatement(ts.factory.createCallExpression( + ts.factory.createPropertyAccessExpression(ts.factory.createIdentifier('extractedMethods'), `install${className}Methods`), + undefined, + [ts.factory.createPropertyAccessExpression(ts.factory.createIdentifier(className), 'prototype')], + ))); + const statements: ts.Statement[] = []; + for (const statement of source.statements) { + if (ts.isImportDeclaration(statement)) { + statements.push(statement); + continue; + } + if (statement === classNode) { + statements.push(methodImport, interfaceImport, updatedClass, ...assignments); + continue; + } + statements.push(exportTopLevel(statement)); + } + const output = printer.printFile(ts.factory.updateSourceFile(source, statements)); + if (output.split('\n').length > 500) throw new Error(`${path}: class shell remains ${output.split('\n').length} lines`); + writeFileSync(path, output, 'utf8'); + console.log(`${path}: extracted ${methods.length} ${className} methods`); +} + +const [path, className] = process.argv.slice(2); +if (!path) throw new Error('Usage: split-class-methods.ts [ClassName]'); +split(path, className); diff --git a/scripts/split-module-declarations.ts b/scripts/split-module-declarations.ts new file mode 100644 index 00000000..cc237ba7 --- /dev/null +++ b/scripts/split-module-declarations.ts @@ -0,0 +1,150 @@ +import { mkdirSync, readFileSync, writeFileSync } from 'node:fs'; +import { basename, dirname, join } from 'node:path'; +import ts from 'typescript'; + +const TARGET_LINES = 280; +const MAX_LINES = 500; + +function bindingNames(name: ts.BindingName | ts.DeclarationName | undefined): string[] { + if (!name) return []; + if (ts.isIdentifier(name)) return [name.text]; + if (ts.isObjectBindingPattern(name) || ts.isArrayBindingPattern(name)) { + return name.elements.flatMap((element) => ts.isBindingElement(element) ? bindingNames(element.name) : []); + } + return []; +} + +function statementNames(statement: ts.Statement) { + if (ts.isVariableStatement(statement)) return statement.declarationList.declarations.flatMap((declaration) => bindingNames(declaration.name)); + if ( + ts.isFunctionDeclaration(statement) + || ts.isClassDeclaration(statement) + || ts.isInterfaceDeclaration(statement) + || ts.isTypeAliasDeclaration(statement) + || ts.isEnumDeclaration(statement) + || ts.isModuleDeclaration(statement) + ) return bindingNames(statement.name); + return []; +} + +function kebab(value: string) { + return value.replace(/([a-z0-9])([A-Z])/g, '$1-$2').replace(/_/g, '-').toLowerCase(); +} + +function identifiersIn(statements: ts.Statement[]) { + const identifiers = new Set(); + const visit = (node: ts.Node) => { + if (ts.isIdentifier(node)) identifiers.add(node.text); + ts.forEachChild(node, visit); + }; + for (const statement of statements) visit(statement); + return identifiers; +} + +function adjustedImport(source: ts.SourceFile, statement: ts.ImportDeclaration, used: Set) { + const clause = statement.importClause; + if (!clause) return statement.getFullText(source).trim(); + const defaultName = clause.name && used.has(clause.name.text) ? clause.name : undefined; + let bindings: ts.NamedImportBindings | undefined; + if (clause.namedBindings && ts.isNamespaceImport(clause.namedBindings)) { + if (used.has(clause.namedBindings.name.text)) bindings = clause.namedBindings; + } else if (clause.namedBindings && ts.isNamedImports(clause.namedBindings)) { + const elements = clause.namedBindings.elements.filter((element) => used.has(element.name.text)); + if (elements.length > 0) bindings = ts.factory.updateNamedImports(clause.namedBindings, elements); + } + if (!defaultName && !bindings) return ''; + const specifier = ts.isStringLiteral(statement.moduleSpecifier) && statement.moduleSpecifier.text.startsWith('.') + ? ts.factory.createStringLiteral(`../${statement.moduleSpecifier.text}`) + : statement.moduleSpecifier; + const updated = ts.factory.updateImportDeclaration( + statement, + statement.modifiers, + ts.factory.updateImportClause(clause, clause.isTypeOnly, defaultName, bindings), + specifier, + statement.attributes, + ); + return ts.createPrinter().printNode(ts.EmitHint.Unspecified, updated, source).replace(/\s+/gu, ' '); +} + +function exportedStatement(source: ts.SourceFile, statement: ts.Statement) { + const text = statement.getFullText(source).trim(); + if (statement.modifiers?.some((modifier) => modifier.kind === ts.SyntaxKind.ExportKeyword || modifier.kind === ts.SyntaxKind.DefaultKeyword)) return text; + return statementNames(statement).length > 0 ? `export ${text}` : text; +} + +function referencedNames(statement: ts.Statement, localNames: Set, ownNames: Set) { + const references = new Set(); + const visit = (node: ts.Node) => { + if (ts.isIdentifier(node) && localNames.has(node.text) && !ownNames.has(node.text)) references.add(node.text); + ts.forEachChild(node, visit); + }; + visit(statement); + return references; +} + +function split(path: string) { + const text = readFileSync(path, 'utf8'); + const source = ts.createSourceFile(path, text, ts.ScriptTarget.Latest, true, path.endsWith('.tsx') ? ts.ScriptKind.TSX : ts.ScriptKind.TS); + const imports = source.statements.filter(ts.isImportDeclaration); + const declarations = source.statements.filter((statement) => !ts.isImportDeclaration(statement)); + const chunks: ts.Statement[][] = []; + let current: ts.Statement[] = []; + let lines = 0; + for (const statement of declarations) { + const statementLines = statement.getFullText(source).split('\n').length; + if (statementLines > MAX_LINES) throw new Error(`${path}: declaration ${statementNames(statement)[0] ?? statement.kind} is ${statementLines} lines`); + if (current.length > 0 && lines + statementLines > TARGET_LINES) { + chunks.push(current); + current = []; + lines = 0; + } + current.push(statement); + lines += statementLines; + } + if (current.length > 0) chunks.push(current); + if (chunks.length < 2) return; + + const extension = path.endsWith('.tsx') ? '.tsx' : '.ts'; + const stem = basename(path, extension); + const outputDir = join(dirname(path), stem); + mkdirSync(outputDir, { recursive: true }); + const used = new Set(); + const parts = chunks.map((statements, index) => { + const names = statements.flatMap(statementNames); + let fileStem = kebab(names[0] ?? `module-${index + 1}`); + if (used.has(fileStem)) fileStem = `${fileStem}-${index + 1}`; + used.add(fileStem); + return { statements, names, fileStem }; + }); + const owner = new Map(parts.flatMap((part) => part.names.map((name) => [name, part] as const))); + const allNames = new Set(owner.keys()); + for (const part of parts) { + const usedIdentifiers = identifiersIn(part.statements); + const ownNames = new Set(part.names); + const dependencies = new Map>(); + for (const statement of part.statements) { + for (const name of referencedNames(statement, allNames, ownNames)) { + const dependency = owner.get(name); + if (!dependency || dependency === part) continue; + const names = dependencies.get(dependency) ?? new Set(); + names.add(name); + dependencies.set(dependency, names); + } + } + const dependencyImports = [...dependencies.entries()] + .map(([dependency, names]) => `import { ${[...names].sort().join(', ')} } from './${dependency.fileStem}${extension}';`); + const body = part.statements.map((statement) => exportedStatement(source, statement)).join('\n\n'); + const output = `${imports.map((statement) => adjustedImport(source, statement, usedIdentifiers)).filter(Boolean).join('\n')}\n${dependencyImports.join('\n')}\n\n${body}\n`; + if (output.split('\n').length > MAX_LINES) throw new Error(`${part.fileStem}.ts: generated ${output.split('\n').length} lines`); + writeFileSync(join(outputDir, `${part.fileStem}${extension}`), output, 'utf8'); + } + const exports = parts.flatMap((part) => { + const path = `./${stem}/${part.fileStem}${extension}`; + const hasDefault = part.statements.some((statement) => statement.modifiers?.some((modifier) => modifier.kind === ts.SyntaxKind.DefaultKeyword)); + return [`export * from '${path}';`, ...(hasDefault ? [`export { default } from '${path}';`] : [])]; + }); + writeFileSync(path, `${exports.join('\n')}\n`, 'utf8'); + console.log(`${path}: ${parts.length} cohesive declaration modules`); +} + +for (const path of process.argv.slice(2)) split(path); diff --git a/src/lib/market/api-client.ts b/src/lib/market/api-client.ts index 44dbf259..9a1510aa 100644 --- a/src/lib/market/api-client.ts +++ b/src/lib/market/api-client.ts @@ -2,897 +2,154 @@ import type { APIContext } from 'astro'; import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; import { getSiteAuthConfig } from '../auth/config'; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; - -type AstroLike = Pick; - -const API_SESSION_COOKIE = 'ts_market_api_access'; - -function getNodeCrypto(): - | { - createHmac?: (algorithm: string, secret: string) => { update: (value: string) => { digest: (encoding: 'base64url') => string } }; - randomUUID?: () => string; - timingSafeEqual?: (left: Uint8Array, right: Uint8Array) => boolean; - } - | null { - return (globalThis as { process?: { getBuiltinModule?: (name: string) => unknown } }).process - ?.getBuiltinModule?.('crypto') as ReturnType ?? null; +export type AstroLike = Pick; +export const API_SESSION_COOKIE = 'ts_market_api_access'; +export function getNodeCrypto(): { + createHmac?: (algorithm: string, secret: string) => { + update: (value: string) => { + digest: (encoding: 'base64url') => string; + }; + }; + randomUUID?: () => string; + timingSafeEqual?: (left: Uint8Array, right: Uint8Array) => boolean; +} | null { + return (globalThis as { + process?: { + getBuiltinModule?: (name: string) => unknown; + }; + }).process + ?.getBuiltinModule?.('crypto') as ReturnType ?? null; +} +export function randomId() { + const nodeCrypto = getNodeCrypto(); + if (nodeCrypto?.randomUUID) + return nodeCrypto.randomUUID(); + if (globalThis.crypto?.randomUUID) + return globalThis.crypto.randomUUID(); + const bytes = new Uint8Array(16); + globalThis.crypto?.getRandomValues?.(bytes); + bytes[6] = (bytes[6] & 0x0f) | 0x40; + bytes[8] = (bytes[8] & 0x3f) | 0x80; + const hex = [...bytes].map((byte) => byte.toString(16).padStart(2, '0')).join(''); + return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`; +} +export function runtimeEnv(locals: App.Locals | Record | null | undefined) { + return (locals as App.Locals | undefined)?.runtime?.env as Record | undefined; +} +export function envValue(locals: App.Locals | Record | null | undefined, name: string) { + const runtimeValue = runtimeEnv(locals)?.[name]; + if (typeof runtimeValue === 'string' && runtimeValue.trim()) + return runtimeValue.trim(); + const processValue = (globalThis as { + process?: { + env?: Record; + }; + }).process?.env?.[name]; + return typeof processValue === 'string' && processValue.trim() ? processValue.trim() : ''; } - -function randomId() { - const nodeCrypto = getNodeCrypto(); - if (nodeCrypto?.randomUUID) return nodeCrypto.randomUUID(); - if (globalThis.crypto?.randomUUID) return globalThis.crypto.randomUUID(); - const bytes = new Uint8Array(16); - globalThis.crypto?.getRandomValues?.(bytes); - bytes[6] = (bytes[6] & 0x0f) | 0x40; - bytes[8] = (bytes[8] & 0x3f) | 0x80; - const hex = [...bytes].map((byte) => byte.toString(16).padStart(2, '0')).join(''); - return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`; -} - -function runtimeEnv(locals: App.Locals | Record | null | undefined) { - return (locals as App.Locals | undefined)?.runtime?.env as Record | undefined; -} - -function envValue(locals: App.Locals | Record | null | undefined, name: string) { - const runtimeValue = runtimeEnv(locals)?.[name]; - if (typeof runtimeValue === 'string' && runtimeValue.trim()) return runtimeValue.trim(); - const processValue = (globalThis as { process?: { env?: Record } }).process?.env?.[name]; - return typeof processValue === 'string' && processValue.trim() ? processValue.trim() : ''; -} - export function resolveApiBaseUrl(locals?: App.Locals | Record | null) { - return ( - envValue(locals, 'TREESEED_MARKET_API_BASE_URL') - || envValue(locals, 'TREESEED_CENTRAL_MARKET_API_BASE_URL') - || 'https://api.treeseed.ai' - ).replace(/\/+$/u, ''); + return (envValue(locals, 'TREESEED_MARKET_API_BASE_URL') + || envValue(locals, 'TREESEED_CENTRAL_MARKET_API_BASE_URL') + || 'https://api.treeseed.ai').replace(/\/+$/u, ''); } - -function encodeAssertionPayload(payload: Record) { - return Buffer.from(JSON.stringify(payload)).toString('base64url'); +export function encodeAssertionPayload(payload: Record) { + return Buffer.from(JSON.stringify(payload)).toString('base64url'); } - -function signAssertionPayload(payload: string, secret: string) { - const nodeCrypto = getNodeCrypto(); - if (!nodeCrypto?.createHmac) { - throw new Error('Trusted web user assertions require an HMAC-capable runtime.'); - } - return nodeCrypto.createHmac('sha256', secret).update(payload).digest('base64url'); +export function signAssertionPayload(payload: string, secret: string) { + const nodeCrypto = getNodeCrypto(); + if (!nodeCrypto?.createHmac) { + throw new Error('Trusted web user assertions require an HMAC-capable runtime.'); + } + return nodeCrypto.createHmac('sha256', secret).update(payload).digest('base64url'); } - export function createTrustedWebUserAssertion(context: Pick) { - const principal = context.locals.auth?.principal; - if (!principal?.id) return null; - const config = getSiteAuthConfig(context); - const session = context.locals.auth?.session; - const payload = encodeAssertionPayload({ - userId: principal.id, - sessionId: session?.id ?? principal.metadata?.sessionId ?? null, - identityId: session?.identityId ?? principal.metadata?.identityId ?? null, - authTime: session?.authenticatedAt ?? principal.metadata?.authTime ?? new Date().toISOString(), - expiresAt: new Date(Date.now() + 5 * 60 * 1000).toISOString(), - nonce: randomId(), - }); - return `${payload}.${signAssertionPayload(payload, config.apiAssertionSecret)}`; -} - -export function apiServiceHeaders( - context: Pick, - options: { forceService?: boolean; skipUserAssertion?: boolean } = {}, -) { - const config = getSiteAuthConfig(context); - const headers = new Headers({ - accept: 'application/json', - [TREESEED_REMOTE_CONTRACT_HEADER]: String(TREESEED_REMOTE_CONTRACT_VERSION), - }); - const assertion = options.skipUserAssertion ? null : createTrustedWebUserAssertion(context); - if (assertion || options.forceService) { - headers.set('x-treeseed-service-id', config.apiServiceId); - headers.set('x-treeseed-service-secret', config.apiServiceSecret); - } - if (assertion) headers.set('x-treeseed-user-assertion', assertion); - return headers; + const principal = context.locals.auth?.principal; + if (!principal?.id) + return null; + const config = getSiteAuthConfig(context); + const session = context.locals.auth?.session; + const payload = encodeAssertionPayload({ + userId: principal.id, + sessionId: session?.id ?? principal.metadata?.sessionId ?? null, + identityId: session?.identityId ?? principal.metadata?.identityId ?? null, + authTime: session?.authenticatedAt ?? principal.metadata?.authTime ?? new Date().toISOString(), + expiresAt: new Date(Date.now() + 5 * 60 * 1000).toISOString(), + nonce: randomId(), + }); + return `${payload}.${signAssertionPayload(payload, config.apiAssertionSecret)}`; +} +export function apiServiceHeaders(context: Pick, options: { + forceService?: boolean; + skipUserAssertion?: boolean; +} = {}) { + const config = getSiteAuthConfig(context); + const headers = new Headers({ + accept: 'application/json', + [TREESEED_REMOTE_CONTRACT_HEADER]: String(TREESEED_REMOTE_CONTRACT_VERSION), + }); + const assertion = options.skipUserAssertion ? null : createTrustedWebUserAssertion(context); + if (assertion || options.forceService) { + headers.set('x-treeseed-service-id', config.apiServiceId); + headers.set('x-treeseed-service-secret', config.apiServiceSecret); + } + if (assertion) + headers.set('x-treeseed-user-assertion', assertion); + return headers; } - export function apiAccessTokenFromCookies(context: Pick) { - return context.cookies.get(API_SESSION_COOKIE)?.value ?? null; + return context.cookies.get(API_SESSION_COOKIE)?.value ?? null; } - export function setApiAccessTokenCookie(context: Pick, token: string, maxAgeSeconds: number) { - context.cookies.set(API_SESSION_COOKIE, token, { - httpOnly: true, - path: '/', - sameSite: 'lax', - secure: context.url.protocol === 'https:', - maxAge: maxAgeSeconds, - }); + context.cookies.set(API_SESSION_COOKIE, token, { + httpOnly: true, + path: '/', + sameSite: 'lax', + secure: context.url.protocol === 'https:', + maxAge: maxAgeSeconds, + }); } - export function clearApiAccessTokenCookie(context: Pick) { - context.cookies.delete(API_SESSION_COOKIE, { - path: '/', - secure: context.url.protocol === 'https:', - }); -} - -function isObject(value: unknown): value is Record { - return Boolean(value && typeof value === 'object' && !Array.isArray(value)); -} - -function unwrapEnvelope(envelope: any): T { - if (Object.prototype.hasOwnProperty.call(envelope, 'payload')) return envelope.payload as T; - if (Object.prototype.hasOwnProperty.call(envelope, 'provider')) return envelope.provider as T; - if (Object.prototype.hasOwnProperty.call(envelope, 'operations')) return envelope.operations as T; - return envelope as T; -} - + context.cookies.delete(API_SESSION_COOKIE, { + path: '/', + secure: context.url.protocol === 'https:', + }); +} +export function isObject(value: unknown): value is Record { + return Boolean(value && typeof value === 'object' && !Array.isArray(value)); +} +export function unwrapEnvelope(envelope: any): T { + if (Object.prototype.hasOwnProperty.call(envelope, 'payload')) + return envelope.payload as T; + if (Object.prototype.hasOwnProperty.call(envelope, 'provider')) + return envelope.provider as T; + if (Object.prototype.hasOwnProperty.call(envelope, 'operations')) + return envelope.operations as T; + return envelope as T; +} +import * as extractedMethods from "./api-client/methods.ts"; +import "./api-client/interface.ts"; export class ApiClientFacade { - constructor(private readonly context: AstroLike) {} - - private headers(body = false) { - const token = apiAccessTokenFromCookies(this.context); - const headers = apiServiceHeaders(this.context, { skipUserAssertion: Boolean(token) }); - if (token) headers.set('authorization', `Bearer ${token}`); - if (body) headers.set('content-type', 'application/json'); - return headers; - } - - private url(path: string) { - return `${resolveApiBaseUrl(this.context.locals)}${path}`; - } - - async request(method: string, path: string, options: { body?: unknown } = {}): Promise { - const response = await fetch(this.url(path), { - method, - headers: this.headers(options.body !== undefined), - body: options.body === undefined ? undefined : JSON.stringify(options.body), - }); - const envelope = await response.json().catch(() => null); - if (!response.ok || envelope?.ok === false) { - const error = new Error(envelope?.error ?? `API request failed: ${response.status}`); - (error as any).status = response.status; - (error as any).details = isObject(envelope) ? envelope : {}; - throw error; - } - return unwrapEnvelope(envelope); - } - - get currentPrincipal() { - return this.context.locals.auth?.principal ?? null; - } - - accountIdentity() { return this.request('GET', '/v1/auth/web/account/identity'); } - authProviders() { return this.request('GET', '/v1/auth/providers'); } - requestPasswordReset(email: string) { return this.request<{ accepted: true }>('POST', '/v1/auth/web/password-reset/request', { body: { email } }); } - completePasswordReset(token: string, newPassword: string) { return this.request<{ changed: true }>('POST', '/v1/auth/web/password-reset/complete', { body: { token, newPassword } }); } - confirmEmail(token: string) { return this.request('POST', '/v1/auth/web/confirm-email', { body: { token } }); } - approveDevice(userCode: string) { return this.request<{ approved: true }>('POST', '/v1/auth/device/approve', { body: { userCode } }); } - claimUsername(username: string) { return this.request('PATCH', '/v1/auth/web/username', { body: { username } }); } - updateAccountProfile(body: { firstName: string; lastName: string; image?: string | null }) { return this.request('PATCH', '/v1/auth/web/profile', { body }); } - addAccountEmail(email: string) { return this.request('POST', '/v1/auth/web/emails', { body: { email } }); } - resendAccountEmail(emailId: string) { return this.request('POST', `/v1/auth/web/emails/${encodeURIComponent(emailId)}/verify`, { body: {} }); } - setPrimaryAccountEmail(emailId: string) { return this.request('POST', `/v1/auth/web/emails/${encodeURIComponent(emailId)}/primary`, { body: {} }); } - deleteAccountEmail(emailId: string) { return this.request('DELETE', `/v1/auth/web/emails/${encodeURIComponent(emailId)}`); } - updateAccountPassword(body: { currentPassword?: string; password: string; reauthenticationGrantId?: string }) { return this.request<{ changed: true }>('PATCH', '/v1/auth/web/password', { body }); } - unlinkAccountProvider(identityId: string) { return this.request('DELETE', `/v1/auth/web/providers/${encodeURIComponent(identityId)}`); } - accountSessions() { return this.request('GET', '/v1/auth/web/sessions'); } - revokeAccountSession(sessionId: string) { return this.request('POST', `/v1/auth/web/sessions/${encodeURIComponent(sessionId)}/revoke`, { body: {} }); } - notificationPreferences() { return this.request('GET', '/v1/auth/web/notifications/preferences'); } - accountNotifications(limit = 20) { return this.request('GET', `/v1/auth/web/notifications?limit=${encodeURIComponent(String(limit))}`); } - updateNotificationPreferences(body: NotificationPreferences) { return this.request('PUT', '/v1/auth/web/notifications/preferences', { body }); } - listProjectsForPrincipal() { return this.request('GET', '/v1/projects'); } - personalThemes() { return this.request('GET', '/v1/auth/web/themes'); } - createPersonalTheme(body: PersonalThemeDraft) { return this.request('POST', '/v1/auth/web/themes', { body }); } - updatePersonalTheme(id: string, body: PersonalThemeDraft) { return this.request('PATCH', `/v1/auth/web/themes/${encodeURIComponent(id)}`, { body }); } - deletePersonalTheme(id: string) { return this.request('DELETE', `/v1/auth/web/themes/${encodeURIComponent(id)}`); } - accountDeletionBlockers() { return this.request<{ blockers: AccountDeletionBlocker[]; canDelete: boolean }>('GET', '/v1/auth/web/account/deletion-blockers'); } - deleteCurrentAccount(body: { confirmation: string; currentPassword?: string; reauthenticationGrantId?: string }) { return this.request<{ deleted: true }>('DELETE', '/v1/auth/web/account', { body }); } - - listTeamsForPrincipal() { - return this.request('GET', '/v1/teams'); - } - - listTeamProjects(teamId: string) { - return this.request('GET', `/v1/projects?teamId=${encodeURIComponent(teamId)}`); - } - - getProjectDetails(projectId: string) { - return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}`); - } - - validatePrivateKnowledgeAccess(projectId: string, body: { slug?: string; route?: string } = {}) { - return this.request('POST', `/v1/projects/${encodeURIComponent(projectId)}/private-knowledge/access`, { body }); - } - - recordPrivateKnowledgeOutcome(projectId: string, body: { slug?: string; route?: string; outcome: 'read' | 'not_found' }) { - return this.request('POST', `/v1/projects/${encodeURIComponent(projectId)}/private-knowledge/access`, { body }); - } - - getProjectDeployment(deploymentId: string, options: { limit?: number | string | null } = {}) { - const query = new URLSearchParams(); - if (options.limit != null) query.set('limit', String(options.limit)); - return this.request('GET', `/v1/project-deployments/${encodeURIComponent(deploymentId)}${query.toString() ? `?${query}` : ''}`); - } - - listProjectDeployments(projectId: string, filters: { environment?: string; action?: string; status?: string; limit?: number | string } = {}) { - const query = new URLSearchParams(); - if (filters.environment) query.set('environment', filters.environment); - if (filters.action) query.set('action', filters.action); - if (filters.status) query.set('status', filters.status); - if (filters.limit != null) query.set('limit', String(filters.limit)); - return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/deployments${query.toString() ? `?${query}` : ''}`); - } - - async listProjectDeploymentEvents(deploymentId: string, options: { limit?: number | string | null } = {}) { - const details = await this.getProjectDeployment(deploymentId, options); - return Array.isArray(details?.events) ? details.events : []; - } - - getProjectByTeamAndSlug(teamId: string, slug: string) { - return this.listTeamProjects(teamId).then((projects) => projects.find((project: any) => project.slug === slug || project.id === slug) ?? null); - } - - getProjectSummary(projectId: string) { - return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/summary`); - } - - getProjectAgentsSummary(projectId: string) { - return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/agents`); - } - - getProjectReleasesSummary(projectId: string) { - return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/releases`); - } - - getProjectCapacitySummary(projectId: string, environment = 'staging') { - return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/capacity?environment=${encodeURIComponent(environment)}`); - } - - listApprovalRequestsForProject(projectId: string, limit = 100) { - return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/approval-requests?limit=${encodeURIComponent(String(limit))}`); - } - - listApprovalRequestsForTeam(teamId: string, options: { kind?: string; limit?: number } = {}) { - const query = new URLSearchParams(); - if (options.kind) query.set('kind', options.kind); - query.set('limit', String(options.limit ?? 100)); - return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/approval-requests?${query}`); - } - - decideApprovalRequest(approvalRequestId: string, body: Record) { - return this.request('POST', `/v1/approval-requests/${encodeURIComponent(approvalRequestId)}/decide`, { body }); - } - - getCommonsSummary() { - return this.request('GET', '/v1/commons/summary'); - } - - getCommonsParticipantMe() { - return this.request('GET', '/v1/commons/participants/me'); - } - - listCommonsParticipants(filters: Record = {}) { - const query = new URLSearchParams(); - for (const [key, value] of Object.entries(filters)) { - if (value != null && value !== '') query.set(key, String(value)); - } - const suffix = query.toString() ? `?${query}` : ''; - return this.request('GET', `/v1/commons/participants${suffix}`); - } - - backfillCommonsParticipants() { - return this.request('POST', '/v1/commons/participants/backfill', { body: {} }); - } - - listCommonsQuestions(filters: Record = {}) { - const query = new URLSearchParams(); - for (const [key, value] of Object.entries(filters)) { - if (value != null && value !== '') query.set(key, String(value)); - } - const suffix = query.toString() ? `?${query}` : ''; - return this.request('GET', `/v1/commons/questions${suffix}`); - } - - answerCommonsQuestion(questionId: string, body: Record) { - return this.request('POST', `/v1/commons/questions/${encodeURIComponent(questionId)}/answer`, { body }); - } - - createCommonsProposal(body: Record) { - return this.request('POST', '/v1/commons/proposals', { body }); - } - - listCommonsProposals(filters: Record = {}) { - const query = new URLSearchParams(); - for (const [key, value] of Object.entries(filters)) { - if (value != null && value !== '') query.set(key, String(value)); - } - const suffix = query.toString() ? `?${query}` : ''; - return this.request('GET', `/v1/commons/proposals${suffix}`); - } - - getCommonsProposal(proposalId: string) { - return this.request('GET', `/v1/commons/proposals/${encodeURIComponent(proposalId)}`); - } - - reviewCommonsProposal(proposalId: string, body: Record = {}) { - return this.request('POST', `/v1/commons/proposals/${encodeURIComponent(proposalId)}/review`, { body }); - } - - startCommonsProposalVoting(proposalId: string, body: Record = {}) { - return this.request('POST', `/v1/commons/proposals/${encodeURIComponent(proposalId)}/start-voting`, { body }); - } - - stewardDecisionForCommonsProposal(proposalId: string, body: Record) { - return this.request('POST', `/v1/commons/proposals/${encodeURIComponent(proposalId)}/steward-decision`, { body }); - } - - listCommonsDecisions(filters: Record = {}) { - const query = new URLSearchParams(); - for (const [key, value] of Object.entries(filters)) { - if (value != null && value !== '') query.set(key, String(value)); - } - const suffix = query.toString() ? `?${query}` : ''; - return this.request('GET', `/v1/commons/decisions${suffix}`); - } - - listCommonsEvents(filters: Record = {}) { - const query = new URLSearchParams(); - for (const [key, value] of Object.entries(filters)) { - if (value != null && value !== '') query.set(key, String(value)); - } - const suffix = query.toString() ? `?${query}` : ''; - return this.request('GET', `/v1/commons/events${suffix}`); - } - - deleteTeamInboxItemsByItemKey(_teamId: string, _itemKey: string) { - return Promise.resolve({ ok: true }); - } - - listPersistedTeamInboxItems(teamId: string) { - return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/inbox`); - } - - listAuditEventsForTarget(targetType: string, targetId: string, limit = 100) { - return this.request('GET', `/v1/audit-events?targetType=${encodeURIComponent(targetType)}&targetId=${encodeURIComponent(targetId)}&limit=${encodeURIComponent(String(limit))}`); - } - - listTeamMembers(teamId: string) { - return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/members`); - } - - getTeamAccessSummary(teamId: string) { - return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/permissions`); - } - - getCommerceVendor(teamId: string) { - return this.request('GET', `/v1/commerce/vendors/${encodeURIComponent(teamId)}`); - } - - requestCommerceVendor(teamId: string, body: Record) { - return this.request('POST', `/v1/commerce/vendors/${encodeURIComponent(teamId)}/request`, { body }); - } - - getCommerceVendorStripeStatus(teamId: string, refresh = false) { - const query = refresh ? '?refresh=1' : ''; - return this.request('GET', `/v1/commerce/vendors/${encodeURIComponent(teamId)}/stripe/status${query}`); - } - - startCommerceVendorStripeOnboarding(teamId: string, body: Record = {}) { - return this.request('POST', `/v1/commerce/vendors/${encodeURIComponent(teamId)}/stripe/onboarding`, { body }); - } - - markCommerceVendorStripeReturn(teamId: string) { - return this.request('POST', `/v1/commerce/vendors/${encodeURIComponent(teamId)}/stripe/return`, { body: {} }); - } - - createCommerceVendorStripeLoginLink(teamId: string) { - return this.request('POST', `/v1/commerce/vendors/${encodeURIComponent(teamId)}/stripe/login-link`, { body: {} }); - } - - listCommerceProducts(filters: Record = {}) { - const query = new URLSearchParams(Object.entries(filters).filter(([, value]) => value != null).map(([key, value]) => [key, String(value)])); - const suffix = query.toString() ? `?${query.toString()}` : ''; - return this.request('GET', `/v1/commerce/products${suffix}`); - } - - getCommerceProduct(productId: string) { - return this.request('GET', `/v1/commerce/products/${encodeURIComponent(productId)}`); - } - - getCommerceOwnershipWorkflow(productId: string) { - return this.request('GET', `/v1/commerce/products/${encodeURIComponent(productId)}/ownership-workflow`); - } - - updateCommerceOwnershipRecord(productId: string, ownershipRecordId: string, body: Record) { - return this.request('PATCH', `/v1/commerce/products/${encodeURIComponent(productId)}/ownership/${encodeURIComponent(ownershipRecordId)}`, { body }); - } - - updateCommerceStewardshipAssignment(productId: string, assignmentId: string, body: Record) { - return this.request('PATCH', `/v1/commerce/products/${encodeURIComponent(productId)}/stewards/${encodeURIComponent(assignmentId)}`, { body }); - } - - endCommerceStewardshipAssignment(productId: string, assignmentId: string, body: Record) { - return this.request('POST', `/v1/commerce/products/${encodeURIComponent(productId)}/stewards/${encodeURIComponent(assignmentId)}/end`, { body }); - } - - updateCommerceContribution(productId: string, contributionId: string, body: Record) { - return this.request('PATCH', `/v1/commerce/products/${encodeURIComponent(productId)}/contributions/${encodeURIComponent(contributionId)}`, { body }); - } - - updateCommerceGovernancePolicy(productId: string, policyId: string, body: Record) { - return this.request('PATCH', `/v1/commerce/products/${encodeURIComponent(productId)}/governance-policy/${encodeURIComponent(policyId)}`, { body }); - } - - submitCommerceOwnershipTransfer(productId: string, transferId: string, body: Record = {}) { - return this.request('POST', `/v1/commerce/products/${encodeURIComponent(productId)}/ownership-transfer/${encodeURIComponent(transferId)}/submit`, { body }); - } - - approveCommerceOwnershipTransfer(productId: string, transferId: string, body: Record = {}) { - return this.request('POST', `/v1/commerce/products/${encodeURIComponent(productId)}/ownership-transfer/${encodeURIComponent(transferId)}/approve`, { body }); - } - - rejectCommerceOwnershipTransfer(productId: string, transferId: string, body: Record = {}) { - return this.request('POST', `/v1/commerce/products/${encodeURIComponent(productId)}/ownership-transfer/${encodeURIComponent(transferId)}/reject`, { body }); - } - - cancelCommerceOwnershipTransfer(productId: string, transferId: string, body: Record = {}) { - return this.request('POST', `/v1/commerce/products/${encodeURIComponent(productId)}/ownership-transfer/${encodeURIComponent(transferId)}/cancel`, { body }); - } - - createCommerceSuccessionEvent(productId: string, body: Record) { - return this.request('POST', `/v1/commerce/products/${encodeURIComponent(productId)}/succession-events`, { body }); - } - - listCommerceSuccessionEvents(productId: string) { - return this.request('GET', `/v1/commerce/products/${encodeURIComponent(productId)}/succession-events`); - } - - getCommerceVendorSalesSummary(teamId: string, filters: Record = {}) { - const query = new URLSearchParams(Object.entries(filters).filter(([, value]) => value != null).map(([key, value]) => [key, String(value)])); - const suffix = query.toString() ? `?${query.toString()}` : ''; - return this.request('GET', `/v1/commerce/vendors/${encodeURIComponent(teamId)}/sales/summary${suffix}`); - } - - getCommerceVendorMonitoring(teamId: string, filters: Record = {}) { - const query = new URLSearchParams(Object.entries(filters).filter(([, value]) => value != null).map(([key, value]) => [key, String(value)])); - const suffix = query.toString() ? `?${query.toString()}` : ''; - return this.request('GET', `/v1/commerce/vendors/${encodeURIComponent(teamId)}/monitoring${suffix}`); - } - - listCommerceMarketplaceProducts(filters: Record = {}) { - const query = new URLSearchParams(Object.entries(filters).filter(([, value]) => value != null).map(([key, value]) => [key, String(value)])); - const suffix = query.toString() ? `?${query.toString()}` : ''; - return this.request('GET', `/v1/commerce/marketplace${suffix}`); - } - - getCommerceMarketplaceProduct(productId: string) { - return this.request('GET', `/v1/commerce/marketplace/products/${encodeURIComponent(productId)}`); - } - - listCommerceVendorSalesOrders(teamId: string, filters: Record = {}) { - const query = new URLSearchParams(Object.entries(filters).filter(([, value]) => value != null).map(([key, value]) => [key, String(value)])); - const suffix = query.toString() ? `?${query.toString()}` : ''; - return this.request('GET', `/v1/commerce/vendors/${encodeURIComponent(teamId)}/sales/orders${suffix}`); - } - - listCommerceVendorSalesSubscriptions(teamId: string, filters: Record = {}) { - const query = new URLSearchParams(Object.entries(filters).filter(([, value]) => value != null).map(([key, value]) => [key, String(value)])); - const suffix = query.toString() ? `?${query.toString()}` : ''; - return this.request('GET', `/v1/commerce/vendors/${encodeURIComponent(teamId)}/sales/subscriptions${suffix}`); - } - - listCommerceVendorSalesEntitlements(teamId: string, filters: Record = {}) { - const query = new URLSearchParams(Object.entries(filters).filter(([, value]) => value != null).map(([key, value]) => [key, String(value)])); - const suffix = query.toString() ? `?${query.toString()}` : ''; - return this.request('GET', `/v1/commerce/vendors/${encodeURIComponent(teamId)}/sales/entitlements${suffix}`); - } - - listCommerceVendorSalesRefunds(teamId: string, filters: Record = {}) { - const query = new URLSearchParams(Object.entries(filters).filter(([, value]) => value != null).map(([key, value]) => [key, String(value)])); - const suffix = query.toString() ? `?${query.toString()}` : ''; - return this.request('GET', `/v1/commerce/vendors/${encodeURIComponent(teamId)}/sales/refunds${suffix}`); - } - - listCommerceVendorFulfillmentEvents(teamId: string, filters: Record = {}) { - const query = new URLSearchParams(Object.entries(filters).filter(([, value]) => value != null).map(([key, value]) => [key, String(value)])); - const suffix = query.toString() ? `?${query.toString()}` : ''; - return this.request('GET', `/v1/commerce/vendors/${encodeURIComponent(teamId)}/sales/fulfillment-events${suffix}`); - } - - createCommerceOrderRefund(orderId: string, body: Record) { - return this.request('POST', `/v1/commerce/orders/${encodeURIComponent(orderId)}/refunds`, { body }); - } - - fulfillCommerceOrderItemArtifact(orderItemId: string, body: Record) { - return this.request('POST', `/v1/commerce/order-items/${encodeURIComponent(orderItemId)}/fulfillment/artifact`, { body }); - } - - revokeCommerceEntitlement(entitlementId: string, body: Record) { - return this.request('POST', `/v1/commerce/entitlements/${encodeURIComponent(entitlementId)}/revoke`, { body }); - } - - createCommerceServiceRequest(body: Record) { - return this.request('POST', '/v1/commerce/services/requests', { body }); - } - - listCommerceServiceRequests(filters: Record = {}) { - const query = new URLSearchParams(Object.entries(filters).filter(([, value]) => value != null).map(([key, value]) => [key, String(value)])); - const suffix = query.toString() ? `?${query.toString()}` : ''; - return this.request('GET', `/v1/commerce/services/requests${suffix}`); - } - - getCommerceServiceRequest(requestId: string) { - return this.request('GET', `/v1/commerce/services/requests/${encodeURIComponent(requestId)}`); - } - - startCommerceServiceScoping(requestId: string, body: Record = {}) { - return this.request('POST', `/v1/commerce/services/requests/${encodeURIComponent(requestId)}/scoping`, { body }); - } - - updateCommerceServiceRequest(requestId: string, body: Record) { - return this.request('PATCH', `/v1/commerce/services/requests/${encodeURIComponent(requestId)}`, { body }); - } - - cancelCommerceServiceRequest(requestId: string, body: Record = {}) { - return this.request('POST', `/v1/commerce/services/requests/${encodeURIComponent(requestId)}/cancel`, { body }); - } - - createCommerceServiceQuote(requestId: string, body: Record) { - return this.request('POST', `/v1/commerce/services/requests/${encodeURIComponent(requestId)}/quotes`, { body }); - } - - listCommerceServiceQuotes(requestId: string) { - return this.request('GET', `/v1/commerce/services/requests/${encodeURIComponent(requestId)}/quotes`); - } - - submitCommerceServiceQuote(quoteId: string, body: Record = {}) { - return this.request('POST', `/v1/commerce/services/quotes/${encodeURIComponent(quoteId)}/submit`, { body }); - } - - buyerApproveCommerceServiceQuote(quoteId: string, body: Record = {}) { - return this.request('POST', `/v1/commerce/services/quotes/${encodeURIComponent(quoteId)}/buyer-approve`, { body }); - } - - vendorApproveCommerceServiceQuote(quoteId: string, body: Record = {}) { - return this.request('POST', `/v1/commerce/services/quotes/${encodeURIComponent(quoteId)}/vendor-approve`, { body }); - } - - rejectCommerceServiceQuote(quoteId: string, body: Record = {}) { - return this.request('POST', `/v1/commerce/services/quotes/${encodeURIComponent(quoteId)}/reject`, { body }); - } - - getCommerceServiceContract(contractId: string) { - return this.request('GET', `/v1/commerce/services/contracts/${encodeURIComponent(contractId)}`); - } - - linkCommerceServiceContractWork(contractId: string, body: Record) { - return this.request('POST', `/v1/commerce/services/contracts/${encodeURIComponent(contractId)}/link-work`, { body }); - } - - fulfillCommerceServiceContract(contractId: string, body: Record) { - return this.request('POST', `/v1/commerce/services/contracts/${encodeURIComponent(contractId)}/fulfill`, { body }); - } - - cancelCommerceServiceContract(contractId: string, body: Record = {}) { - return this.request('POST', `/v1/commerce/services/contracts/${encodeURIComponent(contractId)}/cancel`, { body }); - } - - listCommerceServiceEvents(filters: Record = {}) { - const query = new URLSearchParams(Object.entries(filters).filter(([, value]) => value != null).map(([key, value]) => [key, String(value)])); - const suffix = query.toString() ? `?${query.toString()}` : ''; - return this.request('GET', `/v1/commerce/services/events${suffix}`); - } - - listCommerceCapacityListings(filters: Record = {}) { - const query = new URLSearchParams(Object.entries(filters).filter(([, value]) => value != null).map(([key, value]) => [key, String(value)])); - const suffix = query.toString() ? `?${query.toString()}` : ''; - return this.request('GET', `/v1/commerce/capacity-listings${suffix}`); - } - - getCommerceCapacityListing(listingId: string) { - return this.request('GET', `/v1/commerce/capacity-listings/${encodeURIComponent(listingId)}`); - } - - getCommerceCapacityListingForProduct(productId: string) { - return this.request('GET', `/v1/commerce/products/${encodeURIComponent(productId)}/capacity-listing`); - } - - createCommerceCapacityListing(productId: string, body: Record) { - return this.request('POST', `/v1/commerce/products/${encodeURIComponent(productId)}/capacity-listing`, { body }); - } - - updateCommerceCapacityListing(listingId: string, body: Record) { - return this.request('PATCH', `/v1/commerce/capacity-listings/${encodeURIComponent(listingId)}`, { body }); - } - - submitCommerceCapacityListing(listingId: string, body: Record = {}) { - return this.request('POST', `/v1/commerce/capacity-listings/${encodeURIComponent(listingId)}/submit`, { body }); - } - - approveCommerceCapacityListing(listingId: string, body: Record = {}) { - return this.request('POST', `/v1/commerce/capacity-listings/${encodeURIComponent(listingId)}/approve`, { body }); - } - - rejectCommerceCapacityListing(listingId: string, body: Record = {}) { - return this.request('POST', `/v1/commerce/capacity-listings/${encodeURIComponent(listingId)}/reject`, { body }); - } - - suspendCommerceCapacityListing(listingId: string, body: Record = {}) { - return this.request('POST', `/v1/commerce/capacity-listings/${encodeURIComponent(listingId)}/suspend`, { body }); - } - - archiveCommerceCapacityListing(listingId: string, body: Record = {}) { - return this.request('POST', `/v1/commerce/capacity-listings/${encodeURIComponent(listingId)}/archive`, { body }); - } - - createCommerceCapacityListingInquiry(listingId: string, body: Record) { - return this.request('POST', `/v1/commerce/capacity-listings/${encodeURIComponent(listingId)}/inquiries`, { body }); - } - - listCommerceCapacityListingInquiries(filters: Record = {}) { - const query = new URLSearchParams(Object.entries(filters).filter(([, value]) => value != null).map(([key, value]) => [key, String(value)])); - const suffix = query.toString() ? `?${query.toString()}` : ''; - return this.request('GET', `/v1/commerce/capacity-listing-inquiries${suffix}`); - } - - getCommerceCapacityListingInquiry(inquiryId: string) { - return this.request('GET', `/v1/commerce/capacity-listing-inquiries/${encodeURIComponent(inquiryId)}`); - } - - reviewCommerceCapacityInquiry(inquiryId: string, body: Record = {}) { - return this.request('POST', `/v1/commerce/capacity-listing-inquiries/${encodeURIComponent(inquiryId)}/review`, { body }); - } - - approveCommerceCapacityInquiryForScoping(inquiryId: string, body: Record = {}) { - return this.request('POST', `/v1/commerce/capacity-listing-inquiries/${encodeURIComponent(inquiryId)}/approve-for-scoping`, { body }); - } - - declineCommerceCapacityInquiry(inquiryId: string, body: Record = {}) { - return this.request('POST', `/v1/commerce/capacity-listing-inquiries/${encodeURIComponent(inquiryId)}/decline`, { body }); - } - - cancelCommerceCapacityInquiry(inquiryId: string, body: Record = {}) { - return this.request('POST', `/v1/commerce/capacity-listing-inquiries/${encodeURIComponent(inquiryId)}/cancel`, { body }); - } - - evaluateTeamDeletionBlockers(teamId: string) { - return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/deletion-blockers`); - } - - evaluateProjectDeletionBlockers(projectId: string) { - return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/deletion-blockers`); - } - - listRepositoryHosts(teamId: string, options: { includePlatform?: boolean } = {}) { - const query = options.includePlatform === false ? '?includePlatform=false' : ''; - return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/repository-hosts${query}`); - } - - getRepositoryHost(teamId: string, hostId: string) { - return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/repository-hosts/${encodeURIComponent(hostId)}`); - } - - listTeamWebHosts(teamId: string) { - return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/web-hosts`); - } - - getTeamTreeDx(teamId: string) { - return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/treedx`); - } - - updateTeamTreeDx(teamId: string, body: Record) { - return this.request('PUT', `/v1/teams/${encodeURIComponent(teamId)}/treedx`, { body }); - } - - provisionTeamTreeDx(teamId: string, body: Record = {}) { - return this.request('POST', `/v1/teams/${encodeURIComponent(teamId)}/treedx/provision`, { body }); - } - - listTreeDxMirrors(teamId: string) { - return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/treedx/mirrors`); - } - - createTreeDxMirror(teamId: string, body: Record) { - return this.request('POST', `/v1/teams/${encodeURIComponent(teamId)}/treedx/mirrors`, { body }); - } - - listTreeDxShares(teamId: string) { - return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/treedx/shares`); - } - - createTreeDxShare(teamId: string, body: Record) { - return this.request('POST', `/v1/teams/${encodeURIComponent(teamId)}/treedx/shares`, { body }); - } - - getProjectTreeDxLibrary(projectId: string) { - return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/treedx-library`); - } - - upsertProjectTreeDxLibrary(projectId: string, body: Record) { - return this.request('POST', `/v1/projects/${encodeURIComponent(projectId)}/treedx-library`, { body }); - } - - getProjectRepositoryTopology(projectId: string) { - return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/repository-topology`); - } - - updateProjectRepositoryTopology(projectId: string, body: Record) { - return this.request('PUT', `/v1/projects/${encodeURIComponent(projectId)}/repository-topology`, { body }); - } - - getTeamWebHost(teamId: string, hostId: string) { - return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/web-hosts/${encodeURIComponent(hostId)}`); - } - - listCapacityAllocationSets(teamId: string) { - return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/capacity/allocation-sets`); - } - - listProviderAvailabilitySessions(teamId: string, filters: { providerId?: string | null; status?: string | null } = {}) { - const query = new URLSearchParams(); - if (filters.providerId) query.set('providerId', filters.providerId); - if (filters.status) query.set('status', filters.status); - return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/capacity/provider-sessions${query.toString() ? `?${query}` : ''}`); - } - - listProviderAssignments(teamId: string, filters: { projectId?: string | null; providerId?: string | null; status?: string | null } = {}) { - const query = new URLSearchParams(); - if (filters.projectId) query.set('projectId', filters.projectId); - if (filters.providerId) query.set('providerId', filters.providerId); - if (filters.status) query.set('status', filters.status); - return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/capacity/assignments${query.toString() ? `?${query}` : ''}`); - } - - listExecutionRuns(teamId: string, filters: { projectId?: string | null; providerId?: string | null; status?: string | null; mode?: string | null; assignmentId?: string | null; workdayId?: string | null; limit?: number | null } = {}) { - const query = new URLSearchParams(); - if (filters.projectId) query.set('projectId', filters.projectId); - if (filters.providerId) query.set('providerId', filters.providerId); - if (filters.status) query.set('status', filters.status); - if (filters.mode) query.set('mode', filters.mode); - if (filters.assignmentId) query.set('assignmentId', filters.assignmentId); - if (filters.workdayId) query.set('workdayId', filters.workdayId); - if (filters.limit) query.set('limit', String(filters.limit)); - return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/capacity/execution-runs${query.toString() ? `?${query}` : ''}`); - } - - listProjectAgentClasses(projectId: string) { - return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/agent-classes`); - } - - listProjectAgentModeRuns(projectId: string, filters: { mode?: string | null; assignmentId?: string | null } = {}) { - const query = new URLSearchParams(); - if (filters.mode) query.set('mode', filters.mode); - if (filters.assignmentId) query.set('assignmentId', filters.assignmentId); - return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/agent-mode-runs${query.toString() ? `?${query}` : ''}`); - } - - listProjectAgentFallbackOutputs(projectId: string, filters: { mode?: string | null; status?: string | null; assignmentId?: string | null } = {}) { - const query = new URLSearchParams(); - if (filters.mode) query.set('mode', filters.mode); - if (filters.status) query.set('status', filters.status); - if (filters.assignmentId) query.set('assignmentId', filters.assignmentId); - return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/agent-fallback-outputs${query.toString() ? `?${query}` : ''}`); - } - - listProjectTreeDxProxyAudit(projectId: string, filters: { assignmentId?: string | null; actorType?: string | null } = {}) { - const query = new URLSearchParams(); - if (filters.assignmentId) query.set('assignmentId', filters.assignmentId); - if (filters.actorType) query.set('actorType', filters.actorType); - return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/treedx-proxy-audit${query.toString() ? `?${query}` : ''}`); - } - - getProjectCapacityRuntimeDiagnostics(projectId: string, teamId: string) { - const query = new URLSearchParams({ teamId }); - return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/capacity-runtime-diagnostics?${query}`); - } - - getProviderAssignmentExplanation(teamId: string, assignmentId: string) { - return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/capacity/assignments/${encodeURIComponent(assignmentId)}/explanation`); - } - - getDecisionPlanningStatus(decisionId: string) { - return this.request('GET', `/v1/decisions/${encodeURIComponent(decisionId)}/planning-status`); - } - - listDecisionExecutionInputs(decisionId: string) { - return this.request('GET', `/v1/decisions/${encodeURIComponent(decisionId)}/execution-inputs`); - } - - listDecisionCapacityPlans(decisionId: string, filters: { status?: string | null } = {}) { - const query = new URLSearchParams(); - if (filters.status) query.set('status', filters.status); - return this.request('GET', `/v1/decisions/${encodeURIComponent(decisionId)}/capacity-plans${query.toString() ? `?${query}` : ''}`); - } - - getCapacityPlan(capacityPlanId: string) { - return this.request('GET', `/v1/capacity-plans/${encodeURIComponent(capacityPlanId)}`); - } - - getWorkdayCapacitySummary(workdayId: string) { - return this.request('GET', `/v1/workdays/${encodeURIComponent(workdayId)}/summary`); - } - - listWorkdayRuns(teamId: string, filters: { status?: string | null; providerId?: string | null } = {}) { - const query = new URLSearchParams(); - if (filters.status) query.set('status', filters.status); - if (filters.providerId) query.set('providerId', filters.providerId); - return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/workday-runs${query.toString() ? `?${query}` : ''}`); - } - - createWorkdayRun(teamId: string, body: Record) { - return this.request('POST', `/v1/teams/${encodeURIComponent(teamId)}/workday-runs`, { body }); - } - - getWorkdayRun(teamId: string, runId: string) { - return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/workday-runs/${encodeURIComponent(runId)}`); - } - - listCapacityLedgerEntries(projectId: string, workdayId: string) { - return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/capacity/ledger?workdayId=${encodeURIComponent(workdayId)}`); - } - - listCapacityRoutingDecisionsForProject(projectId: string, limit = 100) { - return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/capacity/routing-decisions?limit=${encodeURIComponent(String(limit))}`); - } - - listSeedRuns(limit = 100) { - return this.request('GET', `/v1/seeds/runs?limit=${encodeURIComponent(String(limit))}`); - } - - listCatalogItems(_principal: unknown, filters: { kind?: string; teamId?: string; slug?: string } = {}) { - const query = new URLSearchParams(); - if (filters.kind) query.set('kind', filters.kind); - if (filters.teamId) query.set('teamId', filters.teamId); - if (filters.slug) query.set('slug', filters.slug); - return this.request('GET', `/v1/catalog${query.toString() ? `?${query}` : ''}`); - } - - getCatalogItemBySlug(kind: string, slug: string) { - return this.listCatalogItems(null, { kind, slug }).then((items) => items[0] ?? null); - } - - listCatalogArtifactVersions(itemId: string) { - return this.request('GET', `/v1/catalog/${encodeURIComponent(itemId)}/artifacts`); - } - - listKnowledgePacks(principal: unknown) { - return this.listCatalogItems(principal, { kind: 'knowledge_pack' }); - } - - acceptTeamInvite(token: string, _principalId: string) { - return this.request('POST', `/v1/team-invites/${encodeURIComponent(token)}/accept`, { body: {} }); - } - - getTeamInvite(token: string) { - return this.request('GET', `/v1/team-invites/${encodeURIComponent(token)}`); - } - - loadTeamProfileByName(name: string) { - return this.request('GET', `/v1/teams/by-name/${encodeURIComponent(name)}/profile`).catch(() => null); - } - - loadUserProfileByUsername(username: string) { - return this.request('GET', `/v1/users/by-username/${encodeURIComponent(username)}/profile`).catch(() => null); - } + constructor(readonly context: AstroLike) { } + get currentPrincipal() { + return this.context.locals.auth?.principal ?? null; + } } - +extractedMethods.installApiClientFacadeMethods(ApiClientFacade.prototype); export function createApiFacade(context: AstroLike) { - return new ApiClientFacade(context); + return new ApiClientFacade(context); } - export function safeTokenEquals(left: string, right: string) { - const encoder = new TextEncoder(); - const leftBuffer = encoder.encode(left); - const rightBuffer = encoder.encode(right); - const nodeCrypto = getNodeCrypto(); - if (nodeCrypto?.timingSafeEqual) { - return leftBuffer.length === rightBuffer.length && nodeCrypto.timingSafeEqual(leftBuffer, rightBuffer); - } - let diff = leftBuffer.length ^ rightBuffer.length; - const length = Math.max(leftBuffer.length, rightBuffer.length); - for (let index = 0; index < length; index += 1) { - diff |= (leftBuffer[index] ?? 0) ^ (rightBuffer[index] ?? 0); - } - return diff === 0; + const encoder = new TextEncoder(); + const leftBuffer = encoder.encode(left); + const rightBuffer = encoder.encode(right); + const nodeCrypto = getNodeCrypto(); + if (nodeCrypto?.timingSafeEqual) { + return leftBuffer.length === rightBuffer.length && nodeCrypto.timingSafeEqual(leftBuffer, rightBuffer); + } + let diff = leftBuffer.length ^ rightBuffer.length; + const length = Math.max(leftBuffer.length, rightBuffer.length); + for (let index = 0; index < length; index += 1) { + diff |= (leftBuffer[index] ?? 0) ^ (rightBuffer[index] ?? 0); + } + return diff === 0; } diff --git a/src/lib/market/api-client/accept-team-invite.ts b/src/lib/market/api-client/accept-team-invite.ts new file mode 100644 index 00000000..d7f788ce --- /dev/null +++ b/src/lib/market/api-client/accept-team-invite.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function acceptTeamInviteMethod(this: ApiClientFacade, token: string, _principalId: string) { + return this.request('POST', `/v1/team-invites/${encodeURIComponent(token)}/accept`, { body: {} }); +} diff --git a/src/lib/market/api-client/account-deletion-blockers.ts b/src/lib/market/api-client/account-deletion-blockers.ts new file mode 100644 index 00000000..a8a5a0f4 --- /dev/null +++ b/src/lib/market/api-client/account-deletion-blockers.ts @@ -0,0 +1,10 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function accountDeletionBlockersMethod(this: ApiClientFacade) { return this.request<{ + blockers: AccountDeletionBlocker[]; + canDelete: boolean; +}>('GET', '/v1/auth/web/account/deletion-blockers'); } diff --git a/src/lib/market/api-client/account-identity.ts b/src/lib/market/api-client/account-identity.ts new file mode 100644 index 00000000..bc7ebe26 --- /dev/null +++ b/src/lib/market/api-client/account-identity.ts @@ -0,0 +1,7 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function accountIdentityMethod(this: ApiClientFacade) { return this.request('GET', '/v1/auth/web/account/identity'); } diff --git a/src/lib/market/api-client/account-notifications.ts b/src/lib/market/api-client/account-notifications.ts new file mode 100644 index 00000000..72cbc130 --- /dev/null +++ b/src/lib/market/api-client/account-notifications.ts @@ -0,0 +1,7 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function accountNotificationsMethod(this: ApiClientFacade, limit = 20) { return this.request('GET', `/v1/auth/web/notifications?limit=${encodeURIComponent(String(limit))}`); } diff --git a/src/lib/market/api-client/account-sessions.ts b/src/lib/market/api-client/account-sessions.ts new file mode 100644 index 00000000..580e0bf7 --- /dev/null +++ b/src/lib/market/api-client/account-sessions.ts @@ -0,0 +1,7 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function accountSessionsMethod(this: ApiClientFacade) { return this.request('GET', '/v1/auth/web/sessions'); } diff --git a/src/lib/market/api-client/add-account-email.ts b/src/lib/market/api-client/add-account-email.ts new file mode 100644 index 00000000..d333bd06 --- /dev/null +++ b/src/lib/market/api-client/add-account-email.ts @@ -0,0 +1,7 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function addAccountEmailMethod(this: ApiClientFacade, email: string) { return this.request('POST', '/v1/auth/web/emails', { body: { email } }); } diff --git a/src/lib/market/api-client/answer-commons-question.ts b/src/lib/market/api-client/answer-commons-question.ts new file mode 100644 index 00000000..0a0d3910 --- /dev/null +++ b/src/lib/market/api-client/answer-commons-question.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function answerCommonsQuestionMethod(this: ApiClientFacade, questionId: string, body: Record) { + return this.request('POST', `/v1/commons/questions/${encodeURIComponent(questionId)}/answer`, { body }); +} diff --git a/src/lib/market/api-client/approve-commerce-capacity-inquiry-for-scoping.ts b/src/lib/market/api-client/approve-commerce-capacity-inquiry-for-scoping.ts new file mode 100644 index 00000000..56ebed8c --- /dev/null +++ b/src/lib/market/api-client/approve-commerce-capacity-inquiry-for-scoping.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function approveCommerceCapacityInquiryForScopingMethod(this: ApiClientFacade, inquiryId: string, body: Record = {}) { + return this.request('POST', `/v1/commerce/capacity-listing-inquiries/${encodeURIComponent(inquiryId)}/approve-for-scoping`, { body }); +} diff --git a/src/lib/market/api-client/approve-commerce-capacity-listing.ts b/src/lib/market/api-client/approve-commerce-capacity-listing.ts new file mode 100644 index 00000000..58ae9f6e --- /dev/null +++ b/src/lib/market/api-client/approve-commerce-capacity-listing.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function approveCommerceCapacityListingMethod(this: ApiClientFacade, listingId: string, body: Record = {}) { + return this.request('POST', `/v1/commerce/capacity-listings/${encodeURIComponent(listingId)}/approve`, { body }); +} diff --git a/src/lib/market/api-client/approve-commerce-ownership-transfer.ts b/src/lib/market/api-client/approve-commerce-ownership-transfer.ts new file mode 100644 index 00000000..77eca5b0 --- /dev/null +++ b/src/lib/market/api-client/approve-commerce-ownership-transfer.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function approveCommerceOwnershipTransferMethod(this: ApiClientFacade, productId: string, transferId: string, body: Record = {}) { + return this.request('POST', `/v1/commerce/products/${encodeURIComponent(productId)}/ownership-transfer/${encodeURIComponent(transferId)}/approve`, { body }); +} diff --git a/src/lib/market/api-client/approve-device.ts b/src/lib/market/api-client/approve-device.ts new file mode 100644 index 00000000..ef3daadf --- /dev/null +++ b/src/lib/market/api-client/approve-device.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function approveDeviceMethod(this: ApiClientFacade, userCode: string) { return this.request<{ + approved: true; +}>('POST', '/v1/auth/device/approve', { body: { userCode } }); } diff --git a/src/lib/market/api-client/archive-commerce-capacity-listing.ts b/src/lib/market/api-client/archive-commerce-capacity-listing.ts new file mode 100644 index 00000000..efc9d429 --- /dev/null +++ b/src/lib/market/api-client/archive-commerce-capacity-listing.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function archiveCommerceCapacityListingMethod(this: ApiClientFacade, listingId: string, body: Record = {}) { + return this.request('POST', `/v1/commerce/capacity-listings/${encodeURIComponent(listingId)}/archive`, { body }); +} diff --git a/src/lib/market/api-client/auth-providers.ts b/src/lib/market/api-client/auth-providers.ts new file mode 100644 index 00000000..83fbc25f --- /dev/null +++ b/src/lib/market/api-client/auth-providers.ts @@ -0,0 +1,7 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function authProvidersMethod(this: ApiClientFacade) { return this.request('GET', '/v1/auth/providers'); } diff --git a/src/lib/market/api-client/backfill-commons-participants.ts b/src/lib/market/api-client/backfill-commons-participants.ts new file mode 100644 index 00000000..94520737 --- /dev/null +++ b/src/lib/market/api-client/backfill-commons-participants.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function backfillCommonsParticipantsMethod(this: ApiClientFacade) { + return this.request('POST', '/v1/commons/participants/backfill', { body: {} }); +} diff --git a/src/lib/market/api-client/buyer-approve-commerce-service-quote.ts b/src/lib/market/api-client/buyer-approve-commerce-service-quote.ts new file mode 100644 index 00000000..0ef2b5f7 --- /dev/null +++ b/src/lib/market/api-client/buyer-approve-commerce-service-quote.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function buyerApproveCommerceServiceQuoteMethod(this: ApiClientFacade, quoteId: string, body: Record = {}) { + return this.request('POST', `/v1/commerce/services/quotes/${encodeURIComponent(quoteId)}/buyer-approve`, { body }); +} diff --git a/src/lib/market/api-client/cancel-commerce-capacity-inquiry.ts b/src/lib/market/api-client/cancel-commerce-capacity-inquiry.ts new file mode 100644 index 00000000..ef2d7553 --- /dev/null +++ b/src/lib/market/api-client/cancel-commerce-capacity-inquiry.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function cancelCommerceCapacityInquiryMethod(this: ApiClientFacade, inquiryId: string, body: Record = {}) { + return this.request('POST', `/v1/commerce/capacity-listing-inquiries/${encodeURIComponent(inquiryId)}/cancel`, { body }); +} diff --git a/src/lib/market/api-client/cancel-commerce-ownership-transfer.ts b/src/lib/market/api-client/cancel-commerce-ownership-transfer.ts new file mode 100644 index 00000000..a8895fa0 --- /dev/null +++ b/src/lib/market/api-client/cancel-commerce-ownership-transfer.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function cancelCommerceOwnershipTransferMethod(this: ApiClientFacade, productId: string, transferId: string, body: Record = {}) { + return this.request('POST', `/v1/commerce/products/${encodeURIComponent(productId)}/ownership-transfer/${encodeURIComponent(transferId)}/cancel`, { body }); +} diff --git a/src/lib/market/api-client/cancel-commerce-service-contract.ts b/src/lib/market/api-client/cancel-commerce-service-contract.ts new file mode 100644 index 00000000..b3160ff8 --- /dev/null +++ b/src/lib/market/api-client/cancel-commerce-service-contract.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function cancelCommerceServiceContractMethod(this: ApiClientFacade, contractId: string, body: Record = {}) { + return this.request('POST', `/v1/commerce/services/contracts/${encodeURIComponent(contractId)}/cancel`, { body }); +} diff --git a/src/lib/market/api-client/cancel-commerce-service-request.ts b/src/lib/market/api-client/cancel-commerce-service-request.ts new file mode 100644 index 00000000..ca0a9a3d --- /dev/null +++ b/src/lib/market/api-client/cancel-commerce-service-request.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function cancelCommerceServiceRequestMethod(this: ApiClientFacade, requestId: string, body: Record = {}) { + return this.request('POST', `/v1/commerce/services/requests/${encodeURIComponent(requestId)}/cancel`, { body }); +} diff --git a/src/lib/market/api-client/claim-username.ts b/src/lib/market/api-client/claim-username.ts new file mode 100644 index 00000000..3e7d3d44 --- /dev/null +++ b/src/lib/market/api-client/claim-username.ts @@ -0,0 +1,7 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function claimUsernameMethod(this: ApiClientFacade, username: string) { return this.request('PATCH', '/v1/auth/web/username', { body: { username } }); } diff --git a/src/lib/market/api-client/complete-password-reset.ts b/src/lib/market/api-client/complete-password-reset.ts new file mode 100644 index 00000000..399ebac7 --- /dev/null +++ b/src/lib/market/api-client/complete-password-reset.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function completePasswordResetMethod(this: ApiClientFacade, token: string, newPassword: string) { return this.request<{ + changed: true; +}>('POST', '/v1/auth/web/password-reset/complete', { body: { token, newPassword } }); } diff --git a/src/lib/market/api-client/confirm-email.ts b/src/lib/market/api-client/confirm-email.ts new file mode 100644 index 00000000..9c9c8e7a --- /dev/null +++ b/src/lib/market/api-client/confirm-email.ts @@ -0,0 +1,7 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function confirmEmailMethod(this: ApiClientFacade, token: string) { return this.request('POST', '/v1/auth/web/confirm-email', { body: { token } }); } diff --git a/src/lib/market/api-client/create-commerce-capacity-listing-inquiry.ts b/src/lib/market/api-client/create-commerce-capacity-listing-inquiry.ts new file mode 100644 index 00000000..120e51ca --- /dev/null +++ b/src/lib/market/api-client/create-commerce-capacity-listing-inquiry.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function createCommerceCapacityListingInquiryMethod(this: ApiClientFacade, listingId: string, body: Record) { + return this.request('POST', `/v1/commerce/capacity-listings/${encodeURIComponent(listingId)}/inquiries`, { body }); +} diff --git a/src/lib/market/api-client/create-commerce-capacity-listing.ts b/src/lib/market/api-client/create-commerce-capacity-listing.ts new file mode 100644 index 00000000..f59de4fb --- /dev/null +++ b/src/lib/market/api-client/create-commerce-capacity-listing.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function createCommerceCapacityListingMethod(this: ApiClientFacade, productId: string, body: Record) { + return this.request('POST', `/v1/commerce/products/${encodeURIComponent(productId)}/capacity-listing`, { body }); +} diff --git a/src/lib/market/api-client/create-commerce-order-refund.ts b/src/lib/market/api-client/create-commerce-order-refund.ts new file mode 100644 index 00000000..a5488982 --- /dev/null +++ b/src/lib/market/api-client/create-commerce-order-refund.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function createCommerceOrderRefundMethod(this: ApiClientFacade, orderId: string, body: Record) { + return this.request('POST', `/v1/commerce/orders/${encodeURIComponent(orderId)}/refunds`, { body }); +} diff --git a/src/lib/market/api-client/create-commerce-service-quote.ts b/src/lib/market/api-client/create-commerce-service-quote.ts new file mode 100644 index 00000000..b825c9cd --- /dev/null +++ b/src/lib/market/api-client/create-commerce-service-quote.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function createCommerceServiceQuoteMethod(this: ApiClientFacade, requestId: string, body: Record) { + return this.request('POST', `/v1/commerce/services/requests/${encodeURIComponent(requestId)}/quotes`, { body }); +} diff --git a/src/lib/market/api-client/create-commerce-service-request.ts b/src/lib/market/api-client/create-commerce-service-request.ts new file mode 100644 index 00000000..9172051d --- /dev/null +++ b/src/lib/market/api-client/create-commerce-service-request.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function createCommerceServiceRequestMethod(this: ApiClientFacade, body: Record) { + return this.request('POST', '/v1/commerce/services/requests', { body }); +} diff --git a/src/lib/market/api-client/create-commerce-succession-event.ts b/src/lib/market/api-client/create-commerce-succession-event.ts new file mode 100644 index 00000000..7db7188b --- /dev/null +++ b/src/lib/market/api-client/create-commerce-succession-event.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function createCommerceSuccessionEventMethod(this: ApiClientFacade, productId: string, body: Record) { + return this.request('POST', `/v1/commerce/products/${encodeURIComponent(productId)}/succession-events`, { body }); +} diff --git a/src/lib/market/api-client/create-commerce-vendor-stripe-login-link.ts b/src/lib/market/api-client/create-commerce-vendor-stripe-login-link.ts new file mode 100644 index 00000000..630494d5 --- /dev/null +++ b/src/lib/market/api-client/create-commerce-vendor-stripe-login-link.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function createCommerceVendorStripeLoginLinkMethod(this: ApiClientFacade, teamId: string) { + return this.request('POST', `/v1/commerce/vendors/${encodeURIComponent(teamId)}/stripe/login-link`, { body: {} }); +} diff --git a/src/lib/market/api-client/create-commons-proposal.ts b/src/lib/market/api-client/create-commons-proposal.ts new file mode 100644 index 00000000..169768d4 --- /dev/null +++ b/src/lib/market/api-client/create-commons-proposal.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function createCommonsProposalMethod(this: ApiClientFacade, body: Record) { + return this.request('POST', '/v1/commons/proposals', { body }); +} diff --git a/src/lib/market/api-client/create-personal-theme.ts b/src/lib/market/api-client/create-personal-theme.ts new file mode 100644 index 00000000..e163b9ed --- /dev/null +++ b/src/lib/market/api-client/create-personal-theme.ts @@ -0,0 +1,7 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function createPersonalThemeMethod(this: ApiClientFacade, body: PersonalThemeDraft) { return this.request('POST', '/v1/auth/web/themes', { body }); } diff --git a/src/lib/market/api-client/create-tree-dx-mirror.ts b/src/lib/market/api-client/create-tree-dx-mirror.ts new file mode 100644 index 00000000..165e4498 --- /dev/null +++ b/src/lib/market/api-client/create-tree-dx-mirror.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function createTreeDxMirrorMethod(this: ApiClientFacade, teamId: string, body: Record) { + return this.request('POST', `/v1/teams/${encodeURIComponent(teamId)}/treedx/mirrors`, { body }); +} diff --git a/src/lib/market/api-client/create-tree-dx-share.ts b/src/lib/market/api-client/create-tree-dx-share.ts new file mode 100644 index 00000000..3f919e61 --- /dev/null +++ b/src/lib/market/api-client/create-tree-dx-share.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function createTreeDxShareMethod(this: ApiClientFacade, teamId: string, body: Record) { + return this.request('POST', `/v1/teams/${encodeURIComponent(teamId)}/treedx/shares`, { body }); +} diff --git a/src/lib/market/api-client/create-workday-run.ts b/src/lib/market/api-client/create-workday-run.ts new file mode 100644 index 00000000..15c92a94 --- /dev/null +++ b/src/lib/market/api-client/create-workday-run.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function createWorkdayRunMethod(this: ApiClientFacade, teamId: string, body: Record) { + return this.request('POST', `/v1/teams/${encodeURIComponent(teamId)}/workday-runs`, { body }); +} diff --git a/src/lib/market/api-client/decide-approval-request.ts b/src/lib/market/api-client/decide-approval-request.ts new file mode 100644 index 00000000..8c99bc76 --- /dev/null +++ b/src/lib/market/api-client/decide-approval-request.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function decideApprovalRequestMethod(this: ApiClientFacade, approvalRequestId: string, body: Record) { + return this.request('POST', `/v1/approval-requests/${encodeURIComponent(approvalRequestId)}/decide`, { body }); +} diff --git a/src/lib/market/api-client/decline-commerce-capacity-inquiry.ts b/src/lib/market/api-client/decline-commerce-capacity-inquiry.ts new file mode 100644 index 00000000..ada38639 --- /dev/null +++ b/src/lib/market/api-client/decline-commerce-capacity-inquiry.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function declineCommerceCapacityInquiryMethod(this: ApiClientFacade, inquiryId: string, body: Record = {}) { + return this.request('POST', `/v1/commerce/capacity-listing-inquiries/${encodeURIComponent(inquiryId)}/decline`, { body }); +} diff --git a/src/lib/market/api-client/delete-account-email.ts b/src/lib/market/api-client/delete-account-email.ts new file mode 100644 index 00000000..a4d1c3d9 --- /dev/null +++ b/src/lib/market/api-client/delete-account-email.ts @@ -0,0 +1,7 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function deleteAccountEmailMethod(this: ApiClientFacade, emailId: string) { return this.request('DELETE', `/v1/auth/web/emails/${encodeURIComponent(emailId)}`); } diff --git a/src/lib/market/api-client/delete-current-account.ts b/src/lib/market/api-client/delete-current-account.ts new file mode 100644 index 00000000..b6f558ce --- /dev/null +++ b/src/lib/market/api-client/delete-current-account.ts @@ -0,0 +1,13 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function deleteCurrentAccountMethod(this: ApiClientFacade, body: { + confirmation: string; + currentPassword?: string; + reauthenticationGrantId?: string; +}) { return this.request<{ + deleted: true; +}>('DELETE', '/v1/auth/web/account', { body }); } diff --git a/src/lib/market/api-client/delete-personal-theme.ts b/src/lib/market/api-client/delete-personal-theme.ts new file mode 100644 index 00000000..97a62b95 --- /dev/null +++ b/src/lib/market/api-client/delete-personal-theme.ts @@ -0,0 +1,7 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function deletePersonalThemeMethod(this: ApiClientFacade, id: string) { return this.request('DELETE', `/v1/auth/web/themes/${encodeURIComponent(id)}`); } diff --git a/src/lib/market/api-client/delete-team-inbox-items-by-item-key.ts b/src/lib/market/api-client/delete-team-inbox-items-by-item-key.ts new file mode 100644 index 00000000..50318ed0 --- /dev/null +++ b/src/lib/market/api-client/delete-team-inbox-items-by-item-key.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function deleteTeamInboxItemsByItemKeyMethod(this: ApiClientFacade, _teamId: string, _itemKey: string) { + return Promise.resolve({ ok: true }); +} diff --git a/src/lib/market/api-client/end-commerce-stewardship-assignment.ts b/src/lib/market/api-client/end-commerce-stewardship-assignment.ts new file mode 100644 index 00000000..124065ff --- /dev/null +++ b/src/lib/market/api-client/end-commerce-stewardship-assignment.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function endCommerceStewardshipAssignmentMethod(this: ApiClientFacade, productId: string, assignmentId: string, body: Record) { + return this.request('POST', `/v1/commerce/products/${encodeURIComponent(productId)}/stewards/${encodeURIComponent(assignmentId)}/end`, { body }); +} diff --git a/src/lib/market/api-client/evaluate-project-deletion-blockers.ts b/src/lib/market/api-client/evaluate-project-deletion-blockers.ts new file mode 100644 index 00000000..6aaf4f1f --- /dev/null +++ b/src/lib/market/api-client/evaluate-project-deletion-blockers.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function evaluateProjectDeletionBlockersMethod(this: ApiClientFacade, projectId: string) { + return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/deletion-blockers`); +} diff --git a/src/lib/market/api-client/evaluate-team-deletion-blockers.ts b/src/lib/market/api-client/evaluate-team-deletion-blockers.ts new file mode 100644 index 00000000..6e6808ef --- /dev/null +++ b/src/lib/market/api-client/evaluate-team-deletion-blockers.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function evaluateTeamDeletionBlockersMethod(this: ApiClientFacade, teamId: string) { + return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/deletion-blockers`); +} diff --git a/src/lib/market/api-client/fulfill-commerce-order-item-artifact.ts b/src/lib/market/api-client/fulfill-commerce-order-item-artifact.ts new file mode 100644 index 00000000..c3052cb1 --- /dev/null +++ b/src/lib/market/api-client/fulfill-commerce-order-item-artifact.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function fulfillCommerceOrderItemArtifactMethod(this: ApiClientFacade, orderItemId: string, body: Record) { + return this.request('POST', `/v1/commerce/order-items/${encodeURIComponent(orderItemId)}/fulfillment/artifact`, { body }); +} diff --git a/src/lib/market/api-client/fulfill-commerce-service-contract.ts b/src/lib/market/api-client/fulfill-commerce-service-contract.ts new file mode 100644 index 00000000..03f9f9ae --- /dev/null +++ b/src/lib/market/api-client/fulfill-commerce-service-contract.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function fulfillCommerceServiceContractMethod(this: ApiClientFacade, contractId: string, body: Record) { + return this.request('POST', `/v1/commerce/services/contracts/${encodeURIComponent(contractId)}/fulfill`, { body }); +} diff --git a/src/lib/market/api-client/get-capacity-plan.ts b/src/lib/market/api-client/get-capacity-plan.ts new file mode 100644 index 00000000..3d85e219 --- /dev/null +++ b/src/lib/market/api-client/get-capacity-plan.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function getCapacityPlanMethod(this: ApiClientFacade, capacityPlanId: string) { + return this.request('GET', `/v1/capacity-plans/${encodeURIComponent(capacityPlanId)}`); +} diff --git a/src/lib/market/api-client/get-catalog-item-by-slug.ts b/src/lib/market/api-client/get-catalog-item-by-slug.ts new file mode 100644 index 00000000..403e249f --- /dev/null +++ b/src/lib/market/api-client/get-catalog-item-by-slug.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function getCatalogItemBySlugMethod(this: ApiClientFacade, kind: string, slug: string) { + return this.listCatalogItems(null, { kind, slug }).then((items) => items[0] ?? null); +} diff --git a/src/lib/market/api-client/get-commerce-capacity-listing-for-product.ts b/src/lib/market/api-client/get-commerce-capacity-listing-for-product.ts new file mode 100644 index 00000000..0cdd1f36 --- /dev/null +++ b/src/lib/market/api-client/get-commerce-capacity-listing-for-product.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function getCommerceCapacityListingForProductMethod(this: ApiClientFacade, productId: string) { + return this.request('GET', `/v1/commerce/products/${encodeURIComponent(productId)}/capacity-listing`); +} diff --git a/src/lib/market/api-client/get-commerce-capacity-listing-inquiry.ts b/src/lib/market/api-client/get-commerce-capacity-listing-inquiry.ts new file mode 100644 index 00000000..6a8fc89f --- /dev/null +++ b/src/lib/market/api-client/get-commerce-capacity-listing-inquiry.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function getCommerceCapacityListingInquiryMethod(this: ApiClientFacade, inquiryId: string) { + return this.request('GET', `/v1/commerce/capacity-listing-inquiries/${encodeURIComponent(inquiryId)}`); +} diff --git a/src/lib/market/api-client/get-commerce-capacity-listing.ts b/src/lib/market/api-client/get-commerce-capacity-listing.ts new file mode 100644 index 00000000..a763db3d --- /dev/null +++ b/src/lib/market/api-client/get-commerce-capacity-listing.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function getCommerceCapacityListingMethod(this: ApiClientFacade, listingId: string) { + return this.request('GET', `/v1/commerce/capacity-listings/${encodeURIComponent(listingId)}`); +} diff --git a/src/lib/market/api-client/get-commerce-marketplace-product.ts b/src/lib/market/api-client/get-commerce-marketplace-product.ts new file mode 100644 index 00000000..6599316e --- /dev/null +++ b/src/lib/market/api-client/get-commerce-marketplace-product.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function getCommerceMarketplaceProductMethod(this: ApiClientFacade, productId: string) { + return this.request('GET', `/v1/commerce/marketplace/products/${encodeURIComponent(productId)}`); +} diff --git a/src/lib/market/api-client/get-commerce-ownership-workflow.ts b/src/lib/market/api-client/get-commerce-ownership-workflow.ts new file mode 100644 index 00000000..0f5040c1 --- /dev/null +++ b/src/lib/market/api-client/get-commerce-ownership-workflow.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function getCommerceOwnershipWorkflowMethod(this: ApiClientFacade, productId: string) { + return this.request('GET', `/v1/commerce/products/${encodeURIComponent(productId)}/ownership-workflow`); +} diff --git a/src/lib/market/api-client/get-commerce-product.ts b/src/lib/market/api-client/get-commerce-product.ts new file mode 100644 index 00000000..a2c5fdd4 --- /dev/null +++ b/src/lib/market/api-client/get-commerce-product.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function getCommerceProductMethod(this: ApiClientFacade, productId: string) { + return this.request('GET', `/v1/commerce/products/${encodeURIComponent(productId)}`); +} diff --git a/src/lib/market/api-client/get-commerce-service-contract.ts b/src/lib/market/api-client/get-commerce-service-contract.ts new file mode 100644 index 00000000..b28ca7b5 --- /dev/null +++ b/src/lib/market/api-client/get-commerce-service-contract.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function getCommerceServiceContractMethod(this: ApiClientFacade, contractId: string) { + return this.request('GET', `/v1/commerce/services/contracts/${encodeURIComponent(contractId)}`); +} diff --git a/src/lib/market/api-client/get-commerce-service-request.ts b/src/lib/market/api-client/get-commerce-service-request.ts new file mode 100644 index 00000000..40210351 --- /dev/null +++ b/src/lib/market/api-client/get-commerce-service-request.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function getCommerceServiceRequestMethod(this: ApiClientFacade, requestId: string) { + return this.request('GET', `/v1/commerce/services/requests/${encodeURIComponent(requestId)}`); +} diff --git a/src/lib/market/api-client/get-commerce-vendor-monitoring.ts b/src/lib/market/api-client/get-commerce-vendor-monitoring.ts new file mode 100644 index 00000000..2c3f3bfb --- /dev/null +++ b/src/lib/market/api-client/get-commerce-vendor-monitoring.ts @@ -0,0 +1,11 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function getCommerceVendorMonitoringMethod(this: ApiClientFacade, teamId: string, filters: Record = {}) { + const query = new URLSearchParams(Object.entries(filters).filter(([, value]) => value != null).map(([key, value]) => [key, String(value)])); + const suffix = query.toString() ? `?${query.toString()}` : ''; + return this.request('GET', `/v1/commerce/vendors/${encodeURIComponent(teamId)}/monitoring${suffix}`); +} diff --git a/src/lib/market/api-client/get-commerce-vendor-sales-summary.ts b/src/lib/market/api-client/get-commerce-vendor-sales-summary.ts new file mode 100644 index 00000000..837b710d --- /dev/null +++ b/src/lib/market/api-client/get-commerce-vendor-sales-summary.ts @@ -0,0 +1,11 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function getCommerceVendorSalesSummaryMethod(this: ApiClientFacade, teamId: string, filters: Record = {}) { + const query = new URLSearchParams(Object.entries(filters).filter(([, value]) => value != null).map(([key, value]) => [key, String(value)])); + const suffix = query.toString() ? `?${query.toString()}` : ''; + return this.request('GET', `/v1/commerce/vendors/${encodeURIComponent(teamId)}/sales/summary${suffix}`); +} diff --git a/src/lib/market/api-client/get-commerce-vendor-stripe-status.ts b/src/lib/market/api-client/get-commerce-vendor-stripe-status.ts new file mode 100644 index 00000000..e0756bc8 --- /dev/null +++ b/src/lib/market/api-client/get-commerce-vendor-stripe-status.ts @@ -0,0 +1,10 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function getCommerceVendorStripeStatusMethod(this: ApiClientFacade, teamId: string, refresh = false) { + const query = refresh ? '?refresh=1' : ''; + return this.request('GET', `/v1/commerce/vendors/${encodeURIComponent(teamId)}/stripe/status${query}`); +} diff --git a/src/lib/market/api-client/get-commerce-vendor.ts b/src/lib/market/api-client/get-commerce-vendor.ts new file mode 100644 index 00000000..d3475b1e --- /dev/null +++ b/src/lib/market/api-client/get-commerce-vendor.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function getCommerceVendorMethod(this: ApiClientFacade, teamId: string) { + return this.request('GET', `/v1/commerce/vendors/${encodeURIComponent(teamId)}`); +} diff --git a/src/lib/market/api-client/get-commons-participant-me.ts b/src/lib/market/api-client/get-commons-participant-me.ts new file mode 100644 index 00000000..e9bd2d83 --- /dev/null +++ b/src/lib/market/api-client/get-commons-participant-me.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function getCommonsParticipantMeMethod(this: ApiClientFacade) { + return this.request('GET', '/v1/commons/participants/me'); +} diff --git a/src/lib/market/api-client/get-commons-proposal.ts b/src/lib/market/api-client/get-commons-proposal.ts new file mode 100644 index 00000000..d884c4b1 --- /dev/null +++ b/src/lib/market/api-client/get-commons-proposal.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function getCommonsProposalMethod(this: ApiClientFacade, proposalId: string) { + return this.request('GET', `/v1/commons/proposals/${encodeURIComponent(proposalId)}`); +} diff --git a/src/lib/market/api-client/get-commons-summary.ts b/src/lib/market/api-client/get-commons-summary.ts new file mode 100644 index 00000000..23ff9352 --- /dev/null +++ b/src/lib/market/api-client/get-commons-summary.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function getCommonsSummaryMethod(this: ApiClientFacade) { + return this.request('GET', '/v1/commons/summary'); +} diff --git a/src/lib/market/api-client/get-decision-planning-status.ts b/src/lib/market/api-client/get-decision-planning-status.ts new file mode 100644 index 00000000..9678f828 --- /dev/null +++ b/src/lib/market/api-client/get-decision-planning-status.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function getDecisionPlanningStatusMethod(this: ApiClientFacade, decisionId: string) { + return this.request('GET', `/v1/decisions/${encodeURIComponent(decisionId)}/planning-status`); +} diff --git a/src/lib/market/api-client/get-project-agents-summary.ts b/src/lib/market/api-client/get-project-agents-summary.ts new file mode 100644 index 00000000..9bb67c60 --- /dev/null +++ b/src/lib/market/api-client/get-project-agents-summary.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function getProjectAgentsSummaryMethod(this: ApiClientFacade, projectId: string) { + return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/agents`); +} diff --git a/src/lib/market/api-client/get-project-by-team-and-slug.ts b/src/lib/market/api-client/get-project-by-team-and-slug.ts new file mode 100644 index 00000000..00cadd9d --- /dev/null +++ b/src/lib/market/api-client/get-project-by-team-and-slug.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function getProjectByTeamAndSlugMethod(this: ApiClientFacade, teamId: string, slug: string) { + return this.listTeamProjects(teamId).then((projects) => projects.find((project: any) => project.slug === slug || project.id === slug) ?? null); +} diff --git a/src/lib/market/api-client/get-project-capacity-runtime-diagnostics.ts b/src/lib/market/api-client/get-project-capacity-runtime-diagnostics.ts new file mode 100644 index 00000000..deff8865 --- /dev/null +++ b/src/lib/market/api-client/get-project-capacity-runtime-diagnostics.ts @@ -0,0 +1,10 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function getProjectCapacityRuntimeDiagnosticsMethod(this: ApiClientFacade, projectId: string, teamId: string) { + const query = new URLSearchParams({ teamId }); + return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/capacity-runtime-diagnostics?${query}`); +} diff --git a/src/lib/market/api-client/get-project-capacity-summary.ts b/src/lib/market/api-client/get-project-capacity-summary.ts new file mode 100644 index 00000000..b708c91d --- /dev/null +++ b/src/lib/market/api-client/get-project-capacity-summary.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function getProjectCapacitySummaryMethod(this: ApiClientFacade, projectId: string, environment = 'staging') { + return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/capacity?environment=${encodeURIComponent(environment)}`); +} diff --git a/src/lib/market/api-client/get-project-deployment.ts b/src/lib/market/api-client/get-project-deployment.ts new file mode 100644 index 00000000..ec187d66 --- /dev/null +++ b/src/lib/market/api-client/get-project-deployment.ts @@ -0,0 +1,14 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function getProjectDeploymentMethod(this: ApiClientFacade, deploymentId: string, options: { + limit?: number | string | null; +} = {}) { + const query = new URLSearchParams(); + if (options.limit != null) + query.set('limit', String(options.limit)); + return this.request('GET', `/v1/project-deployments/${encodeURIComponent(deploymentId)}${query.toString() ? `?${query}` : ''}`); +} diff --git a/src/lib/market/api-client/get-project-details.ts b/src/lib/market/api-client/get-project-details.ts new file mode 100644 index 00000000..509df380 --- /dev/null +++ b/src/lib/market/api-client/get-project-details.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function getProjectDetailsMethod(this: ApiClientFacade, projectId: string) { + return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}`); +} diff --git a/src/lib/market/api-client/get-project-releases-summary.ts b/src/lib/market/api-client/get-project-releases-summary.ts new file mode 100644 index 00000000..6d5c896a --- /dev/null +++ b/src/lib/market/api-client/get-project-releases-summary.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function getProjectReleasesSummaryMethod(this: ApiClientFacade, projectId: string) { + return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/releases`); +} diff --git a/src/lib/market/api-client/get-project-repository-topology.ts b/src/lib/market/api-client/get-project-repository-topology.ts new file mode 100644 index 00000000..02b97dc2 --- /dev/null +++ b/src/lib/market/api-client/get-project-repository-topology.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function getProjectRepositoryTopologyMethod(this: ApiClientFacade, projectId: string) { + return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/repository-topology`); +} diff --git a/src/lib/market/api-client/get-project-summary.ts b/src/lib/market/api-client/get-project-summary.ts new file mode 100644 index 00000000..11e4fbd8 --- /dev/null +++ b/src/lib/market/api-client/get-project-summary.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function getProjectSummaryMethod(this: ApiClientFacade, projectId: string) { + return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/summary`); +} diff --git a/src/lib/market/api-client/get-project-tree-dx-library.ts b/src/lib/market/api-client/get-project-tree-dx-library.ts new file mode 100644 index 00000000..9100cc8a --- /dev/null +++ b/src/lib/market/api-client/get-project-tree-dx-library.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function getProjectTreeDxLibraryMethod(this: ApiClientFacade, projectId: string) { + return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/treedx-library`); +} diff --git a/src/lib/market/api-client/get-provider-assignment-explanation.ts b/src/lib/market/api-client/get-provider-assignment-explanation.ts new file mode 100644 index 00000000..8c57e364 --- /dev/null +++ b/src/lib/market/api-client/get-provider-assignment-explanation.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function getProviderAssignmentExplanationMethod(this: ApiClientFacade, teamId: string, assignmentId: string) { + return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/capacity/assignments/${encodeURIComponent(assignmentId)}/explanation`); +} diff --git a/src/lib/market/api-client/get-repository-host.ts b/src/lib/market/api-client/get-repository-host.ts new file mode 100644 index 00000000..f4f3c70e --- /dev/null +++ b/src/lib/market/api-client/get-repository-host.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function getRepositoryHostMethod(this: ApiClientFacade, teamId: string, hostId: string) { + return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/repository-hosts/${encodeURIComponent(hostId)}`); +} diff --git a/src/lib/market/api-client/get-team-access-summary.ts b/src/lib/market/api-client/get-team-access-summary.ts new file mode 100644 index 00000000..8952d1d8 --- /dev/null +++ b/src/lib/market/api-client/get-team-access-summary.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function getTeamAccessSummaryMethod(this: ApiClientFacade, teamId: string) { + return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/permissions`); +} diff --git a/src/lib/market/api-client/get-team-invite.ts b/src/lib/market/api-client/get-team-invite.ts new file mode 100644 index 00000000..db808a5d --- /dev/null +++ b/src/lib/market/api-client/get-team-invite.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function getTeamInviteMethod(this: ApiClientFacade, token: string) { + return this.request('GET', `/v1/team-invites/${encodeURIComponent(token)}`); +} diff --git a/src/lib/market/api-client/get-team-tree-dx.ts b/src/lib/market/api-client/get-team-tree-dx.ts new file mode 100644 index 00000000..495a80c9 --- /dev/null +++ b/src/lib/market/api-client/get-team-tree-dx.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function getTeamTreeDxMethod(this: ApiClientFacade, teamId: string) { + return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/treedx`); +} diff --git a/src/lib/market/api-client/get-team-web-host.ts b/src/lib/market/api-client/get-team-web-host.ts new file mode 100644 index 00000000..1483818a --- /dev/null +++ b/src/lib/market/api-client/get-team-web-host.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function getTeamWebHostMethod(this: ApiClientFacade, teamId: string, hostId: string) { + return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/web-hosts/${encodeURIComponent(hostId)}`); +} diff --git a/src/lib/market/api-client/get-workday-capacity-summary.ts b/src/lib/market/api-client/get-workday-capacity-summary.ts new file mode 100644 index 00000000..15809f8a --- /dev/null +++ b/src/lib/market/api-client/get-workday-capacity-summary.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function getWorkdayCapacitySummaryMethod(this: ApiClientFacade, workdayId: string) { + return this.request('GET', `/v1/workdays/${encodeURIComponent(workdayId)}/summary`); +} diff --git a/src/lib/market/api-client/get-workday-run.ts b/src/lib/market/api-client/get-workday-run.ts new file mode 100644 index 00000000..bf56fff4 --- /dev/null +++ b/src/lib/market/api-client/get-workday-run.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function getWorkdayRunMethod(this: ApiClientFacade, teamId: string, runId: string) { + return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/workday-runs/${encodeURIComponent(runId)}`); +} diff --git a/src/lib/market/api-client/headers.ts b/src/lib/market/api-client/headers.ts new file mode 100644 index 00000000..b103460b --- /dev/null +++ b/src/lib/market/api-client/headers.ts @@ -0,0 +1,15 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function headersMethod(this: ApiClientFacade, body = false) { + const token = apiAccessTokenFromCookies(this.context); + const headers = apiServiceHeaders(this.context, { skipUserAssertion: Boolean(token) }); + if (token) + headers.set('authorization', `Bearer ${token}`); + if (body) + headers.set('content-type', 'application/json'); + return headers; +} diff --git a/src/lib/market/api-client/interface.ts b/src/lib/market/api-client/interface.ts new file mode 100644 index 00000000..5e4875d4 --- /dev/null +++ b/src/lib/market/api-client/interface.ts @@ -0,0 +1,182 @@ +declare module '../api-client.ts' { + interface ApiClientFacade { + acceptTeamInvite: typeof import('./accept-team-invite.ts').acceptTeamInviteMethod; + accountDeletionBlockers: typeof import('./account-deletion-blockers.ts').accountDeletionBlockersMethod; + accountIdentity: typeof import('./account-identity.ts').accountIdentityMethod; + accountNotifications: typeof import('./account-notifications.ts').accountNotificationsMethod; + accountSessions: typeof import('./account-sessions.ts').accountSessionsMethod; + addAccountEmail: typeof import('./add-account-email.ts').addAccountEmailMethod; + answerCommonsQuestion: typeof import('./answer-commons-question.ts').answerCommonsQuestionMethod; + approveCommerceCapacityInquiryForScoping: typeof import('./approve-commerce-capacity-inquiry-for-scoping.ts').approveCommerceCapacityInquiryForScopingMethod; + approveCommerceCapacityListing: typeof import('./approve-commerce-capacity-listing.ts').approveCommerceCapacityListingMethod; + approveCommerceOwnershipTransfer: typeof import('./approve-commerce-ownership-transfer.ts').approveCommerceOwnershipTransferMethod; + approveDevice: typeof import('./approve-device.ts').approveDeviceMethod; + archiveCommerceCapacityListing: typeof import('./archive-commerce-capacity-listing.ts').archiveCommerceCapacityListingMethod; + authProviders: typeof import('./auth-providers.ts').authProvidersMethod; + backfillCommonsParticipants: typeof import('./backfill-commons-participants.ts').backfillCommonsParticipantsMethod; + buyerApproveCommerceServiceQuote: typeof import('./buyer-approve-commerce-service-quote.ts').buyerApproveCommerceServiceQuoteMethod; + cancelCommerceCapacityInquiry: typeof import('./cancel-commerce-capacity-inquiry.ts').cancelCommerceCapacityInquiryMethod; + cancelCommerceOwnershipTransfer: typeof import('./cancel-commerce-ownership-transfer.ts').cancelCommerceOwnershipTransferMethod; + cancelCommerceServiceContract: typeof import('./cancel-commerce-service-contract.ts').cancelCommerceServiceContractMethod; + cancelCommerceServiceRequest: typeof import('./cancel-commerce-service-request.ts').cancelCommerceServiceRequestMethod; + claimUsername: typeof import('./claim-username.ts').claimUsernameMethod; + completePasswordReset: typeof import('./complete-password-reset.ts').completePasswordResetMethod; + confirmEmail: typeof import('./confirm-email.ts').confirmEmailMethod; + createCommerceCapacityListingInquiry: typeof import('./create-commerce-capacity-listing-inquiry.ts').createCommerceCapacityListingInquiryMethod; + createCommerceCapacityListing: typeof import('./create-commerce-capacity-listing.ts').createCommerceCapacityListingMethod; + createCommerceOrderRefund: typeof import('./create-commerce-order-refund.ts').createCommerceOrderRefundMethod; + createCommerceServiceQuote: typeof import('./create-commerce-service-quote.ts').createCommerceServiceQuoteMethod; + createCommerceServiceRequest: typeof import('./create-commerce-service-request.ts').createCommerceServiceRequestMethod; + createCommerceSuccessionEvent: typeof import('./create-commerce-succession-event.ts').createCommerceSuccessionEventMethod; + createCommerceVendorStripeLoginLink: typeof import('./create-commerce-vendor-stripe-login-link.ts').createCommerceVendorStripeLoginLinkMethod; + createCommonsProposal: typeof import('./create-commons-proposal.ts').createCommonsProposalMethod; + createPersonalTheme: typeof import('./create-personal-theme.ts').createPersonalThemeMethod; + createTreeDxMirror: typeof import('./create-tree-dx-mirror.ts').createTreeDxMirrorMethod; + createTreeDxShare: typeof import('./create-tree-dx-share.ts').createTreeDxShareMethod; + createWorkdayRun: typeof import('./create-workday-run.ts').createWorkdayRunMethod; + decideApprovalRequest: typeof import('./decide-approval-request.ts').decideApprovalRequestMethod; + declineCommerceCapacityInquiry: typeof import('./decline-commerce-capacity-inquiry.ts').declineCommerceCapacityInquiryMethod; + deleteAccountEmail: typeof import('./delete-account-email.ts').deleteAccountEmailMethod; + deleteCurrentAccount: typeof import('./delete-current-account.ts').deleteCurrentAccountMethod; + deletePersonalTheme: typeof import('./delete-personal-theme.ts').deletePersonalThemeMethod; + deleteTeamInboxItemsByItemKey: typeof import('./delete-team-inbox-items-by-item-key.ts').deleteTeamInboxItemsByItemKeyMethod; + endCommerceStewardshipAssignment: typeof import('./end-commerce-stewardship-assignment.ts').endCommerceStewardshipAssignmentMethod; + evaluateProjectDeletionBlockers: typeof import('./evaluate-project-deletion-blockers.ts').evaluateProjectDeletionBlockersMethod; + evaluateTeamDeletionBlockers: typeof import('./evaluate-team-deletion-blockers.ts').evaluateTeamDeletionBlockersMethod; + fulfillCommerceOrderItemArtifact: typeof import('./fulfill-commerce-order-item-artifact.ts').fulfillCommerceOrderItemArtifactMethod; + fulfillCommerceServiceContract: typeof import('./fulfill-commerce-service-contract.ts').fulfillCommerceServiceContractMethod; + getCapacityPlan: typeof import('./get-capacity-plan.ts').getCapacityPlanMethod; + getCatalogItemBySlug: typeof import('./get-catalog-item-by-slug.ts').getCatalogItemBySlugMethod; + getCommerceCapacityListingForProduct: typeof import('./get-commerce-capacity-listing-for-product.ts').getCommerceCapacityListingForProductMethod; + getCommerceCapacityListingInquiry: typeof import('./get-commerce-capacity-listing-inquiry.ts').getCommerceCapacityListingInquiryMethod; + getCommerceCapacityListing: typeof import('./get-commerce-capacity-listing.ts').getCommerceCapacityListingMethod; + getCommerceMarketplaceProduct: typeof import('./get-commerce-marketplace-product.ts').getCommerceMarketplaceProductMethod; + getCommerceOwnershipWorkflow: typeof import('./get-commerce-ownership-workflow.ts').getCommerceOwnershipWorkflowMethod; + getCommerceProduct: typeof import('./get-commerce-product.ts').getCommerceProductMethod; + getCommerceServiceContract: typeof import('./get-commerce-service-contract.ts').getCommerceServiceContractMethod; + getCommerceServiceRequest: typeof import('./get-commerce-service-request.ts').getCommerceServiceRequestMethod; + getCommerceVendorMonitoring: typeof import('./get-commerce-vendor-monitoring.ts').getCommerceVendorMonitoringMethod; + getCommerceVendorSalesSummary: typeof import('./get-commerce-vendor-sales-summary.ts').getCommerceVendorSalesSummaryMethod; + getCommerceVendorStripeStatus: typeof import('./get-commerce-vendor-stripe-status.ts').getCommerceVendorStripeStatusMethod; + getCommerceVendor: typeof import('./get-commerce-vendor.ts').getCommerceVendorMethod; + getCommonsParticipantMe: typeof import('./get-commons-participant-me.ts').getCommonsParticipantMeMethod; + getCommonsProposal: typeof import('./get-commons-proposal.ts').getCommonsProposalMethod; + getCommonsSummary: typeof import('./get-commons-summary.ts').getCommonsSummaryMethod; + getDecisionPlanningStatus: typeof import('./get-decision-planning-status.ts').getDecisionPlanningStatusMethod; + getProjectAgentsSummary: typeof import('./get-project-agents-summary.ts').getProjectAgentsSummaryMethod; + getProjectByTeamAndSlug: typeof import('./get-project-by-team-and-slug.ts').getProjectByTeamAndSlugMethod; + getProjectCapacityRuntimeDiagnostics: typeof import('./get-project-capacity-runtime-diagnostics.ts').getProjectCapacityRuntimeDiagnosticsMethod; + getProjectCapacitySummary: typeof import('./get-project-capacity-summary.ts').getProjectCapacitySummaryMethod; + getProjectDeployment: typeof import('./get-project-deployment.ts').getProjectDeploymentMethod; + getProjectDetails: typeof import('./get-project-details.ts').getProjectDetailsMethod; + getProjectReleasesSummary: typeof import('./get-project-releases-summary.ts').getProjectReleasesSummaryMethod; + getProjectRepositoryTopology: typeof import('./get-project-repository-topology.ts').getProjectRepositoryTopologyMethod; + getProjectSummary: typeof import('./get-project-summary.ts').getProjectSummaryMethod; + getProjectTreeDxLibrary: typeof import('./get-project-tree-dx-library.ts').getProjectTreeDxLibraryMethod; + getProviderAssignmentExplanation: typeof import('./get-provider-assignment-explanation.ts').getProviderAssignmentExplanationMethod; + getRepositoryHost: typeof import('./get-repository-host.ts').getRepositoryHostMethod; + getTeamAccessSummary: typeof import('./get-team-access-summary.ts').getTeamAccessSummaryMethod; + getTeamInvite: typeof import('./get-team-invite.ts').getTeamInviteMethod; + getTeamTreeDx: typeof import('./get-team-tree-dx.ts').getTeamTreeDxMethod; + getTeamWebHost: typeof import('./get-team-web-host.ts').getTeamWebHostMethod; + getWorkdayCapacitySummary: typeof import('./get-workday-capacity-summary.ts').getWorkdayCapacitySummaryMethod; + getWorkdayRun: typeof import('./get-workday-run.ts').getWorkdayRunMethod; + headers: typeof import('./headers.ts').headersMethod; + linkCommerceServiceContractWork: typeof import('./link-commerce-service-contract-work.ts').linkCommerceServiceContractWorkMethod; + listApprovalRequestsForProject: typeof import('./list-approval-requests-for-project.ts').listApprovalRequestsForProjectMethod; + listApprovalRequestsForTeam: typeof import('./list-approval-requests-for-team.ts').listApprovalRequestsForTeamMethod; + listAuditEventsForTarget: typeof import('./list-audit-events-for-target.ts').listAuditEventsForTargetMethod; + listCapacityAllocationSets: typeof import('./list-capacity-allocation-sets.ts').listCapacityAllocationSetsMethod; + listCapacityLedgerEntries: typeof import('./list-capacity-ledger-entries.ts').listCapacityLedgerEntriesMethod; + listCapacityRoutingDecisionsForProject: typeof import('./list-capacity-routing-decisions-for-project.ts').listCapacityRoutingDecisionsForProjectMethod; + listCatalogArtifactVersions: typeof import('./list-catalog-artifact-versions.ts').listCatalogArtifactVersionsMethod; + listCatalogItems: typeof import('./list-catalog-items.ts').listCatalogItemsMethod; + listCommerceCapacityListingInquiries: typeof import('./list-commerce-capacity-listing-inquiries.ts').listCommerceCapacityListingInquiriesMethod; + listCommerceCapacityListings: typeof import('./list-commerce-capacity-listings.ts').listCommerceCapacityListingsMethod; + listCommerceMarketplaceProducts: typeof import('./list-commerce-marketplace-products.ts').listCommerceMarketplaceProductsMethod; + listCommerceProducts: typeof import('./list-commerce-products.ts').listCommerceProductsMethod; + listCommerceServiceEvents: typeof import('./list-commerce-service-events.ts').listCommerceServiceEventsMethod; + listCommerceServiceQuotes: typeof import('./list-commerce-service-quotes.ts').listCommerceServiceQuotesMethod; + listCommerceServiceRequests: typeof import('./list-commerce-service-requests.ts').listCommerceServiceRequestsMethod; + listCommerceSuccessionEvents: typeof import('./list-commerce-succession-events.ts').listCommerceSuccessionEventsMethod; + listCommerceVendorFulfillmentEvents: typeof import('./list-commerce-vendor-fulfillment-events.ts').listCommerceVendorFulfillmentEventsMethod; + listCommerceVendorSalesEntitlements: typeof import('./list-commerce-vendor-sales-entitlements.ts').listCommerceVendorSalesEntitlementsMethod; + listCommerceVendorSalesOrders: typeof import('./list-commerce-vendor-sales-orders.ts').listCommerceVendorSalesOrdersMethod; + listCommerceVendorSalesRefunds: typeof import('./list-commerce-vendor-sales-refunds.ts').listCommerceVendorSalesRefundsMethod; + listCommerceVendorSalesSubscriptions: typeof import('./list-commerce-vendor-sales-subscriptions.ts').listCommerceVendorSalesSubscriptionsMethod; + listCommonsDecisions: typeof import('./list-commons-decisions.ts').listCommonsDecisionsMethod; + listCommonsEvents: typeof import('./list-commons-events.ts').listCommonsEventsMethod; + listCommonsParticipants: typeof import('./list-commons-participants.ts').listCommonsParticipantsMethod; + listCommonsProposals: typeof import('./list-commons-proposals.ts').listCommonsProposalsMethod; + listCommonsQuestions: typeof import('./list-commons-questions.ts').listCommonsQuestionsMethod; + listDecisionCapacityPlans: typeof import('./list-decision-capacity-plans.ts').listDecisionCapacityPlansMethod; + listDecisionExecutionInputs: typeof import('./list-decision-execution-inputs.ts').listDecisionExecutionInputsMethod; + listExecutionRuns: typeof import('./list-execution-runs.ts').listExecutionRunsMethod; + listKnowledgePacks: typeof import('./list-knowledge-packs.ts').listKnowledgePacksMethod; + listPersistedTeamInboxItems: typeof import('./list-persisted-team-inbox-items.ts').listPersistedTeamInboxItemsMethod; + listProjectAgentClasses: typeof import('./list-project-agent-classes.ts').listProjectAgentClassesMethod; + listProjectAgentFallbackOutputs: typeof import('./list-project-agent-fallback-outputs.ts').listProjectAgentFallbackOutputsMethod; + listProjectAgentModeRuns: typeof import('./list-project-agent-mode-runs.ts').listProjectAgentModeRunsMethod; + listProjectDeploymentEvents: typeof import('./list-project-deployment-events.ts').listProjectDeploymentEventsMethod; + listProjectDeployments: typeof import('./list-project-deployments.ts').listProjectDeploymentsMethod; + listProjectTreeDxProxyAudit: typeof import('./list-project-tree-dx-proxy-audit.ts').listProjectTreeDxProxyAuditMethod; + listProjectsForPrincipal: typeof import('./list-projects-for-principal.ts').listProjectsForPrincipalMethod; + listProviderAssignments: typeof import('./list-provider-assignments.ts').listProviderAssignmentsMethod; + listProviderAvailabilitySessions: typeof import('./list-provider-availability-sessions.ts').listProviderAvailabilitySessionsMethod; + listRepositoryHosts: typeof import('./list-repository-hosts.ts').listRepositoryHostsMethod; + listSeedRuns: typeof import('./list-seed-runs.ts').listSeedRunsMethod; + listTeamMembers: typeof import('./list-team-members.ts').listTeamMembersMethod; + listTeamProjects: typeof import('./list-team-projects.ts').listTeamProjectsMethod; + listTeamWebHosts: typeof import('./list-team-web-hosts.ts').listTeamWebHostsMethod; + listTeamsForPrincipal: typeof import('./list-teams-for-principal.ts').listTeamsForPrincipalMethod; + listTreeDxMirrors: typeof import('./list-tree-dx-mirrors.ts').listTreeDxMirrorsMethod; + listTreeDxShares: typeof import('./list-tree-dx-shares.ts').listTreeDxSharesMethod; + listWorkdayRuns: typeof import('./list-workday-runs.ts').listWorkdayRunsMethod; + loadTeamProfileByName: typeof import('./load-team-profile-by-name.ts').loadTeamProfileByNameMethod; + loadUserProfileByUsername: typeof import('./load-user-profile-by-username.ts').loadUserProfileByUsernameMethod; + markCommerceVendorStripeReturn: typeof import('./mark-commerce-vendor-stripe-return.ts').markCommerceVendorStripeReturnMethod; + notificationPreferences: typeof import('./notification-preferences.ts').notificationPreferencesMethod; + personalThemes: typeof import('./personal-themes.ts').personalThemesMethod; + provisionTeamTreeDx: typeof import('./provision-team-tree-dx.ts').provisionTeamTreeDxMethod; + recordPrivateKnowledgeOutcome: typeof import('./record-private-knowledge-outcome.ts').recordPrivateKnowledgeOutcomeMethod; + rejectCommerceCapacityListing: typeof import('./reject-commerce-capacity-listing.ts').rejectCommerceCapacityListingMethod; + rejectCommerceOwnershipTransfer: typeof import('./reject-commerce-ownership-transfer.ts').rejectCommerceOwnershipTransferMethod; + rejectCommerceServiceQuote: typeof import('./reject-commerce-service-quote.ts').rejectCommerceServiceQuoteMethod; + requestCommerceVendor: typeof import('./request-commerce-vendor.ts').requestCommerceVendorMethod; + requestPasswordReset: typeof import('./request-password-reset.ts').requestPasswordResetMethod; + request: typeof import('./request.ts').requestMethod; + resendAccountEmail: typeof import('./resend-account-email.ts').resendAccountEmailMethod; + reviewCommerceCapacityInquiry: typeof import('./review-commerce-capacity-inquiry.ts').reviewCommerceCapacityInquiryMethod; + reviewCommonsProposal: typeof import('./review-commons-proposal.ts').reviewCommonsProposalMethod; + revokeAccountSession: typeof import('./revoke-account-session.ts').revokeAccountSessionMethod; + revokeCommerceEntitlement: typeof import('./revoke-commerce-entitlement.ts').revokeCommerceEntitlementMethod; + setPrimaryAccountEmail: typeof import('./set-primary-account-email.ts').setPrimaryAccountEmailMethod; + startCommerceServiceScoping: typeof import('./start-commerce-service-scoping.ts').startCommerceServiceScopingMethod; + startCommerceVendorStripeOnboarding: typeof import('./start-commerce-vendor-stripe-onboarding.ts').startCommerceVendorStripeOnboardingMethod; + startCommonsProposalVoting: typeof import('./start-commons-proposal-voting.ts').startCommonsProposalVotingMethod; + stewardDecisionForCommonsProposal: typeof import('./steward-decision-for-commons-proposal.ts').stewardDecisionForCommonsProposalMethod; + submitCommerceCapacityListing: typeof import('./submit-commerce-capacity-listing.ts').submitCommerceCapacityListingMethod; + submitCommerceOwnershipTransfer: typeof import('./submit-commerce-ownership-transfer.ts').submitCommerceOwnershipTransferMethod; + submitCommerceServiceQuote: typeof import('./submit-commerce-service-quote.ts').submitCommerceServiceQuoteMethod; + suspendCommerceCapacityListing: typeof import('./suspend-commerce-capacity-listing.ts').suspendCommerceCapacityListingMethod; + unlinkAccountProvider: typeof import('./unlink-account-provider.ts').unlinkAccountProviderMethod; + updateAccountPassword: typeof import('./update-account-password.ts').updateAccountPasswordMethod; + updateAccountProfile: typeof import('./update-account-profile.ts').updateAccountProfileMethod; + updateCommerceCapacityListing: typeof import('./update-commerce-capacity-listing.ts').updateCommerceCapacityListingMethod; + updateCommerceContribution: typeof import('./update-commerce-contribution.ts').updateCommerceContributionMethod; + updateCommerceGovernancePolicy: typeof import('./update-commerce-governance-policy.ts').updateCommerceGovernancePolicyMethod; + updateCommerceOwnershipRecord: typeof import('./update-commerce-ownership-record.ts').updateCommerceOwnershipRecordMethod; + updateCommerceServiceRequest: typeof import('./update-commerce-service-request.ts').updateCommerceServiceRequestMethod; + updateCommerceStewardshipAssignment: typeof import('./update-commerce-stewardship-assignment.ts').updateCommerceStewardshipAssignmentMethod; + updateNotificationPreferences: typeof import('./update-notification-preferences.ts').updateNotificationPreferencesMethod; + updatePersonalTheme: typeof import('./update-personal-theme.ts').updatePersonalThemeMethod; + updateProjectRepositoryTopology: typeof import('./update-project-repository-topology.ts').updateProjectRepositoryTopologyMethod; + updateTeamTreeDx: typeof import('./update-team-tree-dx.ts').updateTeamTreeDxMethod; + upsertProjectTreeDxLibrary: typeof import('./upsert-project-tree-dx-library.ts').upsertProjectTreeDxLibraryMethod; + url: typeof import('./url.ts').urlMethod; + validatePrivateKnowledgeAccess: typeof import('./validate-private-knowledge-access.ts').validatePrivateKnowledgeAccessMethod; + vendorApproveCommerceServiceQuote: typeof import('./vendor-approve-commerce-service-quote.ts').vendorApproveCommerceServiceQuoteMethod; + } +} + +export {}; diff --git a/src/lib/market/api-client/link-commerce-service-contract-work.ts b/src/lib/market/api-client/link-commerce-service-contract-work.ts new file mode 100644 index 00000000..17735ef6 --- /dev/null +++ b/src/lib/market/api-client/link-commerce-service-contract-work.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function linkCommerceServiceContractWorkMethod(this: ApiClientFacade, contractId: string, body: Record) { + return this.request('POST', `/v1/commerce/services/contracts/${encodeURIComponent(contractId)}/link-work`, { body }); +} diff --git a/src/lib/market/api-client/list-approval-requests-for-project.ts b/src/lib/market/api-client/list-approval-requests-for-project.ts new file mode 100644 index 00000000..52b1fa08 --- /dev/null +++ b/src/lib/market/api-client/list-approval-requests-for-project.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function listApprovalRequestsForProjectMethod(this: ApiClientFacade, projectId: string, limit = 100) { + return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/approval-requests?limit=${encodeURIComponent(String(limit))}`); +} diff --git a/src/lib/market/api-client/list-approval-requests-for-team.ts b/src/lib/market/api-client/list-approval-requests-for-team.ts new file mode 100644 index 00000000..fe041f90 --- /dev/null +++ b/src/lib/market/api-client/list-approval-requests-for-team.ts @@ -0,0 +1,16 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function listApprovalRequestsForTeamMethod(this: ApiClientFacade, teamId: string, options: { + kind?: string; + limit?: number; +} = {}) { + const query = new URLSearchParams(); + if (options.kind) + query.set('kind', options.kind); + query.set('limit', String(options.limit ?? 100)); + return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/approval-requests?${query}`); +} diff --git a/src/lib/market/api-client/list-audit-events-for-target.ts b/src/lib/market/api-client/list-audit-events-for-target.ts new file mode 100644 index 00000000..6fb41133 --- /dev/null +++ b/src/lib/market/api-client/list-audit-events-for-target.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function listAuditEventsForTargetMethod(this: ApiClientFacade, targetType: string, targetId: string, limit = 100) { + return this.request('GET', `/v1/audit-events?targetType=${encodeURIComponent(targetType)}&targetId=${encodeURIComponent(targetId)}&limit=${encodeURIComponent(String(limit))}`); +} diff --git a/src/lib/market/api-client/list-capacity-allocation-sets.ts b/src/lib/market/api-client/list-capacity-allocation-sets.ts new file mode 100644 index 00000000..c8bfbb79 --- /dev/null +++ b/src/lib/market/api-client/list-capacity-allocation-sets.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function listCapacityAllocationSetsMethod(this: ApiClientFacade, teamId: string) { + return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/capacity/allocation-sets`); +} diff --git a/src/lib/market/api-client/list-capacity-ledger-entries.ts b/src/lib/market/api-client/list-capacity-ledger-entries.ts new file mode 100644 index 00000000..15346f21 --- /dev/null +++ b/src/lib/market/api-client/list-capacity-ledger-entries.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function listCapacityLedgerEntriesMethod(this: ApiClientFacade, projectId: string, workdayId: string) { + return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/capacity/ledger?workdayId=${encodeURIComponent(workdayId)}`); +} diff --git a/src/lib/market/api-client/list-capacity-routing-decisions-for-project.ts b/src/lib/market/api-client/list-capacity-routing-decisions-for-project.ts new file mode 100644 index 00000000..3578321f --- /dev/null +++ b/src/lib/market/api-client/list-capacity-routing-decisions-for-project.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function listCapacityRoutingDecisionsForProjectMethod(this: ApiClientFacade, projectId: string, limit = 100) { + return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/capacity/routing-decisions?limit=${encodeURIComponent(String(limit))}`); +} diff --git a/src/lib/market/api-client/list-catalog-artifact-versions.ts b/src/lib/market/api-client/list-catalog-artifact-versions.ts new file mode 100644 index 00000000..89758a7a --- /dev/null +++ b/src/lib/market/api-client/list-catalog-artifact-versions.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function listCatalogArtifactVersionsMethod(this: ApiClientFacade, itemId: string) { + return this.request('GET', `/v1/catalog/${encodeURIComponent(itemId)}/artifacts`); +} diff --git a/src/lib/market/api-client/list-catalog-items.ts b/src/lib/market/api-client/list-catalog-items.ts new file mode 100644 index 00000000..9cf83092 --- /dev/null +++ b/src/lib/market/api-client/list-catalog-items.ts @@ -0,0 +1,20 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function listCatalogItemsMethod(this: ApiClientFacade, _principal: unknown, filters: { + kind?: string; + teamId?: string; + slug?: string; +} = {}) { + const query = new URLSearchParams(); + if (filters.kind) + query.set('kind', filters.kind); + if (filters.teamId) + query.set('teamId', filters.teamId); + if (filters.slug) + query.set('slug', filters.slug); + return this.request('GET', `/v1/catalog${query.toString() ? `?${query}` : ''}`); +} diff --git a/src/lib/market/api-client/list-commerce-capacity-listing-inquiries.ts b/src/lib/market/api-client/list-commerce-capacity-listing-inquiries.ts new file mode 100644 index 00000000..a386e83d --- /dev/null +++ b/src/lib/market/api-client/list-commerce-capacity-listing-inquiries.ts @@ -0,0 +1,11 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function listCommerceCapacityListingInquiriesMethod(this: ApiClientFacade, filters: Record = {}) { + const query = new URLSearchParams(Object.entries(filters).filter(([, value]) => value != null).map(([key, value]) => [key, String(value)])); + const suffix = query.toString() ? `?${query.toString()}` : ''; + return this.request('GET', `/v1/commerce/capacity-listing-inquiries${suffix}`); +} diff --git a/src/lib/market/api-client/list-commerce-capacity-listings.ts b/src/lib/market/api-client/list-commerce-capacity-listings.ts new file mode 100644 index 00000000..86f46b21 --- /dev/null +++ b/src/lib/market/api-client/list-commerce-capacity-listings.ts @@ -0,0 +1,11 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function listCommerceCapacityListingsMethod(this: ApiClientFacade, filters: Record = {}) { + const query = new URLSearchParams(Object.entries(filters).filter(([, value]) => value != null).map(([key, value]) => [key, String(value)])); + const suffix = query.toString() ? `?${query.toString()}` : ''; + return this.request('GET', `/v1/commerce/capacity-listings${suffix}`); +} diff --git a/src/lib/market/api-client/list-commerce-marketplace-products.ts b/src/lib/market/api-client/list-commerce-marketplace-products.ts new file mode 100644 index 00000000..8834b7fe --- /dev/null +++ b/src/lib/market/api-client/list-commerce-marketplace-products.ts @@ -0,0 +1,11 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function listCommerceMarketplaceProductsMethod(this: ApiClientFacade, filters: Record = {}) { + const query = new URLSearchParams(Object.entries(filters).filter(([, value]) => value != null).map(([key, value]) => [key, String(value)])); + const suffix = query.toString() ? `?${query.toString()}` : ''; + return this.request('GET', `/v1/commerce/marketplace${suffix}`); +} diff --git a/src/lib/market/api-client/list-commerce-products.ts b/src/lib/market/api-client/list-commerce-products.ts new file mode 100644 index 00000000..6061f148 --- /dev/null +++ b/src/lib/market/api-client/list-commerce-products.ts @@ -0,0 +1,11 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function listCommerceProductsMethod(this: ApiClientFacade, filters: Record = {}) { + const query = new URLSearchParams(Object.entries(filters).filter(([, value]) => value != null).map(([key, value]) => [key, String(value)])); + const suffix = query.toString() ? `?${query.toString()}` : ''; + return this.request('GET', `/v1/commerce/products${suffix}`); +} diff --git a/src/lib/market/api-client/list-commerce-service-events.ts b/src/lib/market/api-client/list-commerce-service-events.ts new file mode 100644 index 00000000..8d637040 --- /dev/null +++ b/src/lib/market/api-client/list-commerce-service-events.ts @@ -0,0 +1,11 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function listCommerceServiceEventsMethod(this: ApiClientFacade, filters: Record = {}) { + const query = new URLSearchParams(Object.entries(filters).filter(([, value]) => value != null).map(([key, value]) => [key, String(value)])); + const suffix = query.toString() ? `?${query.toString()}` : ''; + return this.request('GET', `/v1/commerce/services/events${suffix}`); +} diff --git a/src/lib/market/api-client/list-commerce-service-quotes.ts b/src/lib/market/api-client/list-commerce-service-quotes.ts new file mode 100644 index 00000000..739dc5e5 --- /dev/null +++ b/src/lib/market/api-client/list-commerce-service-quotes.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function listCommerceServiceQuotesMethod(this: ApiClientFacade, requestId: string) { + return this.request('GET', `/v1/commerce/services/requests/${encodeURIComponent(requestId)}/quotes`); +} diff --git a/src/lib/market/api-client/list-commerce-service-requests.ts b/src/lib/market/api-client/list-commerce-service-requests.ts new file mode 100644 index 00000000..54023211 --- /dev/null +++ b/src/lib/market/api-client/list-commerce-service-requests.ts @@ -0,0 +1,11 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function listCommerceServiceRequestsMethod(this: ApiClientFacade, filters: Record = {}) { + const query = new URLSearchParams(Object.entries(filters).filter(([, value]) => value != null).map(([key, value]) => [key, String(value)])); + const suffix = query.toString() ? `?${query.toString()}` : ''; + return this.request('GET', `/v1/commerce/services/requests${suffix}`); +} diff --git a/src/lib/market/api-client/list-commerce-succession-events.ts b/src/lib/market/api-client/list-commerce-succession-events.ts new file mode 100644 index 00000000..e67a5bc1 --- /dev/null +++ b/src/lib/market/api-client/list-commerce-succession-events.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function listCommerceSuccessionEventsMethod(this: ApiClientFacade, productId: string) { + return this.request('GET', `/v1/commerce/products/${encodeURIComponent(productId)}/succession-events`); +} diff --git a/src/lib/market/api-client/list-commerce-vendor-fulfillment-events.ts b/src/lib/market/api-client/list-commerce-vendor-fulfillment-events.ts new file mode 100644 index 00000000..1229c77a --- /dev/null +++ b/src/lib/market/api-client/list-commerce-vendor-fulfillment-events.ts @@ -0,0 +1,11 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function listCommerceVendorFulfillmentEventsMethod(this: ApiClientFacade, teamId: string, filters: Record = {}) { + const query = new URLSearchParams(Object.entries(filters).filter(([, value]) => value != null).map(([key, value]) => [key, String(value)])); + const suffix = query.toString() ? `?${query.toString()}` : ''; + return this.request('GET', `/v1/commerce/vendors/${encodeURIComponent(teamId)}/sales/fulfillment-events${suffix}`); +} diff --git a/src/lib/market/api-client/list-commerce-vendor-sales-entitlements.ts b/src/lib/market/api-client/list-commerce-vendor-sales-entitlements.ts new file mode 100644 index 00000000..49e3a553 --- /dev/null +++ b/src/lib/market/api-client/list-commerce-vendor-sales-entitlements.ts @@ -0,0 +1,11 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function listCommerceVendorSalesEntitlementsMethod(this: ApiClientFacade, teamId: string, filters: Record = {}) { + const query = new URLSearchParams(Object.entries(filters).filter(([, value]) => value != null).map(([key, value]) => [key, String(value)])); + const suffix = query.toString() ? `?${query.toString()}` : ''; + return this.request('GET', `/v1/commerce/vendors/${encodeURIComponent(teamId)}/sales/entitlements${suffix}`); +} diff --git a/src/lib/market/api-client/list-commerce-vendor-sales-orders.ts b/src/lib/market/api-client/list-commerce-vendor-sales-orders.ts new file mode 100644 index 00000000..03912abe --- /dev/null +++ b/src/lib/market/api-client/list-commerce-vendor-sales-orders.ts @@ -0,0 +1,11 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function listCommerceVendorSalesOrdersMethod(this: ApiClientFacade, teamId: string, filters: Record = {}) { + const query = new URLSearchParams(Object.entries(filters).filter(([, value]) => value != null).map(([key, value]) => [key, String(value)])); + const suffix = query.toString() ? `?${query.toString()}` : ''; + return this.request('GET', `/v1/commerce/vendors/${encodeURIComponent(teamId)}/sales/orders${suffix}`); +} diff --git a/src/lib/market/api-client/list-commerce-vendor-sales-refunds.ts b/src/lib/market/api-client/list-commerce-vendor-sales-refunds.ts new file mode 100644 index 00000000..b9d652bc --- /dev/null +++ b/src/lib/market/api-client/list-commerce-vendor-sales-refunds.ts @@ -0,0 +1,11 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function listCommerceVendorSalesRefundsMethod(this: ApiClientFacade, teamId: string, filters: Record = {}) { + const query = new URLSearchParams(Object.entries(filters).filter(([, value]) => value != null).map(([key, value]) => [key, String(value)])); + const suffix = query.toString() ? `?${query.toString()}` : ''; + return this.request('GET', `/v1/commerce/vendors/${encodeURIComponent(teamId)}/sales/refunds${suffix}`); +} diff --git a/src/lib/market/api-client/list-commerce-vendor-sales-subscriptions.ts b/src/lib/market/api-client/list-commerce-vendor-sales-subscriptions.ts new file mode 100644 index 00000000..c925ab41 --- /dev/null +++ b/src/lib/market/api-client/list-commerce-vendor-sales-subscriptions.ts @@ -0,0 +1,11 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function listCommerceVendorSalesSubscriptionsMethod(this: ApiClientFacade, teamId: string, filters: Record = {}) { + const query = new URLSearchParams(Object.entries(filters).filter(([, value]) => value != null).map(([key, value]) => [key, String(value)])); + const suffix = query.toString() ? `?${query.toString()}` : ''; + return this.request('GET', `/v1/commerce/vendors/${encodeURIComponent(teamId)}/sales/subscriptions${suffix}`); +} diff --git a/src/lib/market/api-client/list-commons-decisions.ts b/src/lib/market/api-client/list-commons-decisions.ts new file mode 100644 index 00000000..0c5c537d --- /dev/null +++ b/src/lib/market/api-client/list-commons-decisions.ts @@ -0,0 +1,15 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function listCommonsDecisionsMethod(this: ApiClientFacade, filters: Record = {}) { + const query = new URLSearchParams(); + for (const [key, value] of Object.entries(filters)) { + if (value != null && value !== '') + query.set(key, String(value)); + } + const suffix = query.toString() ? `?${query}` : ''; + return this.request('GET', `/v1/commons/decisions${suffix}`); +} diff --git a/src/lib/market/api-client/list-commons-events.ts b/src/lib/market/api-client/list-commons-events.ts new file mode 100644 index 00000000..c97f8f22 --- /dev/null +++ b/src/lib/market/api-client/list-commons-events.ts @@ -0,0 +1,15 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function listCommonsEventsMethod(this: ApiClientFacade, filters: Record = {}) { + const query = new URLSearchParams(); + for (const [key, value] of Object.entries(filters)) { + if (value != null && value !== '') + query.set(key, String(value)); + } + const suffix = query.toString() ? `?${query}` : ''; + return this.request('GET', `/v1/commons/events${suffix}`); +} diff --git a/src/lib/market/api-client/list-commons-participants.ts b/src/lib/market/api-client/list-commons-participants.ts new file mode 100644 index 00000000..8a54ceae --- /dev/null +++ b/src/lib/market/api-client/list-commons-participants.ts @@ -0,0 +1,15 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function listCommonsParticipantsMethod(this: ApiClientFacade, filters: Record = {}) { + const query = new URLSearchParams(); + for (const [key, value] of Object.entries(filters)) { + if (value != null && value !== '') + query.set(key, String(value)); + } + const suffix = query.toString() ? `?${query}` : ''; + return this.request('GET', `/v1/commons/participants${suffix}`); +} diff --git a/src/lib/market/api-client/list-commons-proposals.ts b/src/lib/market/api-client/list-commons-proposals.ts new file mode 100644 index 00000000..0430f468 --- /dev/null +++ b/src/lib/market/api-client/list-commons-proposals.ts @@ -0,0 +1,15 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function listCommonsProposalsMethod(this: ApiClientFacade, filters: Record = {}) { + const query = new URLSearchParams(); + for (const [key, value] of Object.entries(filters)) { + if (value != null && value !== '') + query.set(key, String(value)); + } + const suffix = query.toString() ? `?${query}` : ''; + return this.request('GET', `/v1/commons/proposals${suffix}`); +} diff --git a/src/lib/market/api-client/list-commons-questions.ts b/src/lib/market/api-client/list-commons-questions.ts new file mode 100644 index 00000000..5eeca008 --- /dev/null +++ b/src/lib/market/api-client/list-commons-questions.ts @@ -0,0 +1,15 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function listCommonsQuestionsMethod(this: ApiClientFacade, filters: Record = {}) { + const query = new URLSearchParams(); + for (const [key, value] of Object.entries(filters)) { + if (value != null && value !== '') + query.set(key, String(value)); + } + const suffix = query.toString() ? `?${query}` : ''; + return this.request('GET', `/v1/commons/questions${suffix}`); +} diff --git a/src/lib/market/api-client/list-decision-capacity-plans.ts b/src/lib/market/api-client/list-decision-capacity-plans.ts new file mode 100644 index 00000000..407a4f32 --- /dev/null +++ b/src/lib/market/api-client/list-decision-capacity-plans.ts @@ -0,0 +1,14 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function listDecisionCapacityPlansMethod(this: ApiClientFacade, decisionId: string, filters: { + status?: string | null; +} = {}) { + const query = new URLSearchParams(); + if (filters.status) + query.set('status', filters.status); + return this.request('GET', `/v1/decisions/${encodeURIComponent(decisionId)}/capacity-plans${query.toString() ? `?${query}` : ''}`); +} diff --git a/src/lib/market/api-client/list-decision-execution-inputs.ts b/src/lib/market/api-client/list-decision-execution-inputs.ts new file mode 100644 index 00000000..0f7be96e --- /dev/null +++ b/src/lib/market/api-client/list-decision-execution-inputs.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function listDecisionExecutionInputsMethod(this: ApiClientFacade, decisionId: string) { + return this.request('GET', `/v1/decisions/${encodeURIComponent(decisionId)}/execution-inputs`); +} diff --git a/src/lib/market/api-client/list-execution-runs.ts b/src/lib/market/api-client/list-execution-runs.ts new file mode 100644 index 00000000..26a0e081 --- /dev/null +++ b/src/lib/market/api-client/list-execution-runs.ts @@ -0,0 +1,32 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function listExecutionRunsMethod(this: ApiClientFacade, teamId: string, filters: { + projectId?: string | null; + providerId?: string | null; + status?: string | null; + mode?: string | null; + assignmentId?: string | null; + workdayId?: string | null; + limit?: number | null; +} = {}) { + const query = new URLSearchParams(); + if (filters.projectId) + query.set('projectId', filters.projectId); + if (filters.providerId) + query.set('providerId', filters.providerId); + if (filters.status) + query.set('status', filters.status); + if (filters.mode) + query.set('mode', filters.mode); + if (filters.assignmentId) + query.set('assignmentId', filters.assignmentId); + if (filters.workdayId) + query.set('workdayId', filters.workdayId); + if (filters.limit) + query.set('limit', String(filters.limit)); + return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/capacity/execution-runs${query.toString() ? `?${query}` : ''}`); +} diff --git a/src/lib/market/api-client/list-knowledge-packs.ts b/src/lib/market/api-client/list-knowledge-packs.ts new file mode 100644 index 00000000..6024fd2d --- /dev/null +++ b/src/lib/market/api-client/list-knowledge-packs.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function listKnowledgePacksMethod(this: ApiClientFacade, principal: unknown) { + return this.listCatalogItems(principal, { kind: 'knowledge_pack' }); +} diff --git a/src/lib/market/api-client/list-persisted-team-inbox-items.ts b/src/lib/market/api-client/list-persisted-team-inbox-items.ts new file mode 100644 index 00000000..b6d5ac0d --- /dev/null +++ b/src/lib/market/api-client/list-persisted-team-inbox-items.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function listPersistedTeamInboxItemsMethod(this: ApiClientFacade, teamId: string) { + return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/inbox`); +} diff --git a/src/lib/market/api-client/list-project-agent-classes.ts b/src/lib/market/api-client/list-project-agent-classes.ts new file mode 100644 index 00000000..c401dd27 --- /dev/null +++ b/src/lib/market/api-client/list-project-agent-classes.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function listProjectAgentClassesMethod(this: ApiClientFacade, projectId: string) { + return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/agent-classes`); +} diff --git a/src/lib/market/api-client/list-project-agent-fallback-outputs.ts b/src/lib/market/api-client/list-project-agent-fallback-outputs.ts new file mode 100644 index 00000000..a973755b --- /dev/null +++ b/src/lib/market/api-client/list-project-agent-fallback-outputs.ts @@ -0,0 +1,20 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function listProjectAgentFallbackOutputsMethod(this: ApiClientFacade, projectId: string, filters: { + mode?: string | null; + status?: string | null; + assignmentId?: string | null; +} = {}) { + const query = new URLSearchParams(); + if (filters.mode) + query.set('mode', filters.mode); + if (filters.status) + query.set('status', filters.status); + if (filters.assignmentId) + query.set('assignmentId', filters.assignmentId); + return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/agent-fallback-outputs${query.toString() ? `?${query}` : ''}`); +} diff --git a/src/lib/market/api-client/list-project-agent-mode-runs.ts b/src/lib/market/api-client/list-project-agent-mode-runs.ts new file mode 100644 index 00000000..db1a22c9 --- /dev/null +++ b/src/lib/market/api-client/list-project-agent-mode-runs.ts @@ -0,0 +1,17 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function listProjectAgentModeRunsMethod(this: ApiClientFacade, projectId: string, filters: { + mode?: string | null; + assignmentId?: string | null; +} = {}) { + const query = new URLSearchParams(); + if (filters.mode) + query.set('mode', filters.mode); + if (filters.assignmentId) + query.set('assignmentId', filters.assignmentId); + return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/agent-mode-runs${query.toString() ? `?${query}` : ''}`); +} diff --git a/src/lib/market/api-client/list-project-deployment-events.ts b/src/lib/market/api-client/list-project-deployment-events.ts new file mode 100644 index 00000000..97e359fe --- /dev/null +++ b/src/lib/market/api-client/list-project-deployment-events.ts @@ -0,0 +1,12 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export async function listProjectDeploymentEventsMethod(this: ApiClientFacade, deploymentId: string, options: { + limit?: number | string | null; +} = {}) { + const details = await this.getProjectDeployment(deploymentId, options); + return Array.isArray(details?.events) ? details.events : []; +} diff --git a/src/lib/market/api-client/list-project-deployments.ts b/src/lib/market/api-client/list-project-deployments.ts new file mode 100644 index 00000000..98d0fb30 --- /dev/null +++ b/src/lib/market/api-client/list-project-deployments.ts @@ -0,0 +1,23 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function listProjectDeploymentsMethod(this: ApiClientFacade, projectId: string, filters: { + environment?: string; + action?: string; + status?: string; + limit?: number | string; +} = {}) { + const query = new URLSearchParams(); + if (filters.environment) + query.set('environment', filters.environment); + if (filters.action) + query.set('action', filters.action); + if (filters.status) + query.set('status', filters.status); + if (filters.limit != null) + query.set('limit', String(filters.limit)); + return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/deployments${query.toString() ? `?${query}` : ''}`); +} diff --git a/src/lib/market/api-client/list-project-tree-dx-proxy-audit.ts b/src/lib/market/api-client/list-project-tree-dx-proxy-audit.ts new file mode 100644 index 00000000..aa2ad168 --- /dev/null +++ b/src/lib/market/api-client/list-project-tree-dx-proxy-audit.ts @@ -0,0 +1,17 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function listProjectTreeDxProxyAuditMethod(this: ApiClientFacade, projectId: string, filters: { + assignmentId?: string | null; + actorType?: string | null; +} = {}) { + const query = new URLSearchParams(); + if (filters.assignmentId) + query.set('assignmentId', filters.assignmentId); + if (filters.actorType) + query.set('actorType', filters.actorType); + return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/treedx-proxy-audit${query.toString() ? `?${query}` : ''}`); +} diff --git a/src/lib/market/api-client/list-projects-for-principal.ts b/src/lib/market/api-client/list-projects-for-principal.ts new file mode 100644 index 00000000..4ab62ad2 --- /dev/null +++ b/src/lib/market/api-client/list-projects-for-principal.ts @@ -0,0 +1,7 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function listProjectsForPrincipalMethod(this: ApiClientFacade) { return this.request('GET', '/v1/projects'); } diff --git a/src/lib/market/api-client/list-provider-assignments.ts b/src/lib/market/api-client/list-provider-assignments.ts new file mode 100644 index 00000000..4984de1a --- /dev/null +++ b/src/lib/market/api-client/list-provider-assignments.ts @@ -0,0 +1,20 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function listProviderAssignmentsMethod(this: ApiClientFacade, teamId: string, filters: { + projectId?: string | null; + providerId?: string | null; + status?: string | null; +} = {}) { + const query = new URLSearchParams(); + if (filters.projectId) + query.set('projectId', filters.projectId); + if (filters.providerId) + query.set('providerId', filters.providerId); + if (filters.status) + query.set('status', filters.status); + return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/capacity/assignments${query.toString() ? `?${query}` : ''}`); +} diff --git a/src/lib/market/api-client/list-provider-availability-sessions.ts b/src/lib/market/api-client/list-provider-availability-sessions.ts new file mode 100644 index 00000000..65da33be --- /dev/null +++ b/src/lib/market/api-client/list-provider-availability-sessions.ts @@ -0,0 +1,17 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function listProviderAvailabilitySessionsMethod(this: ApiClientFacade, teamId: string, filters: { + providerId?: string | null; + status?: string | null; +} = {}) { + const query = new URLSearchParams(); + if (filters.providerId) + query.set('providerId', filters.providerId); + if (filters.status) + query.set('status', filters.status); + return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/capacity/provider-sessions${query.toString() ? `?${query}` : ''}`); +} diff --git a/src/lib/market/api-client/list-repository-hosts.ts b/src/lib/market/api-client/list-repository-hosts.ts new file mode 100644 index 00000000..bf845d95 --- /dev/null +++ b/src/lib/market/api-client/list-repository-hosts.ts @@ -0,0 +1,12 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function listRepositoryHostsMethod(this: ApiClientFacade, teamId: string, options: { + includePlatform?: boolean; +} = {}) { + const query = options.includePlatform === false ? '?includePlatform=false' : ''; + return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/repository-hosts${query}`); +} diff --git a/src/lib/market/api-client/list-seed-runs.ts b/src/lib/market/api-client/list-seed-runs.ts new file mode 100644 index 00000000..7c1cd730 --- /dev/null +++ b/src/lib/market/api-client/list-seed-runs.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function listSeedRunsMethod(this: ApiClientFacade, limit = 100) { + return this.request('GET', `/v1/seeds/runs?limit=${encodeURIComponent(String(limit))}`); +} diff --git a/src/lib/market/api-client/list-team-members.ts b/src/lib/market/api-client/list-team-members.ts new file mode 100644 index 00000000..188a8d3e --- /dev/null +++ b/src/lib/market/api-client/list-team-members.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function listTeamMembersMethod(this: ApiClientFacade, teamId: string) { + return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/members`); +} diff --git a/src/lib/market/api-client/list-team-projects.ts b/src/lib/market/api-client/list-team-projects.ts new file mode 100644 index 00000000..5feed835 --- /dev/null +++ b/src/lib/market/api-client/list-team-projects.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function listTeamProjectsMethod(this: ApiClientFacade, teamId: string) { + return this.request('GET', `/v1/projects?teamId=${encodeURIComponent(teamId)}`); +} diff --git a/src/lib/market/api-client/list-team-web-hosts.ts b/src/lib/market/api-client/list-team-web-hosts.ts new file mode 100644 index 00000000..ba7a0473 --- /dev/null +++ b/src/lib/market/api-client/list-team-web-hosts.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function listTeamWebHostsMethod(this: ApiClientFacade, teamId: string) { + return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/web-hosts`); +} diff --git a/src/lib/market/api-client/list-teams-for-principal.ts b/src/lib/market/api-client/list-teams-for-principal.ts new file mode 100644 index 00000000..a84750b3 --- /dev/null +++ b/src/lib/market/api-client/list-teams-for-principal.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function listTeamsForPrincipalMethod(this: ApiClientFacade) { + return this.request('GET', '/v1/teams'); +} diff --git a/src/lib/market/api-client/list-tree-dx-mirrors.ts b/src/lib/market/api-client/list-tree-dx-mirrors.ts new file mode 100644 index 00000000..99889a99 --- /dev/null +++ b/src/lib/market/api-client/list-tree-dx-mirrors.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function listTreeDxMirrorsMethod(this: ApiClientFacade, teamId: string) { + return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/treedx/mirrors`); +} diff --git a/src/lib/market/api-client/list-tree-dx-shares.ts b/src/lib/market/api-client/list-tree-dx-shares.ts new file mode 100644 index 00000000..c2a2c0bc --- /dev/null +++ b/src/lib/market/api-client/list-tree-dx-shares.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function listTreeDxSharesMethod(this: ApiClientFacade, teamId: string) { + return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/treedx/shares`); +} diff --git a/src/lib/market/api-client/list-workday-runs.ts b/src/lib/market/api-client/list-workday-runs.ts new file mode 100644 index 00000000..d9a092c0 --- /dev/null +++ b/src/lib/market/api-client/list-workday-runs.ts @@ -0,0 +1,17 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function listWorkdayRunsMethod(this: ApiClientFacade, teamId: string, filters: { + status?: string | null; + providerId?: string | null; +} = {}) { + const query = new URLSearchParams(); + if (filters.status) + query.set('status', filters.status); + if (filters.providerId) + query.set('providerId', filters.providerId); + return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/workday-runs${query.toString() ? `?${query}` : ''}`); +} diff --git a/src/lib/market/api-client/load-team-profile-by-name.ts b/src/lib/market/api-client/load-team-profile-by-name.ts new file mode 100644 index 00000000..c9710ea0 --- /dev/null +++ b/src/lib/market/api-client/load-team-profile-by-name.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function loadTeamProfileByNameMethod(this: ApiClientFacade, name: string) { + return this.request('GET', `/v1/teams/by-name/${encodeURIComponent(name)}/profile`).catch(() => null); +} diff --git a/src/lib/market/api-client/load-user-profile-by-username.ts b/src/lib/market/api-client/load-user-profile-by-username.ts new file mode 100644 index 00000000..2bbc2679 --- /dev/null +++ b/src/lib/market/api-client/load-user-profile-by-username.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function loadUserProfileByUsernameMethod(this: ApiClientFacade, username: string) { + return this.request('GET', `/v1/users/by-username/${encodeURIComponent(username)}/profile`).catch(() => null); +} diff --git a/src/lib/market/api-client/mark-commerce-vendor-stripe-return.ts b/src/lib/market/api-client/mark-commerce-vendor-stripe-return.ts new file mode 100644 index 00000000..5c617d11 --- /dev/null +++ b/src/lib/market/api-client/mark-commerce-vendor-stripe-return.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function markCommerceVendorStripeReturnMethod(this: ApiClientFacade, teamId: string) { + return this.request('POST', `/v1/commerce/vendors/${encodeURIComponent(teamId)}/stripe/return`, { body: {} }); +} diff --git a/src/lib/market/api-client/methods.ts b/src/lib/market/api-client/methods.ts new file mode 100644 index 00000000..81037a7d --- /dev/null +++ b/src/lib/market/api-client/methods.ts @@ -0,0 +1,356 @@ +import type { ApiClientFacade } from '../api-client.ts'; +import { headersMethod } from './headers.ts'; +import { urlMethod } from './url.ts'; +import { requestMethod } from './request.ts'; +import { accountIdentityMethod } from './account-identity.ts'; +import { authProvidersMethod } from './auth-providers.ts'; +import { requestPasswordResetMethod } from './request-password-reset.ts'; +import { completePasswordResetMethod } from './complete-password-reset.ts'; +import { confirmEmailMethod } from './confirm-email.ts'; +import { approveDeviceMethod } from './approve-device.ts'; +import { claimUsernameMethod } from './claim-username.ts'; +import { updateAccountProfileMethod } from './update-account-profile.ts'; +import { addAccountEmailMethod } from './add-account-email.ts'; +import { resendAccountEmailMethod } from './resend-account-email.ts'; +import { setPrimaryAccountEmailMethod } from './set-primary-account-email.ts'; +import { deleteAccountEmailMethod } from './delete-account-email.ts'; +import { updateAccountPasswordMethod } from './update-account-password.ts'; +import { unlinkAccountProviderMethod } from './unlink-account-provider.ts'; +import { accountSessionsMethod } from './account-sessions.ts'; +import { revokeAccountSessionMethod } from './revoke-account-session.ts'; +import { notificationPreferencesMethod } from './notification-preferences.ts'; +import { accountNotificationsMethod } from './account-notifications.ts'; +import { updateNotificationPreferencesMethod } from './update-notification-preferences.ts'; +import { listProjectsForPrincipalMethod } from './list-projects-for-principal.ts'; +import { personalThemesMethod } from './personal-themes.ts'; +import { createPersonalThemeMethod } from './create-personal-theme.ts'; +import { updatePersonalThemeMethod } from './update-personal-theme.ts'; +import { deletePersonalThemeMethod } from './delete-personal-theme.ts'; +import { accountDeletionBlockersMethod } from './account-deletion-blockers.ts'; +import { deleteCurrentAccountMethod } from './delete-current-account.ts'; +import { listTeamsForPrincipalMethod } from './list-teams-for-principal.ts'; +import { listTeamProjectsMethod } from './list-team-projects.ts'; +import { getProjectDetailsMethod } from './get-project-details.ts'; +import { validatePrivateKnowledgeAccessMethod } from './validate-private-knowledge-access.ts'; +import { recordPrivateKnowledgeOutcomeMethod } from './record-private-knowledge-outcome.ts'; +import { getProjectDeploymentMethod } from './get-project-deployment.ts'; +import { listProjectDeploymentsMethod } from './list-project-deployments.ts'; +import { listProjectDeploymentEventsMethod } from './list-project-deployment-events.ts'; +import { getProjectByTeamAndSlugMethod } from './get-project-by-team-and-slug.ts'; +import { getProjectSummaryMethod } from './get-project-summary.ts'; +import { getProjectAgentsSummaryMethod } from './get-project-agents-summary.ts'; +import { getProjectReleasesSummaryMethod } from './get-project-releases-summary.ts'; +import { getProjectCapacitySummaryMethod } from './get-project-capacity-summary.ts'; +import { listApprovalRequestsForProjectMethod } from './list-approval-requests-for-project.ts'; +import { listApprovalRequestsForTeamMethod } from './list-approval-requests-for-team.ts'; +import { decideApprovalRequestMethod } from './decide-approval-request.ts'; +import { getCommonsSummaryMethod } from './get-commons-summary.ts'; +import { getCommonsParticipantMeMethod } from './get-commons-participant-me.ts'; +import { listCommonsParticipantsMethod } from './list-commons-participants.ts'; +import { backfillCommonsParticipantsMethod } from './backfill-commons-participants.ts'; +import { listCommonsQuestionsMethod } from './list-commons-questions.ts'; +import { answerCommonsQuestionMethod } from './answer-commons-question.ts'; +import { createCommonsProposalMethod } from './create-commons-proposal.ts'; +import { listCommonsProposalsMethod } from './list-commons-proposals.ts'; +import { getCommonsProposalMethod } from './get-commons-proposal.ts'; +import { reviewCommonsProposalMethod } from './review-commons-proposal.ts'; +import { startCommonsProposalVotingMethod } from './start-commons-proposal-voting.ts'; +import { stewardDecisionForCommonsProposalMethod } from './steward-decision-for-commons-proposal.ts'; +import { listCommonsDecisionsMethod } from './list-commons-decisions.ts'; +import { listCommonsEventsMethod } from './list-commons-events.ts'; +import { deleteTeamInboxItemsByItemKeyMethod } from './delete-team-inbox-items-by-item-key.ts'; +import { listPersistedTeamInboxItemsMethod } from './list-persisted-team-inbox-items.ts'; +import { listAuditEventsForTargetMethod } from './list-audit-events-for-target.ts'; +import { listTeamMembersMethod } from './list-team-members.ts'; +import { getTeamAccessSummaryMethod } from './get-team-access-summary.ts'; +import { getCommerceVendorMethod } from './get-commerce-vendor.ts'; +import { requestCommerceVendorMethod } from './request-commerce-vendor.ts'; +import { getCommerceVendorStripeStatusMethod } from './get-commerce-vendor-stripe-status.ts'; +import { startCommerceVendorStripeOnboardingMethod } from './start-commerce-vendor-stripe-onboarding.ts'; +import { markCommerceVendorStripeReturnMethod } from './mark-commerce-vendor-stripe-return.ts'; +import { createCommerceVendorStripeLoginLinkMethod } from './create-commerce-vendor-stripe-login-link.ts'; +import { listCommerceProductsMethod } from './list-commerce-products.ts'; +import { getCommerceProductMethod } from './get-commerce-product.ts'; +import { getCommerceOwnershipWorkflowMethod } from './get-commerce-ownership-workflow.ts'; +import { updateCommerceOwnershipRecordMethod } from './update-commerce-ownership-record.ts'; +import { updateCommerceStewardshipAssignmentMethod } from './update-commerce-stewardship-assignment.ts'; +import { endCommerceStewardshipAssignmentMethod } from './end-commerce-stewardship-assignment.ts'; +import { updateCommerceContributionMethod } from './update-commerce-contribution.ts'; +import { updateCommerceGovernancePolicyMethod } from './update-commerce-governance-policy.ts'; +import { submitCommerceOwnershipTransferMethod } from './submit-commerce-ownership-transfer.ts'; +import { approveCommerceOwnershipTransferMethod } from './approve-commerce-ownership-transfer.ts'; +import { rejectCommerceOwnershipTransferMethod } from './reject-commerce-ownership-transfer.ts'; +import { cancelCommerceOwnershipTransferMethod } from './cancel-commerce-ownership-transfer.ts'; +import { createCommerceSuccessionEventMethod } from './create-commerce-succession-event.ts'; +import { listCommerceSuccessionEventsMethod } from './list-commerce-succession-events.ts'; +import { getCommerceVendorSalesSummaryMethod } from './get-commerce-vendor-sales-summary.ts'; +import { getCommerceVendorMonitoringMethod } from './get-commerce-vendor-monitoring.ts'; +import { listCommerceMarketplaceProductsMethod } from './list-commerce-marketplace-products.ts'; +import { getCommerceMarketplaceProductMethod } from './get-commerce-marketplace-product.ts'; +import { listCommerceVendorSalesOrdersMethod } from './list-commerce-vendor-sales-orders.ts'; +import { listCommerceVendorSalesSubscriptionsMethod } from './list-commerce-vendor-sales-subscriptions.ts'; +import { listCommerceVendorSalesEntitlementsMethod } from './list-commerce-vendor-sales-entitlements.ts'; +import { listCommerceVendorSalesRefundsMethod } from './list-commerce-vendor-sales-refunds.ts'; +import { listCommerceVendorFulfillmentEventsMethod } from './list-commerce-vendor-fulfillment-events.ts'; +import { createCommerceOrderRefundMethod } from './create-commerce-order-refund.ts'; +import { fulfillCommerceOrderItemArtifactMethod } from './fulfill-commerce-order-item-artifact.ts'; +import { revokeCommerceEntitlementMethod } from './revoke-commerce-entitlement.ts'; +import { createCommerceServiceRequestMethod } from './create-commerce-service-request.ts'; +import { listCommerceServiceRequestsMethod } from './list-commerce-service-requests.ts'; +import { getCommerceServiceRequestMethod } from './get-commerce-service-request.ts'; +import { startCommerceServiceScopingMethod } from './start-commerce-service-scoping.ts'; +import { updateCommerceServiceRequestMethod } from './update-commerce-service-request.ts'; +import { cancelCommerceServiceRequestMethod } from './cancel-commerce-service-request.ts'; +import { createCommerceServiceQuoteMethod } from './create-commerce-service-quote.ts'; +import { listCommerceServiceQuotesMethod } from './list-commerce-service-quotes.ts'; +import { submitCommerceServiceQuoteMethod } from './submit-commerce-service-quote.ts'; +import { buyerApproveCommerceServiceQuoteMethod } from './buyer-approve-commerce-service-quote.ts'; +import { vendorApproveCommerceServiceQuoteMethod } from './vendor-approve-commerce-service-quote.ts'; +import { rejectCommerceServiceQuoteMethod } from './reject-commerce-service-quote.ts'; +import { getCommerceServiceContractMethod } from './get-commerce-service-contract.ts'; +import { linkCommerceServiceContractWorkMethod } from './link-commerce-service-contract-work.ts'; +import { fulfillCommerceServiceContractMethod } from './fulfill-commerce-service-contract.ts'; +import { cancelCommerceServiceContractMethod } from './cancel-commerce-service-contract.ts'; +import { listCommerceServiceEventsMethod } from './list-commerce-service-events.ts'; +import { listCommerceCapacityListingsMethod } from './list-commerce-capacity-listings.ts'; +import { getCommerceCapacityListingMethod } from './get-commerce-capacity-listing.ts'; +import { getCommerceCapacityListingForProductMethod } from './get-commerce-capacity-listing-for-product.ts'; +import { createCommerceCapacityListingMethod } from './create-commerce-capacity-listing.ts'; +import { updateCommerceCapacityListingMethod } from './update-commerce-capacity-listing.ts'; +import { submitCommerceCapacityListingMethod } from './submit-commerce-capacity-listing.ts'; +import { approveCommerceCapacityListingMethod } from './approve-commerce-capacity-listing.ts'; +import { rejectCommerceCapacityListingMethod } from './reject-commerce-capacity-listing.ts'; +import { suspendCommerceCapacityListingMethod } from './suspend-commerce-capacity-listing.ts'; +import { archiveCommerceCapacityListingMethod } from './archive-commerce-capacity-listing.ts'; +import { createCommerceCapacityListingInquiryMethod } from './create-commerce-capacity-listing-inquiry.ts'; +import { listCommerceCapacityListingInquiriesMethod } from './list-commerce-capacity-listing-inquiries.ts'; +import { getCommerceCapacityListingInquiryMethod } from './get-commerce-capacity-listing-inquiry.ts'; +import { reviewCommerceCapacityInquiryMethod } from './review-commerce-capacity-inquiry.ts'; +import { approveCommerceCapacityInquiryForScopingMethod } from './approve-commerce-capacity-inquiry-for-scoping.ts'; +import { declineCommerceCapacityInquiryMethod } from './decline-commerce-capacity-inquiry.ts'; +import { cancelCommerceCapacityInquiryMethod } from './cancel-commerce-capacity-inquiry.ts'; +import { evaluateTeamDeletionBlockersMethod } from './evaluate-team-deletion-blockers.ts'; +import { evaluateProjectDeletionBlockersMethod } from './evaluate-project-deletion-blockers.ts'; +import { listRepositoryHostsMethod } from './list-repository-hosts.ts'; +import { getRepositoryHostMethod } from './get-repository-host.ts'; +import { listTeamWebHostsMethod } from './list-team-web-hosts.ts'; +import { getTeamTreeDxMethod } from './get-team-tree-dx.ts'; +import { updateTeamTreeDxMethod } from './update-team-tree-dx.ts'; +import { provisionTeamTreeDxMethod } from './provision-team-tree-dx.ts'; +import { listTreeDxMirrorsMethod } from './list-tree-dx-mirrors.ts'; +import { createTreeDxMirrorMethod } from './create-tree-dx-mirror.ts'; +import { listTreeDxSharesMethod } from './list-tree-dx-shares.ts'; +import { createTreeDxShareMethod } from './create-tree-dx-share.ts'; +import { getProjectTreeDxLibraryMethod } from './get-project-tree-dx-library.ts'; +import { upsertProjectTreeDxLibraryMethod } from './upsert-project-tree-dx-library.ts'; +import { getProjectRepositoryTopologyMethod } from './get-project-repository-topology.ts'; +import { updateProjectRepositoryTopologyMethod } from './update-project-repository-topology.ts'; +import { getTeamWebHostMethod } from './get-team-web-host.ts'; +import { listCapacityAllocationSetsMethod } from './list-capacity-allocation-sets.ts'; +import { listProviderAvailabilitySessionsMethod } from './list-provider-availability-sessions.ts'; +import { listProviderAssignmentsMethod } from './list-provider-assignments.ts'; +import { listExecutionRunsMethod } from './list-execution-runs.ts'; +import { listProjectAgentClassesMethod } from './list-project-agent-classes.ts'; +import { listProjectAgentModeRunsMethod } from './list-project-agent-mode-runs.ts'; +import { listProjectAgentFallbackOutputsMethod } from './list-project-agent-fallback-outputs.ts'; +import { listProjectTreeDxProxyAuditMethod } from './list-project-tree-dx-proxy-audit.ts'; +import { getProjectCapacityRuntimeDiagnosticsMethod } from './get-project-capacity-runtime-diagnostics.ts'; +import { getProviderAssignmentExplanationMethod } from './get-provider-assignment-explanation.ts'; +import { getDecisionPlanningStatusMethod } from './get-decision-planning-status.ts'; +import { listDecisionExecutionInputsMethod } from './list-decision-execution-inputs.ts'; +import { listDecisionCapacityPlansMethod } from './list-decision-capacity-plans.ts'; +import { getCapacityPlanMethod } from './get-capacity-plan.ts'; +import { getWorkdayCapacitySummaryMethod } from './get-workday-capacity-summary.ts'; +import { listWorkdayRunsMethod } from './list-workday-runs.ts'; +import { createWorkdayRunMethod } from './create-workday-run.ts'; +import { getWorkdayRunMethod } from './get-workday-run.ts'; +import { listCapacityLedgerEntriesMethod } from './list-capacity-ledger-entries.ts'; +import { listCapacityRoutingDecisionsForProjectMethod } from './list-capacity-routing-decisions-for-project.ts'; +import { listSeedRunsMethod } from './list-seed-runs.ts'; +import { listCatalogItemsMethod } from './list-catalog-items.ts'; +import { getCatalogItemBySlugMethod } from './get-catalog-item-by-slug.ts'; +import { listCatalogArtifactVersionsMethod } from './list-catalog-artifact-versions.ts'; +import { listKnowledgePacksMethod } from './list-knowledge-packs.ts'; +import { acceptTeamInviteMethod } from './accept-team-invite.ts'; +import { getTeamInviteMethod } from './get-team-invite.ts'; +import { loadTeamProfileByNameMethod } from './load-team-profile-by-name.ts'; +import { loadUserProfileByUsernameMethod } from './load-user-profile-by-username.ts'; + +export function installApiClientFacadeMethods(prototype: ApiClientFacade) { + prototype.headers = headersMethod; + prototype.url = urlMethod; + prototype.request = requestMethod; + prototype.accountIdentity = accountIdentityMethod; + prototype.authProviders = authProvidersMethod; + prototype.requestPasswordReset = requestPasswordResetMethod; + prototype.completePasswordReset = completePasswordResetMethod; + prototype.confirmEmail = confirmEmailMethod; + prototype.approveDevice = approveDeviceMethod; + prototype.claimUsername = claimUsernameMethod; + prototype.updateAccountProfile = updateAccountProfileMethod; + prototype.addAccountEmail = addAccountEmailMethod; + prototype.resendAccountEmail = resendAccountEmailMethod; + prototype.setPrimaryAccountEmail = setPrimaryAccountEmailMethod; + prototype.deleteAccountEmail = deleteAccountEmailMethod; + prototype.updateAccountPassword = updateAccountPasswordMethod; + prototype.unlinkAccountProvider = unlinkAccountProviderMethod; + prototype.accountSessions = accountSessionsMethod; + prototype.revokeAccountSession = revokeAccountSessionMethod; + prototype.notificationPreferences = notificationPreferencesMethod; + prototype.accountNotifications = accountNotificationsMethod; + prototype.updateNotificationPreferences = updateNotificationPreferencesMethod; + prototype.listProjectsForPrincipal = listProjectsForPrincipalMethod; + prototype.personalThemes = personalThemesMethod; + prototype.createPersonalTheme = createPersonalThemeMethod; + prototype.updatePersonalTheme = updatePersonalThemeMethod; + prototype.deletePersonalTheme = deletePersonalThemeMethod; + prototype.accountDeletionBlockers = accountDeletionBlockersMethod; + prototype.deleteCurrentAccount = deleteCurrentAccountMethod; + prototype.listTeamsForPrincipal = listTeamsForPrincipalMethod; + prototype.listTeamProjects = listTeamProjectsMethod; + prototype.getProjectDetails = getProjectDetailsMethod; + prototype.validatePrivateKnowledgeAccess = validatePrivateKnowledgeAccessMethod; + prototype.recordPrivateKnowledgeOutcome = recordPrivateKnowledgeOutcomeMethod; + prototype.getProjectDeployment = getProjectDeploymentMethod; + prototype.listProjectDeployments = listProjectDeploymentsMethod; + prototype.listProjectDeploymentEvents = listProjectDeploymentEventsMethod; + prototype.getProjectByTeamAndSlug = getProjectByTeamAndSlugMethod; + prototype.getProjectSummary = getProjectSummaryMethod; + prototype.getProjectAgentsSummary = getProjectAgentsSummaryMethod; + prototype.getProjectReleasesSummary = getProjectReleasesSummaryMethod; + prototype.getProjectCapacitySummary = getProjectCapacitySummaryMethod; + prototype.listApprovalRequestsForProject = listApprovalRequestsForProjectMethod; + prototype.listApprovalRequestsForTeam = listApprovalRequestsForTeamMethod; + prototype.decideApprovalRequest = decideApprovalRequestMethod; + prototype.getCommonsSummary = getCommonsSummaryMethod; + prototype.getCommonsParticipantMe = getCommonsParticipantMeMethod; + prototype.listCommonsParticipants = listCommonsParticipantsMethod; + prototype.backfillCommonsParticipants = backfillCommonsParticipantsMethod; + prototype.listCommonsQuestions = listCommonsQuestionsMethod; + prototype.answerCommonsQuestion = answerCommonsQuestionMethod; + prototype.createCommonsProposal = createCommonsProposalMethod; + prototype.listCommonsProposals = listCommonsProposalsMethod; + prototype.getCommonsProposal = getCommonsProposalMethod; + prototype.reviewCommonsProposal = reviewCommonsProposalMethod; + prototype.startCommonsProposalVoting = startCommonsProposalVotingMethod; + prototype.stewardDecisionForCommonsProposal = stewardDecisionForCommonsProposalMethod; + prototype.listCommonsDecisions = listCommonsDecisionsMethod; + prototype.listCommonsEvents = listCommonsEventsMethod; + prototype.deleteTeamInboxItemsByItemKey = deleteTeamInboxItemsByItemKeyMethod; + prototype.listPersistedTeamInboxItems = listPersistedTeamInboxItemsMethod; + prototype.listAuditEventsForTarget = listAuditEventsForTargetMethod; + prototype.listTeamMembers = listTeamMembersMethod; + prototype.getTeamAccessSummary = getTeamAccessSummaryMethod; + prototype.getCommerceVendor = getCommerceVendorMethod; + prototype.requestCommerceVendor = requestCommerceVendorMethod; + prototype.getCommerceVendorStripeStatus = getCommerceVendorStripeStatusMethod; + prototype.startCommerceVendorStripeOnboarding = startCommerceVendorStripeOnboardingMethod; + prototype.markCommerceVendorStripeReturn = markCommerceVendorStripeReturnMethod; + prototype.createCommerceVendorStripeLoginLink = createCommerceVendorStripeLoginLinkMethod; + prototype.listCommerceProducts = listCommerceProductsMethod; + prototype.getCommerceProduct = getCommerceProductMethod; + prototype.getCommerceOwnershipWorkflow = getCommerceOwnershipWorkflowMethod; + prototype.updateCommerceOwnershipRecord = updateCommerceOwnershipRecordMethod; + prototype.updateCommerceStewardshipAssignment = updateCommerceStewardshipAssignmentMethod; + prototype.endCommerceStewardshipAssignment = endCommerceStewardshipAssignmentMethod; + prototype.updateCommerceContribution = updateCommerceContributionMethod; + prototype.updateCommerceGovernancePolicy = updateCommerceGovernancePolicyMethod; + prototype.submitCommerceOwnershipTransfer = submitCommerceOwnershipTransferMethod; + prototype.approveCommerceOwnershipTransfer = approveCommerceOwnershipTransferMethod; + prototype.rejectCommerceOwnershipTransfer = rejectCommerceOwnershipTransferMethod; + prototype.cancelCommerceOwnershipTransfer = cancelCommerceOwnershipTransferMethod; + prototype.createCommerceSuccessionEvent = createCommerceSuccessionEventMethod; + prototype.listCommerceSuccessionEvents = listCommerceSuccessionEventsMethod; + prototype.getCommerceVendorSalesSummary = getCommerceVendorSalesSummaryMethod; + prototype.getCommerceVendorMonitoring = getCommerceVendorMonitoringMethod; + prototype.listCommerceMarketplaceProducts = listCommerceMarketplaceProductsMethod; + prototype.getCommerceMarketplaceProduct = getCommerceMarketplaceProductMethod; + prototype.listCommerceVendorSalesOrders = listCommerceVendorSalesOrdersMethod; + prototype.listCommerceVendorSalesSubscriptions = listCommerceVendorSalesSubscriptionsMethod; + prototype.listCommerceVendorSalesEntitlements = listCommerceVendorSalesEntitlementsMethod; + prototype.listCommerceVendorSalesRefunds = listCommerceVendorSalesRefundsMethod; + prototype.listCommerceVendorFulfillmentEvents = listCommerceVendorFulfillmentEventsMethod; + prototype.createCommerceOrderRefund = createCommerceOrderRefundMethod; + prototype.fulfillCommerceOrderItemArtifact = fulfillCommerceOrderItemArtifactMethod; + prototype.revokeCommerceEntitlement = revokeCommerceEntitlementMethod; + prototype.createCommerceServiceRequest = createCommerceServiceRequestMethod; + prototype.listCommerceServiceRequests = listCommerceServiceRequestsMethod; + prototype.getCommerceServiceRequest = getCommerceServiceRequestMethod; + prototype.startCommerceServiceScoping = startCommerceServiceScopingMethod; + prototype.updateCommerceServiceRequest = updateCommerceServiceRequestMethod; + prototype.cancelCommerceServiceRequest = cancelCommerceServiceRequestMethod; + prototype.createCommerceServiceQuote = createCommerceServiceQuoteMethod; + prototype.listCommerceServiceQuotes = listCommerceServiceQuotesMethod; + prototype.submitCommerceServiceQuote = submitCommerceServiceQuoteMethod; + prototype.buyerApproveCommerceServiceQuote = buyerApproveCommerceServiceQuoteMethod; + prototype.vendorApproveCommerceServiceQuote = vendorApproveCommerceServiceQuoteMethod; + prototype.rejectCommerceServiceQuote = rejectCommerceServiceQuoteMethod; + prototype.getCommerceServiceContract = getCommerceServiceContractMethod; + prototype.linkCommerceServiceContractWork = linkCommerceServiceContractWorkMethod; + prototype.fulfillCommerceServiceContract = fulfillCommerceServiceContractMethod; + prototype.cancelCommerceServiceContract = cancelCommerceServiceContractMethod; + prototype.listCommerceServiceEvents = listCommerceServiceEventsMethod; + prototype.listCommerceCapacityListings = listCommerceCapacityListingsMethod; + prototype.getCommerceCapacityListing = getCommerceCapacityListingMethod; + prototype.getCommerceCapacityListingForProduct = getCommerceCapacityListingForProductMethod; + prototype.createCommerceCapacityListing = createCommerceCapacityListingMethod; + prototype.updateCommerceCapacityListing = updateCommerceCapacityListingMethod; + prototype.submitCommerceCapacityListing = submitCommerceCapacityListingMethod; + prototype.approveCommerceCapacityListing = approveCommerceCapacityListingMethod; + prototype.rejectCommerceCapacityListing = rejectCommerceCapacityListingMethod; + prototype.suspendCommerceCapacityListing = suspendCommerceCapacityListingMethod; + prototype.archiveCommerceCapacityListing = archiveCommerceCapacityListingMethod; + prototype.createCommerceCapacityListingInquiry = createCommerceCapacityListingInquiryMethod; + prototype.listCommerceCapacityListingInquiries = listCommerceCapacityListingInquiriesMethod; + prototype.getCommerceCapacityListingInquiry = getCommerceCapacityListingInquiryMethod; + prototype.reviewCommerceCapacityInquiry = reviewCommerceCapacityInquiryMethod; + prototype.approveCommerceCapacityInquiryForScoping = approveCommerceCapacityInquiryForScopingMethod; + prototype.declineCommerceCapacityInquiry = declineCommerceCapacityInquiryMethod; + prototype.cancelCommerceCapacityInquiry = cancelCommerceCapacityInquiryMethod; + prototype.evaluateTeamDeletionBlockers = evaluateTeamDeletionBlockersMethod; + prototype.evaluateProjectDeletionBlockers = evaluateProjectDeletionBlockersMethod; + prototype.listRepositoryHosts = listRepositoryHostsMethod; + prototype.getRepositoryHost = getRepositoryHostMethod; + prototype.listTeamWebHosts = listTeamWebHostsMethod; + prototype.getTeamTreeDx = getTeamTreeDxMethod; + prototype.updateTeamTreeDx = updateTeamTreeDxMethod; + prototype.provisionTeamTreeDx = provisionTeamTreeDxMethod; + prototype.listTreeDxMirrors = listTreeDxMirrorsMethod; + prototype.createTreeDxMirror = createTreeDxMirrorMethod; + prototype.listTreeDxShares = listTreeDxSharesMethod; + prototype.createTreeDxShare = createTreeDxShareMethod; + prototype.getProjectTreeDxLibrary = getProjectTreeDxLibraryMethod; + prototype.upsertProjectTreeDxLibrary = upsertProjectTreeDxLibraryMethod; + prototype.getProjectRepositoryTopology = getProjectRepositoryTopologyMethod; + prototype.updateProjectRepositoryTopology = updateProjectRepositoryTopologyMethod; + prototype.getTeamWebHost = getTeamWebHostMethod; + prototype.listCapacityAllocationSets = listCapacityAllocationSetsMethod; + prototype.listProviderAvailabilitySessions = listProviderAvailabilitySessionsMethod; + prototype.listProviderAssignments = listProviderAssignmentsMethod; + prototype.listExecutionRuns = listExecutionRunsMethod; + prototype.listProjectAgentClasses = listProjectAgentClassesMethod; + prototype.listProjectAgentModeRuns = listProjectAgentModeRunsMethod; + prototype.listProjectAgentFallbackOutputs = listProjectAgentFallbackOutputsMethod; + prototype.listProjectTreeDxProxyAudit = listProjectTreeDxProxyAuditMethod; + prototype.getProjectCapacityRuntimeDiagnostics = getProjectCapacityRuntimeDiagnosticsMethod; + prototype.getProviderAssignmentExplanation = getProviderAssignmentExplanationMethod; + prototype.getDecisionPlanningStatus = getDecisionPlanningStatusMethod; + prototype.listDecisionExecutionInputs = listDecisionExecutionInputsMethod; + prototype.listDecisionCapacityPlans = listDecisionCapacityPlansMethod; + prototype.getCapacityPlan = getCapacityPlanMethod; + prototype.getWorkdayCapacitySummary = getWorkdayCapacitySummaryMethod; + prototype.listWorkdayRuns = listWorkdayRunsMethod; + prototype.createWorkdayRun = createWorkdayRunMethod; + prototype.getWorkdayRun = getWorkdayRunMethod; + prototype.listCapacityLedgerEntries = listCapacityLedgerEntriesMethod; + prototype.listCapacityRoutingDecisionsForProject = listCapacityRoutingDecisionsForProjectMethod; + prototype.listSeedRuns = listSeedRunsMethod; + prototype.listCatalogItems = listCatalogItemsMethod; + prototype.getCatalogItemBySlug = getCatalogItemBySlugMethod; + prototype.listCatalogArtifactVersions = listCatalogArtifactVersionsMethod; + prototype.listKnowledgePacks = listKnowledgePacksMethod; + prototype.acceptTeamInvite = acceptTeamInviteMethod; + prototype.getTeamInvite = getTeamInviteMethod; + prototype.loadTeamProfileByName = loadTeamProfileByNameMethod; + prototype.loadUserProfileByUsername = loadUserProfileByUsernameMethod; +} diff --git a/src/lib/market/api-client/notification-preferences.ts b/src/lib/market/api-client/notification-preferences.ts new file mode 100644 index 00000000..1a0fa50d --- /dev/null +++ b/src/lib/market/api-client/notification-preferences.ts @@ -0,0 +1,7 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function notificationPreferencesMethod(this: ApiClientFacade) { return this.request('GET', '/v1/auth/web/notifications/preferences'); } diff --git a/src/lib/market/api-client/personal-themes.ts b/src/lib/market/api-client/personal-themes.ts new file mode 100644 index 00000000..0e4b2b7b --- /dev/null +++ b/src/lib/market/api-client/personal-themes.ts @@ -0,0 +1,7 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function personalThemesMethod(this: ApiClientFacade) { return this.request('GET', '/v1/auth/web/themes'); } diff --git a/src/lib/market/api-client/provision-team-tree-dx.ts b/src/lib/market/api-client/provision-team-tree-dx.ts new file mode 100644 index 00000000..1a0c498d --- /dev/null +++ b/src/lib/market/api-client/provision-team-tree-dx.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function provisionTeamTreeDxMethod(this: ApiClientFacade, teamId: string, body: Record = {}) { + return this.request('POST', `/v1/teams/${encodeURIComponent(teamId)}/treedx/provision`, { body }); +} diff --git a/src/lib/market/api-client/record-private-knowledge-outcome.ts b/src/lib/market/api-client/record-private-knowledge-outcome.ts new file mode 100644 index 00000000..f53ba294 --- /dev/null +++ b/src/lib/market/api-client/record-private-knowledge-outcome.ts @@ -0,0 +1,13 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function recordPrivateKnowledgeOutcomeMethod(this: ApiClientFacade, projectId: string, body: { + slug?: string; + route?: string; + outcome: 'read' | 'not_found'; +}) { + return this.request('POST', `/v1/projects/${encodeURIComponent(projectId)}/private-knowledge/access`, { body }); +} diff --git a/src/lib/market/api-client/reject-commerce-capacity-listing.ts b/src/lib/market/api-client/reject-commerce-capacity-listing.ts new file mode 100644 index 00000000..3b4e6c6b --- /dev/null +++ b/src/lib/market/api-client/reject-commerce-capacity-listing.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function rejectCommerceCapacityListingMethod(this: ApiClientFacade, listingId: string, body: Record = {}) { + return this.request('POST', `/v1/commerce/capacity-listings/${encodeURIComponent(listingId)}/reject`, { body }); +} diff --git a/src/lib/market/api-client/reject-commerce-ownership-transfer.ts b/src/lib/market/api-client/reject-commerce-ownership-transfer.ts new file mode 100644 index 00000000..0e5a2607 --- /dev/null +++ b/src/lib/market/api-client/reject-commerce-ownership-transfer.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function rejectCommerceOwnershipTransferMethod(this: ApiClientFacade, productId: string, transferId: string, body: Record = {}) { + return this.request('POST', `/v1/commerce/products/${encodeURIComponent(productId)}/ownership-transfer/${encodeURIComponent(transferId)}/reject`, { body }); +} diff --git a/src/lib/market/api-client/reject-commerce-service-quote.ts b/src/lib/market/api-client/reject-commerce-service-quote.ts new file mode 100644 index 00000000..0c7496d5 --- /dev/null +++ b/src/lib/market/api-client/reject-commerce-service-quote.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function rejectCommerceServiceQuoteMethod(this: ApiClientFacade, quoteId: string, body: Record = {}) { + return this.request('POST', `/v1/commerce/services/quotes/${encodeURIComponent(quoteId)}/reject`, { body }); +} diff --git a/src/lib/market/api-client/request-commerce-vendor.ts b/src/lib/market/api-client/request-commerce-vendor.ts new file mode 100644 index 00000000..d4b7fa0a --- /dev/null +++ b/src/lib/market/api-client/request-commerce-vendor.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function requestCommerceVendorMethod(this: ApiClientFacade, teamId: string, body: Record) { + return this.request('POST', `/v1/commerce/vendors/${encodeURIComponent(teamId)}/request`, { body }); +} diff --git a/src/lib/market/api-client/request-password-reset.ts b/src/lib/market/api-client/request-password-reset.ts new file mode 100644 index 00000000..1092ff11 --- /dev/null +++ b/src/lib/market/api-client/request-password-reset.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function requestPasswordResetMethod(this: ApiClientFacade, email: string) { return this.request<{ + accepted: true; +}>('POST', '/v1/auth/web/password-reset/request', { body: { email } }); } diff --git a/src/lib/market/api-client/request.ts b/src/lib/market/api-client/request.ts new file mode 100644 index 00000000..913b6f26 --- /dev/null +++ b/src/lib/market/api-client/request.ts @@ -0,0 +1,23 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export async function requestMethod(this: ApiClientFacade, method: string, path: string, options: { + body?: unknown; +} = {}): Promise { + const response = await fetch(this.url(path), { + method, + headers: this.headers(options.body !== undefined), + body: options.body === undefined ? undefined : JSON.stringify(options.body), + }); + const envelope = await response.json().catch(() => null); + if (!response.ok || envelope?.ok === false) { + const error = new Error(envelope?.error ?? `API request failed: ${response.status}`); + (error as any).status = response.status; + (error as any).details = isObject(envelope) ? envelope : {}; + throw error; + } + return unwrapEnvelope(envelope); +} diff --git a/src/lib/market/api-client/resend-account-email.ts b/src/lib/market/api-client/resend-account-email.ts new file mode 100644 index 00000000..33862ab9 --- /dev/null +++ b/src/lib/market/api-client/resend-account-email.ts @@ -0,0 +1,7 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function resendAccountEmailMethod(this: ApiClientFacade, emailId: string) { return this.request('POST', `/v1/auth/web/emails/${encodeURIComponent(emailId)}/verify`, { body: {} }); } diff --git a/src/lib/market/api-client/review-commerce-capacity-inquiry.ts b/src/lib/market/api-client/review-commerce-capacity-inquiry.ts new file mode 100644 index 00000000..66a96329 --- /dev/null +++ b/src/lib/market/api-client/review-commerce-capacity-inquiry.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function reviewCommerceCapacityInquiryMethod(this: ApiClientFacade, inquiryId: string, body: Record = {}) { + return this.request('POST', `/v1/commerce/capacity-listing-inquiries/${encodeURIComponent(inquiryId)}/review`, { body }); +} diff --git a/src/lib/market/api-client/review-commons-proposal.ts b/src/lib/market/api-client/review-commons-proposal.ts new file mode 100644 index 00000000..527cb2df --- /dev/null +++ b/src/lib/market/api-client/review-commons-proposal.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function reviewCommonsProposalMethod(this: ApiClientFacade, proposalId: string, body: Record = {}) { + return this.request('POST', `/v1/commons/proposals/${encodeURIComponent(proposalId)}/review`, { body }); +} diff --git a/src/lib/market/api-client/revoke-account-session.ts b/src/lib/market/api-client/revoke-account-session.ts new file mode 100644 index 00000000..d16d6702 --- /dev/null +++ b/src/lib/market/api-client/revoke-account-session.ts @@ -0,0 +1,7 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function revokeAccountSessionMethod(this: ApiClientFacade, sessionId: string) { return this.request('POST', `/v1/auth/web/sessions/${encodeURIComponent(sessionId)}/revoke`, { body: {} }); } diff --git a/src/lib/market/api-client/revoke-commerce-entitlement.ts b/src/lib/market/api-client/revoke-commerce-entitlement.ts new file mode 100644 index 00000000..1baa6cac --- /dev/null +++ b/src/lib/market/api-client/revoke-commerce-entitlement.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function revokeCommerceEntitlementMethod(this: ApiClientFacade, entitlementId: string, body: Record) { + return this.request('POST', `/v1/commerce/entitlements/${encodeURIComponent(entitlementId)}/revoke`, { body }); +} diff --git a/src/lib/market/api-client/set-primary-account-email.ts b/src/lib/market/api-client/set-primary-account-email.ts new file mode 100644 index 00000000..0b1bf7fa --- /dev/null +++ b/src/lib/market/api-client/set-primary-account-email.ts @@ -0,0 +1,7 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function setPrimaryAccountEmailMethod(this: ApiClientFacade, emailId: string) { return this.request('POST', `/v1/auth/web/emails/${encodeURIComponent(emailId)}/primary`, { body: {} }); } diff --git a/src/lib/market/api-client/start-commerce-service-scoping.ts b/src/lib/market/api-client/start-commerce-service-scoping.ts new file mode 100644 index 00000000..a96708f2 --- /dev/null +++ b/src/lib/market/api-client/start-commerce-service-scoping.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function startCommerceServiceScopingMethod(this: ApiClientFacade, requestId: string, body: Record = {}) { + return this.request('POST', `/v1/commerce/services/requests/${encodeURIComponent(requestId)}/scoping`, { body }); +} diff --git a/src/lib/market/api-client/start-commerce-vendor-stripe-onboarding.ts b/src/lib/market/api-client/start-commerce-vendor-stripe-onboarding.ts new file mode 100644 index 00000000..5b249cfa --- /dev/null +++ b/src/lib/market/api-client/start-commerce-vendor-stripe-onboarding.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function startCommerceVendorStripeOnboardingMethod(this: ApiClientFacade, teamId: string, body: Record = {}) { + return this.request('POST', `/v1/commerce/vendors/${encodeURIComponent(teamId)}/stripe/onboarding`, { body }); +} diff --git a/src/lib/market/api-client/start-commons-proposal-voting.ts b/src/lib/market/api-client/start-commons-proposal-voting.ts new file mode 100644 index 00000000..dff367d6 --- /dev/null +++ b/src/lib/market/api-client/start-commons-proposal-voting.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function startCommonsProposalVotingMethod(this: ApiClientFacade, proposalId: string, body: Record = {}) { + return this.request('POST', `/v1/commons/proposals/${encodeURIComponent(proposalId)}/start-voting`, { body }); +} diff --git a/src/lib/market/api-client/steward-decision-for-commons-proposal.ts b/src/lib/market/api-client/steward-decision-for-commons-proposal.ts new file mode 100644 index 00000000..dcad2a66 --- /dev/null +++ b/src/lib/market/api-client/steward-decision-for-commons-proposal.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function stewardDecisionForCommonsProposalMethod(this: ApiClientFacade, proposalId: string, body: Record) { + return this.request('POST', `/v1/commons/proposals/${encodeURIComponent(proposalId)}/steward-decision`, { body }); +} diff --git a/src/lib/market/api-client/submit-commerce-capacity-listing.ts b/src/lib/market/api-client/submit-commerce-capacity-listing.ts new file mode 100644 index 00000000..1f49ffca --- /dev/null +++ b/src/lib/market/api-client/submit-commerce-capacity-listing.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function submitCommerceCapacityListingMethod(this: ApiClientFacade, listingId: string, body: Record = {}) { + return this.request('POST', `/v1/commerce/capacity-listings/${encodeURIComponent(listingId)}/submit`, { body }); +} diff --git a/src/lib/market/api-client/submit-commerce-ownership-transfer.ts b/src/lib/market/api-client/submit-commerce-ownership-transfer.ts new file mode 100644 index 00000000..c4a8b70a --- /dev/null +++ b/src/lib/market/api-client/submit-commerce-ownership-transfer.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function submitCommerceOwnershipTransferMethod(this: ApiClientFacade, productId: string, transferId: string, body: Record = {}) { + return this.request('POST', `/v1/commerce/products/${encodeURIComponent(productId)}/ownership-transfer/${encodeURIComponent(transferId)}/submit`, { body }); +} diff --git a/src/lib/market/api-client/submit-commerce-service-quote.ts b/src/lib/market/api-client/submit-commerce-service-quote.ts new file mode 100644 index 00000000..dfbd01c4 --- /dev/null +++ b/src/lib/market/api-client/submit-commerce-service-quote.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function submitCommerceServiceQuoteMethod(this: ApiClientFacade, quoteId: string, body: Record = {}) { + return this.request('POST', `/v1/commerce/services/quotes/${encodeURIComponent(quoteId)}/submit`, { body }); +} diff --git a/src/lib/market/api-client/suspend-commerce-capacity-listing.ts b/src/lib/market/api-client/suspend-commerce-capacity-listing.ts new file mode 100644 index 00000000..c5206730 --- /dev/null +++ b/src/lib/market/api-client/suspend-commerce-capacity-listing.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function suspendCommerceCapacityListingMethod(this: ApiClientFacade, listingId: string, body: Record = {}) { + return this.request('POST', `/v1/commerce/capacity-listings/${encodeURIComponent(listingId)}/suspend`, { body }); +} diff --git a/src/lib/market/api-client/unlink-account-provider.ts b/src/lib/market/api-client/unlink-account-provider.ts new file mode 100644 index 00000000..49e748c8 --- /dev/null +++ b/src/lib/market/api-client/unlink-account-provider.ts @@ -0,0 +1,7 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function unlinkAccountProviderMethod(this: ApiClientFacade, identityId: string) { return this.request('DELETE', `/v1/auth/web/providers/${encodeURIComponent(identityId)}`); } diff --git a/src/lib/market/api-client/update-account-password.ts b/src/lib/market/api-client/update-account-password.ts new file mode 100644 index 00000000..bbba34eb --- /dev/null +++ b/src/lib/market/api-client/update-account-password.ts @@ -0,0 +1,13 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function updateAccountPasswordMethod(this: ApiClientFacade, body: { + currentPassword?: string; + password: string; + reauthenticationGrantId?: string; +}) { return this.request<{ + changed: true; +}>('PATCH', '/v1/auth/web/password', { body }); } diff --git a/src/lib/market/api-client/update-account-profile.ts b/src/lib/market/api-client/update-account-profile.ts new file mode 100644 index 00000000..cbd8eb58 --- /dev/null +++ b/src/lib/market/api-client/update-account-profile.ts @@ -0,0 +1,11 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function updateAccountProfileMethod(this: ApiClientFacade, body: { + firstName: string; + lastName: string; + image?: string | null; +}) { return this.request('PATCH', '/v1/auth/web/profile', { body }); } diff --git a/src/lib/market/api-client/update-commerce-capacity-listing.ts b/src/lib/market/api-client/update-commerce-capacity-listing.ts new file mode 100644 index 00000000..635fb106 --- /dev/null +++ b/src/lib/market/api-client/update-commerce-capacity-listing.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function updateCommerceCapacityListingMethod(this: ApiClientFacade, listingId: string, body: Record) { + return this.request('PATCH', `/v1/commerce/capacity-listings/${encodeURIComponent(listingId)}`, { body }); +} diff --git a/src/lib/market/api-client/update-commerce-contribution.ts b/src/lib/market/api-client/update-commerce-contribution.ts new file mode 100644 index 00000000..12087aa1 --- /dev/null +++ b/src/lib/market/api-client/update-commerce-contribution.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function updateCommerceContributionMethod(this: ApiClientFacade, productId: string, contributionId: string, body: Record) { + return this.request('PATCH', `/v1/commerce/products/${encodeURIComponent(productId)}/contributions/${encodeURIComponent(contributionId)}`, { body }); +} diff --git a/src/lib/market/api-client/update-commerce-governance-policy.ts b/src/lib/market/api-client/update-commerce-governance-policy.ts new file mode 100644 index 00000000..9b128470 --- /dev/null +++ b/src/lib/market/api-client/update-commerce-governance-policy.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function updateCommerceGovernancePolicyMethod(this: ApiClientFacade, productId: string, policyId: string, body: Record) { + return this.request('PATCH', `/v1/commerce/products/${encodeURIComponent(productId)}/governance-policy/${encodeURIComponent(policyId)}`, { body }); +} diff --git a/src/lib/market/api-client/update-commerce-ownership-record.ts b/src/lib/market/api-client/update-commerce-ownership-record.ts new file mode 100644 index 00000000..7a02a9fe --- /dev/null +++ b/src/lib/market/api-client/update-commerce-ownership-record.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function updateCommerceOwnershipRecordMethod(this: ApiClientFacade, productId: string, ownershipRecordId: string, body: Record) { + return this.request('PATCH', `/v1/commerce/products/${encodeURIComponent(productId)}/ownership/${encodeURIComponent(ownershipRecordId)}`, { body }); +} diff --git a/src/lib/market/api-client/update-commerce-service-request.ts b/src/lib/market/api-client/update-commerce-service-request.ts new file mode 100644 index 00000000..df8dd970 --- /dev/null +++ b/src/lib/market/api-client/update-commerce-service-request.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function updateCommerceServiceRequestMethod(this: ApiClientFacade, requestId: string, body: Record) { + return this.request('PATCH', `/v1/commerce/services/requests/${encodeURIComponent(requestId)}`, { body }); +} diff --git a/src/lib/market/api-client/update-commerce-stewardship-assignment.ts b/src/lib/market/api-client/update-commerce-stewardship-assignment.ts new file mode 100644 index 00000000..f19168a8 --- /dev/null +++ b/src/lib/market/api-client/update-commerce-stewardship-assignment.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function updateCommerceStewardshipAssignmentMethod(this: ApiClientFacade, productId: string, assignmentId: string, body: Record) { + return this.request('PATCH', `/v1/commerce/products/${encodeURIComponent(productId)}/stewards/${encodeURIComponent(assignmentId)}`, { body }); +} diff --git a/src/lib/market/api-client/update-notification-preferences.ts b/src/lib/market/api-client/update-notification-preferences.ts new file mode 100644 index 00000000..57f07aa9 --- /dev/null +++ b/src/lib/market/api-client/update-notification-preferences.ts @@ -0,0 +1,7 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function updateNotificationPreferencesMethod(this: ApiClientFacade, body: NotificationPreferences) { return this.request('PUT', '/v1/auth/web/notifications/preferences', { body }); } diff --git a/src/lib/market/api-client/update-personal-theme.ts b/src/lib/market/api-client/update-personal-theme.ts new file mode 100644 index 00000000..f7ed32bc --- /dev/null +++ b/src/lib/market/api-client/update-personal-theme.ts @@ -0,0 +1,7 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function updatePersonalThemeMethod(this: ApiClientFacade, id: string, body: PersonalThemeDraft) { return this.request('PATCH', `/v1/auth/web/themes/${encodeURIComponent(id)}`, { body }); } diff --git a/src/lib/market/api-client/update-project-repository-topology.ts b/src/lib/market/api-client/update-project-repository-topology.ts new file mode 100644 index 00000000..d62997a8 --- /dev/null +++ b/src/lib/market/api-client/update-project-repository-topology.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function updateProjectRepositoryTopologyMethod(this: ApiClientFacade, projectId: string, body: Record) { + return this.request('PUT', `/v1/projects/${encodeURIComponent(projectId)}/repository-topology`, { body }); +} diff --git a/src/lib/market/api-client/update-team-tree-dx.ts b/src/lib/market/api-client/update-team-tree-dx.ts new file mode 100644 index 00000000..3277f262 --- /dev/null +++ b/src/lib/market/api-client/update-team-tree-dx.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function updateTeamTreeDxMethod(this: ApiClientFacade, teamId: string, body: Record) { + return this.request('PUT', `/v1/teams/${encodeURIComponent(teamId)}/treedx`, { body }); +} diff --git a/src/lib/market/api-client/upsert-project-tree-dx-library.ts b/src/lib/market/api-client/upsert-project-tree-dx-library.ts new file mode 100644 index 00000000..ed9c254a --- /dev/null +++ b/src/lib/market/api-client/upsert-project-tree-dx-library.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function upsertProjectTreeDxLibraryMethod(this: ApiClientFacade, projectId: string, body: Record) { + return this.request('POST', `/v1/projects/${encodeURIComponent(projectId)}/treedx-library`, { body }); +} diff --git a/src/lib/market/api-client/url.ts b/src/lib/market/api-client/url.ts new file mode 100644 index 00000000..0385c246 --- /dev/null +++ b/src/lib/market/api-client/url.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function urlMethod(this: ApiClientFacade, path: string) { + return `${resolveApiBaseUrl(this.context.locals)}${path}`; +} diff --git a/src/lib/market/api-client/validate-private-knowledge-access.ts b/src/lib/market/api-client/validate-private-knowledge-access.ts new file mode 100644 index 00000000..5379e08c --- /dev/null +++ b/src/lib/market/api-client/validate-private-knowledge-access.ts @@ -0,0 +1,12 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function validatePrivateKnowledgeAccessMethod(this: ApiClientFacade, projectId: string, body: { + slug?: string; + route?: string; +} = {}) { + return this.request('POST', `/v1/projects/${encodeURIComponent(projectId)}/private-knowledge/access`, { body }); +} diff --git a/src/lib/market/api-client/vendor-approve-commerce-service-quote.ts b/src/lib/market/api-client/vendor-approve-commerce-service-quote.ts new file mode 100644 index 00000000..319777dc --- /dev/null +++ b/src/lib/market/api-client/vendor-approve-commerce-service-quote.ts @@ -0,0 +1,9 @@ +import type { APIContext } from 'astro'; +import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../auth/config"; +import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; +import type { AstroLike, ApiClientFacade } from '../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +export function vendorApproveCommerceServiceQuoteMethod(this: ApiClientFacade, quoteId: string, body: Record = {}) { + return this.request('POST', `/v1/commerce/services/quotes/${encodeURIComponent(quoteId)}/vendor-approve`, { body }); +} diff --git a/test/admin-package.test.ts b/tests/contract/package/admin-package.test.ts similarity index 93% rename from test/admin-package.test.ts rename to tests/contract/package/admin-package.test.ts index 15b1a799..a3bcbaa1 100644 --- a/test/admin-package.test.ts +++ b/tests/contract/package/admin-package.test.ts @@ -1,11 +1,11 @@ import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs'; import { extname, join, relative, resolve } from 'node:path'; import { describe, expect, it } from 'vitest'; -import adminPlugin, { ADMIN_CAPABILITIES, ADMIN_ENV_SCHEMA } from '../src/plugin'; +import adminPlugin, { ADMIN_CAPABILITIES, ADMIN_ENV_SCHEMA } from '../../../src/plugin'; import type { TreeseedPluginSiteContext, TreeseedSiteExtensionContribution } from '@treeseed/sdk/platform/plugin'; -import { ADMIN_ROUTES, ADMIN_SUPPORT_ROUTES } from '../src/routes'; -import { DEFAULT_ADMIN_COMMERCE_PROVIDER } from '../src/commerce'; -import { DEFAULT_SECRET_MANAGER_PROVIDERS } from '../src/secret-managers'; +import { ADMIN_ROUTES, ADMIN_SUPPORT_ROUTES } from '../../../src/routes'; +import { DEFAULT_ADMIN_COMMERCE_PROVIDER } from '../../../src/commerce'; +import { DEFAULT_SECRET_MANAGER_PROVIDERS } from '../../../src/secret-managers'; const EXPECTED_ROUTES = [ '/app', @@ -113,7 +113,7 @@ describe('@treeseed/admin identity and team surface', () => { expect(packageJson.dependencies).not.toHaveProperty('@treeseed/api'); expect(DEFAULT_ADMIN_COMMERCE_PROVIDER.id).toBe('none'); expect(DEFAULT_SECRET_MANAGER_PROVIDERS[0]?.id).toBe('treeseed-local-encrypted'); - expect(readFileSync('src/lib/market/api-client.ts', 'utf8')).toContain('getCommerceVendorSalesSummary'); + expect(readFileSync('src/lib/market/api-client/get-commerce-vendor-sales-summary.ts', 'utf8')).toContain('getCommerceVendorSalesSummaryMethod'); }); it('builds declarations and valid package exports', () => { diff --git a/test/shims/sdk-platform-plugin.ts b/tests/support/shims/sdk-platform-plugin.ts similarity index 100% rename from test/shims/sdk-platform-plugin.ts rename to tests/support/shims/sdk-platform-plugin.ts diff --git a/tsconfig.json b/tsconfig.json index 25040dcd..8d809de7 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -13,5 +13,5 @@ "@treeseed/ui/theme": ["src/internal/ui-theme.d.ts"] } }, - "include": ["src/**/*", "test/**/*", "vitest.config.ts"] + "include": ["src/**/*", "tests/**/*", "vitest.config.ts"] } diff --git a/vitest.config.ts b/vitest.config.ts index 5bc30c72..2e2f2228 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -4,11 +4,11 @@ import { resolve } from 'node:path'; export default defineConfig({ resolve: { alias: { - '@treeseed/sdk/platform/plugin': resolve(__dirname, 'test/shims/sdk-platform-plugin.ts'), + '@treeseed/sdk/platform/plugin': resolve(__dirname, 'tests/support/shims/sdk-platform-plugin.ts'), }, }, test: { - include: ['test/**/*.test.ts'], + include: ['tests/{unit,integration,contract}/**/*.test.ts'], testTimeout: 30000, }, }); From d8d1a040ab9a0e7afe47d8ab0cd48e508f6ff5a5 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Thu, 23 Jul 2026 18:31:02 -0400 Subject: [PATCH 012/315] build(deps): update @treeseed/sdk and @treeseed/core pointers Changes: - Update package.json and package-lock.json with new dependency commit hashes. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#2e95b2e65d3a8f224b79459c127875483883c7f8 -> github:treeseed-ai/sdk#d7e2c296f3003327a5cca64f83a5950dedba4aac - dependencies.@treeseed/core: github:treeseed-ai/core#2a00e061edbcf24c288aee73a43345d5f3db8005 -> github:treeseed-ai/core#0a123d60d9c423c1a59140eaa80efb86c23538b9 --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index c7fa319d..640df266 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#2a00e061edbcf24c288aee73a43345d5f3db8005", - "@treeseed/sdk": "github:treeseed-ai/sdk#2e95b2e65d3a8f224b79459c127875483883c7f8", + "@treeseed/core": "github:treeseed-ai/core#0a123d60d9c423c1a59140eaa80efb86c23538b9", + "@treeseed/sdk": "github:treeseed-ai/sdk#d7e2c296f3003327a5cca64f83a5950dedba4aac", "@treeseed/ui": "github:treeseed-ai/ui#9c6940f6ca0820c1478815dcbca0f298daf0dae3", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -6932,7 +6932,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.staging.20260716T185112Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#2a00e061edbcf24c288aee73a43345d5f3db8005", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#0a123d60d9c423c1a59140eaa80efb86c23538b9", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6943,7 +6943,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#2e95b2e65d3a8f224b79459c127875483883c7f8", + "@treeseed/sdk": "github:treeseed-ai/sdk#d7e2c296f3003327a5cca64f83a5950dedba4aac", "@treeseed/ui": "github:treeseed-ai/ui#9c6940f6ca0820c1478815dcbca0f298daf0dae3", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8948,7 +8948,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.staging.20260716T185056Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#2e95b2e65d3a8f224b79459c127875483883c7f8", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#d7e2c296f3003327a5cca64f83a5950dedba4aac", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index 8ccb1b66..3ba12447 100644 --- a/package.json +++ b/package.json @@ -48,8 +48,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#2a00e061edbcf24c288aee73a43345d5f3db8005", - "@treeseed/sdk": "github:treeseed-ai/sdk#2e95b2e65d3a8f224b79459c127875483883c7f8", + "@treeseed/core": "github:treeseed-ai/core#0a123d60d9c423c1a59140eaa80efb86c23538b9", + "@treeseed/sdk": "github:treeseed-ai/sdk#d7e2c296f3003327a5cca64f83a5950dedba4aac", "@treeseed/ui": "github:treeseed-ai/ui#9c6940f6ca0820c1478815dcbca0f298daf0dae3", "react": "^19.2.5", "react-dom": "^19.2.6" From 054fbb84c13114afa57c15ec55fbb0220f8b9cfb Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Thu, 23 Jul 2026 21:37:07 -0400 Subject: [PATCH 013/315] build(build): sync package dependency references Changes: - Updates 5 files across build: 5. - Touches package-lock.json, package.json, scripts/check-file-architecture.ts, scripts/split-class-methods.ts, scripts/split-module-declarations.ts. - Plans package version/tag 0.12.59-dev.staging.20260716T154320Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/ui: github:treeseed-ai/ui#9c6940f6ca0820c1478815dcbca0f298daf0dae3 -> github:treeseed-ai/ui#84b54513a13691dc55a5868ab2e97b3f14f83fd6 - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#d7e2c296f3003327a5cca64f83a5950dedba4aac -> github:treeseed-ai/sdk#363356034d2717f401f4cdd0c54b22c16dffc60c - dependencies.@treeseed/core: github:treeseed-ai/core#0a123d60d9c423c1a59140eaa80efb86c23538b9 -> github:treeseed-ai/core#784c3b0f770a3f2252445d8da6006b884b2252b3 --- package-lock.json | 16 +-- package.json | 9 +- scripts/check-file-architecture.ts | 46 +++++++ scripts/split-class-methods.ts | 171 --------------------------- scripts/split-module-declarations.ts | 150 ----------------------- 5 files changed, 59 insertions(+), 333 deletions(-) create mode 100644 scripts/check-file-architecture.ts delete mode 100644 scripts/split-class-methods.ts delete mode 100644 scripts/split-module-declarations.ts diff --git a/package-lock.json b/package-lock.json index 640df266..4f2cd2db 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,9 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#0a123d60d9c423c1a59140eaa80efb86c23538b9", - "@treeseed/sdk": "github:treeseed-ai/sdk#d7e2c296f3003327a5cca64f83a5950dedba4aac", - "@treeseed/ui": "github:treeseed-ai/ui#9c6940f6ca0820c1478815dcbca0f298daf0dae3", + "@treeseed/core": "github:treeseed-ai/core#784c3b0f770a3f2252445d8da6006b884b2252b3", + "@treeseed/sdk": "github:treeseed-ai/sdk#363356034d2717f401f4cdd0c54b22c16dffc60c", + "@treeseed/ui": "github:treeseed-ai/ui#84b54513a13691dc55a5868ab2e97b3f14f83fd6", "react": "^19.2.5", "react-dom": "^19.2.6" }, @@ -6932,7 +6932,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.staging.20260716T185112Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#0a123d60d9c423c1a59140eaa80efb86c23538b9", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#784c3b0f770a3f2252445d8da6006b884b2252b3", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6943,8 +6943,8 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#d7e2c296f3003327a5cca64f83a5950dedba4aac", - "@treeseed/ui": "github:treeseed-ai/ui#9c6940f6ca0820c1478815dcbca0f298daf0dae3", + "@treeseed/sdk": "github:treeseed-ai/sdk#363356034d2717f401f4cdd0c54b22c16dffc60c", + "@treeseed/ui": "github:treeseed-ai/ui#84b54513a13691dc55a5868ab2e97b3f14f83fd6", "astro": "^5.6.1", "esbuild": "^0.28.0", "katex": "^0.16.22", @@ -8948,7 +8948,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.staging.20260716T185056Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#d7e2c296f3003327a5cca64f83a5950dedba4aac", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#363356034d2717f401f4cdd0c54b22c16dffc60c", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", @@ -9645,7 +9645,7 @@ }, "node_modules/@treeseed/ui": { "version": "0.12.18-dev.staging.20260716T185026Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#9c6940f6ca0820c1478815dcbca0f298daf0dae3", + "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#84b54513a13691dc55a5868ab2e97b3f14f83fd6", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", diff --git a/package.json b/package.json index 3ba12447..f446ab61 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,8 @@ "access": "public" }, "scripts": { - "check:file-lengths": "node --import tsx ./scripts/check-file-lengths.ts", + "check:file-lengths": "node --import tsx ./scripts/check-file-lengths.ts && npm run check:file-architecture", + "check:file-architecture": "node --import tsx ./scripts/check-file-architecture.ts", "setup": "npm install", "setup:ci": "npm ci --workspaces=false", "build": "npm run build:dist", @@ -48,9 +49,9 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#0a123d60d9c423c1a59140eaa80efb86c23538b9", - "@treeseed/sdk": "github:treeseed-ai/sdk#d7e2c296f3003327a5cca64f83a5950dedba4aac", - "@treeseed/ui": "github:treeseed-ai/ui#9c6940f6ca0820c1478815dcbca0f298daf0dae3", + "@treeseed/core": "github:treeseed-ai/core#784c3b0f770a3f2252445d8da6006b884b2252b3", + "@treeseed/sdk": "github:treeseed-ai/sdk#363356034d2717f401f4cdd0c54b22c16dffc60c", + "@treeseed/ui": "github:treeseed-ai/ui#84b54513a13691dc55a5868ab2e97b3f14f83fd6", "react": "^19.2.5", "react-dom": "^19.2.6" }, diff --git a/scripts/check-file-architecture.ts b/scripts/check-file-architecture.ts new file mode 100644 index 00000000..56f75332 --- /dev/null +++ b/scripts/check-file-architecture.ts @@ -0,0 +1,46 @@ +import { existsSync, readFileSync } from 'node:fs'; +import { spawnSync } from 'node:child_process'; + +function repositoryFiles() { + const result = spawnSync('git', ['ls-files', '-z', '--cached', '--others', '--exclude-standard'], { encoding: 'utf8' }); + if (result.status !== 0) throw new Error(result.stderr || 'Unable to enumerate repository files.'); + return result.stdout.split('\0').filter(Boolean).filter(existsSync); +} + +const violations: string[] = []; +for (const path of repositoryFiles()) { + const basename = path.split('/').at(-1) ?? path; + if (/^(?:chunk|module|part|section|segment)-\d+\./u.test(basename)) { + violations.push(`${path}: generic numbered partition`); + } + if (/-\d{1,2}\.(?:scenarios|spec|test)\.[^.]+$/u.test(basename)) { + violations.push(`${path}: ordinal test or scenario suffix`); + } + if (path.startsWith('src/api/routes/') && basename.includes('-through-')) { + violations.push(`${path}: route-order range name`); + } + if (/split-(?:class-methods|large-tests|module-declarations)\.[^.]+$/u.test(basename)) { + violations.push(`${path}: mechanical split script`); + } + if (path.startsWith('scripts/') && /\.(?:spec|test)\.[^.]+$/u.test(basename)) { + violations.push(`${path}: test belongs under tests/`); + } + if (/\.(?:js|jsx|ts|tsx)$/u.test(path)) { + const source = readFileSync(path, 'utf8'); + if (/\b(?:CLI_COMMAND_OVERLAYS|CLI_ONLY_OPERATION_SPECS|MODULE|PART)_\d+\b/u.test(source)) { + violations.push(`${path}: ordinal partition symbol`); + } + } +} + +if (existsSync('test') && existsSync('tests')) { + violations.push('test and tests: duplicate TypeScript test roots'); +} + +if (violations.length > 0) { + console.error('File architecture policy failed:'); + for (const violation of violations) console.error(`- ${violation}`); + process.exit(1); +} + +console.log('File architecture policy passed: filenames and test roots express functional ownership.'); diff --git a/scripts/split-class-methods.ts b/scripts/split-class-methods.ts deleted file mode 100644 index 2095a7fc..00000000 --- a/scripts/split-class-methods.ts +++ /dev/null @@ -1,171 +0,0 @@ -import { mkdirSync, readFileSync, writeFileSync } from 'node:fs'; -import { basename, dirname, join } from 'node:path'; -import ts from 'typescript'; - -function kebab(value: string) { - return value.replace(/([a-z0-9])([A-Z])/g, '$1-$2').replace(/_/g, '-').toLowerCase(); -} - -function withoutAccessModifiers(modifiers: ts.NodeArray | undefined) { - return modifiers?.filter((modifier) => ![ - ts.SyntaxKind.PrivateKeyword, - ts.SyntaxKind.ProtectedKeyword, - ts.SyntaxKind.OverrideKeyword, - ts.SyntaxKind.AbstractKeyword, - ].includes(modifier.kind)); -} - -function adjustedImport(source: ts.SourceFile, statement: ts.ImportDeclaration) { - if (!ts.isStringLiteral(statement.moduleSpecifier) || !statement.moduleSpecifier.text.startsWith('.')) return statement; - return ts.factory.updateImportDeclaration( - statement, - statement.modifiers, - statement.importClause, - ts.factory.createStringLiteral(`../${statement.moduleSpecifier.text}`), - statement.attributes, - ); -} - -function declaredNames(statement: ts.Statement) { - if (ts.isVariableStatement(statement)) { - return statement.declarationList.declarations.flatMap((declaration) => ts.isIdentifier(declaration.name) ? [declaration.name.text] : []); - } - if (ts.isFunctionDeclaration(statement) || ts.isClassDeclaration(statement) || ts.isInterfaceDeclaration(statement) || ts.isTypeAliasDeclaration(statement) || ts.isEnumDeclaration(statement)) { - return statement.name && ts.isIdentifier(statement.name) ? [statement.name.text] : []; - } - return []; -} - -function exportTopLevel(statement: ts.Statement) { - if (statement.modifiers?.some((modifier) => modifier.kind === ts.SyntaxKind.ExportKeyword || modifier.kind === ts.SyntaxKind.DefaultKeyword)) return statement; - if (declaredNames(statement).length === 0) return statement; - const exportModifier = ts.factory.createModifier(ts.SyntaxKind.ExportKeyword); - const modifiers = ts.factory.createNodeArray([exportModifier, ...(statement.modifiers ?? [])]); - if (ts.isVariableStatement(statement)) return ts.factory.updateVariableStatement(statement, modifiers, statement.declarationList); - if (ts.isFunctionDeclaration(statement)) return ts.factory.updateFunctionDeclaration(statement, modifiers, statement.asteriskToken, statement.name, statement.typeParameters, statement.parameters, statement.type, statement.body); - if (ts.isClassDeclaration(statement)) return ts.factory.updateClassDeclaration(statement, modifiers, statement.name, statement.typeParameters, statement.heritageClauses, statement.members); - if (ts.isInterfaceDeclaration(statement)) return ts.factory.updateInterfaceDeclaration(statement, modifiers, statement.name, statement.typeParameters, statement.heritageClauses, statement.members); - if (ts.isTypeAliasDeclaration(statement)) return ts.factory.updateTypeAliasDeclaration(statement, modifiers, statement.name, statement.typeParameters, statement.type); - if (ts.isEnumDeclaration(statement)) return ts.factory.updateEnumDeclaration(statement, modifiers, statement.name, statement.members); - return statement; -} - -function split(path: string, requestedClass?: string) { - const text = readFileSync(path, 'utf8'); - const source = ts.createSourceFile(path, text, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS); - const classNode = source.statements.find((statement): statement is ts.ClassDeclaration => - ts.isClassDeclaration(statement) && Boolean(statement.name) && (!requestedClass || statement.name?.text === requestedClass)); - if (!classNode?.name) throw new Error(`${path}: class not found`); - const className = classNode.name.text; - const methods = classNode.members.filter((member): member is ts.MethodDeclaration => - ts.isMethodDeclaration(member) - && Boolean(member.body) - && !member.modifiers?.some((modifier) => modifier.kind === ts.SyntaxKind.StaticKeyword) - && ts.isIdentifier(member.name)); - if (methods.length === 0) throw new Error(`${path}: no extractable methods found`); - - const stem = basename(path, '.ts'); - const outputDir = join(dirname(path), stem); - mkdirSync(outputDir, { recursive: true }); - const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed }); - const imports = source.statements.filter(ts.isImportDeclaration); - const localNames = source.statements.flatMap(declaredNames); - const methodModuleImports: string[] = []; - const methodInstallations: string[] = []; - const interfaceMembers: ts.TypeElement[] = []; - const assignments: ts.Statement[] = []; - - for (const method of methods) { - const methodName = (method.name as ts.Identifier).text; - const fileStem = kebab(methodName); - const functionName = `${methodName}Method`; - const thisParameter = ts.factory.createParameterDeclaration(undefined, undefined, 'this', undefined, ts.factory.createTypeReferenceNode(className), undefined); - const functionNode = ts.factory.createFunctionDeclaration( - [ts.factory.createModifier(ts.SyntaxKind.ExportKeyword), ...(method.modifiers?.filter((modifier) => modifier.kind === ts.SyntaxKind.AsyncKeyword) ?? [])], - method.asteriskToken, - functionName, - method.typeParameters, - [thisParameter, ...method.parameters], - method.type, - method.body, - ); - const supportImport = ts.factory.createImportDeclaration( - undefined, - ts.factory.createImportClause(false, undefined, ts.factory.createNamedImports(localNames.map((name) => ts.factory.createImportSpecifier(false, undefined, ts.factory.createIdentifier(name))))), - ts.factory.createStringLiteral(`../${stem}.ts`), - undefined, - ); - const methodSource = [ - ...imports.map((statement) => adjustedImport(source, statement)), - supportImport, - functionNode, - ].map((node) => printer.printNode(ts.EmitHint.Unspecified, node, source)).join('\n'); - if (methodSource.split('\n').length > 500) throw new Error(`${path}: method ${methodName} generates ${methodSource.split('\n').length} lines`); - writeFileSync(join(outputDir, `${fileStem}.ts`), `${methodSource}\n`, 'utf8'); - methodModuleImports.push(`import { ${functionName} } from './${fileStem}.ts';`); - methodInstallations.push(`\tprototype.${methodName} = ${functionName};`); - interfaceMembers.push(ts.factory.createMethodSignature( - undefined, - method.name, - method.questionToken, - method.typeParameters, - method.parameters.map((parameter) => ts.factory.updateParameterDeclaration(parameter, parameter.modifiers, parameter.dotDotDotToken, parameter.name, parameter.questionToken ?? (parameter.initializer ? ts.factory.createToken(ts.SyntaxKind.QuestionToken) : undefined), parameter.type, undefined)), - method.type, - )); - } - writeFileSync(join(outputDir, 'methods.ts'), `import type { ${className} } from '../${stem}.ts';\n${methodModuleImports.join('\n')}\n\nexport function install${className}Methods(prototype: ${className}) {\n${methodInstallations.join('\n')}\n}\n`, 'utf8'); - const methodImport = ts.factory.createImportDeclaration( - undefined, - ts.factory.createImportClause(false, undefined, ts.factory.createNamespaceImport(ts.factory.createIdentifier('extractedMethods'))), - ts.factory.createStringLiteral(`./${stem}/methods.ts`), - undefined, - ); - const interfaceImport = ts.factory.createImportDeclaration(undefined, undefined, ts.factory.createStringLiteral(`./${stem}/interface.ts`), undefined); - - const retainedMembers = classNode.members - .filter((member) => !methods.includes(member as ts.MethodDeclaration)) - .map((member) => { - if (ts.isPropertyDeclaration(member)) return ts.factory.updatePropertyDeclaration(member, withoutAccessModifiers(member.modifiers), member.name, member.questionToken ?? member.exclamationToken, member.type, member.initializer); - if (ts.isConstructorDeclaration(member)) { - const parameters = member.parameters.map((parameter) => ts.factory.updateParameterDeclaration(parameter, withoutAccessModifiers(parameter.modifiers), parameter.dotDotDotToken, parameter.name, parameter.questionToken, parameter.type, parameter.initializer)); - return ts.factory.updateConstructorDeclaration(member, withoutAccessModifiers(member.modifiers), parameters, member.body); - } - return member; - }); - const updatedClass = ts.factory.updateClassDeclaration(classNode, classNode.modifiers, classNode.name, classNode.typeParameters, classNode.heritageClauses, retainedMembers); - const interfaceNode = ts.factory.createInterfaceDeclaration( - [ts.factory.createModifier(ts.SyntaxKind.ExportKeyword)], - className, - classNode.typeParameters, - undefined, - interfaceMembers, - ); - const interfaceText = `${imports.map((statement) => printer.printNode(ts.EmitHint.Unspecified, adjustedImport(source, statement), source)).join('\n')}\n\ndeclare module '../${stem}.ts' {\n${printer.printNode(ts.EmitHint.Unspecified, interfaceNode, source).replace(/^export /u, '').split('\n').map((line) => `\t${line}`).join('\n')}\n}\n\nexport {};\n`; - if (interfaceText.split('\n').length > 500) throw new Error(`${path}: extracted interface remains ${interfaceText.split('\n').length} lines`); - writeFileSync(join(outputDir, 'interface.ts'), interfaceText, 'utf8'); - assignments.push(ts.factory.createExpressionStatement(ts.factory.createCallExpression( - ts.factory.createPropertyAccessExpression(ts.factory.createIdentifier('extractedMethods'), `install${className}Methods`), - undefined, - [ts.factory.createPropertyAccessExpression(ts.factory.createIdentifier(className), 'prototype')], - ))); - const statements: ts.Statement[] = []; - for (const statement of source.statements) { - if (ts.isImportDeclaration(statement)) { - statements.push(statement); - continue; - } - if (statement === classNode) { - statements.push(methodImport, interfaceImport, updatedClass, ...assignments); - continue; - } - statements.push(exportTopLevel(statement)); - } - const output = printer.printFile(ts.factory.updateSourceFile(source, statements)); - if (output.split('\n').length > 500) throw new Error(`${path}: class shell remains ${output.split('\n').length} lines`); - writeFileSync(path, output, 'utf8'); - console.log(`${path}: extracted ${methods.length} ${className} methods`); -} - -const [path, className] = process.argv.slice(2); -if (!path) throw new Error('Usage: split-class-methods.ts [ClassName]'); -split(path, className); diff --git a/scripts/split-module-declarations.ts b/scripts/split-module-declarations.ts deleted file mode 100644 index cc237ba7..00000000 --- a/scripts/split-module-declarations.ts +++ /dev/null @@ -1,150 +0,0 @@ -import { mkdirSync, readFileSync, writeFileSync } from 'node:fs'; -import { basename, dirname, join } from 'node:path'; -import ts from 'typescript'; - -const TARGET_LINES = 280; -const MAX_LINES = 500; - -function bindingNames(name: ts.BindingName | ts.DeclarationName | undefined): string[] { - if (!name) return []; - if (ts.isIdentifier(name)) return [name.text]; - if (ts.isObjectBindingPattern(name) || ts.isArrayBindingPattern(name)) { - return name.elements.flatMap((element) => ts.isBindingElement(element) ? bindingNames(element.name) : []); - } - return []; -} - -function statementNames(statement: ts.Statement) { - if (ts.isVariableStatement(statement)) return statement.declarationList.declarations.flatMap((declaration) => bindingNames(declaration.name)); - if ( - ts.isFunctionDeclaration(statement) - || ts.isClassDeclaration(statement) - || ts.isInterfaceDeclaration(statement) - || ts.isTypeAliasDeclaration(statement) - || ts.isEnumDeclaration(statement) - || ts.isModuleDeclaration(statement) - ) return bindingNames(statement.name); - return []; -} - -function kebab(value: string) { - return value.replace(/([a-z0-9])([A-Z])/g, '$1-$2').replace(/_/g, '-').toLowerCase(); -} - -function identifiersIn(statements: ts.Statement[]) { - const identifiers = new Set(); - const visit = (node: ts.Node) => { - if (ts.isIdentifier(node)) identifiers.add(node.text); - ts.forEachChild(node, visit); - }; - for (const statement of statements) visit(statement); - return identifiers; -} - -function adjustedImport(source: ts.SourceFile, statement: ts.ImportDeclaration, used: Set) { - const clause = statement.importClause; - if (!clause) return statement.getFullText(source).trim(); - const defaultName = clause.name && used.has(clause.name.text) ? clause.name : undefined; - let bindings: ts.NamedImportBindings | undefined; - if (clause.namedBindings && ts.isNamespaceImport(clause.namedBindings)) { - if (used.has(clause.namedBindings.name.text)) bindings = clause.namedBindings; - } else if (clause.namedBindings && ts.isNamedImports(clause.namedBindings)) { - const elements = clause.namedBindings.elements.filter((element) => used.has(element.name.text)); - if (elements.length > 0) bindings = ts.factory.updateNamedImports(clause.namedBindings, elements); - } - if (!defaultName && !bindings) return ''; - const specifier = ts.isStringLiteral(statement.moduleSpecifier) && statement.moduleSpecifier.text.startsWith('.') - ? ts.factory.createStringLiteral(`../${statement.moduleSpecifier.text}`) - : statement.moduleSpecifier; - const updated = ts.factory.updateImportDeclaration( - statement, - statement.modifiers, - ts.factory.updateImportClause(clause, clause.isTypeOnly, defaultName, bindings), - specifier, - statement.attributes, - ); - return ts.createPrinter().printNode(ts.EmitHint.Unspecified, updated, source).replace(/\s+/gu, ' '); -} - -function exportedStatement(source: ts.SourceFile, statement: ts.Statement) { - const text = statement.getFullText(source).trim(); - if (statement.modifiers?.some((modifier) => modifier.kind === ts.SyntaxKind.ExportKeyword || modifier.kind === ts.SyntaxKind.DefaultKeyword)) return text; - return statementNames(statement).length > 0 ? `export ${text}` : text; -} - -function referencedNames(statement: ts.Statement, localNames: Set, ownNames: Set) { - const references = new Set(); - const visit = (node: ts.Node) => { - if (ts.isIdentifier(node) && localNames.has(node.text) && !ownNames.has(node.text)) references.add(node.text); - ts.forEachChild(node, visit); - }; - visit(statement); - return references; -} - -function split(path: string) { - const text = readFileSync(path, 'utf8'); - const source = ts.createSourceFile(path, text, ts.ScriptTarget.Latest, true, path.endsWith('.tsx') ? ts.ScriptKind.TSX : ts.ScriptKind.TS); - const imports = source.statements.filter(ts.isImportDeclaration); - const declarations = source.statements.filter((statement) => !ts.isImportDeclaration(statement)); - const chunks: ts.Statement[][] = []; - let current: ts.Statement[] = []; - let lines = 0; - for (const statement of declarations) { - const statementLines = statement.getFullText(source).split('\n').length; - if (statementLines > MAX_LINES) throw new Error(`${path}: declaration ${statementNames(statement)[0] ?? statement.kind} is ${statementLines} lines`); - if (current.length > 0 && lines + statementLines > TARGET_LINES) { - chunks.push(current); - current = []; - lines = 0; - } - current.push(statement); - lines += statementLines; - } - if (current.length > 0) chunks.push(current); - if (chunks.length < 2) return; - - const extension = path.endsWith('.tsx') ? '.tsx' : '.ts'; - const stem = basename(path, extension); - const outputDir = join(dirname(path), stem); - mkdirSync(outputDir, { recursive: true }); - const used = new Set(); - const parts = chunks.map((statements, index) => { - const names = statements.flatMap(statementNames); - let fileStem = kebab(names[0] ?? `module-${index + 1}`); - if (used.has(fileStem)) fileStem = `${fileStem}-${index + 1}`; - used.add(fileStem); - return { statements, names, fileStem }; - }); - const owner = new Map(parts.flatMap((part) => part.names.map((name) => [name, part] as const))); - const allNames = new Set(owner.keys()); - for (const part of parts) { - const usedIdentifiers = identifiersIn(part.statements); - const ownNames = new Set(part.names); - const dependencies = new Map>(); - for (const statement of part.statements) { - for (const name of referencedNames(statement, allNames, ownNames)) { - const dependency = owner.get(name); - if (!dependency || dependency === part) continue; - const names = dependencies.get(dependency) ?? new Set(); - names.add(name); - dependencies.set(dependency, names); - } - } - const dependencyImports = [...dependencies.entries()] - .map(([dependency, names]) => `import { ${[...names].sort().join(', ')} } from './${dependency.fileStem}${extension}';`); - const body = part.statements.map((statement) => exportedStatement(source, statement)).join('\n\n'); - const output = `${imports.map((statement) => adjustedImport(source, statement, usedIdentifiers)).filter(Boolean).join('\n')}\n${dependencyImports.join('\n')}\n\n${body}\n`; - if (output.split('\n').length > MAX_LINES) throw new Error(`${part.fileStem}.ts: generated ${output.split('\n').length} lines`); - writeFileSync(join(outputDir, `${part.fileStem}${extension}`), output, 'utf8'); - } - const exports = parts.flatMap((part) => { - const path = `./${stem}/${part.fileStem}${extension}`; - const hasDefault = part.statements.some((statement) => statement.modifiers?.some((modifier) => modifier.kind === ts.SyntaxKind.DefaultKeyword)); - return [`export * from '${path}';`, ...(hasDefault ? [`export { default } from '${path}';`] : [])]; - }); - writeFileSync(path, `${exports.join('\n')}\n`, 'utf8'); - console.log(`${path}: ${parts.length} cohesive declaration modules`); -} - -for (const path of process.argv.slice(2)) split(path); From 99c2b0e7b9cb8783e779b05eb3c6beb076de8b0e Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Fri, 24 Jul 2026 06:53:34 -0400 Subject: [PATCH 014/315] build(source): sync package dependency references Changes: - Updates 243 files across source: 193, ui: 27, config: 13, build: 4, docs: 2, tests: 2, release: 1, workflow: 1. - Touches docs/astro.config.ts, docs/src/content.config.ts, guarantees/team/team/scenes/create-team.scene.yaml -> guarantees/team/scenes/create-team.scene.yaml, guarantees/team/team/scenes/delete-team.scene.yaml -> guarantees/team/scenes/delete-team.scene.yaml, guarantees/team/team/scenes/edit-team-settings.scene.yaml -> guarantees/team/scenes/edit-team-settings.scene.yaml, guarantees/team/team/scenes/switch-active-team.scene.yaml -> guarantees/team/scenes/switch-active-team.scene.yaml, .... - Plans package version/tag 0.12.59-dev.staging.20260716T154320Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/ui: github:treeseed-ai/ui#84b54513a13691dc55a5868ab2e97b3f14f83fd6 -> github:treeseed-ai/ui#3703cb057472895d224cf99def95066aa9ea399c - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#363356034d2717f401f4cdd0c54b22c16dffc60c -> github:treeseed-ai/sdk#8f2e04cb4dac647d7aa63179dd67b5027d2e393f - dependencies.@treeseed/core: github:treeseed-ai/core#784c3b0f770a3f2252445d8da6006b884b2252b3 -> github:treeseed-ai/core#3c4750cbd95d27372ebaa4f0dfeac67bb5dfeeab --- docs/astro.config.ts | 4 +- docs/src/content.config.ts | 4 +- .../{team => }/scenes/create-team.scene.yaml | 0 .../{team => }/scenes/delete-team.scene.yaml | 0 .../scenes/edit-team-settings.scene.yaml | 0 .../scenes/switch-active-team.scene.yaml | 0 .../scenes/view-team-profile.scene.yaml | 0 .../team/team/create-team.guarantee.yaml | 2 +- .../team/team/delete-team.guarantee.yaml | 2 +- .../team/edit-team-settings.guarantee.yaml | 2 +- .../team/switch-active-team.guarantee.yaml | 2 +- .../team/view-team-profile.guarantee.yaml | 2 +- package-lock.json | 16 +- package.json | 6 +- scripts/build-dist.ts | 4 +- scripts/check-file-architecture.ts | 82 +++- src/config.ts | 2 +- src/content-config.ts | 2 +- ...reeseedAppLayout.astro => AppLayout.astro} | 6 +- ...dPublicLayout.astro => PublicLayout.astro} | 8 +- src/lib/auth/{ => accounts}/account.ts | 4 +- src/lib/auth/{ => accounts}/appearance.ts | 12 +- .../auth/{ => accounts}/email-confirmation.ts | 0 src/lib/auth/{ => accounts}/email.ts | 2 +- .../auth/{ => accounts}/password-policy.ts | 0 src/lib/auth/{ => accounts}/welcome-email.ts | 2 +- src/lib/auth/{ => configuration}/config.ts | 0 src/lib/auth/{ => support}/csrf.ts | 2 +- .../auth/{ => support}/delete-confirmation.ts | 0 src/lib/auth/{ => support}/flow.ts | 6 +- .../auth/{ => support}/profile-validation.ts | 0 src/lib/market/api-client.ts | 6 +- .../contracts}/account-deletion-blockers.ts | 8 +- .../contracts}/account-identity.ts | 8 +- .../contracts}/account-notifications.ts | 8 +- .../contracts}/account-sessions.ts | 8 +- .../contracts}/notification-preferences.ts | 8 +- .../contracts}/resend-account-email.ts | 8 +- .../creation}/add-account-email.ts | 8 +- .../creation}/request-password-reset.ts | 8 +- .../lifecycle}/claim-username.ts | 8 +- .../lifecycle}/complete-password-reset.ts | 8 +- .../{ => accounts/lifecycle}/confirm-email.ts | 8 +- .../queries}/load-user-profile-by-username.ts | 8 +- .../retirement}/delete-account-email.ts | 8 +- .../retirement}/delete-current-account.ts | 8 +- .../retirement}/revoke-account-session.ts | 8 +- .../updates}/set-primary-account-email.ts | 8 +- .../updates}/update-account-password.ts | 8 +- .../updates}/update-account-profile.ts | 8 +- .../update-notification-preferences.ts | 8 +- .../queries}/list-capacity-ledger-entries.ts | 8 +- .../queries}/list-capacity-allocation-sets.ts | 8 +- .../get-provider-assignment-explanation.ts | 8 +- .../queries}/list-provider-assignments.ts | 8 +- ...et-project-capacity-runtime-diagnostics.ts | 8 +- .../queries}/get-project-capacity-summary.ts | 8 +- .../planning/queries}/get-capacity-plan.ts | 8 +- ...-capacity-routing-decisions-for-project.ts | 8 +- .../queries}/list-decision-capacity-plans.ts | 8 +- .../providers/contracts}/auth-providers.ts | 8 +- .../contracts}/unlink-account-provider.ts | 8 +- .../list-provider-availability-sessions.ts | 8 +- .../workdays/creation}/create-workday-run.ts | 8 +- .../queries}/get-workday-capacity-summary.ts | 8 +- .../workdays/queries}/get-workday-run.ts | 8 +- .../workdays/queries}/list-workday-runs.ts | 8 +- ...reate-commerce-capacity-listing-inquiry.ts | 8 +- .../create-commerce-capacity-listing.ts | 8 +- .../submit-commerce-capacity-listing.ts | 8 +- ...e-commerce-capacity-inquiry-for-scoping.ts | 8 +- .../approve-commerce-capacity-listing.ts | 8 +- .../decline-commerce-capacity-inquiry.ts | 8 +- .../reject-commerce-capacity-listing.ts | 8 +- .../review-commerce-capacity-inquiry.ts | 8 +- ...t-commerce-capacity-listing-for-product.ts | 8 +- .../get-commerce-capacity-listing-inquiry.ts | 8 +- .../queries}/get-commerce-capacity-listing.ts | 8 +- ...ist-commerce-capacity-listing-inquiries.ts | 8 +- .../list-commerce-capacity-listings.ts | 8 +- .../archive-commerce-capacity-listing.ts | 8 +- .../cancel-commerce-capacity-inquiry.ts | 8 +- .../suspend-commerce-capacity-listing.ts | 8 +- .../update-commerce-capacity-listing.ts | 8 +- .../queries}/get-catalog-item-by-slug.ts | 8 +- .../get-commerce-marketplace-product.ts | 8 +- .../catalog/queries}/get-commerce-product.ts | 8 +- .../catalog/queries}/list-catalog-items.ts | 8 +- .../list-commerce-marketplace-products.ts | 8 +- .../queries}/list-commerce-products.ts | 8 +- .../start-commerce-service-scoping.ts | 8 +- .../updates}/update-commerce-contribution.ts | 8 +- .../update-commerce-governance-policy.ts | 8 +- .../creation}/create-commerce-order-refund.ts | 8 +- .../fulfill-commerce-order-item-artifact.ts | 8 +- .../list-catalog-artifact-versions.ts | 8 +- .../end-commerce-stewardship-assignment.ts | 8 +- .../create-commerce-succession-event.ts | 8 +- .../submit-commerce-ownership-transfer.ts | 8 +- .../approve-commerce-ownership-transfer.ts | 8 +- .../reject-commerce-ownership-transfer.ts | 8 +- .../get-commerce-ownership-workflow.ts | 8 +- .../list-commerce-succession-events.ts | 8 +- .../cancel-commerce-ownership-transfer.ts | 8 +- .../update-commerce-ownership-record.ts | 8 +- .../update-commerce-stewardship-assignment.ts | 8 +- .../revoke-commerce-entitlement.ts | 8 +- .../buyer-approve-commerce-service-quote.ts | 8 +- .../link-commerce-service-contract-work.ts | 8 +- .../vendor-approve-commerce-service-quote.ts | 8 +- .../create-commerce-service-quote.ts | 8 +- .../create-commerce-service-request.ts | 8 +- .../submit-commerce-service-quote.ts | 8 +- .../fulfill-commerce-service-contract.ts | 8 +- .../reject-commerce-service-quote.ts | 8 +- .../queries}/get-commerce-service-contract.ts | 8 +- .../queries}/get-commerce-service-request.ts | 8 +- .../queries}/list-commerce-service-events.ts | 8 +- .../queries}/list-commerce-service-quotes.ts | 8 +- .../list-commerce-service-requests.ts | 8 +- .../cancel-commerce-service-contract.ts | 8 +- .../cancel-commerce-service-request.ts | 8 +- .../update-commerce-service-request.ts | 8 +- ...reate-commerce-vendor-stripe-login-link.ts | 8 +- .../creation}/request-commerce-vendor.ts | 8 +- ...start-commerce-vendor-stripe-onboarding.ts | 8 +- .../get-commerce-vendor-monitoring.ts | 8 +- .../get-commerce-vendor-sales-summary.ts | 8 +- .../get-commerce-vendor-stripe-status.ts | 8 +- .../vendors/queries}/get-commerce-vendor.ts | 8 +- ...list-commerce-vendor-fulfillment-events.ts | 8 +- ...list-commerce-vendor-sales-entitlements.ts | 8 +- .../list-commerce-vendor-sales-orders.ts | 8 +- .../list-commerce-vendor-sales-refunds.ts | 8 +- ...ist-commerce-vendor-sales-subscriptions.ts | 8 +- .../mark-commerce-vendor-stripe-return.ts | 8 +- .../validate-private-knowledge-access.ts | 8 +- .../queries}/list-knowledge-packs.ts | 8 +- .../record-private-knowledge-outcome.ts | 8 +- .../contracts}/answer-commons-question.ts | 8 +- .../backfill-commons-participants.ts | 8 +- .../creation}/create-commons-proposal.ts | 8 +- .../start-commons-proposal-voting.ts | 8 +- .../lifecycle}/review-commons-proposal.ts | 8 +- .../steward-decision-for-commons-proposal.ts | 8 +- .../queries}/get-commons-participant-me.ts | 8 +- .../commons/queries}/get-commons-proposal.ts | 8 +- .../commons/queries}/get-commons-summary.ts | 8 +- .../queries}/list-commons-decisions.ts | 8 +- .../commons/queries}/list-commons-events.ts | 8 +- .../queries}/list-commons-participants.ts | 8 +- .../queries}/list-commons-proposals.ts | 8 +- .../queries}/list-commons-questions.ts | 8 +- .../queries}/get-repository-host.ts | 8 +- .../queries}/list-repository-hosts.ts | 8 +- src/lib/market/api-client/interface.ts | 352 +++++++++--------- src/lib/market/api-client/methods.ts | 352 +++++++++--------- .../queries}/list-project-agent-classes.ts | 8 +- .../list-project-agent-fallback-outputs.ts | 8 +- .../queries}/list-project-agent-mode-runs.ts | 8 +- .../queries}/get-project-releases-summary.ts | 8 +- .../queries}/get-project-deployment.ts | 8 +- .../list-project-deployment-events.ts | 8 +- .../queries}/list-project-deployments.ts | 8 +- .../upsert-project-tree-dx-library.ts | 8 +- .../queries}/get-project-tree-dx-library.ts | 8 +- .../list-project-tree-dx-proxy-audit.ts | 8 +- .../evaluate-project-deletion-blockers.ts | 8 +- .../queries}/get-project-agents-summary.ts | 8 +- .../queries}/get-project-by-team-and-slug.ts | 8 +- .../queries}/get-project-details.ts | 8 +- .../queries}/get-project-summary.ts | 8 +- .../list-approval-requests-for-project.ts | 8 +- .../queries}/list-projects-for-principal.ts | 8 +- .../queries}/list-team-projects.ts | 8 +- .../get-project-repository-topology.ts | 8 +- .../update-project-repository-topology.ts | 8 +- .../{ => runtime/lifecycle}/approve-device.ts | 8 +- .../{ => seeds/queries}/list-seed-runs.ts | 8 +- .../{ => support/contracts}/headers.ts | 8 +- .../contracts}/personal-themes.ts | 8 +- .../{ => support/contracts}/request.ts | 8 +- .../api-client/{ => support/contracts}/url.ts | 8 +- .../creation}/create-personal-theme.ts | 8 +- .../lifecycle}/decide-approval-request.ts | 8 +- .../queries}/get-decision-planning-status.ts | 8 +- .../queries}/list-audit-events-for-target.ts | 8 +- .../list-decision-execution-inputs.ts | 8 +- .../queries}/list-execution-runs.ts | 8 +- .../retirement}/delete-personal-theme.ts | 8 +- .../updates}/update-personal-theme.ts | 8 +- .../evaluate-team-deletion-blockers.ts | 8 +- .../lifecycle}/accept-team-invite.ts | 8 +- .../queries}/get-team-access-summary.ts | 8 +- .../{ => teams/queries}/get-team-invite.ts | 8 +- .../{ => teams/queries}/get-team-web-host.ts | 8 +- .../list-approval-requests-for-team.ts | 8 +- .../list-persisted-team-inbox-items.ts | 8 +- .../{ => teams/queries}/list-team-members.ts | 8 +- .../queries}/list-team-web-hosts.ts | 8 +- .../queries}/list-teams-for-principal.ts | 8 +- .../queries}/load-team-profile-by-name.ts | 8 +- .../delete-team-inbox-items-by-item-key.ts | 8 +- .../creation}/create-tree-dx-mirror.ts | 8 +- .../creation}/create-tree-dx-share.ts | 8 +- .../creation}/provision-team-tree-dx.ts | 8 +- .../repositories/queries}/get-team-tree-dx.ts | 8 +- .../queries}/list-tree-dx-mirrors.ts | 8 +- .../queries}/list-tree-dx-shares.ts | 8 +- .../updates}/update-team-tree-dx.ts | 8 +- src/lib/runtime/local-cloudflare.ts | 6 +- src/middleware.ts | 4 +- src/pages/app/account/appearance.astro | 4 +- src/pages/app/account/delete.astro | 2 +- src/pages/app/account/index.astro | 2 +- src/pages/app/account/notifications.astro | 2 +- src/pages/app/account/sessions.astro | 2 +- src/pages/app/index.astro | 2 +- src/pages/app/teams/[teamId]/delete.astro | 14 +- src/pages/app/teams/[teamId]/edit.astro | 14 +- src/pages/app/teams/[teamId]/members.astro | 16 +- src/pages/app/teams/index.astro | 2 +- src/pages/app/teams/new.astro | 14 +- src/pages/auth/callback/[provider].ts | 2 +- src/pages/auth/check-email.astro | 4 +- src/pages/auth/confirm-email.astro | 4 +- src/pages/auth/device/approve.astro | 12 +- src/pages/auth/forgot-password.astro | 12 +- src/pages/auth/logout.ts | 2 +- src/pages/auth/register.astro | 8 +- src/pages/auth/reset-password.astro | 16 +- src/pages/auth/sign-in.astro | 12 +- src/pages/auth/username.astro | 6 +- src/pages/t/[name].astro | 2 +- src/pages/team-invites/[token]/accept.astro | 2 +- src/pages/u/[username].astro | 4 +- src/pages/v1/[...all].ts | 2 +- src/plugin.ts | 6 +- src/routes.ts | 12 +- src/secret-managers.ts | 50 +-- src/view-models/account-settings.ts | 2 +- tests/contract/package/admin-package.test.ts | 12 +- tests/support/shims/sdk-platform-plugin.ts | 14 +- 243 files changed, 1319 insertions(+), 1239 deletions(-) rename guarantees/team/{team => }/scenes/create-team.scene.yaml (100%) rename guarantees/team/{team => }/scenes/delete-team.scene.yaml (100%) rename guarantees/team/{team => }/scenes/edit-team-settings.scene.yaml (100%) rename guarantees/team/{team => }/scenes/switch-active-team.scene.yaml (100%) rename guarantees/team/{team => }/scenes/view-team-profile.scene.yaml (100%) rename src/layouts/{TreeseedAppLayout.astro => AppLayout.astro} (96%) rename src/layouts/{TreeseedPublicLayout.astro => PublicLayout.astro} (82%) rename src/lib/auth/{ => accounts}/account.ts (93%) rename src/lib/auth/{ => accounts}/appearance.ts (87%) rename src/lib/auth/{ => accounts}/email-confirmation.ts (100%) rename src/lib/auth/{ => accounts}/email.ts (99%) rename src/lib/auth/{ => accounts}/password-policy.ts (100%) rename src/lib/auth/{ => accounts}/welcome-email.ts (98%) rename src/lib/auth/{ => configuration}/config.ts (100%) rename src/lib/auth/{ => support}/csrf.ts (93%) rename src/lib/auth/{ => support}/delete-confirmation.ts (100%) rename src/lib/auth/{ => support}/flow.ts (96%) rename src/lib/auth/{ => support}/profile-validation.ts (100%) rename src/lib/market/api-client/{ => accounts/contracts}/account-deletion-blockers.ts (76%) rename src/lib/market/api-client/{ => accounts/contracts}/account-identity.ts (75%) rename src/lib/market/api-client/{ => accounts/contracts}/account-notifications.ts (76%) rename src/lib/market/api-client/{ => accounts/contracts}/account-sessions.ts (75%) rename src/lib/market/api-client/{ => accounts/contracts}/notification-preferences.ts (76%) rename src/lib/market/api-client/{ => accounts/contracts}/resend-account-email.ts (77%) rename src/lib/market/api-client/{ => accounts/creation}/add-account-email.ts (76%) rename src/lib/market/api-client/{ => accounts/creation}/request-password-reset.ts (76%) rename src/lib/market/api-client/{ => accounts/lifecycle}/claim-username.ts (76%) rename src/lib/market/api-client/{ => accounts/lifecycle}/complete-password-reset.ts (77%) rename src/lib/market/api-client/{ => accounts/lifecycle}/confirm-email.ts (76%) rename src/lib/market/api-client/{ => accounts/queries}/load-user-profile-by-username.ts (76%) rename src/lib/market/api-client/{ => accounts/retirement}/delete-account-email.ts (76%) rename src/lib/market/api-client/{ => accounts/retirement}/delete-current-account.ts (77%) rename src/lib/market/api-client/{ => accounts/retirement}/revoke-account-session.ts (77%) rename src/lib/market/api-client/{ => accounts/updates}/set-primary-account-email.ts (77%) rename src/lib/market/api-client/{ => accounts/updates}/update-account-password.ts (77%) rename src/lib/market/api-client/{ => accounts/updates}/update-account-profile.ts (77%) rename src/lib/market/api-client/{ => accounts/updates}/update-notification-preferences.ts (77%) rename src/lib/market/api-client/{ => capacity/accounting/queries}/list-capacity-ledger-entries.ts (77%) rename src/lib/market/api-client/{ => capacity/allocations/queries}/list-capacity-allocation-sets.ts (76%) rename src/lib/market/api-client/{ => capacity/assignments/queries}/get-provider-assignment-explanation.ts (77%) rename src/lib/market/api-client/{ => capacity/assignments/queries}/list-provider-assignments.ts (82%) rename src/lib/market/api-client/{ => capacity/observability/queries}/get-project-capacity-runtime-diagnostics.ts (77%) rename src/lib/market/api-client/{ => capacity/observability/queries}/get-project-capacity-summary.ts (77%) rename src/lib/market/api-client/{ => capacity/planning/queries}/get-capacity-plan.ts (75%) rename src/lib/market/api-client/{ => capacity/planning/queries}/list-capacity-routing-decisions-for-project.ts (77%) rename src/lib/market/api-client/{ => capacity/planning/queries}/list-decision-capacity-plans.ts (79%) rename src/lib/market/api-client/{ => capacity/providers/contracts}/auth-providers.ts (74%) rename src/lib/market/api-client/{ => capacity/providers/contracts}/unlink-account-provider.ts (76%) rename src/lib/market/api-client/{ => capacity/providers/queries}/list-provider-availability-sessions.ts (81%) rename src/lib/market/api-client/{ => capacity/workdays/creation}/create-workday-run.ts (76%) rename src/lib/market/api-client/{ => capacity/workdays/queries}/get-workday-capacity-summary.ts (75%) rename src/lib/market/api-client/{ => capacity/workdays/queries}/get-workday-run.ts (76%) rename src/lib/market/api-client/{ => capacity/workdays/queries}/list-workday-runs.ts (80%) rename src/lib/market/api-client/{ => commerce/capacity/creation}/create-commerce-capacity-listing-inquiry.ts (77%) rename src/lib/market/api-client/{ => commerce/capacity/creation}/create-commerce-capacity-listing.ts (77%) rename src/lib/market/api-client/{ => commerce/capacity/creation}/submit-commerce-capacity-listing.ts (77%) rename src/lib/market/api-client/{ => commerce/capacity/lifecycle}/approve-commerce-capacity-inquiry-for-scoping.ts (77%) rename src/lib/market/api-client/{ => commerce/capacity/lifecycle}/approve-commerce-capacity-listing.ts (77%) rename src/lib/market/api-client/{ => commerce/capacity/lifecycle}/decline-commerce-capacity-inquiry.ts (77%) rename src/lib/market/api-client/{ => commerce/capacity/lifecycle}/reject-commerce-capacity-listing.ts (77%) rename src/lib/market/api-client/{ => commerce/capacity/lifecycle}/review-commerce-capacity-inquiry.ts (77%) rename src/lib/market/api-client/{ => commerce/capacity/queries}/get-commerce-capacity-listing-for-product.ts (76%) rename src/lib/market/api-client/{ => commerce/capacity/queries}/get-commerce-capacity-listing-inquiry.ts (76%) rename src/lib/market/api-client/{ => commerce/capacity/queries}/get-commerce-capacity-listing.ts (76%) rename src/lib/market/api-client/{ => commerce/capacity/queries}/list-commerce-capacity-listing-inquiries.ts (79%) rename src/lib/market/api-client/{ => commerce/capacity/queries}/list-commerce-capacity-listings.ts (79%) rename src/lib/market/api-client/{ => commerce/capacity/retirement}/archive-commerce-capacity-listing.ts (77%) rename src/lib/market/api-client/{ => commerce/capacity/retirement}/cancel-commerce-capacity-inquiry.ts (77%) rename src/lib/market/api-client/{ => commerce/capacity/retirement}/suspend-commerce-capacity-listing.ts (77%) rename src/lib/market/api-client/{ => commerce/capacity/updates}/update-commerce-capacity-listing.ts (77%) rename src/lib/market/api-client/{ => commerce/catalog/queries}/get-catalog-item-by-slug.ts (75%) rename src/lib/market/api-client/{ => commerce/catalog/queries}/get-commerce-marketplace-product.ts (76%) rename src/lib/market/api-client/{ => commerce/catalog/queries}/get-commerce-product.ts (75%) rename src/lib/market/api-client/{ => commerce/catalog/queries}/list-catalog-items.ts (80%) rename src/lib/market/api-client/{ => commerce/catalog/queries}/list-commerce-marketplace-products.ts (79%) rename src/lib/market/api-client/{ => commerce/catalog/queries}/list-commerce-products.ts (79%) rename src/lib/market/api-client/{ => commerce/commerce-core/creation}/start-commerce-service-scoping.ts (77%) rename src/lib/market/api-client/{ => commerce/governance/updates}/update-commerce-contribution.ts (78%) rename src/lib/market/api-client/{ => commerce/governance/updates}/update-commerce-governance-policy.ts (78%) rename src/lib/market/api-client/{ => commerce/orders/creation}/create-commerce-order-refund.ts (76%) rename src/lib/market/api-client/{ => commerce/orders/lifecycle}/fulfill-commerce-order-item-artifact.ts (77%) rename src/lib/market/api-client/{ => commerce/orders/queries}/list-catalog-artifact-versions.ts (75%) rename src/lib/market/api-client/{ => commerce/ownership/contracts}/end-commerce-stewardship-assignment.ts (78%) rename src/lib/market/api-client/{ => commerce/ownership/creation}/create-commerce-succession-event.ts (77%) rename src/lib/market/api-client/{ => commerce/ownership/creation}/submit-commerce-ownership-transfer.ts (78%) rename src/lib/market/api-client/{ => commerce/ownership/lifecycle}/approve-commerce-ownership-transfer.ts (78%) rename src/lib/market/api-client/{ => commerce/ownership/lifecycle}/reject-commerce-ownership-transfer.ts (78%) rename src/lib/market/api-client/{ => commerce/ownership/queries}/get-commerce-ownership-workflow.ts (76%) rename src/lib/market/api-client/{ => commerce/ownership/queries}/list-commerce-succession-events.ts (76%) rename src/lib/market/api-client/{ => commerce/ownership/retirement}/cancel-commerce-ownership-transfer.ts (78%) rename src/lib/market/api-client/{ => commerce/ownership/updates}/update-commerce-ownership-record.ts (78%) rename src/lib/market/api-client/{ => commerce/ownership/updates}/update-commerce-stewardship-assignment.ts (78%) rename src/lib/market/api-client/{ => commerce/payments/retirement}/revoke-commerce-entitlement.ts (77%) rename src/lib/market/api-client/{ => commerce/services/contracts}/buyer-approve-commerce-service-quote.ts (77%) rename src/lib/market/api-client/{ => commerce/services/contracts}/link-commerce-service-contract-work.ts (77%) rename src/lib/market/api-client/{ => commerce/services/contracts}/vendor-approve-commerce-service-quote.ts (77%) rename src/lib/market/api-client/{ => commerce/services/creation}/create-commerce-service-quote.ts (77%) rename src/lib/market/api-client/{ => commerce/services/creation}/create-commerce-service-request.ts (75%) rename src/lib/market/api-client/{ => commerce/services/creation}/submit-commerce-service-quote.ts (77%) rename src/lib/market/api-client/{ => commerce/services/lifecycle}/fulfill-commerce-service-contract.ts (77%) rename src/lib/market/api-client/{ => commerce/services/lifecycle}/reject-commerce-service-quote.ts (77%) rename src/lib/market/api-client/{ => commerce/services/queries}/get-commerce-service-contract.ts (76%) rename src/lib/market/api-client/{ => commerce/services/queries}/get-commerce-service-request.ts (76%) rename src/lib/market/api-client/{ => commerce/services/queries}/list-commerce-service-events.ts (79%) rename src/lib/market/api-client/{ => commerce/services/queries}/list-commerce-service-quotes.ts (76%) rename src/lib/market/api-client/{ => commerce/services/queries}/list-commerce-service-requests.ts (79%) rename src/lib/market/api-client/{ => commerce/services/retirement}/cancel-commerce-service-contract.ts (77%) rename src/lib/market/api-client/{ => commerce/services/retirement}/cancel-commerce-service-request.ts (77%) rename src/lib/market/api-client/{ => commerce/services/updates}/update-commerce-service-request.ts (76%) rename src/lib/market/api-client/{ => commerce/vendors/creation}/create-commerce-vendor-stripe-login-link.ts (76%) rename src/lib/market/api-client/{ => commerce/vendors/creation}/request-commerce-vendor.ts (76%) rename src/lib/market/api-client/{ => commerce/vendors/creation}/start-commerce-vendor-stripe-onboarding.ts (77%) rename src/lib/market/api-client/{ => commerce/vendors/queries}/get-commerce-vendor-monitoring.ts (80%) rename src/lib/market/api-client/{ => commerce/vendors/queries}/get-commerce-vendor-sales-summary.ts (80%) rename src/lib/market/api-client/{ => commerce/vendors/queries}/get-commerce-vendor-stripe-status.ts (77%) rename src/lib/market/api-client/{ => commerce/vendors/queries}/get-commerce-vendor.ts (75%) rename src/lib/market/api-client/{ => commerce/vendors/queries}/list-commerce-vendor-fulfillment-events.ts (80%) rename src/lib/market/api-client/{ => commerce/vendors/queries}/list-commerce-vendor-sales-entitlements.ts (80%) rename src/lib/market/api-client/{ => commerce/vendors/queries}/list-commerce-vendor-sales-orders.ts (80%) rename src/lib/market/api-client/{ => commerce/vendors/queries}/list-commerce-vendor-sales-refunds.ts (80%) rename src/lib/market/api-client/{ => commerce/vendors/queries}/list-commerce-vendor-sales-subscriptions.ts (80%) rename src/lib/market/api-client/{ => commerce/vendors/updates}/mark-commerce-vendor-stripe-return.ts (76%) rename src/lib/market/api-client/{ => content/contracts}/validate-private-knowledge-access.ts (78%) rename src/lib/market/api-client/{ => content/queries}/list-knowledge-packs.ts (75%) rename src/lib/market/api-client/{ => content/updates}/record-private-knowledge-outcome.ts (78%) rename src/lib/market/api-client/{ => governance/commons/contracts}/answer-commons-question.ts (76%) rename src/lib/market/api-client/{ => governance/commons/contracts}/backfill-commons-participants.ts (75%) rename src/lib/market/api-client/{ => governance/commons/creation}/create-commons-proposal.ts (75%) rename src/lib/market/api-client/{ => governance/commons/creation}/start-commons-proposal-voting.ts (77%) rename src/lib/market/api-client/{ => governance/commons/lifecycle}/review-commons-proposal.ts (76%) rename src/lib/market/api-client/{ => governance/commons/lifecycle}/steward-decision-for-commons-proposal.ts (77%) rename src/lib/market/api-client/{ => governance/commons/queries}/get-commons-participant-me.ts (74%) rename src/lib/market/api-client/{ => governance/commons/queries}/get-commons-proposal.ts (75%) rename src/lib/market/api-client/{ => governance/commons/queries}/get-commons-summary.ts (74%) rename src/lib/market/api-client/{ => governance/commons/queries}/list-commons-decisions.ts (79%) rename src/lib/market/api-client/{ => governance/commons/queries}/list-commons-events.ts (79%) rename src/lib/market/api-client/{ => governance/commons/queries}/list-commons-participants.ts (80%) rename src/lib/market/api-client/{ => governance/commons/queries}/list-commons-proposals.ts (79%) rename src/lib/market/api-client/{ => governance/commons/queries}/list-commons-questions.ts (79%) rename src/lib/market/api-client/{ => hosting/queries}/get-repository-host.ts (77%) rename src/lib/market/api-client/{ => hosting/queries}/list-repository-hosts.ts (78%) rename src/lib/market/api-client/{ => projects/agents/queries}/list-project-agent-classes.ts (76%) rename src/lib/market/api-client/{ => projects/agents/queries}/list-project-agent-fallback-outputs.ts (82%) rename src/lib/market/api-client/{ => projects/agents/queries}/list-project-agent-mode-runs.ts (80%) rename src/lib/market/api-client/{ => projects/delivery/queries}/get-project-releases-summary.ts (75%) rename src/lib/market/api-client/{ => projects/deployments/queries}/get-project-deployment.ts (79%) rename src/lib/market/api-client/{ => projects/deployments/queries}/list-project-deployment-events.ts (77%) rename src/lib/market/api-client/{ => projects/deployments/queries}/list-project-deployments.ts (83%) rename src/lib/market/api-client/{ => projects/knowledge/creation}/upsert-project-tree-dx-library.ts (76%) rename src/lib/market/api-client/{ => projects/knowledge/queries}/get-project-tree-dx-library.ts (76%) rename src/lib/market/api-client/{ => projects/knowledge/queries}/list-project-tree-dx-proxy-audit.ts (81%) rename src/lib/market/api-client/{ => projects/projects-core/contracts}/evaluate-project-deletion-blockers.ts (76%) rename src/lib/market/api-client/{ => projects/projects-core/queries}/get-project-agents-summary.ts (75%) rename src/lib/market/api-client/{ => projects/projects-core/queries}/get-project-by-team-and-slug.ts (77%) rename src/lib/market/api-client/{ => projects/projects-core/queries}/get-project-details.ts (75%) rename src/lib/market/api-client/{ => projects/projects-core/queries}/get-project-summary.ts (75%) rename src/lib/market/api-client/{ => projects/projects-core/queries}/list-approval-requests-for-project.ts (77%) rename src/lib/market/api-client/{ => projects/projects-core/queries}/list-projects-for-principal.ts (74%) rename src/lib/market/api-client/{ => projects/projects-core/queries}/list-team-projects.ts (75%) rename src/lib/market/api-client/{ => projects/repositories/queries}/get-project-repository-topology.ts (76%) rename src/lib/market/api-client/{ => projects/repositories/updates}/update-project-repository-topology.ts (77%) rename src/lib/market/api-client/{ => runtime/lifecycle}/approve-device.ts (76%) rename src/lib/market/api-client/{ => seeds/queries}/list-seed-runs.ts (76%) rename src/lib/market/api-client/{ => support/contracts}/headers.ts (79%) rename src/lib/market/api-client/{ => support/contracts}/personal-themes.ts (75%) rename src/lib/market/api-client/{ => support/contracts}/request.ts (84%) rename src/lib/market/api-client/{ => support/contracts}/url.ts (75%) rename src/lib/market/api-client/{ => support/creation}/create-personal-theme.ts (76%) rename src/lib/market/api-client/{ => support/lifecycle}/decide-approval-request.ts (77%) rename src/lib/market/api-client/{ => support/queries}/get-decision-planning-status.ts (76%) rename src/lib/market/api-client/{ => support/queries}/list-audit-events-for-target.ts (78%) rename src/lib/market/api-client/{ => support/queries}/list-decision-execution-inputs.ts (76%) rename src/lib/market/api-client/{ => support/queries}/list-execution-runs.ts (86%) rename src/lib/market/api-client/{ => support/retirement}/delete-personal-theme.ts (76%) rename src/lib/market/api-client/{ => support/updates}/update-personal-theme.ts (76%) rename src/lib/market/api-client/{ => teams/contracts}/evaluate-team-deletion-blockers.ts (76%) rename src/lib/market/api-client/{ => teams/lifecycle}/accept-team-invite.ts (76%) rename src/lib/market/api-client/{ => teams/queries}/get-team-access-summary.ts (76%) rename src/lib/market/api-client/{ => teams/queries}/get-team-invite.ts (76%) rename src/lib/market/api-client/{ => teams/queries}/get-team-web-host.ts (77%) rename src/lib/market/api-client/{ => teams/queries}/list-approval-requests-for-team.ts (80%) rename src/lib/market/api-client/{ => teams/queries}/list-persisted-team-inbox-items.ts (76%) rename src/lib/market/api-client/{ => teams/queries}/list-team-members.ts (76%) rename src/lib/market/api-client/{ => teams/queries}/list-team-web-hosts.ts (76%) rename src/lib/market/api-client/{ => teams/queries}/list-teams-for-principal.ts (75%) rename src/lib/market/api-client/{ => teams/queries}/load-team-profile-by-name.ts (76%) rename src/lib/market/api-client/{ => teams/retirement}/delete-team-inbox-items-by-item-key.ts (75%) rename src/lib/market/api-client/{ => treedx/repositories/creation}/create-tree-dx-mirror.ts (76%) rename src/lib/market/api-client/{ => treedx/repositories/creation}/create-tree-dx-share.ts (76%) rename src/lib/market/api-client/{ => treedx/repositories/creation}/provision-team-tree-dx.ts (76%) rename src/lib/market/api-client/{ => treedx/repositories/queries}/get-team-tree-dx.ts (75%) rename src/lib/market/api-client/{ => treedx/repositories/queries}/list-tree-dx-mirrors.ts (75%) rename src/lib/market/api-client/{ => treedx/repositories/queries}/list-tree-dx-shares.ts (75%) rename src/lib/market/api-client/{ => treedx/repositories/updates}/update-team-tree-dx.ts (76%) diff --git a/docs/astro.config.ts b/docs/astro.config.ts index 5570b541..5deeb78b 100644 --- a/docs/astro.config.ts +++ b/docs/astro.config.ts @@ -3,6 +3,6 @@ import { fileURLToPath } from 'node:url'; process.env.TREESEED_TENANT_ROOT ??= dirname(fileURLToPath(import.meta.url)); -const { createTreeseedTenantSite } = await import('@treeseed/core/config'); +const { createTenantSite } = await import('@treeseed/core/config'); -export default createTreeseedTenantSite(); +export default createTenantSite(); diff --git a/docs/src/content.config.ts b/docs/src/content.config.ts index dbbc8749..8d960e49 100644 --- a/docs/src/content.config.ts +++ b/docs/src/content.config.ts @@ -4,6 +4,6 @@ import { fileURLToPath } from 'node:url'; const tenantRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..'); process.env.TREESEED_TENANT_ROOT ??= tenantRoot; -const { createTreeseedTenantCollections } = await import('@treeseed/core/content-config'); +const { createTenantCollections } = await import('@treeseed/core/content-config'); -export const collections = createTreeseedTenantCollections(); +export const collections = createTenantCollections(); diff --git a/guarantees/team/team/scenes/create-team.scene.yaml b/guarantees/team/scenes/create-team.scene.yaml similarity index 100% rename from guarantees/team/team/scenes/create-team.scene.yaml rename to guarantees/team/scenes/create-team.scene.yaml diff --git a/guarantees/team/team/scenes/delete-team.scene.yaml b/guarantees/team/scenes/delete-team.scene.yaml similarity index 100% rename from guarantees/team/team/scenes/delete-team.scene.yaml rename to guarantees/team/scenes/delete-team.scene.yaml diff --git a/guarantees/team/team/scenes/edit-team-settings.scene.yaml b/guarantees/team/scenes/edit-team-settings.scene.yaml similarity index 100% rename from guarantees/team/team/scenes/edit-team-settings.scene.yaml rename to guarantees/team/scenes/edit-team-settings.scene.yaml diff --git a/guarantees/team/team/scenes/switch-active-team.scene.yaml b/guarantees/team/scenes/switch-active-team.scene.yaml similarity index 100% rename from guarantees/team/team/scenes/switch-active-team.scene.yaml rename to guarantees/team/scenes/switch-active-team.scene.yaml diff --git a/guarantees/team/team/scenes/view-team-profile.scene.yaml b/guarantees/team/scenes/view-team-profile.scene.yaml similarity index 100% rename from guarantees/team/team/scenes/view-team-profile.scene.yaml rename to guarantees/team/scenes/view-team-profile.scene.yaml diff --git a/guarantees/team/team/create-team.guarantee.yaml b/guarantees/team/team/create-team.guarantee.yaml index dd7c656e..6677680f 100644 --- a/guarantees/team/team/create-team.guarantee.yaml +++ b/guarantees/team/team/create-team.guarantee.yaml @@ -33,7 +33,7 @@ preconditions: - "Journey dependencies must be satisfied: 4" scene: required: true - manifest: ./scenes/create-team.scene.yaml + manifest: ../scenes/create-team.scene.yaml mode: acceptance: true demo: true diff --git a/guarantees/team/team/delete-team.guarantee.yaml b/guarantees/team/team/delete-team.guarantee.yaml index ed6c01dd..4cffb5c9 100644 --- a/guarantees/team/team/delete-team.guarantee.yaml +++ b/guarantees/team/team/delete-team.guarantee.yaml @@ -34,7 +34,7 @@ preconditions: - "Journey dependencies must be satisfied: 12" scene: required: true - manifest: ./scenes/delete-team.scene.yaml + manifest: ../scenes/delete-team.scene.yaml mode: acceptance: true demo: true diff --git a/guarantees/team/team/edit-team-settings.guarantee.yaml b/guarantees/team/team/edit-team-settings.guarantee.yaml index 7bf0883e..5ea71ab9 100644 --- a/guarantees/team/team/edit-team-settings.guarantee.yaml +++ b/guarantees/team/team/edit-team-settings.guarantee.yaml @@ -34,7 +34,7 @@ preconditions: - "Journey dependencies must be satisfied: 12" scene: required: true - manifest: ./scenes/edit-team-settings.scene.yaml + manifest: ../scenes/edit-team-settings.scene.yaml mode: acceptance: true demo: true diff --git a/guarantees/team/team/switch-active-team.guarantee.yaml b/guarantees/team/team/switch-active-team.guarantee.yaml index f7cbc5f9..986ff559 100644 --- a/guarantees/team/team/switch-active-team.guarantee.yaml +++ b/guarantees/team/team/switch-active-team.guarantee.yaml @@ -34,7 +34,7 @@ preconditions: - "Journey dependencies must be satisfied: 12" scene: required: true - manifest: ./scenes/switch-active-team.scene.yaml + manifest: ../scenes/switch-active-team.scene.yaml mode: acceptance: true demo: true diff --git a/guarantees/team/team/view-team-profile.guarantee.yaml b/guarantees/team/team/view-team-profile.guarantee.yaml index b70d2f7b..6baacece 100644 --- a/guarantees/team/team/view-team-profile.guarantee.yaml +++ b/guarantees/team/team/view-team-profile.guarantee.yaml @@ -34,7 +34,7 @@ preconditions: - "Journey dependencies must be satisfied: 12" scene: required: true - manifest: ./scenes/view-team-profile.scene.yaml + manifest: ../scenes/view-team-profile.scene.yaml mode: acceptance: true demo: true diff --git a/package-lock.json b/package-lock.json index 4f2cd2db..a7b0c55f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,9 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#784c3b0f770a3f2252445d8da6006b884b2252b3", - "@treeseed/sdk": "github:treeseed-ai/sdk#363356034d2717f401f4cdd0c54b22c16dffc60c", - "@treeseed/ui": "github:treeseed-ai/ui#84b54513a13691dc55a5868ab2e97b3f14f83fd6", + "@treeseed/core": "github:treeseed-ai/core#3c4750cbd95d27372ebaa4f0dfeac67bb5dfeeab", + "@treeseed/sdk": "github:treeseed-ai/sdk#8f2e04cb4dac647d7aa63179dd67b5027d2e393f", + "@treeseed/ui": "github:treeseed-ai/ui#3703cb057472895d224cf99def95066aa9ea399c", "react": "^19.2.5", "react-dom": "^19.2.6" }, @@ -6932,7 +6932,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.staging.20260716T185112Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#784c3b0f770a3f2252445d8da6006b884b2252b3", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#3c4750cbd95d27372ebaa4f0dfeac67bb5dfeeab", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6943,8 +6943,8 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#363356034d2717f401f4cdd0c54b22c16dffc60c", - "@treeseed/ui": "github:treeseed-ai/ui#84b54513a13691dc55a5868ab2e97b3f14f83fd6", + "@treeseed/sdk": "github:treeseed-ai/sdk#8f2e04cb4dac647d7aa63179dd67b5027d2e393f", + "@treeseed/ui": "github:treeseed-ai/ui#3703cb057472895d224cf99def95066aa9ea399c", "astro": "^5.6.1", "esbuild": "^0.28.0", "katex": "^0.16.22", @@ -8948,7 +8948,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.staging.20260716T185056Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#363356034d2717f401f4cdd0c54b22c16dffc60c", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#8f2e04cb4dac647d7aa63179dd67b5027d2e393f", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", @@ -9645,7 +9645,7 @@ }, "node_modules/@treeseed/ui": { "version": "0.12.18-dev.staging.20260716T185026Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#84b54513a13691dc55a5868ab2e97b3f14f83fd6", + "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#3703cb057472895d224cf99def95066aa9ea399c", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", diff --git a/package.json b/package.json index f446ab61..1ea037f4 100644 --- a/package.json +++ b/package.json @@ -49,9 +49,9 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#784c3b0f770a3f2252445d8da6006b884b2252b3", - "@treeseed/sdk": "github:treeseed-ai/sdk#363356034d2717f401f4cdd0c54b22c16dffc60c", - "@treeseed/ui": "github:treeseed-ai/ui#84b54513a13691dc55a5868ab2e97b3f14f83fd6", + "@treeseed/core": "github:treeseed-ai/core#3c4750cbd95d27372ebaa4f0dfeac67bb5dfeeab", + "@treeseed/sdk": "github:treeseed-ai/sdk#8f2e04cb4dac647d7aa63179dd67b5027d2e393f", + "@treeseed/ui": "github:treeseed-ai/ui#3703cb057472895d224cf99def95066aa9ea399c", "react": "^19.2.5", "react-dom": "^19.2.6" }, diff --git a/scripts/build-dist.ts b/scripts/build-dist.ts index 043f1221..5f9a2b13 100644 --- a/scripts/build-dist.ts +++ b/scripts/build-dist.ts @@ -266,8 +266,8 @@ async function main() { emitDeclarations(); writeDeclaration('index.d.ts', "export * from './routes.js';\nexport * from './commerce.js';\nexport * from './secret-managers.js';\n"); - writeDeclaration('config.d.ts', "export { createTreeseedTenantSite as createTreeseedAdminSite } from '@treeseed/core/config';\n"); - writeDeclaration('content-config.d.ts', "export { createTreeseedTenantCollections as createTreeseedAdminCollections } from '@treeseed/core/content-config';\n"); + writeDeclaration('config.d.ts', "export { createTenantSite as createAdminSite } from '@treeseed/core/config';\n"); + writeDeclaration('content-config.d.ts', "export { createTenantCollections as createAdminCollections } from '@treeseed/core/content-config';\n"); writeDeclaration('plugin.d.ts', "declare const plugin: import('@treeseed/sdk/platform/plugin').TreeseedPlugin;\nexport default plugin;\nexport declare const ADMIN_ENV_SCHEMA: Record;\nexport declare const ADMIN_CAPABILITIES: Record;\n"); writeDeclaration('routes.d.ts', "import type { TreeseedSiteRouteContribution } from '@treeseed/sdk/platform/plugin';\nexport declare const ADMIN_ROUTES: TreeseedSiteRouteContribution[];\n"); writeDeclaration('commerce.d.ts', readFileSync(resolve(srcRoot, 'commerce.ts'), 'utf8').replace(/export const DEFAULT_ADMIN_COMMERCE_PROVIDER[\s\S]*$/u, 'export declare const DEFAULT_ADMIN_COMMERCE_PROVIDER: AdminCommerceProvider;\n')); diff --git a/scripts/check-file-architecture.ts b/scripts/check-file-architecture.ts index 56f75332..fbb627d9 100644 --- a/scripts/check-file-architecture.ts +++ b/scripts/check-file-architecture.ts @@ -1,5 +1,7 @@ import { existsSync, readFileSync } from 'node:fs'; +import { dirname } from 'node:path'; import { spawnSync } from 'node:child_process'; +import ts from 'typescript'; function repositoryFiles() { const result = spawnSync('git', ['ls-files', '-z', '--cached', '--others', '--exclude-standard'], { encoding: 'utf8' }); @@ -8,8 +10,81 @@ function repositoryFiles() { } const violations: string[] = []; +const executableExtensions = /\.(?:astro|c|cjs|cts|ex|exs|h|js|jsx|mjs|mts|py|rs|sh|ts|tsx)$/u; +const excludedSegments = new Set([ + '.astro', '.git', '.treeseed', '_build', 'build', 'coverage', 'deps', 'dist', 'generated', + 'migrations', 'node_modules', 'snapshots', 'target', 'vendor', +]); +const isExcluded = (path: string) => path.split('/').some((segment) => + excludedSegments.has(segment) || segment.startsWith('.treeseed-')); +const isExecutable = (path: string) => executableExtensions.test(path) && !isExcluded(path); +const directFileCounts = new Map(); + +function brandedIdentifier(name: string) { + if (/^TREESEED_[A-Z0-9_]+$/u.test(name)) return false; + if (/^__TREESEED_[A-Z0-9_]+__$/u.test(name)) return false; + return /(?:KnowledgeCoop|TreeSeed|Treeseed|TREESEED_)/u.test(name); +} + +function identifierText(name: ts.DeclarationName | ts.BindingName | undefined): string[] { + if (!name) return []; + if (ts.isIdentifier(name)) return [name.text]; + if (ts.isObjectBindingPattern(name) || ts.isArrayBindingPattern(name)) { + return name.elements.flatMap((element) => + ts.isBindingElement(element) ? identifierText(element.name) : []); + } + return []; +} + +function checkTypeScriptDeclarations(path: string, source: string) { + const executableSource = path.endsWith('.astro') + ? source.match(/^---\s*([\s\S]*?)\s*---/u)?.[1] ?? '' + : source; + const sourceFile = ts.createSourceFile( + path, + executableSource, + ts.ScriptTarget.Latest, + true, + path.endsWith('.tsx') ? ts.ScriptKind.TSX : ts.ScriptKind.TS, + ); + const visit = (node: ts.Node) => { + if ( + ts.isVariableDeclaration(node) + || ts.isParameter(node) + || ts.isFunctionDeclaration(node) + || ts.isClassDeclaration(node) + || ts.isInterfaceDeclaration(node) + || ts.isTypeAliasDeclaration(node) + || ts.isEnumDeclaration(node) + || ts.isMethodDeclaration(node) + || ts.isMethodSignature(node) + || ts.isPropertyDeclaration(node) + || ts.isPropertySignature(node) + || ts.isEnumMember(node) + || ts.isModuleDeclaration(node) + ) { + for (const name of identifierText(node.name)) { + if (brandedIdentifier(name)) violations.push(`${path}: redundant product name in symbol ${name}`); + } + } + ts.forEachChild(node, visit); + }; + visit(sourceFile); +} + for (const path of repositoryFiles()) { const basename = path.split('/').at(-1) ?? path; + if (isExecutable(path)) { + directFileCounts.set(dirname(path), (directFileCounts.get(dirname(path)) ?? 0) + 1); + if (/(?:knowledge[-_]?coop|tree[-_]?seed|treeseed)/iu.test(basename)) { + violations.push(`${path}: redundant product name in executable filename`); + } + } + for (const segment of path.split('/').slice(0, -1)) { + if (/^(?:chunk|module|part|section|segment)-\d+$/u.test(segment)) { + violations.push(`${path}: generic numbered directory partition ${segment}`); + } + } if (/^(?:chunk|module|part|section|segment)-\d+\./u.test(basename)) { violations.push(`${path}: generic numbered partition`); } @@ -25,14 +100,19 @@ for (const path of repositoryFiles()) { if (path.startsWith('scripts/') && /\.(?:spec|test)\.[^.]+$/u.test(basename)) { violations.push(`${path}: test belongs under tests/`); } - if (/\.(?:js|jsx|ts|tsx)$/u.test(path)) { + if (/\.(?:astro|js|jsx|ts|tsx)$/u.test(path)) { const source = readFileSync(path, 'utf8'); if (/\b(?:CLI_COMMAND_OVERLAYS|CLI_ONLY_OPERATION_SPECS|MODULE|PART)_\d+\b/u.test(source)) { violations.push(`${path}: ordinal partition symbol`); } + checkTypeScriptDeclarations(path, source); } } +for (const [directory, count] of directFileCounts) { + if (count > 10) violations.push(`${directory}: ${count} direct executable files exceeds the limit of 10`); +} + if (existsSync('test') && existsSync('tests')) { violations.push('test and tests: duplicate TypeScript test roots'); } diff --git a/src/config.ts b/src/config.ts index 4af156f8..9ddac2c6 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1 +1 @@ -export { createTreeseedTenantSite as createTreeseedAdminSite } from '@treeseed/core/config'; +export { createTenantSite as createAdminSite } from '@treeseed/core/config'; diff --git a/src/content-config.ts b/src/content-config.ts index 7d618796..a5ad33e9 100644 --- a/src/content-config.ts +++ b/src/content-config.ts @@ -1 +1 @@ -export { createTreeseedTenantCollections as createTreeseedAdminCollections } from '@treeseed/core/content-config'; +export { createTenantCollections as createAdminCollections } from '@treeseed/core/content-config'; diff --git a/src/layouts/TreeseedAppLayout.astro b/src/layouts/AppLayout.astro similarity index 96% rename from src/layouts/TreeseedAppLayout.astro rename to src/layouts/AppLayout.astro index 017a187f..4f188599 100644 --- a/src/layouts/TreeseedAppLayout.astro +++ b/src/layouts/AppLayout.astro @@ -6,11 +6,11 @@ import '@treeseed/ui/styles/forms.css'; import '@treeseed/ui/styles/app-shell.css'; import '@treeseed/ui/styles/app-controls.css'; import '@treeseed/ui/styles/auth.css'; -import ProductShell from '@treeseed/ui/components/astro/shell/ProductShell.astro'; -import { resolveAuthenticatedThemePreference } from '../lib/auth/appearance'; +import ProductShell from '@treeseed/ui/components/astro/shell/layout/ProductShell.astro'; +import { resolveAuthenticatedThemePreference } from '../lib/auth/accounts/appearance'; import { compileGuidedThemePalette } from '@treeseed/ui/theme'; import { createApiFacade } from '../lib/market/api-client'; -import { ensureCsrfToken } from '../lib/auth/csrf'; +import { ensureCsrfToken } from '../lib/auth/support/csrf'; interface TeamEntry { id: string; diff --git a/src/layouts/TreeseedPublicLayout.astro b/src/layouts/PublicLayout.astro similarity index 82% rename from src/layouts/TreeseedPublicLayout.astro rename to src/layouts/PublicLayout.astro index a06b16b3..0e8598c4 100644 --- a/src/layouts/TreeseedPublicLayout.astro +++ b/src/layouts/PublicLayout.astro @@ -5,10 +5,10 @@ import '@treeseed/ui/styles/ui.css'; import '@treeseed/ui/styles/forms.css'; import '@treeseed/ui/styles/app-shell.css'; import '@treeseed/ui/styles/site.css'; -import PublicShell from '@treeseed/ui/components/astro/shell/PublicShell.astro'; -import PublicFooter from '@treeseed/ui/components/astro/shell/PublicFooter.astro'; -import ShellIconLink from '@treeseed/ui/components/astro/shell/ShellIconLink.astro'; -import { resolveAnonymousThemePreference, resolveAuthenticatedThemePreference } from '../lib/auth/appearance'; +import PublicShell from '@treeseed/ui/components/astro/shell/layout/PublicShell.astro'; +import PublicFooter from '@treeseed/ui/components/astro/shell/chrome/PublicFooter.astro'; +import ShellIconLink from '@treeseed/ui/components/astro/shell/navigation/ShellIconLink.astro'; +import { resolveAnonymousThemePreference, resolveAuthenticatedThemePreference } from '../lib/auth/accounts/appearance'; interface Props { title?: string; diff --git a/src/lib/auth/account.ts b/src/lib/auth/accounts/account.ts similarity index 93% rename from src/lib/auth/account.ts rename to src/lib/auth/accounts/account.ts index ec620807..65999555 100644 --- a/src/lib/auth/account.ts +++ b/src/lib/auth/accounts/account.ts @@ -4,8 +4,8 @@ import { normalizeUsername, validateUsername, type UsernameValidationResult, -} from './profile-validation.ts'; -import { DELETE_ACCOUNT_CONFIRMATION } from './delete-confirmation.ts'; +} from '../support/profile-validation.ts'; +import { DELETE_ACCOUNT_CONFIRMATION } from '../support/delete-confirmation.ts'; export { RESERVED_USERNAMES, composeDisplayNameFromParts, normalizeUsername, validateUsername }; export type { UsernameValidationResult }; diff --git a/src/lib/auth/appearance.ts b/src/lib/auth/accounts/appearance.ts similarity index 87% rename from src/lib/auth/appearance.ts rename to src/lib/auth/accounts/appearance.ts index 075eeece..a1bc605d 100644 --- a/src/lib/auth/appearance.ts +++ b/src/lib/auth/accounts/appearance.ts @@ -4,8 +4,8 @@ import { } from '@treeseed/ui/theme'; import type { APIContext } from 'astro'; -export const TREESEED_COLOR_SCHEME_COOKIE = 'treeseed_color_scheme'; -export const TREESEED_THEME_MODE_COOKIE = 'treeseed_theme_mode'; +export const COLOR_SCHEME_COOKIE = 'treeseed_color_scheme'; +export const THEME_MODE_COOKIE = 'treeseed_theme_mode'; export type AnonymousAppearanceContext = { url: URL; @@ -25,10 +25,10 @@ export function resolveAnonymousThemePreference( return normalizeThemePreference({ scheme: form?.get('colorScheme') ?? context.url.searchParams.get('colorScheme') - ?? context.cookies.get(TREESEED_COLOR_SCHEME_COOKIE)?.value, + ?? context.cookies.get(COLOR_SCHEME_COOKIE)?.value, mode: form?.get('themeMode') ?? context.url.searchParams.get('themeMode') - ?? context.cookies.get(TREESEED_THEME_MODE_COOKIE)?.value, + ?? context.cookies.get(THEME_MODE_COOKIE)?.value, }); } @@ -46,8 +46,8 @@ export function setAnonymousThemeCookies( preference: ThemePreference, ) { const options = anonymousThemeCookieOptions(context); - context.cookies.set(TREESEED_COLOR_SCHEME_COOKIE, preference.scheme, options); - context.cookies.set(TREESEED_THEME_MODE_COOKIE, preference.mode, options); + context.cookies.set(COLOR_SCHEME_COOKIE, preference.scheme, options); + context.cookies.set(THEME_MODE_COOKIE, preference.mode, options); } function appearanceFromPrincipal(context: Pick): ThemePreference | null { diff --git a/src/lib/auth/email-confirmation.ts b/src/lib/auth/accounts/email-confirmation.ts similarity index 100% rename from src/lib/auth/email-confirmation.ts rename to src/lib/auth/accounts/email-confirmation.ts diff --git a/src/lib/auth/email.ts b/src/lib/auth/accounts/email.ts similarity index 99% rename from src/lib/auth/email.ts rename to src/lib/auth/accounts/email.ts index 4045f282..abf065e0 100644 --- a/src/lib/auth/email.ts +++ b/src/lib/auth/accounts/email.ts @@ -1,5 +1,5 @@ import type { APIContext } from 'astro'; -import { getSiteAuthConfig } from './config.ts'; +import { getSiteAuthConfig } from '../configuration/config.ts'; interface AuthEmailMessage { to: string; diff --git a/src/lib/auth/password-policy.ts b/src/lib/auth/accounts/password-policy.ts similarity index 100% rename from src/lib/auth/password-policy.ts rename to src/lib/auth/accounts/password-policy.ts diff --git a/src/lib/auth/welcome-email.ts b/src/lib/auth/accounts/welcome-email.ts similarity index 98% rename from src/lib/auth/welcome-email.ts rename to src/lib/auth/accounts/welcome-email.ts index d5117cf2..331dd495 100644 --- a/src/lib/auth/welcome-email.ts +++ b/src/lib/auth/accounts/welcome-email.ts @@ -2,7 +2,7 @@ import React from 'react'; import { render } from '@react-email/render'; import type { APIContext } from 'astro'; import { sendAuthEmail } from './email.ts'; -import { getSiteAuthConfig } from './config.ts'; +import { getSiteAuthConfig } from '../configuration/config.ts'; interface WelcomeEmailInput { email: string; diff --git a/src/lib/auth/config.ts b/src/lib/auth/configuration/config.ts similarity index 100% rename from src/lib/auth/config.ts rename to src/lib/auth/configuration/config.ts diff --git a/src/lib/auth/csrf.ts b/src/lib/auth/support/csrf.ts similarity index 93% rename from src/lib/auth/csrf.ts rename to src/lib/auth/support/csrf.ts index 859d7213..3c1717b6 100644 --- a/src/lib/auth/csrf.ts +++ b/src/lib/auth/support/csrf.ts @@ -1,6 +1,6 @@ import type { APIContext } from 'astro'; import { randomBytes, timingSafeEqual } from 'node:crypto'; -import { WEB_CSRF_COOKIE, csrfCookieOptions } from './config'; +import { WEB_CSRF_COOKIE, csrfCookieOptions } from '../configuration/config'; export const WEB_CSRF_HEADER = 'x-treeseed-csrf'; diff --git a/src/lib/auth/delete-confirmation.ts b/src/lib/auth/support/delete-confirmation.ts similarity index 100% rename from src/lib/auth/delete-confirmation.ts rename to src/lib/auth/support/delete-confirmation.ts diff --git a/src/lib/auth/flow.ts b/src/lib/auth/support/flow.ts similarity index 96% rename from src/lib/auth/flow.ts rename to src/lib/auth/support/flow.ts index 686f2699..2b80dead 100644 --- a/src/lib/auth/flow.ts +++ b/src/lib/auth/support/flow.ts @@ -1,7 +1,7 @@ import type { APIContext } from 'astro'; -import { getSiteAuthConfig } from './config.ts'; -import { setPrincipalThemeCookies } from './appearance.ts'; -import { resolveApiBaseUrl, setApiAccessTokenCookie } from '../market/api-client.ts'; +import { getSiteAuthConfig } from '../configuration/config.ts'; +import { setPrincipalThemeCookies } from '../accounts/appearance.ts'; +import { resolveApiBaseUrl, setApiAccessTokenCookie } from '../../market/api-client.ts'; export const SUPPORTED_AUTH_PROVIDERS = ['github', 'google', 'microsoft', 'apple'] as const; export type SupportedAuthProvider = (typeof SUPPORTED_AUTH_PROVIDERS)[number]; diff --git a/src/lib/auth/profile-validation.ts b/src/lib/auth/support/profile-validation.ts similarity index 100% rename from src/lib/auth/profile-validation.ts rename to src/lib/auth/support/profile-validation.ts diff --git a/src/lib/market/api-client.ts b/src/lib/market/api-client.ts index 9a1510aa..10a10989 100644 --- a/src/lib/market/api-client.ts +++ b/src/lib/market/api-client.ts @@ -1,6 +1,6 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from '../auth/config'; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from '../auth/configuration/config'; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; export type AstroLike = Pick; export const API_SESSION_COOKIE = 'ts_market_api_access'; @@ -85,7 +85,7 @@ export function apiServiceHeaders(context: Pick, o const config = getSiteAuthConfig(context); const headers = new Headers({ accept: 'application/json', - [TREESEED_REMOTE_CONTRACT_HEADER]: String(TREESEED_REMOTE_CONTRACT_VERSION), + [REMOTE_CONTRACT_HEADER]: String(REMOTE_CONTRACT_VERSION), }); const assertion = options.skipUserAssertion ? null : createTrustedWebUserAssertion(context); if (assertion || options.forceService) { diff --git a/src/lib/market/api-client/account-deletion-blockers.ts b/src/lib/market/api-client/accounts/contracts/account-deletion-blockers.ts similarity index 76% rename from src/lib/market/api-client/account-deletion-blockers.ts rename to src/lib/market/api-client/accounts/contracts/account-deletion-blockers.ts index a8a5a0f4..fd412672 100644 --- a/src/lib/market/api-client/account-deletion-blockers.ts +++ b/src/lib/market/api-client/accounts/contracts/account-deletion-blockers.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export function accountDeletionBlockersMethod(this: ApiClientFacade) { return this.request<{ blockers: AccountDeletionBlocker[]; canDelete: boolean; diff --git a/src/lib/market/api-client/account-identity.ts b/src/lib/market/api-client/accounts/contracts/account-identity.ts similarity index 75% rename from src/lib/market/api-client/account-identity.ts rename to src/lib/market/api-client/accounts/contracts/account-identity.ts index bc7ebe26..aa1f90b5 100644 --- a/src/lib/market/api-client/account-identity.ts +++ b/src/lib/market/api-client/accounts/contracts/account-identity.ts @@ -1,7 +1,7 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export function accountIdentityMethod(this: ApiClientFacade) { return this.request('GET', '/v1/auth/web/account/identity'); } diff --git a/src/lib/market/api-client/account-notifications.ts b/src/lib/market/api-client/accounts/contracts/account-notifications.ts similarity index 76% rename from src/lib/market/api-client/account-notifications.ts rename to src/lib/market/api-client/accounts/contracts/account-notifications.ts index 72cbc130..aeb9b124 100644 --- a/src/lib/market/api-client/account-notifications.ts +++ b/src/lib/market/api-client/accounts/contracts/account-notifications.ts @@ -1,7 +1,7 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export function accountNotificationsMethod(this: ApiClientFacade, limit = 20) { return this.request('GET', `/v1/auth/web/notifications?limit=${encodeURIComponent(String(limit))}`); } diff --git a/src/lib/market/api-client/account-sessions.ts b/src/lib/market/api-client/accounts/contracts/account-sessions.ts similarity index 75% rename from src/lib/market/api-client/account-sessions.ts rename to src/lib/market/api-client/accounts/contracts/account-sessions.ts index 580e0bf7..88517750 100644 --- a/src/lib/market/api-client/account-sessions.ts +++ b/src/lib/market/api-client/accounts/contracts/account-sessions.ts @@ -1,7 +1,7 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export function accountSessionsMethod(this: ApiClientFacade) { return this.request('GET', '/v1/auth/web/sessions'); } diff --git a/src/lib/market/api-client/notification-preferences.ts b/src/lib/market/api-client/accounts/contracts/notification-preferences.ts similarity index 76% rename from src/lib/market/api-client/notification-preferences.ts rename to src/lib/market/api-client/accounts/contracts/notification-preferences.ts index 1a0fa50d..b70f74f6 100644 --- a/src/lib/market/api-client/notification-preferences.ts +++ b/src/lib/market/api-client/accounts/contracts/notification-preferences.ts @@ -1,7 +1,7 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export function notificationPreferencesMethod(this: ApiClientFacade) { return this.request('GET', '/v1/auth/web/notifications/preferences'); } diff --git a/src/lib/market/api-client/resend-account-email.ts b/src/lib/market/api-client/accounts/contracts/resend-account-email.ts similarity index 77% rename from src/lib/market/api-client/resend-account-email.ts rename to src/lib/market/api-client/accounts/contracts/resend-account-email.ts index 33862ab9..75c5cffe 100644 --- a/src/lib/market/api-client/resend-account-email.ts +++ b/src/lib/market/api-client/accounts/contracts/resend-account-email.ts @@ -1,7 +1,7 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export function resendAccountEmailMethod(this: ApiClientFacade, emailId: string) { return this.request('POST', `/v1/auth/web/emails/${encodeURIComponent(emailId)}/verify`, { body: {} }); } diff --git a/src/lib/market/api-client/add-account-email.ts b/src/lib/market/api-client/accounts/creation/add-account-email.ts similarity index 76% rename from src/lib/market/api-client/add-account-email.ts rename to src/lib/market/api-client/accounts/creation/add-account-email.ts index d333bd06..489a885c 100644 --- a/src/lib/market/api-client/add-account-email.ts +++ b/src/lib/market/api-client/accounts/creation/add-account-email.ts @@ -1,7 +1,7 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export function addAccountEmailMethod(this: ApiClientFacade, email: string) { return this.request('POST', '/v1/auth/web/emails', { body: { email } }); } diff --git a/src/lib/market/api-client/request-password-reset.ts b/src/lib/market/api-client/accounts/creation/request-password-reset.ts similarity index 76% rename from src/lib/market/api-client/request-password-reset.ts rename to src/lib/market/api-client/accounts/creation/request-password-reset.ts index 1092ff11..d7258f57 100644 --- a/src/lib/market/api-client/request-password-reset.ts +++ b/src/lib/market/api-client/accounts/creation/request-password-reset.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export function requestPasswordResetMethod(this: ApiClientFacade, email: string) { return this.request<{ accepted: true; }>('POST', '/v1/auth/web/password-reset/request', { body: { email } }); } diff --git a/src/lib/market/api-client/claim-username.ts b/src/lib/market/api-client/accounts/lifecycle/claim-username.ts similarity index 76% rename from src/lib/market/api-client/claim-username.ts rename to src/lib/market/api-client/accounts/lifecycle/claim-username.ts index 3e7d3d44..fbfa8211 100644 --- a/src/lib/market/api-client/claim-username.ts +++ b/src/lib/market/api-client/accounts/lifecycle/claim-username.ts @@ -1,7 +1,7 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export function claimUsernameMethod(this: ApiClientFacade, username: string) { return this.request('PATCH', '/v1/auth/web/username', { body: { username } }); } diff --git a/src/lib/market/api-client/complete-password-reset.ts b/src/lib/market/api-client/accounts/lifecycle/complete-password-reset.ts similarity index 77% rename from src/lib/market/api-client/complete-password-reset.ts rename to src/lib/market/api-client/accounts/lifecycle/complete-password-reset.ts index 399ebac7..24028844 100644 --- a/src/lib/market/api-client/complete-password-reset.ts +++ b/src/lib/market/api-client/accounts/lifecycle/complete-password-reset.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export function completePasswordResetMethod(this: ApiClientFacade, token: string, newPassword: string) { return this.request<{ changed: true; }>('POST', '/v1/auth/web/password-reset/complete', { body: { token, newPassword } }); } diff --git a/src/lib/market/api-client/confirm-email.ts b/src/lib/market/api-client/accounts/lifecycle/confirm-email.ts similarity index 76% rename from src/lib/market/api-client/confirm-email.ts rename to src/lib/market/api-client/accounts/lifecycle/confirm-email.ts index 9c9c8e7a..3c7adae1 100644 --- a/src/lib/market/api-client/confirm-email.ts +++ b/src/lib/market/api-client/accounts/lifecycle/confirm-email.ts @@ -1,7 +1,7 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export function confirmEmailMethod(this: ApiClientFacade, token: string) { return this.request('POST', '/v1/auth/web/confirm-email', { body: { token } }); } diff --git a/src/lib/market/api-client/load-user-profile-by-username.ts b/src/lib/market/api-client/accounts/queries/load-user-profile-by-username.ts similarity index 76% rename from src/lib/market/api-client/load-user-profile-by-username.ts rename to src/lib/market/api-client/accounts/queries/load-user-profile-by-username.ts index 2bbc2679..a0ddd1d9 100644 --- a/src/lib/market/api-client/load-user-profile-by-username.ts +++ b/src/lib/market/api-client/accounts/queries/load-user-profile-by-username.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export function loadUserProfileByUsernameMethod(this: ApiClientFacade, username: string) { return this.request('GET', `/v1/users/by-username/${encodeURIComponent(username)}/profile`).catch(() => null); } diff --git a/src/lib/market/api-client/delete-account-email.ts b/src/lib/market/api-client/accounts/retirement/delete-account-email.ts similarity index 76% rename from src/lib/market/api-client/delete-account-email.ts rename to src/lib/market/api-client/accounts/retirement/delete-account-email.ts index a4d1c3d9..9d9c3b84 100644 --- a/src/lib/market/api-client/delete-account-email.ts +++ b/src/lib/market/api-client/accounts/retirement/delete-account-email.ts @@ -1,7 +1,7 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export function deleteAccountEmailMethod(this: ApiClientFacade, emailId: string) { return this.request('DELETE', `/v1/auth/web/emails/${encodeURIComponent(emailId)}`); } diff --git a/src/lib/market/api-client/delete-current-account.ts b/src/lib/market/api-client/accounts/retirement/delete-current-account.ts similarity index 77% rename from src/lib/market/api-client/delete-current-account.ts rename to src/lib/market/api-client/accounts/retirement/delete-current-account.ts index b6f558ce..57c26beb 100644 --- a/src/lib/market/api-client/delete-current-account.ts +++ b/src/lib/market/api-client/accounts/retirement/delete-current-account.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export function deleteCurrentAccountMethod(this: ApiClientFacade, body: { confirmation: string; currentPassword?: string; diff --git a/src/lib/market/api-client/revoke-account-session.ts b/src/lib/market/api-client/accounts/retirement/revoke-account-session.ts similarity index 77% rename from src/lib/market/api-client/revoke-account-session.ts rename to src/lib/market/api-client/accounts/retirement/revoke-account-session.ts index d16d6702..11f1ec16 100644 --- a/src/lib/market/api-client/revoke-account-session.ts +++ b/src/lib/market/api-client/accounts/retirement/revoke-account-session.ts @@ -1,7 +1,7 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export function revokeAccountSessionMethod(this: ApiClientFacade, sessionId: string) { return this.request('POST', `/v1/auth/web/sessions/${encodeURIComponent(sessionId)}/revoke`, { body: {} }); } diff --git a/src/lib/market/api-client/set-primary-account-email.ts b/src/lib/market/api-client/accounts/updates/set-primary-account-email.ts similarity index 77% rename from src/lib/market/api-client/set-primary-account-email.ts rename to src/lib/market/api-client/accounts/updates/set-primary-account-email.ts index 0b1bf7fa..234a271d 100644 --- a/src/lib/market/api-client/set-primary-account-email.ts +++ b/src/lib/market/api-client/accounts/updates/set-primary-account-email.ts @@ -1,7 +1,7 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export function setPrimaryAccountEmailMethod(this: ApiClientFacade, emailId: string) { return this.request('POST', `/v1/auth/web/emails/${encodeURIComponent(emailId)}/primary`, { body: {} }); } diff --git a/src/lib/market/api-client/update-account-password.ts b/src/lib/market/api-client/accounts/updates/update-account-password.ts similarity index 77% rename from src/lib/market/api-client/update-account-password.ts rename to src/lib/market/api-client/accounts/updates/update-account-password.ts index bbba34eb..7a67ed92 100644 --- a/src/lib/market/api-client/update-account-password.ts +++ b/src/lib/market/api-client/accounts/updates/update-account-password.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export function updateAccountPasswordMethod(this: ApiClientFacade, body: { currentPassword?: string; password: string; diff --git a/src/lib/market/api-client/update-account-profile.ts b/src/lib/market/api-client/accounts/updates/update-account-profile.ts similarity index 77% rename from src/lib/market/api-client/update-account-profile.ts rename to src/lib/market/api-client/accounts/updates/update-account-profile.ts index cbd8eb58..cea6d8a3 100644 --- a/src/lib/market/api-client/update-account-profile.ts +++ b/src/lib/market/api-client/accounts/updates/update-account-profile.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export function updateAccountProfileMethod(this: ApiClientFacade, body: { firstName: string; lastName: string; diff --git a/src/lib/market/api-client/update-notification-preferences.ts b/src/lib/market/api-client/accounts/updates/update-notification-preferences.ts similarity index 77% rename from src/lib/market/api-client/update-notification-preferences.ts rename to src/lib/market/api-client/accounts/updates/update-notification-preferences.ts index 57f07aa9..4600617b 100644 --- a/src/lib/market/api-client/update-notification-preferences.ts +++ b/src/lib/market/api-client/accounts/updates/update-notification-preferences.ts @@ -1,7 +1,7 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export function updateNotificationPreferencesMethod(this: ApiClientFacade, body: NotificationPreferences) { return this.request('PUT', '/v1/auth/web/notifications/preferences', { body }); } diff --git a/src/lib/market/api-client/list-capacity-ledger-entries.ts b/src/lib/market/api-client/capacity/accounting/queries/list-capacity-ledger-entries.ts similarity index 77% rename from src/lib/market/api-client/list-capacity-ledger-entries.ts rename to src/lib/market/api-client/capacity/accounting/queries/list-capacity-ledger-entries.ts index 15346f21..28a1bec4 100644 --- a/src/lib/market/api-client/list-capacity-ledger-entries.ts +++ b/src/lib/market/api-client/capacity/accounting/queries/list-capacity-ledger-entries.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function listCapacityLedgerEntriesMethod(this: ApiClientFacade, projectId: string, workdayId: string) { return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/capacity/ledger?workdayId=${encodeURIComponent(workdayId)}`); } diff --git a/src/lib/market/api-client/list-capacity-allocation-sets.ts b/src/lib/market/api-client/capacity/allocations/queries/list-capacity-allocation-sets.ts similarity index 76% rename from src/lib/market/api-client/list-capacity-allocation-sets.ts rename to src/lib/market/api-client/capacity/allocations/queries/list-capacity-allocation-sets.ts index c8bfbb79..8f7323be 100644 --- a/src/lib/market/api-client/list-capacity-allocation-sets.ts +++ b/src/lib/market/api-client/capacity/allocations/queries/list-capacity-allocation-sets.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function listCapacityAllocationSetsMethod(this: ApiClientFacade, teamId: string) { return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/capacity/allocation-sets`); } diff --git a/src/lib/market/api-client/get-provider-assignment-explanation.ts b/src/lib/market/api-client/capacity/assignments/queries/get-provider-assignment-explanation.ts similarity index 77% rename from src/lib/market/api-client/get-provider-assignment-explanation.ts rename to src/lib/market/api-client/capacity/assignments/queries/get-provider-assignment-explanation.ts index 8c57e364..ae0ab64e 100644 --- a/src/lib/market/api-client/get-provider-assignment-explanation.ts +++ b/src/lib/market/api-client/capacity/assignments/queries/get-provider-assignment-explanation.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function getProviderAssignmentExplanationMethod(this: ApiClientFacade, teamId: string, assignmentId: string) { return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/capacity/assignments/${encodeURIComponent(assignmentId)}/explanation`); } diff --git a/src/lib/market/api-client/list-provider-assignments.ts b/src/lib/market/api-client/capacity/assignments/queries/list-provider-assignments.ts similarity index 82% rename from src/lib/market/api-client/list-provider-assignments.ts rename to src/lib/market/api-client/capacity/assignments/queries/list-provider-assignments.ts index 4984de1a..60b7d90d 100644 --- a/src/lib/market/api-client/list-provider-assignments.ts +++ b/src/lib/market/api-client/capacity/assignments/queries/list-provider-assignments.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function listProviderAssignmentsMethod(this: ApiClientFacade, teamId: string, filters: { projectId?: string | null; providerId?: string | null; diff --git a/src/lib/market/api-client/get-project-capacity-runtime-diagnostics.ts b/src/lib/market/api-client/capacity/observability/queries/get-project-capacity-runtime-diagnostics.ts similarity index 77% rename from src/lib/market/api-client/get-project-capacity-runtime-diagnostics.ts rename to src/lib/market/api-client/capacity/observability/queries/get-project-capacity-runtime-diagnostics.ts index deff8865..f7430004 100644 --- a/src/lib/market/api-client/get-project-capacity-runtime-diagnostics.ts +++ b/src/lib/market/api-client/capacity/observability/queries/get-project-capacity-runtime-diagnostics.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function getProjectCapacityRuntimeDiagnosticsMethod(this: ApiClientFacade, projectId: string, teamId: string) { const query = new URLSearchParams({ teamId }); return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/capacity-runtime-diagnostics?${query}`); diff --git a/src/lib/market/api-client/get-project-capacity-summary.ts b/src/lib/market/api-client/capacity/observability/queries/get-project-capacity-summary.ts similarity index 77% rename from src/lib/market/api-client/get-project-capacity-summary.ts rename to src/lib/market/api-client/capacity/observability/queries/get-project-capacity-summary.ts index b708c91d..fbe78fbd 100644 --- a/src/lib/market/api-client/get-project-capacity-summary.ts +++ b/src/lib/market/api-client/capacity/observability/queries/get-project-capacity-summary.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function getProjectCapacitySummaryMethod(this: ApiClientFacade, projectId: string, environment = 'staging') { return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/capacity?environment=${encodeURIComponent(environment)}`); } diff --git a/src/lib/market/api-client/get-capacity-plan.ts b/src/lib/market/api-client/capacity/planning/queries/get-capacity-plan.ts similarity index 75% rename from src/lib/market/api-client/get-capacity-plan.ts rename to src/lib/market/api-client/capacity/planning/queries/get-capacity-plan.ts index 3d85e219..83e78754 100644 --- a/src/lib/market/api-client/get-capacity-plan.ts +++ b/src/lib/market/api-client/capacity/planning/queries/get-capacity-plan.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function getCapacityPlanMethod(this: ApiClientFacade, capacityPlanId: string) { return this.request('GET', `/v1/capacity-plans/${encodeURIComponent(capacityPlanId)}`); } diff --git a/src/lib/market/api-client/list-capacity-routing-decisions-for-project.ts b/src/lib/market/api-client/capacity/planning/queries/list-capacity-routing-decisions-for-project.ts similarity index 77% rename from src/lib/market/api-client/list-capacity-routing-decisions-for-project.ts rename to src/lib/market/api-client/capacity/planning/queries/list-capacity-routing-decisions-for-project.ts index 3578321f..abe2fbad 100644 --- a/src/lib/market/api-client/list-capacity-routing-decisions-for-project.ts +++ b/src/lib/market/api-client/capacity/planning/queries/list-capacity-routing-decisions-for-project.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function listCapacityRoutingDecisionsForProjectMethod(this: ApiClientFacade, projectId: string, limit = 100) { return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/capacity/routing-decisions?limit=${encodeURIComponent(String(limit))}`); } diff --git a/src/lib/market/api-client/list-decision-capacity-plans.ts b/src/lib/market/api-client/capacity/planning/queries/list-decision-capacity-plans.ts similarity index 79% rename from src/lib/market/api-client/list-decision-capacity-plans.ts rename to src/lib/market/api-client/capacity/planning/queries/list-decision-capacity-plans.ts index 407a4f32..ce64516f 100644 --- a/src/lib/market/api-client/list-decision-capacity-plans.ts +++ b/src/lib/market/api-client/capacity/planning/queries/list-decision-capacity-plans.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function listDecisionCapacityPlansMethod(this: ApiClientFacade, decisionId: string, filters: { status?: string | null; } = {}) { diff --git a/src/lib/market/api-client/auth-providers.ts b/src/lib/market/api-client/capacity/providers/contracts/auth-providers.ts similarity index 74% rename from src/lib/market/api-client/auth-providers.ts rename to src/lib/market/api-client/capacity/providers/contracts/auth-providers.ts index 83fbc25f..6c8d0864 100644 --- a/src/lib/market/api-client/auth-providers.ts +++ b/src/lib/market/api-client/capacity/providers/contracts/auth-providers.ts @@ -1,7 +1,7 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function authProvidersMethod(this: ApiClientFacade) { return this.request('GET', '/v1/auth/providers'); } diff --git a/src/lib/market/api-client/unlink-account-provider.ts b/src/lib/market/api-client/capacity/providers/contracts/unlink-account-provider.ts similarity index 76% rename from src/lib/market/api-client/unlink-account-provider.ts rename to src/lib/market/api-client/capacity/providers/contracts/unlink-account-provider.ts index 49e748c8..19fcfd30 100644 --- a/src/lib/market/api-client/unlink-account-provider.ts +++ b/src/lib/market/api-client/capacity/providers/contracts/unlink-account-provider.ts @@ -1,7 +1,7 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function unlinkAccountProviderMethod(this: ApiClientFacade, identityId: string) { return this.request('DELETE', `/v1/auth/web/providers/${encodeURIComponent(identityId)}`); } diff --git a/src/lib/market/api-client/list-provider-availability-sessions.ts b/src/lib/market/api-client/capacity/providers/queries/list-provider-availability-sessions.ts similarity index 81% rename from src/lib/market/api-client/list-provider-availability-sessions.ts rename to src/lib/market/api-client/capacity/providers/queries/list-provider-availability-sessions.ts index 65da33be..c9bb29ca 100644 --- a/src/lib/market/api-client/list-provider-availability-sessions.ts +++ b/src/lib/market/api-client/capacity/providers/queries/list-provider-availability-sessions.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function listProviderAvailabilitySessionsMethod(this: ApiClientFacade, teamId: string, filters: { providerId?: string | null; status?: string | null; diff --git a/src/lib/market/api-client/create-workday-run.ts b/src/lib/market/api-client/capacity/workdays/creation/create-workday-run.ts similarity index 76% rename from src/lib/market/api-client/create-workday-run.ts rename to src/lib/market/api-client/capacity/workdays/creation/create-workday-run.ts index 15c92a94..59557130 100644 --- a/src/lib/market/api-client/create-workday-run.ts +++ b/src/lib/market/api-client/capacity/workdays/creation/create-workday-run.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function createWorkdayRunMethod(this: ApiClientFacade, teamId: string, body: Record) { return this.request('POST', `/v1/teams/${encodeURIComponent(teamId)}/workday-runs`, { body }); } diff --git a/src/lib/market/api-client/get-workday-capacity-summary.ts b/src/lib/market/api-client/capacity/workdays/queries/get-workday-capacity-summary.ts similarity index 75% rename from src/lib/market/api-client/get-workday-capacity-summary.ts rename to src/lib/market/api-client/capacity/workdays/queries/get-workday-capacity-summary.ts index 15809f8a..b53955b8 100644 --- a/src/lib/market/api-client/get-workday-capacity-summary.ts +++ b/src/lib/market/api-client/capacity/workdays/queries/get-workday-capacity-summary.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function getWorkdayCapacitySummaryMethod(this: ApiClientFacade, workdayId: string) { return this.request('GET', `/v1/workdays/${encodeURIComponent(workdayId)}/summary`); } diff --git a/src/lib/market/api-client/get-workday-run.ts b/src/lib/market/api-client/capacity/workdays/queries/get-workday-run.ts similarity index 76% rename from src/lib/market/api-client/get-workday-run.ts rename to src/lib/market/api-client/capacity/workdays/queries/get-workday-run.ts index bf56fff4..7640ec69 100644 --- a/src/lib/market/api-client/get-workday-run.ts +++ b/src/lib/market/api-client/capacity/workdays/queries/get-workday-run.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function getWorkdayRunMethod(this: ApiClientFacade, teamId: string, runId: string) { return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/workday-runs/${encodeURIComponent(runId)}`); } diff --git a/src/lib/market/api-client/list-workday-runs.ts b/src/lib/market/api-client/capacity/workdays/queries/list-workday-runs.ts similarity index 80% rename from src/lib/market/api-client/list-workday-runs.ts rename to src/lib/market/api-client/capacity/workdays/queries/list-workday-runs.ts index d9a092c0..09518a16 100644 --- a/src/lib/market/api-client/list-workday-runs.ts +++ b/src/lib/market/api-client/capacity/workdays/queries/list-workday-runs.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function listWorkdayRunsMethod(this: ApiClientFacade, teamId: string, filters: { status?: string | null; providerId?: string | null; diff --git a/src/lib/market/api-client/create-commerce-capacity-listing-inquiry.ts b/src/lib/market/api-client/commerce/capacity/creation/create-commerce-capacity-listing-inquiry.ts similarity index 77% rename from src/lib/market/api-client/create-commerce-capacity-listing-inquiry.ts rename to src/lib/market/api-client/commerce/capacity/creation/create-commerce-capacity-listing-inquiry.ts index 120e51ca..eb46d231 100644 --- a/src/lib/market/api-client/create-commerce-capacity-listing-inquiry.ts +++ b/src/lib/market/api-client/commerce/capacity/creation/create-commerce-capacity-listing-inquiry.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function createCommerceCapacityListingInquiryMethod(this: ApiClientFacade, listingId: string, body: Record) { return this.request('POST', `/v1/commerce/capacity-listings/${encodeURIComponent(listingId)}/inquiries`, { body }); } diff --git a/src/lib/market/api-client/create-commerce-capacity-listing.ts b/src/lib/market/api-client/commerce/capacity/creation/create-commerce-capacity-listing.ts similarity index 77% rename from src/lib/market/api-client/create-commerce-capacity-listing.ts rename to src/lib/market/api-client/commerce/capacity/creation/create-commerce-capacity-listing.ts index f59de4fb..8b8c2f47 100644 --- a/src/lib/market/api-client/create-commerce-capacity-listing.ts +++ b/src/lib/market/api-client/commerce/capacity/creation/create-commerce-capacity-listing.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function createCommerceCapacityListingMethod(this: ApiClientFacade, productId: string, body: Record) { return this.request('POST', `/v1/commerce/products/${encodeURIComponent(productId)}/capacity-listing`, { body }); } diff --git a/src/lib/market/api-client/submit-commerce-capacity-listing.ts b/src/lib/market/api-client/commerce/capacity/creation/submit-commerce-capacity-listing.ts similarity index 77% rename from src/lib/market/api-client/submit-commerce-capacity-listing.ts rename to src/lib/market/api-client/commerce/capacity/creation/submit-commerce-capacity-listing.ts index 1f49ffca..2761dd70 100644 --- a/src/lib/market/api-client/submit-commerce-capacity-listing.ts +++ b/src/lib/market/api-client/commerce/capacity/creation/submit-commerce-capacity-listing.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function submitCommerceCapacityListingMethod(this: ApiClientFacade, listingId: string, body: Record = {}) { return this.request('POST', `/v1/commerce/capacity-listings/${encodeURIComponent(listingId)}/submit`, { body }); } diff --git a/src/lib/market/api-client/approve-commerce-capacity-inquiry-for-scoping.ts b/src/lib/market/api-client/commerce/capacity/lifecycle/approve-commerce-capacity-inquiry-for-scoping.ts similarity index 77% rename from src/lib/market/api-client/approve-commerce-capacity-inquiry-for-scoping.ts rename to src/lib/market/api-client/commerce/capacity/lifecycle/approve-commerce-capacity-inquiry-for-scoping.ts index 56ebed8c..8232fcbe 100644 --- a/src/lib/market/api-client/approve-commerce-capacity-inquiry-for-scoping.ts +++ b/src/lib/market/api-client/commerce/capacity/lifecycle/approve-commerce-capacity-inquiry-for-scoping.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function approveCommerceCapacityInquiryForScopingMethod(this: ApiClientFacade, inquiryId: string, body: Record = {}) { return this.request('POST', `/v1/commerce/capacity-listing-inquiries/${encodeURIComponent(inquiryId)}/approve-for-scoping`, { body }); } diff --git a/src/lib/market/api-client/approve-commerce-capacity-listing.ts b/src/lib/market/api-client/commerce/capacity/lifecycle/approve-commerce-capacity-listing.ts similarity index 77% rename from src/lib/market/api-client/approve-commerce-capacity-listing.ts rename to src/lib/market/api-client/commerce/capacity/lifecycle/approve-commerce-capacity-listing.ts index 58ae9f6e..8cae82ca 100644 --- a/src/lib/market/api-client/approve-commerce-capacity-listing.ts +++ b/src/lib/market/api-client/commerce/capacity/lifecycle/approve-commerce-capacity-listing.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function approveCommerceCapacityListingMethod(this: ApiClientFacade, listingId: string, body: Record = {}) { return this.request('POST', `/v1/commerce/capacity-listings/${encodeURIComponent(listingId)}/approve`, { body }); } diff --git a/src/lib/market/api-client/decline-commerce-capacity-inquiry.ts b/src/lib/market/api-client/commerce/capacity/lifecycle/decline-commerce-capacity-inquiry.ts similarity index 77% rename from src/lib/market/api-client/decline-commerce-capacity-inquiry.ts rename to src/lib/market/api-client/commerce/capacity/lifecycle/decline-commerce-capacity-inquiry.ts index ada38639..45048ec4 100644 --- a/src/lib/market/api-client/decline-commerce-capacity-inquiry.ts +++ b/src/lib/market/api-client/commerce/capacity/lifecycle/decline-commerce-capacity-inquiry.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function declineCommerceCapacityInquiryMethod(this: ApiClientFacade, inquiryId: string, body: Record = {}) { return this.request('POST', `/v1/commerce/capacity-listing-inquiries/${encodeURIComponent(inquiryId)}/decline`, { body }); } diff --git a/src/lib/market/api-client/reject-commerce-capacity-listing.ts b/src/lib/market/api-client/commerce/capacity/lifecycle/reject-commerce-capacity-listing.ts similarity index 77% rename from src/lib/market/api-client/reject-commerce-capacity-listing.ts rename to src/lib/market/api-client/commerce/capacity/lifecycle/reject-commerce-capacity-listing.ts index 3b4e6c6b..123290f9 100644 --- a/src/lib/market/api-client/reject-commerce-capacity-listing.ts +++ b/src/lib/market/api-client/commerce/capacity/lifecycle/reject-commerce-capacity-listing.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function rejectCommerceCapacityListingMethod(this: ApiClientFacade, listingId: string, body: Record = {}) { return this.request('POST', `/v1/commerce/capacity-listings/${encodeURIComponent(listingId)}/reject`, { body }); } diff --git a/src/lib/market/api-client/review-commerce-capacity-inquiry.ts b/src/lib/market/api-client/commerce/capacity/lifecycle/review-commerce-capacity-inquiry.ts similarity index 77% rename from src/lib/market/api-client/review-commerce-capacity-inquiry.ts rename to src/lib/market/api-client/commerce/capacity/lifecycle/review-commerce-capacity-inquiry.ts index 66a96329..61ba6e31 100644 --- a/src/lib/market/api-client/review-commerce-capacity-inquiry.ts +++ b/src/lib/market/api-client/commerce/capacity/lifecycle/review-commerce-capacity-inquiry.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function reviewCommerceCapacityInquiryMethod(this: ApiClientFacade, inquiryId: string, body: Record = {}) { return this.request('POST', `/v1/commerce/capacity-listing-inquiries/${encodeURIComponent(inquiryId)}/review`, { body }); } diff --git a/src/lib/market/api-client/get-commerce-capacity-listing-for-product.ts b/src/lib/market/api-client/commerce/capacity/queries/get-commerce-capacity-listing-for-product.ts similarity index 76% rename from src/lib/market/api-client/get-commerce-capacity-listing-for-product.ts rename to src/lib/market/api-client/commerce/capacity/queries/get-commerce-capacity-listing-for-product.ts index 0cdd1f36..22b70c64 100644 --- a/src/lib/market/api-client/get-commerce-capacity-listing-for-product.ts +++ b/src/lib/market/api-client/commerce/capacity/queries/get-commerce-capacity-listing-for-product.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function getCommerceCapacityListingForProductMethod(this: ApiClientFacade, productId: string) { return this.request('GET', `/v1/commerce/products/${encodeURIComponent(productId)}/capacity-listing`); } diff --git a/src/lib/market/api-client/get-commerce-capacity-listing-inquiry.ts b/src/lib/market/api-client/commerce/capacity/queries/get-commerce-capacity-listing-inquiry.ts similarity index 76% rename from src/lib/market/api-client/get-commerce-capacity-listing-inquiry.ts rename to src/lib/market/api-client/commerce/capacity/queries/get-commerce-capacity-listing-inquiry.ts index 6a8fc89f..6b15ea74 100644 --- a/src/lib/market/api-client/get-commerce-capacity-listing-inquiry.ts +++ b/src/lib/market/api-client/commerce/capacity/queries/get-commerce-capacity-listing-inquiry.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function getCommerceCapacityListingInquiryMethod(this: ApiClientFacade, inquiryId: string) { return this.request('GET', `/v1/commerce/capacity-listing-inquiries/${encodeURIComponent(inquiryId)}`); } diff --git a/src/lib/market/api-client/get-commerce-capacity-listing.ts b/src/lib/market/api-client/commerce/capacity/queries/get-commerce-capacity-listing.ts similarity index 76% rename from src/lib/market/api-client/get-commerce-capacity-listing.ts rename to src/lib/market/api-client/commerce/capacity/queries/get-commerce-capacity-listing.ts index a763db3d..e13087cd 100644 --- a/src/lib/market/api-client/get-commerce-capacity-listing.ts +++ b/src/lib/market/api-client/commerce/capacity/queries/get-commerce-capacity-listing.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function getCommerceCapacityListingMethod(this: ApiClientFacade, listingId: string) { return this.request('GET', `/v1/commerce/capacity-listings/${encodeURIComponent(listingId)}`); } diff --git a/src/lib/market/api-client/list-commerce-capacity-listing-inquiries.ts b/src/lib/market/api-client/commerce/capacity/queries/list-commerce-capacity-listing-inquiries.ts similarity index 79% rename from src/lib/market/api-client/list-commerce-capacity-listing-inquiries.ts rename to src/lib/market/api-client/commerce/capacity/queries/list-commerce-capacity-listing-inquiries.ts index a386e83d..67e5354e 100644 --- a/src/lib/market/api-client/list-commerce-capacity-listing-inquiries.ts +++ b/src/lib/market/api-client/commerce/capacity/queries/list-commerce-capacity-listing-inquiries.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function listCommerceCapacityListingInquiriesMethod(this: ApiClientFacade, filters: Record = {}) { const query = new URLSearchParams(Object.entries(filters).filter(([, value]) => value != null).map(([key, value]) => [key, String(value)])); const suffix = query.toString() ? `?${query.toString()}` : ''; diff --git a/src/lib/market/api-client/list-commerce-capacity-listings.ts b/src/lib/market/api-client/commerce/capacity/queries/list-commerce-capacity-listings.ts similarity index 79% rename from src/lib/market/api-client/list-commerce-capacity-listings.ts rename to src/lib/market/api-client/commerce/capacity/queries/list-commerce-capacity-listings.ts index 86f46b21..9b15c014 100644 --- a/src/lib/market/api-client/list-commerce-capacity-listings.ts +++ b/src/lib/market/api-client/commerce/capacity/queries/list-commerce-capacity-listings.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function listCommerceCapacityListingsMethod(this: ApiClientFacade, filters: Record = {}) { const query = new URLSearchParams(Object.entries(filters).filter(([, value]) => value != null).map(([key, value]) => [key, String(value)])); const suffix = query.toString() ? `?${query.toString()}` : ''; diff --git a/src/lib/market/api-client/archive-commerce-capacity-listing.ts b/src/lib/market/api-client/commerce/capacity/retirement/archive-commerce-capacity-listing.ts similarity index 77% rename from src/lib/market/api-client/archive-commerce-capacity-listing.ts rename to src/lib/market/api-client/commerce/capacity/retirement/archive-commerce-capacity-listing.ts index efc9d429..83567703 100644 --- a/src/lib/market/api-client/archive-commerce-capacity-listing.ts +++ b/src/lib/market/api-client/commerce/capacity/retirement/archive-commerce-capacity-listing.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function archiveCommerceCapacityListingMethod(this: ApiClientFacade, listingId: string, body: Record = {}) { return this.request('POST', `/v1/commerce/capacity-listings/${encodeURIComponent(listingId)}/archive`, { body }); } diff --git a/src/lib/market/api-client/cancel-commerce-capacity-inquiry.ts b/src/lib/market/api-client/commerce/capacity/retirement/cancel-commerce-capacity-inquiry.ts similarity index 77% rename from src/lib/market/api-client/cancel-commerce-capacity-inquiry.ts rename to src/lib/market/api-client/commerce/capacity/retirement/cancel-commerce-capacity-inquiry.ts index ef2d7553..b0d43f37 100644 --- a/src/lib/market/api-client/cancel-commerce-capacity-inquiry.ts +++ b/src/lib/market/api-client/commerce/capacity/retirement/cancel-commerce-capacity-inquiry.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function cancelCommerceCapacityInquiryMethod(this: ApiClientFacade, inquiryId: string, body: Record = {}) { return this.request('POST', `/v1/commerce/capacity-listing-inquiries/${encodeURIComponent(inquiryId)}/cancel`, { body }); } diff --git a/src/lib/market/api-client/suspend-commerce-capacity-listing.ts b/src/lib/market/api-client/commerce/capacity/retirement/suspend-commerce-capacity-listing.ts similarity index 77% rename from src/lib/market/api-client/suspend-commerce-capacity-listing.ts rename to src/lib/market/api-client/commerce/capacity/retirement/suspend-commerce-capacity-listing.ts index c5206730..dbffeadc 100644 --- a/src/lib/market/api-client/suspend-commerce-capacity-listing.ts +++ b/src/lib/market/api-client/commerce/capacity/retirement/suspend-commerce-capacity-listing.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function suspendCommerceCapacityListingMethod(this: ApiClientFacade, listingId: string, body: Record = {}) { return this.request('POST', `/v1/commerce/capacity-listings/${encodeURIComponent(listingId)}/suspend`, { body }); } diff --git a/src/lib/market/api-client/update-commerce-capacity-listing.ts b/src/lib/market/api-client/commerce/capacity/updates/update-commerce-capacity-listing.ts similarity index 77% rename from src/lib/market/api-client/update-commerce-capacity-listing.ts rename to src/lib/market/api-client/commerce/capacity/updates/update-commerce-capacity-listing.ts index 635fb106..00edd891 100644 --- a/src/lib/market/api-client/update-commerce-capacity-listing.ts +++ b/src/lib/market/api-client/commerce/capacity/updates/update-commerce-capacity-listing.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function updateCommerceCapacityListingMethod(this: ApiClientFacade, listingId: string, body: Record) { return this.request('PATCH', `/v1/commerce/capacity-listings/${encodeURIComponent(listingId)}`, { body }); } diff --git a/src/lib/market/api-client/get-catalog-item-by-slug.ts b/src/lib/market/api-client/commerce/catalog/queries/get-catalog-item-by-slug.ts similarity index 75% rename from src/lib/market/api-client/get-catalog-item-by-slug.ts rename to src/lib/market/api-client/commerce/catalog/queries/get-catalog-item-by-slug.ts index 403e249f..8ac54a6f 100644 --- a/src/lib/market/api-client/get-catalog-item-by-slug.ts +++ b/src/lib/market/api-client/commerce/catalog/queries/get-catalog-item-by-slug.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function getCatalogItemBySlugMethod(this: ApiClientFacade, kind: string, slug: string) { return this.listCatalogItems(null, { kind, slug }).then((items) => items[0] ?? null); } diff --git a/src/lib/market/api-client/get-commerce-marketplace-product.ts b/src/lib/market/api-client/commerce/catalog/queries/get-commerce-marketplace-product.ts similarity index 76% rename from src/lib/market/api-client/get-commerce-marketplace-product.ts rename to src/lib/market/api-client/commerce/catalog/queries/get-commerce-marketplace-product.ts index 6599316e..4c531118 100644 --- a/src/lib/market/api-client/get-commerce-marketplace-product.ts +++ b/src/lib/market/api-client/commerce/catalog/queries/get-commerce-marketplace-product.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function getCommerceMarketplaceProductMethod(this: ApiClientFacade, productId: string) { return this.request('GET', `/v1/commerce/marketplace/products/${encodeURIComponent(productId)}`); } diff --git a/src/lib/market/api-client/get-commerce-product.ts b/src/lib/market/api-client/commerce/catalog/queries/get-commerce-product.ts similarity index 75% rename from src/lib/market/api-client/get-commerce-product.ts rename to src/lib/market/api-client/commerce/catalog/queries/get-commerce-product.ts index a2c5fdd4..174d0532 100644 --- a/src/lib/market/api-client/get-commerce-product.ts +++ b/src/lib/market/api-client/commerce/catalog/queries/get-commerce-product.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function getCommerceProductMethod(this: ApiClientFacade, productId: string) { return this.request('GET', `/v1/commerce/products/${encodeURIComponent(productId)}`); } diff --git a/src/lib/market/api-client/list-catalog-items.ts b/src/lib/market/api-client/commerce/catalog/queries/list-catalog-items.ts similarity index 80% rename from src/lib/market/api-client/list-catalog-items.ts rename to src/lib/market/api-client/commerce/catalog/queries/list-catalog-items.ts index 9cf83092..9e71af38 100644 --- a/src/lib/market/api-client/list-catalog-items.ts +++ b/src/lib/market/api-client/commerce/catalog/queries/list-catalog-items.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function listCatalogItemsMethod(this: ApiClientFacade, _principal: unknown, filters: { kind?: string; teamId?: string; diff --git a/src/lib/market/api-client/list-commerce-marketplace-products.ts b/src/lib/market/api-client/commerce/catalog/queries/list-commerce-marketplace-products.ts similarity index 79% rename from src/lib/market/api-client/list-commerce-marketplace-products.ts rename to src/lib/market/api-client/commerce/catalog/queries/list-commerce-marketplace-products.ts index 8834b7fe..3516c59d 100644 --- a/src/lib/market/api-client/list-commerce-marketplace-products.ts +++ b/src/lib/market/api-client/commerce/catalog/queries/list-commerce-marketplace-products.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function listCommerceMarketplaceProductsMethod(this: ApiClientFacade, filters: Record = {}) { const query = new URLSearchParams(Object.entries(filters).filter(([, value]) => value != null).map(([key, value]) => [key, String(value)])); const suffix = query.toString() ? `?${query.toString()}` : ''; diff --git a/src/lib/market/api-client/list-commerce-products.ts b/src/lib/market/api-client/commerce/catalog/queries/list-commerce-products.ts similarity index 79% rename from src/lib/market/api-client/list-commerce-products.ts rename to src/lib/market/api-client/commerce/catalog/queries/list-commerce-products.ts index 6061f148..3228ce09 100644 --- a/src/lib/market/api-client/list-commerce-products.ts +++ b/src/lib/market/api-client/commerce/catalog/queries/list-commerce-products.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function listCommerceProductsMethod(this: ApiClientFacade, filters: Record = {}) { const query = new URLSearchParams(Object.entries(filters).filter(([, value]) => value != null).map(([key, value]) => [key, String(value)])); const suffix = query.toString() ? `?${query.toString()}` : ''; diff --git a/src/lib/market/api-client/start-commerce-service-scoping.ts b/src/lib/market/api-client/commerce/commerce-core/creation/start-commerce-service-scoping.ts similarity index 77% rename from src/lib/market/api-client/start-commerce-service-scoping.ts rename to src/lib/market/api-client/commerce/commerce-core/creation/start-commerce-service-scoping.ts index a96708f2..01d6a7fc 100644 --- a/src/lib/market/api-client/start-commerce-service-scoping.ts +++ b/src/lib/market/api-client/commerce/commerce-core/creation/start-commerce-service-scoping.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function startCommerceServiceScopingMethod(this: ApiClientFacade, requestId: string, body: Record = {}) { return this.request('POST', `/v1/commerce/services/requests/${encodeURIComponent(requestId)}/scoping`, { body }); } diff --git a/src/lib/market/api-client/update-commerce-contribution.ts b/src/lib/market/api-client/commerce/governance/updates/update-commerce-contribution.ts similarity index 78% rename from src/lib/market/api-client/update-commerce-contribution.ts rename to src/lib/market/api-client/commerce/governance/updates/update-commerce-contribution.ts index 12087aa1..d8ad271a 100644 --- a/src/lib/market/api-client/update-commerce-contribution.ts +++ b/src/lib/market/api-client/commerce/governance/updates/update-commerce-contribution.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function updateCommerceContributionMethod(this: ApiClientFacade, productId: string, contributionId: string, body: Record) { return this.request('PATCH', `/v1/commerce/products/${encodeURIComponent(productId)}/contributions/${encodeURIComponent(contributionId)}`, { body }); } diff --git a/src/lib/market/api-client/update-commerce-governance-policy.ts b/src/lib/market/api-client/commerce/governance/updates/update-commerce-governance-policy.ts similarity index 78% rename from src/lib/market/api-client/update-commerce-governance-policy.ts rename to src/lib/market/api-client/commerce/governance/updates/update-commerce-governance-policy.ts index 9b128470..c34218ee 100644 --- a/src/lib/market/api-client/update-commerce-governance-policy.ts +++ b/src/lib/market/api-client/commerce/governance/updates/update-commerce-governance-policy.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function updateCommerceGovernancePolicyMethod(this: ApiClientFacade, productId: string, policyId: string, body: Record) { return this.request('PATCH', `/v1/commerce/products/${encodeURIComponent(productId)}/governance-policy/${encodeURIComponent(policyId)}`, { body }); } diff --git a/src/lib/market/api-client/create-commerce-order-refund.ts b/src/lib/market/api-client/commerce/orders/creation/create-commerce-order-refund.ts similarity index 76% rename from src/lib/market/api-client/create-commerce-order-refund.ts rename to src/lib/market/api-client/commerce/orders/creation/create-commerce-order-refund.ts index a5488982..219bc9e6 100644 --- a/src/lib/market/api-client/create-commerce-order-refund.ts +++ b/src/lib/market/api-client/commerce/orders/creation/create-commerce-order-refund.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function createCommerceOrderRefundMethod(this: ApiClientFacade, orderId: string, body: Record) { return this.request('POST', `/v1/commerce/orders/${encodeURIComponent(orderId)}/refunds`, { body }); } diff --git a/src/lib/market/api-client/fulfill-commerce-order-item-artifact.ts b/src/lib/market/api-client/commerce/orders/lifecycle/fulfill-commerce-order-item-artifact.ts similarity index 77% rename from src/lib/market/api-client/fulfill-commerce-order-item-artifact.ts rename to src/lib/market/api-client/commerce/orders/lifecycle/fulfill-commerce-order-item-artifact.ts index c3052cb1..976c3c90 100644 --- a/src/lib/market/api-client/fulfill-commerce-order-item-artifact.ts +++ b/src/lib/market/api-client/commerce/orders/lifecycle/fulfill-commerce-order-item-artifact.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function fulfillCommerceOrderItemArtifactMethod(this: ApiClientFacade, orderItemId: string, body: Record) { return this.request('POST', `/v1/commerce/order-items/${encodeURIComponent(orderItemId)}/fulfillment/artifact`, { body }); } diff --git a/src/lib/market/api-client/list-catalog-artifact-versions.ts b/src/lib/market/api-client/commerce/orders/queries/list-catalog-artifact-versions.ts similarity index 75% rename from src/lib/market/api-client/list-catalog-artifact-versions.ts rename to src/lib/market/api-client/commerce/orders/queries/list-catalog-artifact-versions.ts index 89758a7a..e586d596 100644 --- a/src/lib/market/api-client/list-catalog-artifact-versions.ts +++ b/src/lib/market/api-client/commerce/orders/queries/list-catalog-artifact-versions.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function listCatalogArtifactVersionsMethod(this: ApiClientFacade, itemId: string) { return this.request('GET', `/v1/catalog/${encodeURIComponent(itemId)}/artifacts`); } diff --git a/src/lib/market/api-client/end-commerce-stewardship-assignment.ts b/src/lib/market/api-client/commerce/ownership/contracts/end-commerce-stewardship-assignment.ts similarity index 78% rename from src/lib/market/api-client/end-commerce-stewardship-assignment.ts rename to src/lib/market/api-client/commerce/ownership/contracts/end-commerce-stewardship-assignment.ts index 124065ff..fea9732e 100644 --- a/src/lib/market/api-client/end-commerce-stewardship-assignment.ts +++ b/src/lib/market/api-client/commerce/ownership/contracts/end-commerce-stewardship-assignment.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function endCommerceStewardshipAssignmentMethod(this: ApiClientFacade, productId: string, assignmentId: string, body: Record) { return this.request('POST', `/v1/commerce/products/${encodeURIComponent(productId)}/stewards/${encodeURIComponent(assignmentId)}/end`, { body }); } diff --git a/src/lib/market/api-client/create-commerce-succession-event.ts b/src/lib/market/api-client/commerce/ownership/creation/create-commerce-succession-event.ts similarity index 77% rename from src/lib/market/api-client/create-commerce-succession-event.ts rename to src/lib/market/api-client/commerce/ownership/creation/create-commerce-succession-event.ts index 7db7188b..387bfb77 100644 --- a/src/lib/market/api-client/create-commerce-succession-event.ts +++ b/src/lib/market/api-client/commerce/ownership/creation/create-commerce-succession-event.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function createCommerceSuccessionEventMethod(this: ApiClientFacade, productId: string, body: Record) { return this.request('POST', `/v1/commerce/products/${encodeURIComponent(productId)}/succession-events`, { body }); } diff --git a/src/lib/market/api-client/submit-commerce-ownership-transfer.ts b/src/lib/market/api-client/commerce/ownership/creation/submit-commerce-ownership-transfer.ts similarity index 78% rename from src/lib/market/api-client/submit-commerce-ownership-transfer.ts rename to src/lib/market/api-client/commerce/ownership/creation/submit-commerce-ownership-transfer.ts index c4a8b70a..58ec2262 100644 --- a/src/lib/market/api-client/submit-commerce-ownership-transfer.ts +++ b/src/lib/market/api-client/commerce/ownership/creation/submit-commerce-ownership-transfer.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function submitCommerceOwnershipTransferMethod(this: ApiClientFacade, productId: string, transferId: string, body: Record = {}) { return this.request('POST', `/v1/commerce/products/${encodeURIComponent(productId)}/ownership-transfer/${encodeURIComponent(transferId)}/submit`, { body }); } diff --git a/src/lib/market/api-client/approve-commerce-ownership-transfer.ts b/src/lib/market/api-client/commerce/ownership/lifecycle/approve-commerce-ownership-transfer.ts similarity index 78% rename from src/lib/market/api-client/approve-commerce-ownership-transfer.ts rename to src/lib/market/api-client/commerce/ownership/lifecycle/approve-commerce-ownership-transfer.ts index 77eca5b0..85c9e6cb 100644 --- a/src/lib/market/api-client/approve-commerce-ownership-transfer.ts +++ b/src/lib/market/api-client/commerce/ownership/lifecycle/approve-commerce-ownership-transfer.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function approveCommerceOwnershipTransferMethod(this: ApiClientFacade, productId: string, transferId: string, body: Record = {}) { return this.request('POST', `/v1/commerce/products/${encodeURIComponent(productId)}/ownership-transfer/${encodeURIComponent(transferId)}/approve`, { body }); } diff --git a/src/lib/market/api-client/reject-commerce-ownership-transfer.ts b/src/lib/market/api-client/commerce/ownership/lifecycle/reject-commerce-ownership-transfer.ts similarity index 78% rename from src/lib/market/api-client/reject-commerce-ownership-transfer.ts rename to src/lib/market/api-client/commerce/ownership/lifecycle/reject-commerce-ownership-transfer.ts index 0e5a2607..38e7b402 100644 --- a/src/lib/market/api-client/reject-commerce-ownership-transfer.ts +++ b/src/lib/market/api-client/commerce/ownership/lifecycle/reject-commerce-ownership-transfer.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function rejectCommerceOwnershipTransferMethod(this: ApiClientFacade, productId: string, transferId: string, body: Record = {}) { return this.request('POST', `/v1/commerce/products/${encodeURIComponent(productId)}/ownership-transfer/${encodeURIComponent(transferId)}/reject`, { body }); } diff --git a/src/lib/market/api-client/get-commerce-ownership-workflow.ts b/src/lib/market/api-client/commerce/ownership/queries/get-commerce-ownership-workflow.ts similarity index 76% rename from src/lib/market/api-client/get-commerce-ownership-workflow.ts rename to src/lib/market/api-client/commerce/ownership/queries/get-commerce-ownership-workflow.ts index 0f5040c1..d08a93eb 100644 --- a/src/lib/market/api-client/get-commerce-ownership-workflow.ts +++ b/src/lib/market/api-client/commerce/ownership/queries/get-commerce-ownership-workflow.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function getCommerceOwnershipWorkflowMethod(this: ApiClientFacade, productId: string) { return this.request('GET', `/v1/commerce/products/${encodeURIComponent(productId)}/ownership-workflow`); } diff --git a/src/lib/market/api-client/list-commerce-succession-events.ts b/src/lib/market/api-client/commerce/ownership/queries/list-commerce-succession-events.ts similarity index 76% rename from src/lib/market/api-client/list-commerce-succession-events.ts rename to src/lib/market/api-client/commerce/ownership/queries/list-commerce-succession-events.ts index e67a5bc1..3930feb0 100644 --- a/src/lib/market/api-client/list-commerce-succession-events.ts +++ b/src/lib/market/api-client/commerce/ownership/queries/list-commerce-succession-events.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function listCommerceSuccessionEventsMethod(this: ApiClientFacade, productId: string) { return this.request('GET', `/v1/commerce/products/${encodeURIComponent(productId)}/succession-events`); } diff --git a/src/lib/market/api-client/cancel-commerce-ownership-transfer.ts b/src/lib/market/api-client/commerce/ownership/retirement/cancel-commerce-ownership-transfer.ts similarity index 78% rename from src/lib/market/api-client/cancel-commerce-ownership-transfer.ts rename to src/lib/market/api-client/commerce/ownership/retirement/cancel-commerce-ownership-transfer.ts index a8895fa0..1a5c8f68 100644 --- a/src/lib/market/api-client/cancel-commerce-ownership-transfer.ts +++ b/src/lib/market/api-client/commerce/ownership/retirement/cancel-commerce-ownership-transfer.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function cancelCommerceOwnershipTransferMethod(this: ApiClientFacade, productId: string, transferId: string, body: Record = {}) { return this.request('POST', `/v1/commerce/products/${encodeURIComponent(productId)}/ownership-transfer/${encodeURIComponent(transferId)}/cancel`, { body }); } diff --git a/src/lib/market/api-client/update-commerce-ownership-record.ts b/src/lib/market/api-client/commerce/ownership/updates/update-commerce-ownership-record.ts similarity index 78% rename from src/lib/market/api-client/update-commerce-ownership-record.ts rename to src/lib/market/api-client/commerce/ownership/updates/update-commerce-ownership-record.ts index 7a02a9fe..6e977bc1 100644 --- a/src/lib/market/api-client/update-commerce-ownership-record.ts +++ b/src/lib/market/api-client/commerce/ownership/updates/update-commerce-ownership-record.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function updateCommerceOwnershipRecordMethod(this: ApiClientFacade, productId: string, ownershipRecordId: string, body: Record) { return this.request('PATCH', `/v1/commerce/products/${encodeURIComponent(productId)}/ownership/${encodeURIComponent(ownershipRecordId)}`, { body }); } diff --git a/src/lib/market/api-client/update-commerce-stewardship-assignment.ts b/src/lib/market/api-client/commerce/ownership/updates/update-commerce-stewardship-assignment.ts similarity index 78% rename from src/lib/market/api-client/update-commerce-stewardship-assignment.ts rename to src/lib/market/api-client/commerce/ownership/updates/update-commerce-stewardship-assignment.ts index f19168a8..517a5d24 100644 --- a/src/lib/market/api-client/update-commerce-stewardship-assignment.ts +++ b/src/lib/market/api-client/commerce/ownership/updates/update-commerce-stewardship-assignment.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function updateCommerceStewardshipAssignmentMethod(this: ApiClientFacade, productId: string, assignmentId: string, body: Record) { return this.request('PATCH', `/v1/commerce/products/${encodeURIComponent(productId)}/stewards/${encodeURIComponent(assignmentId)}`, { body }); } diff --git a/src/lib/market/api-client/revoke-commerce-entitlement.ts b/src/lib/market/api-client/commerce/payments/retirement/revoke-commerce-entitlement.ts similarity index 77% rename from src/lib/market/api-client/revoke-commerce-entitlement.ts rename to src/lib/market/api-client/commerce/payments/retirement/revoke-commerce-entitlement.ts index 1baa6cac..a41e0730 100644 --- a/src/lib/market/api-client/revoke-commerce-entitlement.ts +++ b/src/lib/market/api-client/commerce/payments/retirement/revoke-commerce-entitlement.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function revokeCommerceEntitlementMethod(this: ApiClientFacade, entitlementId: string, body: Record) { return this.request('POST', `/v1/commerce/entitlements/${encodeURIComponent(entitlementId)}/revoke`, { body }); } diff --git a/src/lib/market/api-client/buyer-approve-commerce-service-quote.ts b/src/lib/market/api-client/commerce/services/contracts/buyer-approve-commerce-service-quote.ts similarity index 77% rename from src/lib/market/api-client/buyer-approve-commerce-service-quote.ts rename to src/lib/market/api-client/commerce/services/contracts/buyer-approve-commerce-service-quote.ts index 0ef2b5f7..96cc7036 100644 --- a/src/lib/market/api-client/buyer-approve-commerce-service-quote.ts +++ b/src/lib/market/api-client/commerce/services/contracts/buyer-approve-commerce-service-quote.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function buyerApproveCommerceServiceQuoteMethod(this: ApiClientFacade, quoteId: string, body: Record = {}) { return this.request('POST', `/v1/commerce/services/quotes/${encodeURIComponent(quoteId)}/buyer-approve`, { body }); } diff --git a/src/lib/market/api-client/link-commerce-service-contract-work.ts b/src/lib/market/api-client/commerce/services/contracts/link-commerce-service-contract-work.ts similarity index 77% rename from src/lib/market/api-client/link-commerce-service-contract-work.ts rename to src/lib/market/api-client/commerce/services/contracts/link-commerce-service-contract-work.ts index 17735ef6..d92d0487 100644 --- a/src/lib/market/api-client/link-commerce-service-contract-work.ts +++ b/src/lib/market/api-client/commerce/services/contracts/link-commerce-service-contract-work.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function linkCommerceServiceContractWorkMethod(this: ApiClientFacade, contractId: string, body: Record) { return this.request('POST', `/v1/commerce/services/contracts/${encodeURIComponent(contractId)}/link-work`, { body }); } diff --git a/src/lib/market/api-client/vendor-approve-commerce-service-quote.ts b/src/lib/market/api-client/commerce/services/contracts/vendor-approve-commerce-service-quote.ts similarity index 77% rename from src/lib/market/api-client/vendor-approve-commerce-service-quote.ts rename to src/lib/market/api-client/commerce/services/contracts/vendor-approve-commerce-service-quote.ts index 319777dc..6fac834d 100644 --- a/src/lib/market/api-client/vendor-approve-commerce-service-quote.ts +++ b/src/lib/market/api-client/commerce/services/contracts/vendor-approve-commerce-service-quote.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function vendorApproveCommerceServiceQuoteMethod(this: ApiClientFacade, quoteId: string, body: Record = {}) { return this.request('POST', `/v1/commerce/services/quotes/${encodeURIComponent(quoteId)}/vendor-approve`, { body }); } diff --git a/src/lib/market/api-client/create-commerce-service-quote.ts b/src/lib/market/api-client/commerce/services/creation/create-commerce-service-quote.ts similarity index 77% rename from src/lib/market/api-client/create-commerce-service-quote.ts rename to src/lib/market/api-client/commerce/services/creation/create-commerce-service-quote.ts index b825c9cd..0a28829d 100644 --- a/src/lib/market/api-client/create-commerce-service-quote.ts +++ b/src/lib/market/api-client/commerce/services/creation/create-commerce-service-quote.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function createCommerceServiceQuoteMethod(this: ApiClientFacade, requestId: string, body: Record) { return this.request('POST', `/v1/commerce/services/requests/${encodeURIComponent(requestId)}/quotes`, { body }); } diff --git a/src/lib/market/api-client/create-commerce-service-request.ts b/src/lib/market/api-client/commerce/services/creation/create-commerce-service-request.ts similarity index 75% rename from src/lib/market/api-client/create-commerce-service-request.ts rename to src/lib/market/api-client/commerce/services/creation/create-commerce-service-request.ts index 9172051d..c8dff22a 100644 --- a/src/lib/market/api-client/create-commerce-service-request.ts +++ b/src/lib/market/api-client/commerce/services/creation/create-commerce-service-request.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function createCommerceServiceRequestMethod(this: ApiClientFacade, body: Record) { return this.request('POST', '/v1/commerce/services/requests', { body }); } diff --git a/src/lib/market/api-client/submit-commerce-service-quote.ts b/src/lib/market/api-client/commerce/services/creation/submit-commerce-service-quote.ts similarity index 77% rename from src/lib/market/api-client/submit-commerce-service-quote.ts rename to src/lib/market/api-client/commerce/services/creation/submit-commerce-service-quote.ts index dfbd01c4..f5e1e1d8 100644 --- a/src/lib/market/api-client/submit-commerce-service-quote.ts +++ b/src/lib/market/api-client/commerce/services/creation/submit-commerce-service-quote.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function submitCommerceServiceQuoteMethod(this: ApiClientFacade, quoteId: string, body: Record = {}) { return this.request('POST', `/v1/commerce/services/quotes/${encodeURIComponent(quoteId)}/submit`, { body }); } diff --git a/src/lib/market/api-client/fulfill-commerce-service-contract.ts b/src/lib/market/api-client/commerce/services/lifecycle/fulfill-commerce-service-contract.ts similarity index 77% rename from src/lib/market/api-client/fulfill-commerce-service-contract.ts rename to src/lib/market/api-client/commerce/services/lifecycle/fulfill-commerce-service-contract.ts index 03f9f9ae..5c9ca749 100644 --- a/src/lib/market/api-client/fulfill-commerce-service-contract.ts +++ b/src/lib/market/api-client/commerce/services/lifecycle/fulfill-commerce-service-contract.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function fulfillCommerceServiceContractMethod(this: ApiClientFacade, contractId: string, body: Record) { return this.request('POST', `/v1/commerce/services/contracts/${encodeURIComponent(contractId)}/fulfill`, { body }); } diff --git a/src/lib/market/api-client/reject-commerce-service-quote.ts b/src/lib/market/api-client/commerce/services/lifecycle/reject-commerce-service-quote.ts similarity index 77% rename from src/lib/market/api-client/reject-commerce-service-quote.ts rename to src/lib/market/api-client/commerce/services/lifecycle/reject-commerce-service-quote.ts index 0c7496d5..4059fc86 100644 --- a/src/lib/market/api-client/reject-commerce-service-quote.ts +++ b/src/lib/market/api-client/commerce/services/lifecycle/reject-commerce-service-quote.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function rejectCommerceServiceQuoteMethod(this: ApiClientFacade, quoteId: string, body: Record = {}) { return this.request('POST', `/v1/commerce/services/quotes/${encodeURIComponent(quoteId)}/reject`, { body }); } diff --git a/src/lib/market/api-client/get-commerce-service-contract.ts b/src/lib/market/api-client/commerce/services/queries/get-commerce-service-contract.ts similarity index 76% rename from src/lib/market/api-client/get-commerce-service-contract.ts rename to src/lib/market/api-client/commerce/services/queries/get-commerce-service-contract.ts index b28ca7b5..fe6fd692 100644 --- a/src/lib/market/api-client/get-commerce-service-contract.ts +++ b/src/lib/market/api-client/commerce/services/queries/get-commerce-service-contract.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function getCommerceServiceContractMethod(this: ApiClientFacade, contractId: string) { return this.request('GET', `/v1/commerce/services/contracts/${encodeURIComponent(contractId)}`); } diff --git a/src/lib/market/api-client/get-commerce-service-request.ts b/src/lib/market/api-client/commerce/services/queries/get-commerce-service-request.ts similarity index 76% rename from src/lib/market/api-client/get-commerce-service-request.ts rename to src/lib/market/api-client/commerce/services/queries/get-commerce-service-request.ts index 40210351..ad713d41 100644 --- a/src/lib/market/api-client/get-commerce-service-request.ts +++ b/src/lib/market/api-client/commerce/services/queries/get-commerce-service-request.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function getCommerceServiceRequestMethod(this: ApiClientFacade, requestId: string) { return this.request('GET', `/v1/commerce/services/requests/${encodeURIComponent(requestId)}`); } diff --git a/src/lib/market/api-client/list-commerce-service-events.ts b/src/lib/market/api-client/commerce/services/queries/list-commerce-service-events.ts similarity index 79% rename from src/lib/market/api-client/list-commerce-service-events.ts rename to src/lib/market/api-client/commerce/services/queries/list-commerce-service-events.ts index 8d637040..03fce220 100644 --- a/src/lib/market/api-client/list-commerce-service-events.ts +++ b/src/lib/market/api-client/commerce/services/queries/list-commerce-service-events.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function listCommerceServiceEventsMethod(this: ApiClientFacade, filters: Record = {}) { const query = new URLSearchParams(Object.entries(filters).filter(([, value]) => value != null).map(([key, value]) => [key, String(value)])); const suffix = query.toString() ? `?${query.toString()}` : ''; diff --git a/src/lib/market/api-client/list-commerce-service-quotes.ts b/src/lib/market/api-client/commerce/services/queries/list-commerce-service-quotes.ts similarity index 76% rename from src/lib/market/api-client/list-commerce-service-quotes.ts rename to src/lib/market/api-client/commerce/services/queries/list-commerce-service-quotes.ts index 739dc5e5..b84d31fd 100644 --- a/src/lib/market/api-client/list-commerce-service-quotes.ts +++ b/src/lib/market/api-client/commerce/services/queries/list-commerce-service-quotes.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function listCommerceServiceQuotesMethod(this: ApiClientFacade, requestId: string) { return this.request('GET', `/v1/commerce/services/requests/${encodeURIComponent(requestId)}/quotes`); } diff --git a/src/lib/market/api-client/list-commerce-service-requests.ts b/src/lib/market/api-client/commerce/services/queries/list-commerce-service-requests.ts similarity index 79% rename from src/lib/market/api-client/list-commerce-service-requests.ts rename to src/lib/market/api-client/commerce/services/queries/list-commerce-service-requests.ts index 54023211..fa46b538 100644 --- a/src/lib/market/api-client/list-commerce-service-requests.ts +++ b/src/lib/market/api-client/commerce/services/queries/list-commerce-service-requests.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function listCommerceServiceRequestsMethod(this: ApiClientFacade, filters: Record = {}) { const query = new URLSearchParams(Object.entries(filters).filter(([, value]) => value != null).map(([key, value]) => [key, String(value)])); const suffix = query.toString() ? `?${query.toString()}` : ''; diff --git a/src/lib/market/api-client/cancel-commerce-service-contract.ts b/src/lib/market/api-client/commerce/services/retirement/cancel-commerce-service-contract.ts similarity index 77% rename from src/lib/market/api-client/cancel-commerce-service-contract.ts rename to src/lib/market/api-client/commerce/services/retirement/cancel-commerce-service-contract.ts index b3160ff8..1432ba62 100644 --- a/src/lib/market/api-client/cancel-commerce-service-contract.ts +++ b/src/lib/market/api-client/commerce/services/retirement/cancel-commerce-service-contract.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function cancelCommerceServiceContractMethod(this: ApiClientFacade, contractId: string, body: Record = {}) { return this.request('POST', `/v1/commerce/services/contracts/${encodeURIComponent(contractId)}/cancel`, { body }); } diff --git a/src/lib/market/api-client/cancel-commerce-service-request.ts b/src/lib/market/api-client/commerce/services/retirement/cancel-commerce-service-request.ts similarity index 77% rename from src/lib/market/api-client/cancel-commerce-service-request.ts rename to src/lib/market/api-client/commerce/services/retirement/cancel-commerce-service-request.ts index ca0a9a3d..038c95bb 100644 --- a/src/lib/market/api-client/cancel-commerce-service-request.ts +++ b/src/lib/market/api-client/commerce/services/retirement/cancel-commerce-service-request.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function cancelCommerceServiceRequestMethod(this: ApiClientFacade, requestId: string, body: Record = {}) { return this.request('POST', `/v1/commerce/services/requests/${encodeURIComponent(requestId)}/cancel`, { body }); } diff --git a/src/lib/market/api-client/update-commerce-service-request.ts b/src/lib/market/api-client/commerce/services/updates/update-commerce-service-request.ts similarity index 76% rename from src/lib/market/api-client/update-commerce-service-request.ts rename to src/lib/market/api-client/commerce/services/updates/update-commerce-service-request.ts index df8dd970..b127d440 100644 --- a/src/lib/market/api-client/update-commerce-service-request.ts +++ b/src/lib/market/api-client/commerce/services/updates/update-commerce-service-request.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function updateCommerceServiceRequestMethod(this: ApiClientFacade, requestId: string, body: Record) { return this.request('PATCH', `/v1/commerce/services/requests/${encodeURIComponent(requestId)}`, { body }); } diff --git a/src/lib/market/api-client/create-commerce-vendor-stripe-login-link.ts b/src/lib/market/api-client/commerce/vendors/creation/create-commerce-vendor-stripe-login-link.ts similarity index 76% rename from src/lib/market/api-client/create-commerce-vendor-stripe-login-link.ts rename to src/lib/market/api-client/commerce/vendors/creation/create-commerce-vendor-stripe-login-link.ts index 630494d5..56166174 100644 --- a/src/lib/market/api-client/create-commerce-vendor-stripe-login-link.ts +++ b/src/lib/market/api-client/commerce/vendors/creation/create-commerce-vendor-stripe-login-link.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function createCommerceVendorStripeLoginLinkMethod(this: ApiClientFacade, teamId: string) { return this.request('POST', `/v1/commerce/vendors/${encodeURIComponent(teamId)}/stripe/login-link`, { body: {} }); } diff --git a/src/lib/market/api-client/request-commerce-vendor.ts b/src/lib/market/api-client/commerce/vendors/creation/request-commerce-vendor.ts similarity index 76% rename from src/lib/market/api-client/request-commerce-vendor.ts rename to src/lib/market/api-client/commerce/vendors/creation/request-commerce-vendor.ts index d4b7fa0a..dd26dd12 100644 --- a/src/lib/market/api-client/request-commerce-vendor.ts +++ b/src/lib/market/api-client/commerce/vendors/creation/request-commerce-vendor.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function requestCommerceVendorMethod(this: ApiClientFacade, teamId: string, body: Record) { return this.request('POST', `/v1/commerce/vendors/${encodeURIComponent(teamId)}/request`, { body }); } diff --git a/src/lib/market/api-client/start-commerce-vendor-stripe-onboarding.ts b/src/lib/market/api-client/commerce/vendors/creation/start-commerce-vendor-stripe-onboarding.ts similarity index 77% rename from src/lib/market/api-client/start-commerce-vendor-stripe-onboarding.ts rename to src/lib/market/api-client/commerce/vendors/creation/start-commerce-vendor-stripe-onboarding.ts index 5b249cfa..5757ce28 100644 --- a/src/lib/market/api-client/start-commerce-vendor-stripe-onboarding.ts +++ b/src/lib/market/api-client/commerce/vendors/creation/start-commerce-vendor-stripe-onboarding.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function startCommerceVendorStripeOnboardingMethod(this: ApiClientFacade, teamId: string, body: Record = {}) { return this.request('POST', `/v1/commerce/vendors/${encodeURIComponent(teamId)}/stripe/onboarding`, { body }); } diff --git a/src/lib/market/api-client/get-commerce-vendor-monitoring.ts b/src/lib/market/api-client/commerce/vendors/queries/get-commerce-vendor-monitoring.ts similarity index 80% rename from src/lib/market/api-client/get-commerce-vendor-monitoring.ts rename to src/lib/market/api-client/commerce/vendors/queries/get-commerce-vendor-monitoring.ts index 2c3f3bfb..a4d4b84f 100644 --- a/src/lib/market/api-client/get-commerce-vendor-monitoring.ts +++ b/src/lib/market/api-client/commerce/vendors/queries/get-commerce-vendor-monitoring.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function getCommerceVendorMonitoringMethod(this: ApiClientFacade, teamId: string, filters: Record = {}) { const query = new URLSearchParams(Object.entries(filters).filter(([, value]) => value != null).map(([key, value]) => [key, String(value)])); const suffix = query.toString() ? `?${query.toString()}` : ''; diff --git a/src/lib/market/api-client/get-commerce-vendor-sales-summary.ts b/src/lib/market/api-client/commerce/vendors/queries/get-commerce-vendor-sales-summary.ts similarity index 80% rename from src/lib/market/api-client/get-commerce-vendor-sales-summary.ts rename to src/lib/market/api-client/commerce/vendors/queries/get-commerce-vendor-sales-summary.ts index 837b710d..a9ad63ec 100644 --- a/src/lib/market/api-client/get-commerce-vendor-sales-summary.ts +++ b/src/lib/market/api-client/commerce/vendors/queries/get-commerce-vendor-sales-summary.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function getCommerceVendorSalesSummaryMethod(this: ApiClientFacade, teamId: string, filters: Record = {}) { const query = new URLSearchParams(Object.entries(filters).filter(([, value]) => value != null).map(([key, value]) => [key, String(value)])); const suffix = query.toString() ? `?${query.toString()}` : ''; diff --git a/src/lib/market/api-client/get-commerce-vendor-stripe-status.ts b/src/lib/market/api-client/commerce/vendors/queries/get-commerce-vendor-stripe-status.ts similarity index 77% rename from src/lib/market/api-client/get-commerce-vendor-stripe-status.ts rename to src/lib/market/api-client/commerce/vendors/queries/get-commerce-vendor-stripe-status.ts index e0756bc8..ef3b266a 100644 --- a/src/lib/market/api-client/get-commerce-vendor-stripe-status.ts +++ b/src/lib/market/api-client/commerce/vendors/queries/get-commerce-vendor-stripe-status.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function getCommerceVendorStripeStatusMethod(this: ApiClientFacade, teamId: string, refresh = false) { const query = refresh ? '?refresh=1' : ''; return this.request('GET', `/v1/commerce/vendors/${encodeURIComponent(teamId)}/stripe/status${query}`); diff --git a/src/lib/market/api-client/get-commerce-vendor.ts b/src/lib/market/api-client/commerce/vendors/queries/get-commerce-vendor.ts similarity index 75% rename from src/lib/market/api-client/get-commerce-vendor.ts rename to src/lib/market/api-client/commerce/vendors/queries/get-commerce-vendor.ts index d3475b1e..6d628c9f 100644 --- a/src/lib/market/api-client/get-commerce-vendor.ts +++ b/src/lib/market/api-client/commerce/vendors/queries/get-commerce-vendor.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function getCommerceVendorMethod(this: ApiClientFacade, teamId: string) { return this.request('GET', `/v1/commerce/vendors/${encodeURIComponent(teamId)}`); } diff --git a/src/lib/market/api-client/list-commerce-vendor-fulfillment-events.ts b/src/lib/market/api-client/commerce/vendors/queries/list-commerce-vendor-fulfillment-events.ts similarity index 80% rename from src/lib/market/api-client/list-commerce-vendor-fulfillment-events.ts rename to src/lib/market/api-client/commerce/vendors/queries/list-commerce-vendor-fulfillment-events.ts index 1229c77a..54f2d6fe 100644 --- a/src/lib/market/api-client/list-commerce-vendor-fulfillment-events.ts +++ b/src/lib/market/api-client/commerce/vendors/queries/list-commerce-vendor-fulfillment-events.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function listCommerceVendorFulfillmentEventsMethod(this: ApiClientFacade, teamId: string, filters: Record = {}) { const query = new URLSearchParams(Object.entries(filters).filter(([, value]) => value != null).map(([key, value]) => [key, String(value)])); const suffix = query.toString() ? `?${query.toString()}` : ''; diff --git a/src/lib/market/api-client/list-commerce-vendor-sales-entitlements.ts b/src/lib/market/api-client/commerce/vendors/queries/list-commerce-vendor-sales-entitlements.ts similarity index 80% rename from src/lib/market/api-client/list-commerce-vendor-sales-entitlements.ts rename to src/lib/market/api-client/commerce/vendors/queries/list-commerce-vendor-sales-entitlements.ts index 49e3a553..47ed3268 100644 --- a/src/lib/market/api-client/list-commerce-vendor-sales-entitlements.ts +++ b/src/lib/market/api-client/commerce/vendors/queries/list-commerce-vendor-sales-entitlements.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function listCommerceVendorSalesEntitlementsMethod(this: ApiClientFacade, teamId: string, filters: Record = {}) { const query = new URLSearchParams(Object.entries(filters).filter(([, value]) => value != null).map(([key, value]) => [key, String(value)])); const suffix = query.toString() ? `?${query.toString()}` : ''; diff --git a/src/lib/market/api-client/list-commerce-vendor-sales-orders.ts b/src/lib/market/api-client/commerce/vendors/queries/list-commerce-vendor-sales-orders.ts similarity index 80% rename from src/lib/market/api-client/list-commerce-vendor-sales-orders.ts rename to src/lib/market/api-client/commerce/vendors/queries/list-commerce-vendor-sales-orders.ts index 03912abe..16f96e14 100644 --- a/src/lib/market/api-client/list-commerce-vendor-sales-orders.ts +++ b/src/lib/market/api-client/commerce/vendors/queries/list-commerce-vendor-sales-orders.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function listCommerceVendorSalesOrdersMethod(this: ApiClientFacade, teamId: string, filters: Record = {}) { const query = new URLSearchParams(Object.entries(filters).filter(([, value]) => value != null).map(([key, value]) => [key, String(value)])); const suffix = query.toString() ? `?${query.toString()}` : ''; diff --git a/src/lib/market/api-client/list-commerce-vendor-sales-refunds.ts b/src/lib/market/api-client/commerce/vendors/queries/list-commerce-vendor-sales-refunds.ts similarity index 80% rename from src/lib/market/api-client/list-commerce-vendor-sales-refunds.ts rename to src/lib/market/api-client/commerce/vendors/queries/list-commerce-vendor-sales-refunds.ts index b9d652bc..3cc5edfe 100644 --- a/src/lib/market/api-client/list-commerce-vendor-sales-refunds.ts +++ b/src/lib/market/api-client/commerce/vendors/queries/list-commerce-vendor-sales-refunds.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function listCommerceVendorSalesRefundsMethod(this: ApiClientFacade, teamId: string, filters: Record = {}) { const query = new URLSearchParams(Object.entries(filters).filter(([, value]) => value != null).map(([key, value]) => [key, String(value)])); const suffix = query.toString() ? `?${query.toString()}` : ''; diff --git a/src/lib/market/api-client/list-commerce-vendor-sales-subscriptions.ts b/src/lib/market/api-client/commerce/vendors/queries/list-commerce-vendor-sales-subscriptions.ts similarity index 80% rename from src/lib/market/api-client/list-commerce-vendor-sales-subscriptions.ts rename to src/lib/market/api-client/commerce/vendors/queries/list-commerce-vendor-sales-subscriptions.ts index c925ab41..d5ccbcc0 100644 --- a/src/lib/market/api-client/list-commerce-vendor-sales-subscriptions.ts +++ b/src/lib/market/api-client/commerce/vendors/queries/list-commerce-vendor-sales-subscriptions.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function listCommerceVendorSalesSubscriptionsMethod(this: ApiClientFacade, teamId: string, filters: Record = {}) { const query = new URLSearchParams(Object.entries(filters).filter(([, value]) => value != null).map(([key, value]) => [key, String(value)])); const suffix = query.toString() ? `?${query.toString()}` : ''; diff --git a/src/lib/market/api-client/mark-commerce-vendor-stripe-return.ts b/src/lib/market/api-client/commerce/vendors/updates/mark-commerce-vendor-stripe-return.ts similarity index 76% rename from src/lib/market/api-client/mark-commerce-vendor-stripe-return.ts rename to src/lib/market/api-client/commerce/vendors/updates/mark-commerce-vendor-stripe-return.ts index 5c617d11..530fe44f 100644 --- a/src/lib/market/api-client/mark-commerce-vendor-stripe-return.ts +++ b/src/lib/market/api-client/commerce/vendors/updates/mark-commerce-vendor-stripe-return.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function markCommerceVendorStripeReturnMethod(this: ApiClientFacade, teamId: string) { return this.request('POST', `/v1/commerce/vendors/${encodeURIComponent(teamId)}/stripe/return`, { body: {} }); } diff --git a/src/lib/market/api-client/validate-private-knowledge-access.ts b/src/lib/market/api-client/content/contracts/validate-private-knowledge-access.ts similarity index 78% rename from src/lib/market/api-client/validate-private-knowledge-access.ts rename to src/lib/market/api-client/content/contracts/validate-private-knowledge-access.ts index 5379e08c..43b271f1 100644 --- a/src/lib/market/api-client/validate-private-knowledge-access.ts +++ b/src/lib/market/api-client/content/contracts/validate-private-knowledge-access.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export function validatePrivateKnowledgeAccessMethod(this: ApiClientFacade, projectId: string, body: { slug?: string; route?: string; diff --git a/src/lib/market/api-client/list-knowledge-packs.ts b/src/lib/market/api-client/content/queries/list-knowledge-packs.ts similarity index 75% rename from src/lib/market/api-client/list-knowledge-packs.ts rename to src/lib/market/api-client/content/queries/list-knowledge-packs.ts index 6024fd2d..6ae164b8 100644 --- a/src/lib/market/api-client/list-knowledge-packs.ts +++ b/src/lib/market/api-client/content/queries/list-knowledge-packs.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export function listKnowledgePacksMethod(this: ApiClientFacade, principal: unknown) { return this.listCatalogItems(principal, { kind: 'knowledge_pack' }); } diff --git a/src/lib/market/api-client/record-private-knowledge-outcome.ts b/src/lib/market/api-client/content/updates/record-private-knowledge-outcome.ts similarity index 78% rename from src/lib/market/api-client/record-private-knowledge-outcome.ts rename to src/lib/market/api-client/content/updates/record-private-knowledge-outcome.ts index f53ba294..8bd0b086 100644 --- a/src/lib/market/api-client/record-private-knowledge-outcome.ts +++ b/src/lib/market/api-client/content/updates/record-private-knowledge-outcome.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export function recordPrivateKnowledgeOutcomeMethod(this: ApiClientFacade, projectId: string, body: { slug?: string; route?: string; diff --git a/src/lib/market/api-client/answer-commons-question.ts b/src/lib/market/api-client/governance/commons/contracts/answer-commons-question.ts similarity index 76% rename from src/lib/market/api-client/answer-commons-question.ts rename to src/lib/market/api-client/governance/commons/contracts/answer-commons-question.ts index 0a0d3910..91faef81 100644 --- a/src/lib/market/api-client/answer-commons-question.ts +++ b/src/lib/market/api-client/governance/commons/contracts/answer-commons-question.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function answerCommonsQuestionMethod(this: ApiClientFacade, questionId: string, body: Record) { return this.request('POST', `/v1/commons/questions/${encodeURIComponent(questionId)}/answer`, { body }); } diff --git a/src/lib/market/api-client/backfill-commons-participants.ts b/src/lib/market/api-client/governance/commons/contracts/backfill-commons-participants.ts similarity index 75% rename from src/lib/market/api-client/backfill-commons-participants.ts rename to src/lib/market/api-client/governance/commons/contracts/backfill-commons-participants.ts index 94520737..4d059b7f 100644 --- a/src/lib/market/api-client/backfill-commons-participants.ts +++ b/src/lib/market/api-client/governance/commons/contracts/backfill-commons-participants.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function backfillCommonsParticipantsMethod(this: ApiClientFacade) { return this.request('POST', '/v1/commons/participants/backfill', { body: {} }); } diff --git a/src/lib/market/api-client/create-commons-proposal.ts b/src/lib/market/api-client/governance/commons/creation/create-commons-proposal.ts similarity index 75% rename from src/lib/market/api-client/create-commons-proposal.ts rename to src/lib/market/api-client/governance/commons/creation/create-commons-proposal.ts index 169768d4..668b6538 100644 --- a/src/lib/market/api-client/create-commons-proposal.ts +++ b/src/lib/market/api-client/governance/commons/creation/create-commons-proposal.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function createCommonsProposalMethod(this: ApiClientFacade, body: Record) { return this.request('POST', '/v1/commons/proposals', { body }); } diff --git a/src/lib/market/api-client/start-commons-proposal-voting.ts b/src/lib/market/api-client/governance/commons/creation/start-commons-proposal-voting.ts similarity index 77% rename from src/lib/market/api-client/start-commons-proposal-voting.ts rename to src/lib/market/api-client/governance/commons/creation/start-commons-proposal-voting.ts index dff367d6..3e90cad0 100644 --- a/src/lib/market/api-client/start-commons-proposal-voting.ts +++ b/src/lib/market/api-client/governance/commons/creation/start-commons-proposal-voting.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function startCommonsProposalVotingMethod(this: ApiClientFacade, proposalId: string, body: Record = {}) { return this.request('POST', `/v1/commons/proposals/${encodeURIComponent(proposalId)}/start-voting`, { body }); } diff --git a/src/lib/market/api-client/review-commons-proposal.ts b/src/lib/market/api-client/governance/commons/lifecycle/review-commons-proposal.ts similarity index 76% rename from src/lib/market/api-client/review-commons-proposal.ts rename to src/lib/market/api-client/governance/commons/lifecycle/review-commons-proposal.ts index 527cb2df..d0251152 100644 --- a/src/lib/market/api-client/review-commons-proposal.ts +++ b/src/lib/market/api-client/governance/commons/lifecycle/review-commons-proposal.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function reviewCommonsProposalMethod(this: ApiClientFacade, proposalId: string, body: Record = {}) { return this.request('POST', `/v1/commons/proposals/${encodeURIComponent(proposalId)}/review`, { body }); } diff --git a/src/lib/market/api-client/steward-decision-for-commons-proposal.ts b/src/lib/market/api-client/governance/commons/lifecycle/steward-decision-for-commons-proposal.ts similarity index 77% rename from src/lib/market/api-client/steward-decision-for-commons-proposal.ts rename to src/lib/market/api-client/governance/commons/lifecycle/steward-decision-for-commons-proposal.ts index dcad2a66..b0d28d26 100644 --- a/src/lib/market/api-client/steward-decision-for-commons-proposal.ts +++ b/src/lib/market/api-client/governance/commons/lifecycle/steward-decision-for-commons-proposal.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function stewardDecisionForCommonsProposalMethod(this: ApiClientFacade, proposalId: string, body: Record) { return this.request('POST', `/v1/commons/proposals/${encodeURIComponent(proposalId)}/steward-decision`, { body }); } diff --git a/src/lib/market/api-client/get-commons-participant-me.ts b/src/lib/market/api-client/governance/commons/queries/get-commons-participant-me.ts similarity index 74% rename from src/lib/market/api-client/get-commons-participant-me.ts rename to src/lib/market/api-client/governance/commons/queries/get-commons-participant-me.ts index e9bd2d83..3131a247 100644 --- a/src/lib/market/api-client/get-commons-participant-me.ts +++ b/src/lib/market/api-client/governance/commons/queries/get-commons-participant-me.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function getCommonsParticipantMeMethod(this: ApiClientFacade) { return this.request('GET', '/v1/commons/participants/me'); } diff --git a/src/lib/market/api-client/get-commons-proposal.ts b/src/lib/market/api-client/governance/commons/queries/get-commons-proposal.ts similarity index 75% rename from src/lib/market/api-client/get-commons-proposal.ts rename to src/lib/market/api-client/governance/commons/queries/get-commons-proposal.ts index d884c4b1..08828bdd 100644 --- a/src/lib/market/api-client/get-commons-proposal.ts +++ b/src/lib/market/api-client/governance/commons/queries/get-commons-proposal.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function getCommonsProposalMethod(this: ApiClientFacade, proposalId: string) { return this.request('GET', `/v1/commons/proposals/${encodeURIComponent(proposalId)}`); } diff --git a/src/lib/market/api-client/get-commons-summary.ts b/src/lib/market/api-client/governance/commons/queries/get-commons-summary.ts similarity index 74% rename from src/lib/market/api-client/get-commons-summary.ts rename to src/lib/market/api-client/governance/commons/queries/get-commons-summary.ts index 23ff9352..0bdb25bc 100644 --- a/src/lib/market/api-client/get-commons-summary.ts +++ b/src/lib/market/api-client/governance/commons/queries/get-commons-summary.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function getCommonsSummaryMethod(this: ApiClientFacade) { return this.request('GET', '/v1/commons/summary'); } diff --git a/src/lib/market/api-client/list-commons-decisions.ts b/src/lib/market/api-client/governance/commons/queries/list-commons-decisions.ts similarity index 79% rename from src/lib/market/api-client/list-commons-decisions.ts rename to src/lib/market/api-client/governance/commons/queries/list-commons-decisions.ts index 0c5c537d..97d2261d 100644 --- a/src/lib/market/api-client/list-commons-decisions.ts +++ b/src/lib/market/api-client/governance/commons/queries/list-commons-decisions.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function listCommonsDecisionsMethod(this: ApiClientFacade, filters: Record = {}) { const query = new URLSearchParams(); for (const [key, value] of Object.entries(filters)) { diff --git a/src/lib/market/api-client/list-commons-events.ts b/src/lib/market/api-client/governance/commons/queries/list-commons-events.ts similarity index 79% rename from src/lib/market/api-client/list-commons-events.ts rename to src/lib/market/api-client/governance/commons/queries/list-commons-events.ts index c97f8f22..33df34ae 100644 --- a/src/lib/market/api-client/list-commons-events.ts +++ b/src/lib/market/api-client/governance/commons/queries/list-commons-events.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function listCommonsEventsMethod(this: ApiClientFacade, filters: Record = {}) { const query = new URLSearchParams(); for (const [key, value] of Object.entries(filters)) { diff --git a/src/lib/market/api-client/list-commons-participants.ts b/src/lib/market/api-client/governance/commons/queries/list-commons-participants.ts similarity index 80% rename from src/lib/market/api-client/list-commons-participants.ts rename to src/lib/market/api-client/governance/commons/queries/list-commons-participants.ts index 8a54ceae..59ab5d28 100644 --- a/src/lib/market/api-client/list-commons-participants.ts +++ b/src/lib/market/api-client/governance/commons/queries/list-commons-participants.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function listCommonsParticipantsMethod(this: ApiClientFacade, filters: Record = {}) { const query = new URLSearchParams(); for (const [key, value] of Object.entries(filters)) { diff --git a/src/lib/market/api-client/list-commons-proposals.ts b/src/lib/market/api-client/governance/commons/queries/list-commons-proposals.ts similarity index 79% rename from src/lib/market/api-client/list-commons-proposals.ts rename to src/lib/market/api-client/governance/commons/queries/list-commons-proposals.ts index 0430f468..6fa87286 100644 --- a/src/lib/market/api-client/list-commons-proposals.ts +++ b/src/lib/market/api-client/governance/commons/queries/list-commons-proposals.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function listCommonsProposalsMethod(this: ApiClientFacade, filters: Record = {}) { const query = new URLSearchParams(); for (const [key, value] of Object.entries(filters)) { diff --git a/src/lib/market/api-client/list-commons-questions.ts b/src/lib/market/api-client/governance/commons/queries/list-commons-questions.ts similarity index 79% rename from src/lib/market/api-client/list-commons-questions.ts rename to src/lib/market/api-client/governance/commons/queries/list-commons-questions.ts index 5eeca008..c6bebf2b 100644 --- a/src/lib/market/api-client/list-commons-questions.ts +++ b/src/lib/market/api-client/governance/commons/queries/list-commons-questions.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function listCommonsQuestionsMethod(this: ApiClientFacade, filters: Record = {}) { const query = new URLSearchParams(); for (const [key, value] of Object.entries(filters)) { diff --git a/src/lib/market/api-client/get-repository-host.ts b/src/lib/market/api-client/hosting/queries/get-repository-host.ts similarity index 77% rename from src/lib/market/api-client/get-repository-host.ts rename to src/lib/market/api-client/hosting/queries/get-repository-host.ts index f4f3c70e..13fb0258 100644 --- a/src/lib/market/api-client/get-repository-host.ts +++ b/src/lib/market/api-client/hosting/queries/get-repository-host.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export function getRepositoryHostMethod(this: ApiClientFacade, teamId: string, hostId: string) { return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/repository-hosts/${encodeURIComponent(hostId)}`); } diff --git a/src/lib/market/api-client/list-repository-hosts.ts b/src/lib/market/api-client/hosting/queries/list-repository-hosts.ts similarity index 78% rename from src/lib/market/api-client/list-repository-hosts.ts rename to src/lib/market/api-client/hosting/queries/list-repository-hosts.ts index bf845d95..e8326983 100644 --- a/src/lib/market/api-client/list-repository-hosts.ts +++ b/src/lib/market/api-client/hosting/queries/list-repository-hosts.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export function listRepositoryHostsMethod(this: ApiClientFacade, teamId: string, options: { includePlatform?: boolean; } = {}) { diff --git a/src/lib/market/api-client/interface.ts b/src/lib/market/api-client/interface.ts index 5e4875d4..8b2872c6 100644 --- a/src/lib/market/api-client/interface.ts +++ b/src/lib/market/api-client/interface.ts @@ -1,181 +1,181 @@ declare module '../api-client.ts' { interface ApiClientFacade { - acceptTeamInvite: typeof import('./accept-team-invite.ts').acceptTeamInviteMethod; - accountDeletionBlockers: typeof import('./account-deletion-blockers.ts').accountDeletionBlockersMethod; - accountIdentity: typeof import('./account-identity.ts').accountIdentityMethod; - accountNotifications: typeof import('./account-notifications.ts').accountNotificationsMethod; - accountSessions: typeof import('./account-sessions.ts').accountSessionsMethod; - addAccountEmail: typeof import('./add-account-email.ts').addAccountEmailMethod; - answerCommonsQuestion: typeof import('./answer-commons-question.ts').answerCommonsQuestionMethod; - approveCommerceCapacityInquiryForScoping: typeof import('./approve-commerce-capacity-inquiry-for-scoping.ts').approveCommerceCapacityInquiryForScopingMethod; - approveCommerceCapacityListing: typeof import('./approve-commerce-capacity-listing.ts').approveCommerceCapacityListingMethod; - approveCommerceOwnershipTransfer: typeof import('./approve-commerce-ownership-transfer.ts').approveCommerceOwnershipTransferMethod; - approveDevice: typeof import('./approve-device.ts').approveDeviceMethod; - archiveCommerceCapacityListing: typeof import('./archive-commerce-capacity-listing.ts').archiveCommerceCapacityListingMethod; - authProviders: typeof import('./auth-providers.ts').authProvidersMethod; - backfillCommonsParticipants: typeof import('./backfill-commons-participants.ts').backfillCommonsParticipantsMethod; - buyerApproveCommerceServiceQuote: typeof import('./buyer-approve-commerce-service-quote.ts').buyerApproveCommerceServiceQuoteMethod; - cancelCommerceCapacityInquiry: typeof import('./cancel-commerce-capacity-inquiry.ts').cancelCommerceCapacityInquiryMethod; - cancelCommerceOwnershipTransfer: typeof import('./cancel-commerce-ownership-transfer.ts').cancelCommerceOwnershipTransferMethod; - cancelCommerceServiceContract: typeof import('./cancel-commerce-service-contract.ts').cancelCommerceServiceContractMethod; - cancelCommerceServiceRequest: typeof import('./cancel-commerce-service-request.ts').cancelCommerceServiceRequestMethod; - claimUsername: typeof import('./claim-username.ts').claimUsernameMethod; - completePasswordReset: typeof import('./complete-password-reset.ts').completePasswordResetMethod; - confirmEmail: typeof import('./confirm-email.ts').confirmEmailMethod; - createCommerceCapacityListingInquiry: typeof import('./create-commerce-capacity-listing-inquiry.ts').createCommerceCapacityListingInquiryMethod; - createCommerceCapacityListing: typeof import('./create-commerce-capacity-listing.ts').createCommerceCapacityListingMethod; - createCommerceOrderRefund: typeof import('./create-commerce-order-refund.ts').createCommerceOrderRefundMethod; - createCommerceServiceQuote: typeof import('./create-commerce-service-quote.ts').createCommerceServiceQuoteMethod; - createCommerceServiceRequest: typeof import('./create-commerce-service-request.ts').createCommerceServiceRequestMethod; - createCommerceSuccessionEvent: typeof import('./create-commerce-succession-event.ts').createCommerceSuccessionEventMethod; - createCommerceVendorStripeLoginLink: typeof import('./create-commerce-vendor-stripe-login-link.ts').createCommerceVendorStripeLoginLinkMethod; - createCommonsProposal: typeof import('./create-commons-proposal.ts').createCommonsProposalMethod; - createPersonalTheme: typeof import('./create-personal-theme.ts').createPersonalThemeMethod; - createTreeDxMirror: typeof import('./create-tree-dx-mirror.ts').createTreeDxMirrorMethod; - createTreeDxShare: typeof import('./create-tree-dx-share.ts').createTreeDxShareMethod; - createWorkdayRun: typeof import('./create-workday-run.ts').createWorkdayRunMethod; - decideApprovalRequest: typeof import('./decide-approval-request.ts').decideApprovalRequestMethod; - declineCommerceCapacityInquiry: typeof import('./decline-commerce-capacity-inquiry.ts').declineCommerceCapacityInquiryMethod; - deleteAccountEmail: typeof import('./delete-account-email.ts').deleteAccountEmailMethod; - deleteCurrentAccount: typeof import('./delete-current-account.ts').deleteCurrentAccountMethod; - deletePersonalTheme: typeof import('./delete-personal-theme.ts').deletePersonalThemeMethod; - deleteTeamInboxItemsByItemKey: typeof import('./delete-team-inbox-items-by-item-key.ts').deleteTeamInboxItemsByItemKeyMethod; - endCommerceStewardshipAssignment: typeof import('./end-commerce-stewardship-assignment.ts').endCommerceStewardshipAssignmentMethod; - evaluateProjectDeletionBlockers: typeof import('./evaluate-project-deletion-blockers.ts').evaluateProjectDeletionBlockersMethod; - evaluateTeamDeletionBlockers: typeof import('./evaluate-team-deletion-blockers.ts').evaluateTeamDeletionBlockersMethod; - fulfillCommerceOrderItemArtifact: typeof import('./fulfill-commerce-order-item-artifact.ts').fulfillCommerceOrderItemArtifactMethod; - fulfillCommerceServiceContract: typeof import('./fulfill-commerce-service-contract.ts').fulfillCommerceServiceContractMethod; - getCapacityPlan: typeof import('./get-capacity-plan.ts').getCapacityPlanMethod; - getCatalogItemBySlug: typeof import('./get-catalog-item-by-slug.ts').getCatalogItemBySlugMethod; - getCommerceCapacityListingForProduct: typeof import('./get-commerce-capacity-listing-for-product.ts').getCommerceCapacityListingForProductMethod; - getCommerceCapacityListingInquiry: typeof import('./get-commerce-capacity-listing-inquiry.ts').getCommerceCapacityListingInquiryMethod; - getCommerceCapacityListing: typeof import('./get-commerce-capacity-listing.ts').getCommerceCapacityListingMethod; - getCommerceMarketplaceProduct: typeof import('./get-commerce-marketplace-product.ts').getCommerceMarketplaceProductMethod; - getCommerceOwnershipWorkflow: typeof import('./get-commerce-ownership-workflow.ts').getCommerceOwnershipWorkflowMethod; - getCommerceProduct: typeof import('./get-commerce-product.ts').getCommerceProductMethod; - getCommerceServiceContract: typeof import('./get-commerce-service-contract.ts').getCommerceServiceContractMethod; - getCommerceServiceRequest: typeof import('./get-commerce-service-request.ts').getCommerceServiceRequestMethod; - getCommerceVendorMonitoring: typeof import('./get-commerce-vendor-monitoring.ts').getCommerceVendorMonitoringMethod; - getCommerceVendorSalesSummary: typeof import('./get-commerce-vendor-sales-summary.ts').getCommerceVendorSalesSummaryMethod; - getCommerceVendorStripeStatus: typeof import('./get-commerce-vendor-stripe-status.ts').getCommerceVendorStripeStatusMethod; - getCommerceVendor: typeof import('./get-commerce-vendor.ts').getCommerceVendorMethod; - getCommonsParticipantMe: typeof import('./get-commons-participant-me.ts').getCommonsParticipantMeMethod; - getCommonsProposal: typeof import('./get-commons-proposal.ts').getCommonsProposalMethod; - getCommonsSummary: typeof import('./get-commons-summary.ts').getCommonsSummaryMethod; - getDecisionPlanningStatus: typeof import('./get-decision-planning-status.ts').getDecisionPlanningStatusMethod; - getProjectAgentsSummary: typeof import('./get-project-agents-summary.ts').getProjectAgentsSummaryMethod; - getProjectByTeamAndSlug: typeof import('./get-project-by-team-and-slug.ts').getProjectByTeamAndSlugMethod; - getProjectCapacityRuntimeDiagnostics: typeof import('./get-project-capacity-runtime-diagnostics.ts').getProjectCapacityRuntimeDiagnosticsMethod; - getProjectCapacitySummary: typeof import('./get-project-capacity-summary.ts').getProjectCapacitySummaryMethod; - getProjectDeployment: typeof import('./get-project-deployment.ts').getProjectDeploymentMethod; - getProjectDetails: typeof import('./get-project-details.ts').getProjectDetailsMethod; - getProjectReleasesSummary: typeof import('./get-project-releases-summary.ts').getProjectReleasesSummaryMethod; - getProjectRepositoryTopology: typeof import('./get-project-repository-topology.ts').getProjectRepositoryTopologyMethod; - getProjectSummary: typeof import('./get-project-summary.ts').getProjectSummaryMethod; - getProjectTreeDxLibrary: typeof import('./get-project-tree-dx-library.ts').getProjectTreeDxLibraryMethod; - getProviderAssignmentExplanation: typeof import('./get-provider-assignment-explanation.ts').getProviderAssignmentExplanationMethod; - getRepositoryHost: typeof import('./get-repository-host.ts').getRepositoryHostMethod; - getTeamAccessSummary: typeof import('./get-team-access-summary.ts').getTeamAccessSummaryMethod; - getTeamInvite: typeof import('./get-team-invite.ts').getTeamInviteMethod; - getTeamTreeDx: typeof import('./get-team-tree-dx.ts').getTeamTreeDxMethod; - getTeamWebHost: typeof import('./get-team-web-host.ts').getTeamWebHostMethod; - getWorkdayCapacitySummary: typeof import('./get-workday-capacity-summary.ts').getWorkdayCapacitySummaryMethod; - getWorkdayRun: typeof import('./get-workday-run.ts').getWorkdayRunMethod; - headers: typeof import('./headers.ts').headersMethod; - linkCommerceServiceContractWork: typeof import('./link-commerce-service-contract-work.ts').linkCommerceServiceContractWorkMethod; - listApprovalRequestsForProject: typeof import('./list-approval-requests-for-project.ts').listApprovalRequestsForProjectMethod; - listApprovalRequestsForTeam: typeof import('./list-approval-requests-for-team.ts').listApprovalRequestsForTeamMethod; - listAuditEventsForTarget: typeof import('./list-audit-events-for-target.ts').listAuditEventsForTargetMethod; - listCapacityAllocationSets: typeof import('./list-capacity-allocation-sets.ts').listCapacityAllocationSetsMethod; - listCapacityLedgerEntries: typeof import('./list-capacity-ledger-entries.ts').listCapacityLedgerEntriesMethod; - listCapacityRoutingDecisionsForProject: typeof import('./list-capacity-routing-decisions-for-project.ts').listCapacityRoutingDecisionsForProjectMethod; - listCatalogArtifactVersions: typeof import('./list-catalog-artifact-versions.ts').listCatalogArtifactVersionsMethod; - listCatalogItems: typeof import('./list-catalog-items.ts').listCatalogItemsMethod; - listCommerceCapacityListingInquiries: typeof import('./list-commerce-capacity-listing-inquiries.ts').listCommerceCapacityListingInquiriesMethod; - listCommerceCapacityListings: typeof import('./list-commerce-capacity-listings.ts').listCommerceCapacityListingsMethod; - listCommerceMarketplaceProducts: typeof import('./list-commerce-marketplace-products.ts').listCommerceMarketplaceProductsMethod; - listCommerceProducts: typeof import('./list-commerce-products.ts').listCommerceProductsMethod; - listCommerceServiceEvents: typeof import('./list-commerce-service-events.ts').listCommerceServiceEventsMethod; - listCommerceServiceQuotes: typeof import('./list-commerce-service-quotes.ts').listCommerceServiceQuotesMethod; - listCommerceServiceRequests: typeof import('./list-commerce-service-requests.ts').listCommerceServiceRequestsMethod; - listCommerceSuccessionEvents: typeof import('./list-commerce-succession-events.ts').listCommerceSuccessionEventsMethod; - listCommerceVendorFulfillmentEvents: typeof import('./list-commerce-vendor-fulfillment-events.ts').listCommerceVendorFulfillmentEventsMethod; - listCommerceVendorSalesEntitlements: typeof import('./list-commerce-vendor-sales-entitlements.ts').listCommerceVendorSalesEntitlementsMethod; - listCommerceVendorSalesOrders: typeof import('./list-commerce-vendor-sales-orders.ts').listCommerceVendorSalesOrdersMethod; - listCommerceVendorSalesRefunds: typeof import('./list-commerce-vendor-sales-refunds.ts').listCommerceVendorSalesRefundsMethod; - listCommerceVendorSalesSubscriptions: typeof import('./list-commerce-vendor-sales-subscriptions.ts').listCommerceVendorSalesSubscriptionsMethod; - listCommonsDecisions: typeof import('./list-commons-decisions.ts').listCommonsDecisionsMethod; - listCommonsEvents: typeof import('./list-commons-events.ts').listCommonsEventsMethod; - listCommonsParticipants: typeof import('./list-commons-participants.ts').listCommonsParticipantsMethod; - listCommonsProposals: typeof import('./list-commons-proposals.ts').listCommonsProposalsMethod; - listCommonsQuestions: typeof import('./list-commons-questions.ts').listCommonsQuestionsMethod; - listDecisionCapacityPlans: typeof import('./list-decision-capacity-plans.ts').listDecisionCapacityPlansMethod; - listDecisionExecutionInputs: typeof import('./list-decision-execution-inputs.ts').listDecisionExecutionInputsMethod; - listExecutionRuns: typeof import('./list-execution-runs.ts').listExecutionRunsMethod; - listKnowledgePacks: typeof import('./list-knowledge-packs.ts').listKnowledgePacksMethod; - listPersistedTeamInboxItems: typeof import('./list-persisted-team-inbox-items.ts').listPersistedTeamInboxItemsMethod; - listProjectAgentClasses: typeof import('./list-project-agent-classes.ts').listProjectAgentClassesMethod; - listProjectAgentFallbackOutputs: typeof import('./list-project-agent-fallback-outputs.ts').listProjectAgentFallbackOutputsMethod; - listProjectAgentModeRuns: typeof import('./list-project-agent-mode-runs.ts').listProjectAgentModeRunsMethod; - listProjectDeploymentEvents: typeof import('./list-project-deployment-events.ts').listProjectDeploymentEventsMethod; - listProjectDeployments: typeof import('./list-project-deployments.ts').listProjectDeploymentsMethod; - listProjectTreeDxProxyAudit: typeof import('./list-project-tree-dx-proxy-audit.ts').listProjectTreeDxProxyAuditMethod; - listProjectsForPrincipal: typeof import('./list-projects-for-principal.ts').listProjectsForPrincipalMethod; - listProviderAssignments: typeof import('./list-provider-assignments.ts').listProviderAssignmentsMethod; - listProviderAvailabilitySessions: typeof import('./list-provider-availability-sessions.ts').listProviderAvailabilitySessionsMethod; - listRepositoryHosts: typeof import('./list-repository-hosts.ts').listRepositoryHostsMethod; - listSeedRuns: typeof import('./list-seed-runs.ts').listSeedRunsMethod; - listTeamMembers: typeof import('./list-team-members.ts').listTeamMembersMethod; - listTeamProjects: typeof import('./list-team-projects.ts').listTeamProjectsMethod; - listTeamWebHosts: typeof import('./list-team-web-hosts.ts').listTeamWebHostsMethod; - listTeamsForPrincipal: typeof import('./list-teams-for-principal.ts').listTeamsForPrincipalMethod; - listTreeDxMirrors: typeof import('./list-tree-dx-mirrors.ts').listTreeDxMirrorsMethod; - listTreeDxShares: typeof import('./list-tree-dx-shares.ts').listTreeDxSharesMethod; - listWorkdayRuns: typeof import('./list-workday-runs.ts').listWorkdayRunsMethod; - loadTeamProfileByName: typeof import('./load-team-profile-by-name.ts').loadTeamProfileByNameMethod; - loadUserProfileByUsername: typeof import('./load-user-profile-by-username.ts').loadUserProfileByUsernameMethod; - markCommerceVendorStripeReturn: typeof import('./mark-commerce-vendor-stripe-return.ts').markCommerceVendorStripeReturnMethod; - notificationPreferences: typeof import('./notification-preferences.ts').notificationPreferencesMethod; - personalThemes: typeof import('./personal-themes.ts').personalThemesMethod; - provisionTeamTreeDx: typeof import('./provision-team-tree-dx.ts').provisionTeamTreeDxMethod; - recordPrivateKnowledgeOutcome: typeof import('./record-private-knowledge-outcome.ts').recordPrivateKnowledgeOutcomeMethod; - rejectCommerceCapacityListing: typeof import('./reject-commerce-capacity-listing.ts').rejectCommerceCapacityListingMethod; - rejectCommerceOwnershipTransfer: typeof import('./reject-commerce-ownership-transfer.ts').rejectCommerceOwnershipTransferMethod; - rejectCommerceServiceQuote: typeof import('./reject-commerce-service-quote.ts').rejectCommerceServiceQuoteMethod; - requestCommerceVendor: typeof import('./request-commerce-vendor.ts').requestCommerceVendorMethod; - requestPasswordReset: typeof import('./request-password-reset.ts').requestPasswordResetMethod; - request: typeof import('./request.ts').requestMethod; - resendAccountEmail: typeof import('./resend-account-email.ts').resendAccountEmailMethod; - reviewCommerceCapacityInquiry: typeof import('./review-commerce-capacity-inquiry.ts').reviewCommerceCapacityInquiryMethod; - reviewCommonsProposal: typeof import('./review-commons-proposal.ts').reviewCommonsProposalMethod; - revokeAccountSession: typeof import('./revoke-account-session.ts').revokeAccountSessionMethod; - revokeCommerceEntitlement: typeof import('./revoke-commerce-entitlement.ts').revokeCommerceEntitlementMethod; - setPrimaryAccountEmail: typeof import('./set-primary-account-email.ts').setPrimaryAccountEmailMethod; - startCommerceServiceScoping: typeof import('./start-commerce-service-scoping.ts').startCommerceServiceScopingMethod; - startCommerceVendorStripeOnboarding: typeof import('./start-commerce-vendor-stripe-onboarding.ts').startCommerceVendorStripeOnboardingMethod; - startCommonsProposalVoting: typeof import('./start-commons-proposal-voting.ts').startCommonsProposalVotingMethod; - stewardDecisionForCommonsProposal: typeof import('./steward-decision-for-commons-proposal.ts').stewardDecisionForCommonsProposalMethod; - submitCommerceCapacityListing: typeof import('./submit-commerce-capacity-listing.ts').submitCommerceCapacityListingMethod; - submitCommerceOwnershipTransfer: typeof import('./submit-commerce-ownership-transfer.ts').submitCommerceOwnershipTransferMethod; - submitCommerceServiceQuote: typeof import('./submit-commerce-service-quote.ts').submitCommerceServiceQuoteMethod; - suspendCommerceCapacityListing: typeof import('./suspend-commerce-capacity-listing.ts').suspendCommerceCapacityListingMethod; - unlinkAccountProvider: typeof import('./unlink-account-provider.ts').unlinkAccountProviderMethod; - updateAccountPassword: typeof import('./update-account-password.ts').updateAccountPasswordMethod; - updateAccountProfile: typeof import('./update-account-profile.ts').updateAccountProfileMethod; - updateCommerceCapacityListing: typeof import('./update-commerce-capacity-listing.ts').updateCommerceCapacityListingMethod; - updateCommerceContribution: typeof import('./update-commerce-contribution.ts').updateCommerceContributionMethod; - updateCommerceGovernancePolicy: typeof import('./update-commerce-governance-policy.ts').updateCommerceGovernancePolicyMethod; - updateCommerceOwnershipRecord: typeof import('./update-commerce-ownership-record.ts').updateCommerceOwnershipRecordMethod; - updateCommerceServiceRequest: typeof import('./update-commerce-service-request.ts').updateCommerceServiceRequestMethod; - updateCommerceStewardshipAssignment: typeof import('./update-commerce-stewardship-assignment.ts').updateCommerceStewardshipAssignmentMethod; - updateNotificationPreferences: typeof import('./update-notification-preferences.ts').updateNotificationPreferencesMethod; - updatePersonalTheme: typeof import('./update-personal-theme.ts').updatePersonalThemeMethod; - updateProjectRepositoryTopology: typeof import('./update-project-repository-topology.ts').updateProjectRepositoryTopologyMethod; - updateTeamTreeDx: typeof import('./update-team-tree-dx.ts').updateTeamTreeDxMethod; - upsertProjectTreeDxLibrary: typeof import('./upsert-project-tree-dx-library.ts').upsertProjectTreeDxLibraryMethod; - url: typeof import('./url.ts').urlMethod; - validatePrivateKnowledgeAccess: typeof import('./validate-private-knowledge-access.ts').validatePrivateKnowledgeAccessMethod; - vendorApproveCommerceServiceQuote: typeof import('./vendor-approve-commerce-service-quote.ts').vendorApproveCommerceServiceQuoteMethod; + acceptTeamInvite: typeof import('./teams/lifecycle/accept-team-invite.ts').acceptTeamInviteMethod; + accountDeletionBlockers: typeof import('./accounts/contracts/account-deletion-blockers.ts').accountDeletionBlockersMethod; + accountIdentity: typeof import('./accounts/contracts/account-identity.ts').accountIdentityMethod; + accountNotifications: typeof import('./accounts/contracts/account-notifications.ts').accountNotificationsMethod; + accountSessions: typeof import('./accounts/contracts/account-sessions.ts').accountSessionsMethod; + addAccountEmail: typeof import('./accounts/creation/add-account-email.ts').addAccountEmailMethod; + answerCommonsQuestion: typeof import('./governance/commons/contracts/answer-commons-question.ts').answerCommonsQuestionMethod; + approveCommerceCapacityInquiryForScoping: typeof import('./commerce/capacity/lifecycle/approve-commerce-capacity-inquiry-for-scoping.ts').approveCommerceCapacityInquiryForScopingMethod; + approveCommerceCapacityListing: typeof import('./commerce/capacity/lifecycle/approve-commerce-capacity-listing.ts').approveCommerceCapacityListingMethod; + approveCommerceOwnershipTransfer: typeof import('./commerce/ownership/lifecycle/approve-commerce-ownership-transfer.ts').approveCommerceOwnershipTransferMethod; + approveDevice: typeof import('./runtime/lifecycle/approve-device.ts').approveDeviceMethod; + archiveCommerceCapacityListing: typeof import('./commerce/capacity/retirement/archive-commerce-capacity-listing.ts').archiveCommerceCapacityListingMethod; + authProviders: typeof import('./capacity/providers/contracts/auth-providers.ts').authProvidersMethod; + backfillCommonsParticipants: typeof import('./governance/commons/contracts/backfill-commons-participants.ts').backfillCommonsParticipantsMethod; + buyerApproveCommerceServiceQuote: typeof import('./commerce/services/contracts/buyer-approve-commerce-service-quote.ts').buyerApproveCommerceServiceQuoteMethod; + cancelCommerceCapacityInquiry: typeof import('./commerce/capacity/retirement/cancel-commerce-capacity-inquiry.ts').cancelCommerceCapacityInquiryMethod; + cancelCommerceOwnershipTransfer: typeof import('./commerce/ownership/retirement/cancel-commerce-ownership-transfer.ts').cancelCommerceOwnershipTransferMethod; + cancelCommerceServiceContract: typeof import('./commerce/services/retirement/cancel-commerce-service-contract.ts').cancelCommerceServiceContractMethod; + cancelCommerceServiceRequest: typeof import('./commerce/services/retirement/cancel-commerce-service-request.ts').cancelCommerceServiceRequestMethod; + claimUsername: typeof import('./accounts/lifecycle/claim-username.ts').claimUsernameMethod; + completePasswordReset: typeof import('./accounts/lifecycle/complete-password-reset.ts').completePasswordResetMethod; + confirmEmail: typeof import('./accounts/lifecycle/confirm-email.ts').confirmEmailMethod; + createCommerceCapacityListingInquiry: typeof import('./commerce/capacity/creation/create-commerce-capacity-listing-inquiry.ts').createCommerceCapacityListingInquiryMethod; + createCommerceCapacityListing: typeof import('./commerce/capacity/creation/create-commerce-capacity-listing.ts').createCommerceCapacityListingMethod; + createCommerceOrderRefund: typeof import('./commerce/orders/creation/create-commerce-order-refund.ts').createCommerceOrderRefundMethod; + createCommerceServiceQuote: typeof import('./commerce/services/creation/create-commerce-service-quote.ts').createCommerceServiceQuoteMethod; + createCommerceServiceRequest: typeof import('./commerce/services/creation/create-commerce-service-request.ts').createCommerceServiceRequestMethod; + createCommerceSuccessionEvent: typeof import('./commerce/ownership/creation/create-commerce-succession-event.ts').createCommerceSuccessionEventMethod; + createCommerceVendorStripeLoginLink: typeof import('./commerce/vendors/creation/create-commerce-vendor-stripe-login-link.ts').createCommerceVendorStripeLoginLinkMethod; + createCommonsProposal: typeof import('./governance/commons/creation/create-commons-proposal.ts').createCommonsProposalMethod; + createPersonalTheme: typeof import('./support/creation/create-personal-theme.ts').createPersonalThemeMethod; + createTreeDxMirror: typeof import('./treedx/repositories/creation/create-tree-dx-mirror.ts').createTreeDxMirrorMethod; + createTreeDxShare: typeof import('./treedx/repositories/creation/create-tree-dx-share.ts').createTreeDxShareMethod; + createWorkdayRun: typeof import('./capacity/workdays/creation/create-workday-run.ts').createWorkdayRunMethod; + decideApprovalRequest: typeof import('./support/lifecycle/decide-approval-request.ts').decideApprovalRequestMethod; + declineCommerceCapacityInquiry: typeof import('./commerce/capacity/lifecycle/decline-commerce-capacity-inquiry.ts').declineCommerceCapacityInquiryMethod; + deleteAccountEmail: typeof import('./accounts/retirement/delete-account-email.ts').deleteAccountEmailMethod; + deleteCurrentAccount: typeof import('./accounts/retirement/delete-current-account.ts').deleteCurrentAccountMethod; + deletePersonalTheme: typeof import('./support/retirement/delete-personal-theme.ts').deletePersonalThemeMethod; + deleteTeamInboxItemsByItemKey: typeof import('./teams/retirement/delete-team-inbox-items-by-item-key.ts').deleteTeamInboxItemsByItemKeyMethod; + endCommerceStewardshipAssignment: typeof import('./commerce/ownership/contracts/end-commerce-stewardship-assignment.ts').endCommerceStewardshipAssignmentMethod; + evaluateProjectDeletionBlockers: typeof import('./projects/projects-core/contracts/evaluate-project-deletion-blockers.ts').evaluateProjectDeletionBlockersMethod; + evaluateTeamDeletionBlockers: typeof import('./teams/contracts/evaluate-team-deletion-blockers.ts').evaluateTeamDeletionBlockersMethod; + fulfillCommerceOrderItemArtifact: typeof import('./commerce/orders/lifecycle/fulfill-commerce-order-item-artifact.ts').fulfillCommerceOrderItemArtifactMethod; + fulfillCommerceServiceContract: typeof import('./commerce/services/lifecycle/fulfill-commerce-service-contract.ts').fulfillCommerceServiceContractMethod; + getCapacityPlan: typeof import('./capacity/planning/queries/get-capacity-plan.ts').getCapacityPlanMethod; + getCatalogItemBySlug: typeof import('./commerce/catalog/queries/get-catalog-item-by-slug.ts').getCatalogItemBySlugMethod; + getCommerceCapacityListingForProduct: typeof import('./commerce/capacity/queries/get-commerce-capacity-listing-for-product.ts').getCommerceCapacityListingForProductMethod; + getCommerceCapacityListingInquiry: typeof import('./commerce/capacity/queries/get-commerce-capacity-listing-inquiry.ts').getCommerceCapacityListingInquiryMethod; + getCommerceCapacityListing: typeof import('./commerce/capacity/queries/get-commerce-capacity-listing.ts').getCommerceCapacityListingMethod; + getCommerceMarketplaceProduct: typeof import('./commerce/catalog/queries/get-commerce-marketplace-product.ts').getCommerceMarketplaceProductMethod; + getCommerceOwnershipWorkflow: typeof import('./commerce/ownership/queries/get-commerce-ownership-workflow.ts').getCommerceOwnershipWorkflowMethod; + getCommerceProduct: typeof import('./commerce/catalog/queries/get-commerce-product.ts').getCommerceProductMethod; + getCommerceServiceContract: typeof import('./commerce/services/queries/get-commerce-service-contract.ts').getCommerceServiceContractMethod; + getCommerceServiceRequest: typeof import('./commerce/services/queries/get-commerce-service-request.ts').getCommerceServiceRequestMethod; + getCommerceVendorMonitoring: typeof import('./commerce/vendors/queries/get-commerce-vendor-monitoring.ts').getCommerceVendorMonitoringMethod; + getCommerceVendorSalesSummary: typeof import('./commerce/vendors/queries/get-commerce-vendor-sales-summary.ts').getCommerceVendorSalesSummaryMethod; + getCommerceVendorStripeStatus: typeof import('./commerce/vendors/queries/get-commerce-vendor-stripe-status.ts').getCommerceVendorStripeStatusMethod; + getCommerceVendor: typeof import('./commerce/vendors/queries/get-commerce-vendor.ts').getCommerceVendorMethod; + getCommonsParticipantMe: typeof import('./governance/commons/queries/get-commons-participant-me.ts').getCommonsParticipantMeMethod; + getCommonsProposal: typeof import('./governance/commons/queries/get-commons-proposal.ts').getCommonsProposalMethod; + getCommonsSummary: typeof import('./governance/commons/queries/get-commons-summary.ts').getCommonsSummaryMethod; + getDecisionPlanningStatus: typeof import('./support/queries/get-decision-planning-status.ts').getDecisionPlanningStatusMethod; + getProjectAgentsSummary: typeof import('./projects/projects-core/queries/get-project-agents-summary.ts').getProjectAgentsSummaryMethod; + getProjectByTeamAndSlug: typeof import('./projects/projects-core/queries/get-project-by-team-and-slug.ts').getProjectByTeamAndSlugMethod; + getProjectCapacityRuntimeDiagnostics: typeof import('./capacity/observability/queries/get-project-capacity-runtime-diagnostics.ts').getProjectCapacityRuntimeDiagnosticsMethod; + getProjectCapacitySummary: typeof import('./capacity/observability/queries/get-project-capacity-summary.ts').getProjectCapacitySummaryMethod; + getProjectDeployment: typeof import('./projects/deployments/queries/get-project-deployment.ts').getProjectDeploymentMethod; + getProjectDetails: typeof import('./projects/projects-core/queries/get-project-details.ts').getProjectDetailsMethod; + getProjectReleasesSummary: typeof import('./projects/delivery/queries/get-project-releases-summary.ts').getProjectReleasesSummaryMethod; + getProjectRepositoryTopology: typeof import('./projects/repositories/queries/get-project-repository-topology.ts').getProjectRepositoryTopologyMethod; + getProjectSummary: typeof import('./projects/projects-core/queries/get-project-summary.ts').getProjectSummaryMethod; + getProjectTreeDxLibrary: typeof import('./projects/knowledge/queries/get-project-tree-dx-library.ts').getProjectTreeDxLibraryMethod; + getProviderAssignmentExplanation: typeof import('./capacity/assignments/queries/get-provider-assignment-explanation.ts').getProviderAssignmentExplanationMethod; + getRepositoryHost: typeof import('./hosting/queries/get-repository-host.ts').getRepositoryHostMethod; + getTeamAccessSummary: typeof import('./teams/queries/get-team-access-summary.ts').getTeamAccessSummaryMethod; + getTeamInvite: typeof import('./teams/queries/get-team-invite.ts').getTeamInviteMethod; + getTeamTreeDx: typeof import('./treedx/repositories/queries/get-team-tree-dx.ts').getTeamTreeDxMethod; + getTeamWebHost: typeof import('./teams/queries/get-team-web-host.ts').getTeamWebHostMethod; + getWorkdayCapacitySummary: typeof import('./capacity/workdays/queries/get-workday-capacity-summary.ts').getWorkdayCapacitySummaryMethod; + getWorkdayRun: typeof import('./capacity/workdays/queries/get-workday-run.ts').getWorkdayRunMethod; + headers: typeof import('./support/contracts/headers.ts').headersMethod; + linkCommerceServiceContractWork: typeof import('./commerce/services/contracts/link-commerce-service-contract-work.ts').linkCommerceServiceContractWorkMethod; + listApprovalRequestsForProject: typeof import('./projects/projects-core/queries/list-approval-requests-for-project.ts').listApprovalRequestsForProjectMethod; + listApprovalRequestsForTeam: typeof import('./teams/queries/list-approval-requests-for-team.ts').listApprovalRequestsForTeamMethod; + listAuditEventsForTarget: typeof import('./support/queries/list-audit-events-for-target.ts').listAuditEventsForTargetMethod; + listCapacityAllocationSets: typeof import('./capacity/allocations/queries/list-capacity-allocation-sets.ts').listCapacityAllocationSetsMethod; + listCapacityLedgerEntries: typeof import('./capacity/accounting/queries/list-capacity-ledger-entries.ts').listCapacityLedgerEntriesMethod; + listCapacityRoutingDecisionsForProject: typeof import('./capacity/planning/queries/list-capacity-routing-decisions-for-project.ts').listCapacityRoutingDecisionsForProjectMethod; + listCatalogArtifactVersions: typeof import('./commerce/orders/queries/list-catalog-artifact-versions.ts').listCatalogArtifactVersionsMethod; + listCatalogItems: typeof import('./commerce/catalog/queries/list-catalog-items.ts').listCatalogItemsMethod; + listCommerceCapacityListingInquiries: typeof import('./commerce/capacity/queries/list-commerce-capacity-listing-inquiries.ts').listCommerceCapacityListingInquiriesMethod; + listCommerceCapacityListings: typeof import('./commerce/capacity/queries/list-commerce-capacity-listings.ts').listCommerceCapacityListingsMethod; + listCommerceMarketplaceProducts: typeof import('./commerce/catalog/queries/list-commerce-marketplace-products.ts').listCommerceMarketplaceProductsMethod; + listCommerceProducts: typeof import('./commerce/catalog/queries/list-commerce-products.ts').listCommerceProductsMethod; + listCommerceServiceEvents: typeof import('./commerce/services/queries/list-commerce-service-events.ts').listCommerceServiceEventsMethod; + listCommerceServiceQuotes: typeof import('./commerce/services/queries/list-commerce-service-quotes.ts').listCommerceServiceQuotesMethod; + listCommerceServiceRequests: typeof import('./commerce/services/queries/list-commerce-service-requests.ts').listCommerceServiceRequestsMethod; + listCommerceSuccessionEvents: typeof import('./commerce/ownership/queries/list-commerce-succession-events.ts').listCommerceSuccessionEventsMethod; + listCommerceVendorFulfillmentEvents: typeof import('./commerce/vendors/queries/list-commerce-vendor-fulfillment-events.ts').listCommerceVendorFulfillmentEventsMethod; + listCommerceVendorSalesEntitlements: typeof import('./commerce/vendors/queries/list-commerce-vendor-sales-entitlements.ts').listCommerceVendorSalesEntitlementsMethod; + listCommerceVendorSalesOrders: typeof import('./commerce/vendors/queries/list-commerce-vendor-sales-orders.ts').listCommerceVendorSalesOrdersMethod; + listCommerceVendorSalesRefunds: typeof import('./commerce/vendors/queries/list-commerce-vendor-sales-refunds.ts').listCommerceVendorSalesRefundsMethod; + listCommerceVendorSalesSubscriptions: typeof import('./commerce/vendors/queries/list-commerce-vendor-sales-subscriptions.ts').listCommerceVendorSalesSubscriptionsMethod; + listCommonsDecisions: typeof import('./governance/commons/queries/list-commons-decisions.ts').listCommonsDecisionsMethod; + listCommonsEvents: typeof import('./governance/commons/queries/list-commons-events.ts').listCommonsEventsMethod; + listCommonsParticipants: typeof import('./governance/commons/queries/list-commons-participants.ts').listCommonsParticipantsMethod; + listCommonsProposals: typeof import('./governance/commons/queries/list-commons-proposals.ts').listCommonsProposalsMethod; + listCommonsQuestions: typeof import('./governance/commons/queries/list-commons-questions.ts').listCommonsQuestionsMethod; + listDecisionCapacityPlans: typeof import('./capacity/planning/queries/list-decision-capacity-plans.ts').listDecisionCapacityPlansMethod; + listDecisionExecutionInputs: typeof import('./support/queries/list-decision-execution-inputs.ts').listDecisionExecutionInputsMethod; + listExecutionRuns: typeof import('./support/queries/list-execution-runs.ts').listExecutionRunsMethod; + listKnowledgePacks: typeof import('./content/queries/list-knowledge-packs.ts').listKnowledgePacksMethod; + listPersistedTeamInboxItems: typeof import('./teams/queries/list-persisted-team-inbox-items.ts').listPersistedTeamInboxItemsMethod; + listProjectAgentClasses: typeof import('./projects/agents/queries/list-project-agent-classes.ts').listProjectAgentClassesMethod; + listProjectAgentFallbackOutputs: typeof import('./projects/agents/queries/list-project-agent-fallback-outputs.ts').listProjectAgentFallbackOutputsMethod; + listProjectAgentModeRuns: typeof import('./projects/agents/queries/list-project-agent-mode-runs.ts').listProjectAgentModeRunsMethod; + listProjectDeploymentEvents: typeof import('./projects/deployments/queries/list-project-deployment-events.ts').listProjectDeploymentEventsMethod; + listProjectDeployments: typeof import('./projects/deployments/queries/list-project-deployments.ts').listProjectDeploymentsMethod; + listProjectTreeDxProxyAudit: typeof import('./projects/knowledge/queries/list-project-tree-dx-proxy-audit.ts').listProjectTreeDxProxyAuditMethod; + listProjectsForPrincipal: typeof import('./projects/projects-core/queries/list-projects-for-principal.ts').listProjectsForPrincipalMethod; + listProviderAssignments: typeof import('./capacity/assignments/queries/list-provider-assignments.ts').listProviderAssignmentsMethod; + listProviderAvailabilitySessions: typeof import('./capacity/providers/queries/list-provider-availability-sessions.ts').listProviderAvailabilitySessionsMethod; + listRepositoryHosts: typeof import('./hosting/queries/list-repository-hosts.ts').listRepositoryHostsMethod; + listSeedRuns: typeof import('./seeds/queries/list-seed-runs.ts').listSeedRunsMethod; + listTeamMembers: typeof import('./teams/queries/list-team-members.ts').listTeamMembersMethod; + listTeamProjects: typeof import('./projects/projects-core/queries/list-team-projects.ts').listTeamProjectsMethod; + listTeamWebHosts: typeof import('./teams/queries/list-team-web-hosts.ts').listTeamWebHostsMethod; + listTeamsForPrincipal: typeof import('./teams/queries/list-teams-for-principal.ts').listTeamsForPrincipalMethod; + listTreeDxMirrors: typeof import('./treedx/repositories/queries/list-tree-dx-mirrors.ts').listTreeDxMirrorsMethod; + listTreeDxShares: typeof import('./treedx/repositories/queries/list-tree-dx-shares.ts').listTreeDxSharesMethod; + listWorkdayRuns: typeof import('./capacity/workdays/queries/list-workday-runs.ts').listWorkdayRunsMethod; + loadTeamProfileByName: typeof import('./teams/queries/load-team-profile-by-name.ts').loadTeamProfileByNameMethod; + loadUserProfileByUsername: typeof import('./accounts/queries/load-user-profile-by-username.ts').loadUserProfileByUsernameMethod; + markCommerceVendorStripeReturn: typeof import('./commerce/vendors/updates/mark-commerce-vendor-stripe-return.ts').markCommerceVendorStripeReturnMethod; + notificationPreferences: typeof import('./accounts/contracts/notification-preferences.ts').notificationPreferencesMethod; + personalThemes: typeof import('./support/contracts/personal-themes.ts').personalThemesMethod; + provisionTeamTreeDx: typeof import('./treedx/repositories/creation/provision-team-tree-dx.ts').provisionTeamTreeDxMethod; + recordPrivateKnowledgeOutcome: typeof import('./content/updates/record-private-knowledge-outcome.ts').recordPrivateKnowledgeOutcomeMethod; + rejectCommerceCapacityListing: typeof import('./commerce/capacity/lifecycle/reject-commerce-capacity-listing.ts').rejectCommerceCapacityListingMethod; + rejectCommerceOwnershipTransfer: typeof import('./commerce/ownership/lifecycle/reject-commerce-ownership-transfer.ts').rejectCommerceOwnershipTransferMethod; + rejectCommerceServiceQuote: typeof import('./commerce/services/lifecycle/reject-commerce-service-quote.ts').rejectCommerceServiceQuoteMethod; + requestCommerceVendor: typeof import('./commerce/vendors/creation/request-commerce-vendor.ts').requestCommerceVendorMethod; + requestPasswordReset: typeof import('./accounts/creation/request-password-reset.ts').requestPasswordResetMethod; + request: typeof import('./support/contracts/request.ts').requestMethod; + resendAccountEmail: typeof import('./accounts/contracts/resend-account-email.ts').resendAccountEmailMethod; + reviewCommerceCapacityInquiry: typeof import('./commerce/capacity/lifecycle/review-commerce-capacity-inquiry.ts').reviewCommerceCapacityInquiryMethod; + reviewCommonsProposal: typeof import('./governance/commons/lifecycle/review-commons-proposal.ts').reviewCommonsProposalMethod; + revokeAccountSession: typeof import('./accounts/retirement/revoke-account-session.ts').revokeAccountSessionMethod; + revokeCommerceEntitlement: typeof import('./commerce/payments/retirement/revoke-commerce-entitlement.ts').revokeCommerceEntitlementMethod; + setPrimaryAccountEmail: typeof import('./accounts/updates/set-primary-account-email.ts').setPrimaryAccountEmailMethod; + startCommerceServiceScoping: typeof import('./commerce/commerce-core/creation/start-commerce-service-scoping.ts').startCommerceServiceScopingMethod; + startCommerceVendorStripeOnboarding: typeof import('./commerce/vendors/creation/start-commerce-vendor-stripe-onboarding.ts').startCommerceVendorStripeOnboardingMethod; + startCommonsProposalVoting: typeof import('./governance/commons/creation/start-commons-proposal-voting.ts').startCommonsProposalVotingMethod; + stewardDecisionForCommonsProposal: typeof import('./governance/commons/lifecycle/steward-decision-for-commons-proposal.ts').stewardDecisionForCommonsProposalMethod; + submitCommerceCapacityListing: typeof import('./commerce/capacity/creation/submit-commerce-capacity-listing.ts').submitCommerceCapacityListingMethod; + submitCommerceOwnershipTransfer: typeof import('./commerce/ownership/creation/submit-commerce-ownership-transfer.ts').submitCommerceOwnershipTransferMethod; + submitCommerceServiceQuote: typeof import('./commerce/services/creation/submit-commerce-service-quote.ts').submitCommerceServiceQuoteMethod; + suspendCommerceCapacityListing: typeof import('./commerce/capacity/retirement/suspend-commerce-capacity-listing.ts').suspendCommerceCapacityListingMethod; + unlinkAccountProvider: typeof import('./capacity/providers/contracts/unlink-account-provider.ts').unlinkAccountProviderMethod; + updateAccountPassword: typeof import('./accounts/updates/update-account-password.ts').updateAccountPasswordMethod; + updateAccountProfile: typeof import('./accounts/updates/update-account-profile.ts').updateAccountProfileMethod; + updateCommerceCapacityListing: typeof import('./commerce/capacity/updates/update-commerce-capacity-listing.ts').updateCommerceCapacityListingMethod; + updateCommerceContribution: typeof import('./commerce/governance/updates/update-commerce-contribution.ts').updateCommerceContributionMethod; + updateCommerceGovernancePolicy: typeof import('./commerce/governance/updates/update-commerce-governance-policy.ts').updateCommerceGovernancePolicyMethod; + updateCommerceOwnershipRecord: typeof import('./commerce/ownership/updates/update-commerce-ownership-record.ts').updateCommerceOwnershipRecordMethod; + updateCommerceServiceRequest: typeof import('./commerce/services/updates/update-commerce-service-request.ts').updateCommerceServiceRequestMethod; + updateCommerceStewardshipAssignment: typeof import('./commerce/ownership/updates/update-commerce-stewardship-assignment.ts').updateCommerceStewardshipAssignmentMethod; + updateNotificationPreferences: typeof import('./accounts/updates/update-notification-preferences.ts').updateNotificationPreferencesMethod; + updatePersonalTheme: typeof import('./support/updates/update-personal-theme.ts').updatePersonalThemeMethod; + updateProjectRepositoryTopology: typeof import('./projects/repositories/updates/update-project-repository-topology.ts').updateProjectRepositoryTopologyMethod; + updateTeamTreeDx: typeof import('./treedx/repositories/updates/update-team-tree-dx.ts').updateTeamTreeDxMethod; + upsertProjectTreeDxLibrary: typeof import('./projects/knowledge/creation/upsert-project-tree-dx-library.ts').upsertProjectTreeDxLibraryMethod; + url: typeof import('./support/contracts/url.ts').urlMethod; + validatePrivateKnowledgeAccess: typeof import('./content/contracts/validate-private-knowledge-access.ts').validatePrivateKnowledgeAccessMethod; + vendorApproveCommerceServiceQuote: typeof import('./commerce/services/contracts/vendor-approve-commerce-service-quote.ts').vendorApproveCommerceServiceQuoteMethod; } } diff --git a/src/lib/market/api-client/methods.ts b/src/lib/market/api-client/methods.ts index 81037a7d..79ea2a52 100644 --- a/src/lib/market/api-client/methods.ts +++ b/src/lib/market/api-client/methods.ts @@ -1,180 +1,180 @@ import type { ApiClientFacade } from '../api-client.ts'; -import { headersMethod } from './headers.ts'; -import { urlMethod } from './url.ts'; -import { requestMethod } from './request.ts'; -import { accountIdentityMethod } from './account-identity.ts'; -import { authProvidersMethod } from './auth-providers.ts'; -import { requestPasswordResetMethod } from './request-password-reset.ts'; -import { completePasswordResetMethod } from './complete-password-reset.ts'; -import { confirmEmailMethod } from './confirm-email.ts'; -import { approveDeviceMethod } from './approve-device.ts'; -import { claimUsernameMethod } from './claim-username.ts'; -import { updateAccountProfileMethod } from './update-account-profile.ts'; -import { addAccountEmailMethod } from './add-account-email.ts'; -import { resendAccountEmailMethod } from './resend-account-email.ts'; -import { setPrimaryAccountEmailMethod } from './set-primary-account-email.ts'; -import { deleteAccountEmailMethod } from './delete-account-email.ts'; -import { updateAccountPasswordMethod } from './update-account-password.ts'; -import { unlinkAccountProviderMethod } from './unlink-account-provider.ts'; -import { accountSessionsMethod } from './account-sessions.ts'; -import { revokeAccountSessionMethod } from './revoke-account-session.ts'; -import { notificationPreferencesMethod } from './notification-preferences.ts'; -import { accountNotificationsMethod } from './account-notifications.ts'; -import { updateNotificationPreferencesMethod } from './update-notification-preferences.ts'; -import { listProjectsForPrincipalMethod } from './list-projects-for-principal.ts'; -import { personalThemesMethod } from './personal-themes.ts'; -import { createPersonalThemeMethod } from './create-personal-theme.ts'; -import { updatePersonalThemeMethod } from './update-personal-theme.ts'; -import { deletePersonalThemeMethod } from './delete-personal-theme.ts'; -import { accountDeletionBlockersMethod } from './account-deletion-blockers.ts'; -import { deleteCurrentAccountMethod } from './delete-current-account.ts'; -import { listTeamsForPrincipalMethod } from './list-teams-for-principal.ts'; -import { listTeamProjectsMethod } from './list-team-projects.ts'; -import { getProjectDetailsMethod } from './get-project-details.ts'; -import { validatePrivateKnowledgeAccessMethod } from './validate-private-knowledge-access.ts'; -import { recordPrivateKnowledgeOutcomeMethod } from './record-private-knowledge-outcome.ts'; -import { getProjectDeploymentMethod } from './get-project-deployment.ts'; -import { listProjectDeploymentsMethod } from './list-project-deployments.ts'; -import { listProjectDeploymentEventsMethod } from './list-project-deployment-events.ts'; -import { getProjectByTeamAndSlugMethod } from './get-project-by-team-and-slug.ts'; -import { getProjectSummaryMethod } from './get-project-summary.ts'; -import { getProjectAgentsSummaryMethod } from './get-project-agents-summary.ts'; -import { getProjectReleasesSummaryMethod } from './get-project-releases-summary.ts'; -import { getProjectCapacitySummaryMethod } from './get-project-capacity-summary.ts'; -import { listApprovalRequestsForProjectMethod } from './list-approval-requests-for-project.ts'; -import { listApprovalRequestsForTeamMethod } from './list-approval-requests-for-team.ts'; -import { decideApprovalRequestMethod } from './decide-approval-request.ts'; -import { getCommonsSummaryMethod } from './get-commons-summary.ts'; -import { getCommonsParticipantMeMethod } from './get-commons-participant-me.ts'; -import { listCommonsParticipantsMethod } from './list-commons-participants.ts'; -import { backfillCommonsParticipantsMethod } from './backfill-commons-participants.ts'; -import { listCommonsQuestionsMethod } from './list-commons-questions.ts'; -import { answerCommonsQuestionMethod } from './answer-commons-question.ts'; -import { createCommonsProposalMethod } from './create-commons-proposal.ts'; -import { listCommonsProposalsMethod } from './list-commons-proposals.ts'; -import { getCommonsProposalMethod } from './get-commons-proposal.ts'; -import { reviewCommonsProposalMethod } from './review-commons-proposal.ts'; -import { startCommonsProposalVotingMethod } from './start-commons-proposal-voting.ts'; -import { stewardDecisionForCommonsProposalMethod } from './steward-decision-for-commons-proposal.ts'; -import { listCommonsDecisionsMethod } from './list-commons-decisions.ts'; -import { listCommonsEventsMethod } from './list-commons-events.ts'; -import { deleteTeamInboxItemsByItemKeyMethod } from './delete-team-inbox-items-by-item-key.ts'; -import { listPersistedTeamInboxItemsMethod } from './list-persisted-team-inbox-items.ts'; -import { listAuditEventsForTargetMethod } from './list-audit-events-for-target.ts'; -import { listTeamMembersMethod } from './list-team-members.ts'; -import { getTeamAccessSummaryMethod } from './get-team-access-summary.ts'; -import { getCommerceVendorMethod } from './get-commerce-vendor.ts'; -import { requestCommerceVendorMethod } from './request-commerce-vendor.ts'; -import { getCommerceVendorStripeStatusMethod } from './get-commerce-vendor-stripe-status.ts'; -import { startCommerceVendorStripeOnboardingMethod } from './start-commerce-vendor-stripe-onboarding.ts'; -import { markCommerceVendorStripeReturnMethod } from './mark-commerce-vendor-stripe-return.ts'; -import { createCommerceVendorStripeLoginLinkMethod } from './create-commerce-vendor-stripe-login-link.ts'; -import { listCommerceProductsMethod } from './list-commerce-products.ts'; -import { getCommerceProductMethod } from './get-commerce-product.ts'; -import { getCommerceOwnershipWorkflowMethod } from './get-commerce-ownership-workflow.ts'; -import { updateCommerceOwnershipRecordMethod } from './update-commerce-ownership-record.ts'; -import { updateCommerceStewardshipAssignmentMethod } from './update-commerce-stewardship-assignment.ts'; -import { endCommerceStewardshipAssignmentMethod } from './end-commerce-stewardship-assignment.ts'; -import { updateCommerceContributionMethod } from './update-commerce-contribution.ts'; -import { updateCommerceGovernancePolicyMethod } from './update-commerce-governance-policy.ts'; -import { submitCommerceOwnershipTransferMethod } from './submit-commerce-ownership-transfer.ts'; -import { approveCommerceOwnershipTransferMethod } from './approve-commerce-ownership-transfer.ts'; -import { rejectCommerceOwnershipTransferMethod } from './reject-commerce-ownership-transfer.ts'; -import { cancelCommerceOwnershipTransferMethod } from './cancel-commerce-ownership-transfer.ts'; -import { createCommerceSuccessionEventMethod } from './create-commerce-succession-event.ts'; -import { listCommerceSuccessionEventsMethod } from './list-commerce-succession-events.ts'; -import { getCommerceVendorSalesSummaryMethod } from './get-commerce-vendor-sales-summary.ts'; -import { getCommerceVendorMonitoringMethod } from './get-commerce-vendor-monitoring.ts'; -import { listCommerceMarketplaceProductsMethod } from './list-commerce-marketplace-products.ts'; -import { getCommerceMarketplaceProductMethod } from './get-commerce-marketplace-product.ts'; -import { listCommerceVendorSalesOrdersMethod } from './list-commerce-vendor-sales-orders.ts'; -import { listCommerceVendorSalesSubscriptionsMethod } from './list-commerce-vendor-sales-subscriptions.ts'; -import { listCommerceVendorSalesEntitlementsMethod } from './list-commerce-vendor-sales-entitlements.ts'; -import { listCommerceVendorSalesRefundsMethod } from './list-commerce-vendor-sales-refunds.ts'; -import { listCommerceVendorFulfillmentEventsMethod } from './list-commerce-vendor-fulfillment-events.ts'; -import { createCommerceOrderRefundMethod } from './create-commerce-order-refund.ts'; -import { fulfillCommerceOrderItemArtifactMethod } from './fulfill-commerce-order-item-artifact.ts'; -import { revokeCommerceEntitlementMethod } from './revoke-commerce-entitlement.ts'; -import { createCommerceServiceRequestMethod } from './create-commerce-service-request.ts'; -import { listCommerceServiceRequestsMethod } from './list-commerce-service-requests.ts'; -import { getCommerceServiceRequestMethod } from './get-commerce-service-request.ts'; -import { startCommerceServiceScopingMethod } from './start-commerce-service-scoping.ts'; -import { updateCommerceServiceRequestMethod } from './update-commerce-service-request.ts'; -import { cancelCommerceServiceRequestMethod } from './cancel-commerce-service-request.ts'; -import { createCommerceServiceQuoteMethod } from './create-commerce-service-quote.ts'; -import { listCommerceServiceQuotesMethod } from './list-commerce-service-quotes.ts'; -import { submitCommerceServiceQuoteMethod } from './submit-commerce-service-quote.ts'; -import { buyerApproveCommerceServiceQuoteMethod } from './buyer-approve-commerce-service-quote.ts'; -import { vendorApproveCommerceServiceQuoteMethod } from './vendor-approve-commerce-service-quote.ts'; -import { rejectCommerceServiceQuoteMethod } from './reject-commerce-service-quote.ts'; -import { getCommerceServiceContractMethod } from './get-commerce-service-contract.ts'; -import { linkCommerceServiceContractWorkMethod } from './link-commerce-service-contract-work.ts'; -import { fulfillCommerceServiceContractMethod } from './fulfill-commerce-service-contract.ts'; -import { cancelCommerceServiceContractMethod } from './cancel-commerce-service-contract.ts'; -import { listCommerceServiceEventsMethod } from './list-commerce-service-events.ts'; -import { listCommerceCapacityListingsMethod } from './list-commerce-capacity-listings.ts'; -import { getCommerceCapacityListingMethod } from './get-commerce-capacity-listing.ts'; -import { getCommerceCapacityListingForProductMethod } from './get-commerce-capacity-listing-for-product.ts'; -import { createCommerceCapacityListingMethod } from './create-commerce-capacity-listing.ts'; -import { updateCommerceCapacityListingMethod } from './update-commerce-capacity-listing.ts'; -import { submitCommerceCapacityListingMethod } from './submit-commerce-capacity-listing.ts'; -import { approveCommerceCapacityListingMethod } from './approve-commerce-capacity-listing.ts'; -import { rejectCommerceCapacityListingMethod } from './reject-commerce-capacity-listing.ts'; -import { suspendCommerceCapacityListingMethod } from './suspend-commerce-capacity-listing.ts'; -import { archiveCommerceCapacityListingMethod } from './archive-commerce-capacity-listing.ts'; -import { createCommerceCapacityListingInquiryMethod } from './create-commerce-capacity-listing-inquiry.ts'; -import { listCommerceCapacityListingInquiriesMethod } from './list-commerce-capacity-listing-inquiries.ts'; -import { getCommerceCapacityListingInquiryMethod } from './get-commerce-capacity-listing-inquiry.ts'; -import { reviewCommerceCapacityInquiryMethod } from './review-commerce-capacity-inquiry.ts'; -import { approveCommerceCapacityInquiryForScopingMethod } from './approve-commerce-capacity-inquiry-for-scoping.ts'; -import { declineCommerceCapacityInquiryMethod } from './decline-commerce-capacity-inquiry.ts'; -import { cancelCommerceCapacityInquiryMethod } from './cancel-commerce-capacity-inquiry.ts'; -import { evaluateTeamDeletionBlockersMethod } from './evaluate-team-deletion-blockers.ts'; -import { evaluateProjectDeletionBlockersMethod } from './evaluate-project-deletion-blockers.ts'; -import { listRepositoryHostsMethod } from './list-repository-hosts.ts'; -import { getRepositoryHostMethod } from './get-repository-host.ts'; -import { listTeamWebHostsMethod } from './list-team-web-hosts.ts'; -import { getTeamTreeDxMethod } from './get-team-tree-dx.ts'; -import { updateTeamTreeDxMethod } from './update-team-tree-dx.ts'; -import { provisionTeamTreeDxMethod } from './provision-team-tree-dx.ts'; -import { listTreeDxMirrorsMethod } from './list-tree-dx-mirrors.ts'; -import { createTreeDxMirrorMethod } from './create-tree-dx-mirror.ts'; -import { listTreeDxSharesMethod } from './list-tree-dx-shares.ts'; -import { createTreeDxShareMethod } from './create-tree-dx-share.ts'; -import { getProjectTreeDxLibraryMethod } from './get-project-tree-dx-library.ts'; -import { upsertProjectTreeDxLibraryMethod } from './upsert-project-tree-dx-library.ts'; -import { getProjectRepositoryTopologyMethod } from './get-project-repository-topology.ts'; -import { updateProjectRepositoryTopologyMethod } from './update-project-repository-topology.ts'; -import { getTeamWebHostMethod } from './get-team-web-host.ts'; -import { listCapacityAllocationSetsMethod } from './list-capacity-allocation-sets.ts'; -import { listProviderAvailabilitySessionsMethod } from './list-provider-availability-sessions.ts'; -import { listProviderAssignmentsMethod } from './list-provider-assignments.ts'; -import { listExecutionRunsMethod } from './list-execution-runs.ts'; -import { listProjectAgentClassesMethod } from './list-project-agent-classes.ts'; -import { listProjectAgentModeRunsMethod } from './list-project-agent-mode-runs.ts'; -import { listProjectAgentFallbackOutputsMethod } from './list-project-agent-fallback-outputs.ts'; -import { listProjectTreeDxProxyAuditMethod } from './list-project-tree-dx-proxy-audit.ts'; -import { getProjectCapacityRuntimeDiagnosticsMethod } from './get-project-capacity-runtime-diagnostics.ts'; -import { getProviderAssignmentExplanationMethod } from './get-provider-assignment-explanation.ts'; -import { getDecisionPlanningStatusMethod } from './get-decision-planning-status.ts'; -import { listDecisionExecutionInputsMethod } from './list-decision-execution-inputs.ts'; -import { listDecisionCapacityPlansMethod } from './list-decision-capacity-plans.ts'; -import { getCapacityPlanMethod } from './get-capacity-plan.ts'; -import { getWorkdayCapacitySummaryMethod } from './get-workday-capacity-summary.ts'; -import { listWorkdayRunsMethod } from './list-workday-runs.ts'; -import { createWorkdayRunMethod } from './create-workday-run.ts'; -import { getWorkdayRunMethod } from './get-workday-run.ts'; -import { listCapacityLedgerEntriesMethod } from './list-capacity-ledger-entries.ts'; -import { listCapacityRoutingDecisionsForProjectMethod } from './list-capacity-routing-decisions-for-project.ts'; -import { listSeedRunsMethod } from './list-seed-runs.ts'; -import { listCatalogItemsMethod } from './list-catalog-items.ts'; -import { getCatalogItemBySlugMethod } from './get-catalog-item-by-slug.ts'; -import { listCatalogArtifactVersionsMethod } from './list-catalog-artifact-versions.ts'; -import { listKnowledgePacksMethod } from './list-knowledge-packs.ts'; -import { acceptTeamInviteMethod } from './accept-team-invite.ts'; -import { getTeamInviteMethod } from './get-team-invite.ts'; -import { loadTeamProfileByNameMethod } from './load-team-profile-by-name.ts'; -import { loadUserProfileByUsernameMethod } from './load-user-profile-by-username.ts'; +import { headersMethod } from './support/contracts/headers.ts'; +import { urlMethod } from './support/contracts/url.ts'; +import { requestMethod } from './support/contracts/request.ts'; +import { accountIdentityMethod } from './accounts/contracts/account-identity.ts'; +import { authProvidersMethod } from './capacity/providers/contracts/auth-providers.ts'; +import { requestPasswordResetMethod } from './accounts/creation/request-password-reset.ts'; +import { completePasswordResetMethod } from './accounts/lifecycle/complete-password-reset.ts'; +import { confirmEmailMethod } from './accounts/lifecycle/confirm-email.ts'; +import { approveDeviceMethod } from './runtime/lifecycle/approve-device.ts'; +import { claimUsernameMethod } from './accounts/lifecycle/claim-username.ts'; +import { updateAccountProfileMethod } from './accounts/updates/update-account-profile.ts'; +import { addAccountEmailMethod } from './accounts/creation/add-account-email.ts'; +import { resendAccountEmailMethod } from './accounts/contracts/resend-account-email.ts'; +import { setPrimaryAccountEmailMethod } from './accounts/updates/set-primary-account-email.ts'; +import { deleteAccountEmailMethod } from './accounts/retirement/delete-account-email.ts'; +import { updateAccountPasswordMethod } from './accounts/updates/update-account-password.ts'; +import { unlinkAccountProviderMethod } from './capacity/providers/contracts/unlink-account-provider.ts'; +import { accountSessionsMethod } from './accounts/contracts/account-sessions.ts'; +import { revokeAccountSessionMethod } from './accounts/retirement/revoke-account-session.ts'; +import { notificationPreferencesMethod } from './accounts/contracts/notification-preferences.ts'; +import { accountNotificationsMethod } from './accounts/contracts/account-notifications.ts'; +import { updateNotificationPreferencesMethod } from './accounts/updates/update-notification-preferences.ts'; +import { listProjectsForPrincipalMethod } from './projects/projects-core/queries/list-projects-for-principal.ts'; +import { personalThemesMethod } from './support/contracts/personal-themes.ts'; +import { createPersonalThemeMethod } from './support/creation/create-personal-theme.ts'; +import { updatePersonalThemeMethod } from './support/updates/update-personal-theme.ts'; +import { deletePersonalThemeMethod } from './support/retirement/delete-personal-theme.ts'; +import { accountDeletionBlockersMethod } from './accounts/contracts/account-deletion-blockers.ts'; +import { deleteCurrentAccountMethod } from './accounts/retirement/delete-current-account.ts'; +import { listTeamsForPrincipalMethod } from './teams/queries/list-teams-for-principal.ts'; +import { listTeamProjectsMethod } from './projects/projects-core/queries/list-team-projects.ts'; +import { getProjectDetailsMethod } from './projects/projects-core/queries/get-project-details.ts'; +import { validatePrivateKnowledgeAccessMethod } from './content/contracts/validate-private-knowledge-access.ts'; +import { recordPrivateKnowledgeOutcomeMethod } from './content/updates/record-private-knowledge-outcome.ts'; +import { getProjectDeploymentMethod } from './projects/deployments/queries/get-project-deployment.ts'; +import { listProjectDeploymentsMethod } from './projects/deployments/queries/list-project-deployments.ts'; +import { listProjectDeploymentEventsMethod } from './projects/deployments/queries/list-project-deployment-events.ts'; +import { getProjectByTeamAndSlugMethod } from './projects/projects-core/queries/get-project-by-team-and-slug.ts'; +import { getProjectSummaryMethod } from './projects/projects-core/queries/get-project-summary.ts'; +import { getProjectAgentsSummaryMethod } from './projects/projects-core/queries/get-project-agents-summary.ts'; +import { getProjectReleasesSummaryMethod } from './projects/delivery/queries/get-project-releases-summary.ts'; +import { getProjectCapacitySummaryMethod } from './capacity/observability/queries/get-project-capacity-summary.ts'; +import { listApprovalRequestsForProjectMethod } from './projects/projects-core/queries/list-approval-requests-for-project.ts'; +import { listApprovalRequestsForTeamMethod } from './teams/queries/list-approval-requests-for-team.ts'; +import { decideApprovalRequestMethod } from './support/lifecycle/decide-approval-request.ts'; +import { getCommonsSummaryMethod } from './governance/commons/queries/get-commons-summary.ts'; +import { getCommonsParticipantMeMethod } from './governance/commons/queries/get-commons-participant-me.ts'; +import { listCommonsParticipantsMethod } from './governance/commons/queries/list-commons-participants.ts'; +import { backfillCommonsParticipantsMethod } from './governance/commons/contracts/backfill-commons-participants.ts'; +import { listCommonsQuestionsMethod } from './governance/commons/queries/list-commons-questions.ts'; +import { answerCommonsQuestionMethod } from './governance/commons/contracts/answer-commons-question.ts'; +import { createCommonsProposalMethod } from './governance/commons/creation/create-commons-proposal.ts'; +import { listCommonsProposalsMethod } from './governance/commons/queries/list-commons-proposals.ts'; +import { getCommonsProposalMethod } from './governance/commons/queries/get-commons-proposal.ts'; +import { reviewCommonsProposalMethod } from './governance/commons/lifecycle/review-commons-proposal.ts'; +import { startCommonsProposalVotingMethod } from './governance/commons/creation/start-commons-proposal-voting.ts'; +import { stewardDecisionForCommonsProposalMethod } from './governance/commons/lifecycle/steward-decision-for-commons-proposal.ts'; +import { listCommonsDecisionsMethod } from './governance/commons/queries/list-commons-decisions.ts'; +import { listCommonsEventsMethod } from './governance/commons/queries/list-commons-events.ts'; +import { deleteTeamInboxItemsByItemKeyMethod } from './teams/retirement/delete-team-inbox-items-by-item-key.ts'; +import { listPersistedTeamInboxItemsMethod } from './teams/queries/list-persisted-team-inbox-items.ts'; +import { listAuditEventsForTargetMethod } from './support/queries/list-audit-events-for-target.ts'; +import { listTeamMembersMethod } from './teams/queries/list-team-members.ts'; +import { getTeamAccessSummaryMethod } from './teams/queries/get-team-access-summary.ts'; +import { getCommerceVendorMethod } from './commerce/vendors/queries/get-commerce-vendor.ts'; +import { requestCommerceVendorMethod } from './commerce/vendors/creation/request-commerce-vendor.ts'; +import { getCommerceVendorStripeStatusMethod } from './commerce/vendors/queries/get-commerce-vendor-stripe-status.ts'; +import { startCommerceVendorStripeOnboardingMethod } from './commerce/vendors/creation/start-commerce-vendor-stripe-onboarding.ts'; +import { markCommerceVendorStripeReturnMethod } from './commerce/vendors/updates/mark-commerce-vendor-stripe-return.ts'; +import { createCommerceVendorStripeLoginLinkMethod } from './commerce/vendors/creation/create-commerce-vendor-stripe-login-link.ts'; +import { listCommerceProductsMethod } from './commerce/catalog/queries/list-commerce-products.ts'; +import { getCommerceProductMethod } from './commerce/catalog/queries/get-commerce-product.ts'; +import { getCommerceOwnershipWorkflowMethod } from './commerce/ownership/queries/get-commerce-ownership-workflow.ts'; +import { updateCommerceOwnershipRecordMethod } from './commerce/ownership/updates/update-commerce-ownership-record.ts'; +import { updateCommerceStewardshipAssignmentMethod } from './commerce/ownership/updates/update-commerce-stewardship-assignment.ts'; +import { endCommerceStewardshipAssignmentMethod } from './commerce/ownership/contracts/end-commerce-stewardship-assignment.ts'; +import { updateCommerceContributionMethod } from './commerce/governance/updates/update-commerce-contribution.ts'; +import { updateCommerceGovernancePolicyMethod } from './commerce/governance/updates/update-commerce-governance-policy.ts'; +import { submitCommerceOwnershipTransferMethod } from './commerce/ownership/creation/submit-commerce-ownership-transfer.ts'; +import { approveCommerceOwnershipTransferMethod } from './commerce/ownership/lifecycle/approve-commerce-ownership-transfer.ts'; +import { rejectCommerceOwnershipTransferMethod } from './commerce/ownership/lifecycle/reject-commerce-ownership-transfer.ts'; +import { cancelCommerceOwnershipTransferMethod } from './commerce/ownership/retirement/cancel-commerce-ownership-transfer.ts'; +import { createCommerceSuccessionEventMethod } from './commerce/ownership/creation/create-commerce-succession-event.ts'; +import { listCommerceSuccessionEventsMethod } from './commerce/ownership/queries/list-commerce-succession-events.ts'; +import { getCommerceVendorSalesSummaryMethod } from './commerce/vendors/queries/get-commerce-vendor-sales-summary.ts'; +import { getCommerceVendorMonitoringMethod } from './commerce/vendors/queries/get-commerce-vendor-monitoring.ts'; +import { listCommerceMarketplaceProductsMethod } from './commerce/catalog/queries/list-commerce-marketplace-products.ts'; +import { getCommerceMarketplaceProductMethod } from './commerce/catalog/queries/get-commerce-marketplace-product.ts'; +import { listCommerceVendorSalesOrdersMethod } from './commerce/vendors/queries/list-commerce-vendor-sales-orders.ts'; +import { listCommerceVendorSalesSubscriptionsMethod } from './commerce/vendors/queries/list-commerce-vendor-sales-subscriptions.ts'; +import { listCommerceVendorSalesEntitlementsMethod } from './commerce/vendors/queries/list-commerce-vendor-sales-entitlements.ts'; +import { listCommerceVendorSalesRefundsMethod } from './commerce/vendors/queries/list-commerce-vendor-sales-refunds.ts'; +import { listCommerceVendorFulfillmentEventsMethod } from './commerce/vendors/queries/list-commerce-vendor-fulfillment-events.ts'; +import { createCommerceOrderRefundMethod } from './commerce/orders/creation/create-commerce-order-refund.ts'; +import { fulfillCommerceOrderItemArtifactMethod } from './commerce/orders/lifecycle/fulfill-commerce-order-item-artifact.ts'; +import { revokeCommerceEntitlementMethod } from './commerce/payments/retirement/revoke-commerce-entitlement.ts'; +import { createCommerceServiceRequestMethod } from './commerce/services/creation/create-commerce-service-request.ts'; +import { listCommerceServiceRequestsMethod } from './commerce/services/queries/list-commerce-service-requests.ts'; +import { getCommerceServiceRequestMethod } from './commerce/services/queries/get-commerce-service-request.ts'; +import { startCommerceServiceScopingMethod } from './commerce/commerce-core/creation/start-commerce-service-scoping.ts'; +import { updateCommerceServiceRequestMethod } from './commerce/services/updates/update-commerce-service-request.ts'; +import { cancelCommerceServiceRequestMethod } from './commerce/services/retirement/cancel-commerce-service-request.ts'; +import { createCommerceServiceQuoteMethod } from './commerce/services/creation/create-commerce-service-quote.ts'; +import { listCommerceServiceQuotesMethod } from './commerce/services/queries/list-commerce-service-quotes.ts'; +import { submitCommerceServiceQuoteMethod } from './commerce/services/creation/submit-commerce-service-quote.ts'; +import { buyerApproveCommerceServiceQuoteMethod } from './commerce/services/contracts/buyer-approve-commerce-service-quote.ts'; +import { vendorApproveCommerceServiceQuoteMethod } from './commerce/services/contracts/vendor-approve-commerce-service-quote.ts'; +import { rejectCommerceServiceQuoteMethod } from './commerce/services/lifecycle/reject-commerce-service-quote.ts'; +import { getCommerceServiceContractMethod } from './commerce/services/queries/get-commerce-service-contract.ts'; +import { linkCommerceServiceContractWorkMethod } from './commerce/services/contracts/link-commerce-service-contract-work.ts'; +import { fulfillCommerceServiceContractMethod } from './commerce/services/lifecycle/fulfill-commerce-service-contract.ts'; +import { cancelCommerceServiceContractMethod } from './commerce/services/retirement/cancel-commerce-service-contract.ts'; +import { listCommerceServiceEventsMethod } from './commerce/services/queries/list-commerce-service-events.ts'; +import { listCommerceCapacityListingsMethod } from './commerce/capacity/queries/list-commerce-capacity-listings.ts'; +import { getCommerceCapacityListingMethod } from './commerce/capacity/queries/get-commerce-capacity-listing.ts'; +import { getCommerceCapacityListingForProductMethod } from './commerce/capacity/queries/get-commerce-capacity-listing-for-product.ts'; +import { createCommerceCapacityListingMethod } from './commerce/capacity/creation/create-commerce-capacity-listing.ts'; +import { updateCommerceCapacityListingMethod } from './commerce/capacity/updates/update-commerce-capacity-listing.ts'; +import { submitCommerceCapacityListingMethod } from './commerce/capacity/creation/submit-commerce-capacity-listing.ts'; +import { approveCommerceCapacityListingMethod } from './commerce/capacity/lifecycle/approve-commerce-capacity-listing.ts'; +import { rejectCommerceCapacityListingMethod } from './commerce/capacity/lifecycle/reject-commerce-capacity-listing.ts'; +import { suspendCommerceCapacityListingMethod } from './commerce/capacity/retirement/suspend-commerce-capacity-listing.ts'; +import { archiveCommerceCapacityListingMethod } from './commerce/capacity/retirement/archive-commerce-capacity-listing.ts'; +import { createCommerceCapacityListingInquiryMethod } from './commerce/capacity/creation/create-commerce-capacity-listing-inquiry.ts'; +import { listCommerceCapacityListingInquiriesMethod } from './commerce/capacity/queries/list-commerce-capacity-listing-inquiries.ts'; +import { getCommerceCapacityListingInquiryMethod } from './commerce/capacity/queries/get-commerce-capacity-listing-inquiry.ts'; +import { reviewCommerceCapacityInquiryMethod } from './commerce/capacity/lifecycle/review-commerce-capacity-inquiry.ts'; +import { approveCommerceCapacityInquiryForScopingMethod } from './commerce/capacity/lifecycle/approve-commerce-capacity-inquiry-for-scoping.ts'; +import { declineCommerceCapacityInquiryMethod } from './commerce/capacity/lifecycle/decline-commerce-capacity-inquiry.ts'; +import { cancelCommerceCapacityInquiryMethod } from './commerce/capacity/retirement/cancel-commerce-capacity-inquiry.ts'; +import { evaluateTeamDeletionBlockersMethod } from './teams/contracts/evaluate-team-deletion-blockers.ts'; +import { evaluateProjectDeletionBlockersMethod } from './projects/projects-core/contracts/evaluate-project-deletion-blockers.ts'; +import { listRepositoryHostsMethod } from './hosting/queries/list-repository-hosts.ts'; +import { getRepositoryHostMethod } from './hosting/queries/get-repository-host.ts'; +import { listTeamWebHostsMethod } from './teams/queries/list-team-web-hosts.ts'; +import { getTeamTreeDxMethod } from './treedx/repositories/queries/get-team-tree-dx.ts'; +import { updateTeamTreeDxMethod } from './treedx/repositories/updates/update-team-tree-dx.ts'; +import { provisionTeamTreeDxMethod } from './treedx/repositories/creation/provision-team-tree-dx.ts'; +import { listTreeDxMirrorsMethod } from './treedx/repositories/queries/list-tree-dx-mirrors.ts'; +import { createTreeDxMirrorMethod } from './treedx/repositories/creation/create-tree-dx-mirror.ts'; +import { listTreeDxSharesMethod } from './treedx/repositories/queries/list-tree-dx-shares.ts'; +import { createTreeDxShareMethod } from './treedx/repositories/creation/create-tree-dx-share.ts'; +import { getProjectTreeDxLibraryMethod } from './projects/knowledge/queries/get-project-tree-dx-library.ts'; +import { upsertProjectTreeDxLibraryMethod } from './projects/knowledge/creation/upsert-project-tree-dx-library.ts'; +import { getProjectRepositoryTopologyMethod } from './projects/repositories/queries/get-project-repository-topology.ts'; +import { updateProjectRepositoryTopologyMethod } from './projects/repositories/updates/update-project-repository-topology.ts'; +import { getTeamWebHostMethod } from './teams/queries/get-team-web-host.ts'; +import { listCapacityAllocationSetsMethod } from './capacity/allocations/queries/list-capacity-allocation-sets.ts'; +import { listProviderAvailabilitySessionsMethod } from './capacity/providers/queries/list-provider-availability-sessions.ts'; +import { listProviderAssignmentsMethod } from './capacity/assignments/queries/list-provider-assignments.ts'; +import { listExecutionRunsMethod } from './support/queries/list-execution-runs.ts'; +import { listProjectAgentClassesMethod } from './projects/agents/queries/list-project-agent-classes.ts'; +import { listProjectAgentModeRunsMethod } from './projects/agents/queries/list-project-agent-mode-runs.ts'; +import { listProjectAgentFallbackOutputsMethod } from './projects/agents/queries/list-project-agent-fallback-outputs.ts'; +import { listProjectTreeDxProxyAuditMethod } from './projects/knowledge/queries/list-project-tree-dx-proxy-audit.ts'; +import { getProjectCapacityRuntimeDiagnosticsMethod } from './capacity/observability/queries/get-project-capacity-runtime-diagnostics.ts'; +import { getProviderAssignmentExplanationMethod } from './capacity/assignments/queries/get-provider-assignment-explanation.ts'; +import { getDecisionPlanningStatusMethod } from './support/queries/get-decision-planning-status.ts'; +import { listDecisionExecutionInputsMethod } from './support/queries/list-decision-execution-inputs.ts'; +import { listDecisionCapacityPlansMethod } from './capacity/planning/queries/list-decision-capacity-plans.ts'; +import { getCapacityPlanMethod } from './capacity/planning/queries/get-capacity-plan.ts'; +import { getWorkdayCapacitySummaryMethod } from './capacity/workdays/queries/get-workday-capacity-summary.ts'; +import { listWorkdayRunsMethod } from './capacity/workdays/queries/list-workday-runs.ts'; +import { createWorkdayRunMethod } from './capacity/workdays/creation/create-workday-run.ts'; +import { getWorkdayRunMethod } from './capacity/workdays/queries/get-workday-run.ts'; +import { listCapacityLedgerEntriesMethod } from './capacity/accounting/queries/list-capacity-ledger-entries.ts'; +import { listCapacityRoutingDecisionsForProjectMethod } from './capacity/planning/queries/list-capacity-routing-decisions-for-project.ts'; +import { listSeedRunsMethod } from './seeds/queries/list-seed-runs.ts'; +import { listCatalogItemsMethod } from './commerce/catalog/queries/list-catalog-items.ts'; +import { getCatalogItemBySlugMethod } from './commerce/catalog/queries/get-catalog-item-by-slug.ts'; +import { listCatalogArtifactVersionsMethod } from './commerce/orders/queries/list-catalog-artifact-versions.ts'; +import { listKnowledgePacksMethod } from './content/queries/list-knowledge-packs.ts'; +import { acceptTeamInviteMethod } from './teams/lifecycle/accept-team-invite.ts'; +import { getTeamInviteMethod } from './teams/queries/get-team-invite.ts'; +import { loadTeamProfileByNameMethod } from './teams/queries/load-team-profile-by-name.ts'; +import { loadUserProfileByUsernameMethod } from './accounts/queries/load-user-profile-by-username.ts'; export function installApiClientFacadeMethods(prototype: ApiClientFacade) { prototype.headers = headersMethod; diff --git a/src/lib/market/api-client/list-project-agent-classes.ts b/src/lib/market/api-client/projects/agents/queries/list-project-agent-classes.ts similarity index 76% rename from src/lib/market/api-client/list-project-agent-classes.ts rename to src/lib/market/api-client/projects/agents/queries/list-project-agent-classes.ts index c401dd27..650394e5 100644 --- a/src/lib/market/api-client/list-project-agent-classes.ts +++ b/src/lib/market/api-client/projects/agents/queries/list-project-agent-classes.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function listProjectAgentClassesMethod(this: ApiClientFacade, projectId: string) { return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/agent-classes`); } diff --git a/src/lib/market/api-client/list-project-agent-fallback-outputs.ts b/src/lib/market/api-client/projects/agents/queries/list-project-agent-fallback-outputs.ts similarity index 82% rename from src/lib/market/api-client/list-project-agent-fallback-outputs.ts rename to src/lib/market/api-client/projects/agents/queries/list-project-agent-fallback-outputs.ts index a973755b..d7f54663 100644 --- a/src/lib/market/api-client/list-project-agent-fallback-outputs.ts +++ b/src/lib/market/api-client/projects/agents/queries/list-project-agent-fallback-outputs.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function listProjectAgentFallbackOutputsMethod(this: ApiClientFacade, projectId: string, filters: { mode?: string | null; status?: string | null; diff --git a/src/lib/market/api-client/list-project-agent-mode-runs.ts b/src/lib/market/api-client/projects/agents/queries/list-project-agent-mode-runs.ts similarity index 80% rename from src/lib/market/api-client/list-project-agent-mode-runs.ts rename to src/lib/market/api-client/projects/agents/queries/list-project-agent-mode-runs.ts index db1a22c9..d62a2ad2 100644 --- a/src/lib/market/api-client/list-project-agent-mode-runs.ts +++ b/src/lib/market/api-client/projects/agents/queries/list-project-agent-mode-runs.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function listProjectAgentModeRunsMethod(this: ApiClientFacade, projectId: string, filters: { mode?: string | null; assignmentId?: string | null; diff --git a/src/lib/market/api-client/get-project-releases-summary.ts b/src/lib/market/api-client/projects/delivery/queries/get-project-releases-summary.ts similarity index 75% rename from src/lib/market/api-client/get-project-releases-summary.ts rename to src/lib/market/api-client/projects/delivery/queries/get-project-releases-summary.ts index 6d5c896a..748482ed 100644 --- a/src/lib/market/api-client/get-project-releases-summary.ts +++ b/src/lib/market/api-client/projects/delivery/queries/get-project-releases-summary.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function getProjectReleasesSummaryMethod(this: ApiClientFacade, projectId: string) { return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/releases`); } diff --git a/src/lib/market/api-client/get-project-deployment.ts b/src/lib/market/api-client/projects/deployments/queries/get-project-deployment.ts similarity index 79% rename from src/lib/market/api-client/get-project-deployment.ts rename to src/lib/market/api-client/projects/deployments/queries/get-project-deployment.ts index ec187d66..9dbeb7d4 100644 --- a/src/lib/market/api-client/get-project-deployment.ts +++ b/src/lib/market/api-client/projects/deployments/queries/get-project-deployment.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function getProjectDeploymentMethod(this: ApiClientFacade, deploymentId: string, options: { limit?: number | string | null; } = {}) { diff --git a/src/lib/market/api-client/list-project-deployment-events.ts b/src/lib/market/api-client/projects/deployments/queries/list-project-deployment-events.ts similarity index 77% rename from src/lib/market/api-client/list-project-deployment-events.ts rename to src/lib/market/api-client/projects/deployments/queries/list-project-deployment-events.ts index 97e359fe..b1cfae6a 100644 --- a/src/lib/market/api-client/list-project-deployment-events.ts +++ b/src/lib/market/api-client/projects/deployments/queries/list-project-deployment-events.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export async function listProjectDeploymentEventsMethod(this: ApiClientFacade, deploymentId: string, options: { limit?: number | string | null; } = {}) { diff --git a/src/lib/market/api-client/list-project-deployments.ts b/src/lib/market/api-client/projects/deployments/queries/list-project-deployments.ts similarity index 83% rename from src/lib/market/api-client/list-project-deployments.ts rename to src/lib/market/api-client/projects/deployments/queries/list-project-deployments.ts index 98d0fb30..b58c6935 100644 --- a/src/lib/market/api-client/list-project-deployments.ts +++ b/src/lib/market/api-client/projects/deployments/queries/list-project-deployments.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function listProjectDeploymentsMethod(this: ApiClientFacade, projectId: string, filters: { environment?: string; action?: string; diff --git a/src/lib/market/api-client/upsert-project-tree-dx-library.ts b/src/lib/market/api-client/projects/knowledge/creation/upsert-project-tree-dx-library.ts similarity index 76% rename from src/lib/market/api-client/upsert-project-tree-dx-library.ts rename to src/lib/market/api-client/projects/knowledge/creation/upsert-project-tree-dx-library.ts index ed9c254a..7e16dd69 100644 --- a/src/lib/market/api-client/upsert-project-tree-dx-library.ts +++ b/src/lib/market/api-client/projects/knowledge/creation/upsert-project-tree-dx-library.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function upsertProjectTreeDxLibraryMethod(this: ApiClientFacade, projectId: string, body: Record) { return this.request('POST', `/v1/projects/${encodeURIComponent(projectId)}/treedx-library`, { body }); } diff --git a/src/lib/market/api-client/get-project-tree-dx-library.ts b/src/lib/market/api-client/projects/knowledge/queries/get-project-tree-dx-library.ts similarity index 76% rename from src/lib/market/api-client/get-project-tree-dx-library.ts rename to src/lib/market/api-client/projects/knowledge/queries/get-project-tree-dx-library.ts index 9100cc8a..6edf3db6 100644 --- a/src/lib/market/api-client/get-project-tree-dx-library.ts +++ b/src/lib/market/api-client/projects/knowledge/queries/get-project-tree-dx-library.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function getProjectTreeDxLibraryMethod(this: ApiClientFacade, projectId: string) { return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/treedx-library`); } diff --git a/src/lib/market/api-client/list-project-tree-dx-proxy-audit.ts b/src/lib/market/api-client/projects/knowledge/queries/list-project-tree-dx-proxy-audit.ts similarity index 81% rename from src/lib/market/api-client/list-project-tree-dx-proxy-audit.ts rename to src/lib/market/api-client/projects/knowledge/queries/list-project-tree-dx-proxy-audit.ts index aa2ad168..87732d05 100644 --- a/src/lib/market/api-client/list-project-tree-dx-proxy-audit.ts +++ b/src/lib/market/api-client/projects/knowledge/queries/list-project-tree-dx-proxy-audit.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function listProjectTreeDxProxyAuditMethod(this: ApiClientFacade, projectId: string, filters: { assignmentId?: string | null; actorType?: string | null; diff --git a/src/lib/market/api-client/evaluate-project-deletion-blockers.ts b/src/lib/market/api-client/projects/projects-core/contracts/evaluate-project-deletion-blockers.ts similarity index 76% rename from src/lib/market/api-client/evaluate-project-deletion-blockers.ts rename to src/lib/market/api-client/projects/projects-core/contracts/evaluate-project-deletion-blockers.ts index 6aaf4f1f..b608cd13 100644 --- a/src/lib/market/api-client/evaluate-project-deletion-blockers.ts +++ b/src/lib/market/api-client/projects/projects-core/contracts/evaluate-project-deletion-blockers.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function evaluateProjectDeletionBlockersMethod(this: ApiClientFacade, projectId: string) { return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/deletion-blockers`); } diff --git a/src/lib/market/api-client/get-project-agents-summary.ts b/src/lib/market/api-client/projects/projects-core/queries/get-project-agents-summary.ts similarity index 75% rename from src/lib/market/api-client/get-project-agents-summary.ts rename to src/lib/market/api-client/projects/projects-core/queries/get-project-agents-summary.ts index 9bb67c60..ae8300f2 100644 --- a/src/lib/market/api-client/get-project-agents-summary.ts +++ b/src/lib/market/api-client/projects/projects-core/queries/get-project-agents-summary.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function getProjectAgentsSummaryMethod(this: ApiClientFacade, projectId: string) { return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/agents`); } diff --git a/src/lib/market/api-client/get-project-by-team-and-slug.ts b/src/lib/market/api-client/projects/projects-core/queries/get-project-by-team-and-slug.ts similarity index 77% rename from src/lib/market/api-client/get-project-by-team-and-slug.ts rename to src/lib/market/api-client/projects/projects-core/queries/get-project-by-team-and-slug.ts index 00cadd9d..12f8c94a 100644 --- a/src/lib/market/api-client/get-project-by-team-and-slug.ts +++ b/src/lib/market/api-client/projects/projects-core/queries/get-project-by-team-and-slug.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function getProjectByTeamAndSlugMethod(this: ApiClientFacade, teamId: string, slug: string) { return this.listTeamProjects(teamId).then((projects) => projects.find((project: any) => project.slug === slug || project.id === slug) ?? null); } diff --git a/src/lib/market/api-client/get-project-details.ts b/src/lib/market/api-client/projects/projects-core/queries/get-project-details.ts similarity index 75% rename from src/lib/market/api-client/get-project-details.ts rename to src/lib/market/api-client/projects/projects-core/queries/get-project-details.ts index 509df380..f78cbb23 100644 --- a/src/lib/market/api-client/get-project-details.ts +++ b/src/lib/market/api-client/projects/projects-core/queries/get-project-details.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function getProjectDetailsMethod(this: ApiClientFacade, projectId: string) { return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}`); } diff --git a/src/lib/market/api-client/get-project-summary.ts b/src/lib/market/api-client/projects/projects-core/queries/get-project-summary.ts similarity index 75% rename from src/lib/market/api-client/get-project-summary.ts rename to src/lib/market/api-client/projects/projects-core/queries/get-project-summary.ts index 11e4fbd8..c8396755 100644 --- a/src/lib/market/api-client/get-project-summary.ts +++ b/src/lib/market/api-client/projects/projects-core/queries/get-project-summary.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function getProjectSummaryMethod(this: ApiClientFacade, projectId: string) { return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/summary`); } diff --git a/src/lib/market/api-client/list-approval-requests-for-project.ts b/src/lib/market/api-client/projects/projects-core/queries/list-approval-requests-for-project.ts similarity index 77% rename from src/lib/market/api-client/list-approval-requests-for-project.ts rename to src/lib/market/api-client/projects/projects-core/queries/list-approval-requests-for-project.ts index 52b1fa08..1f162c2e 100644 --- a/src/lib/market/api-client/list-approval-requests-for-project.ts +++ b/src/lib/market/api-client/projects/projects-core/queries/list-approval-requests-for-project.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function listApprovalRequestsForProjectMethod(this: ApiClientFacade, projectId: string, limit = 100) { return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/approval-requests?limit=${encodeURIComponent(String(limit))}`); } diff --git a/src/lib/market/api-client/list-projects-for-principal.ts b/src/lib/market/api-client/projects/projects-core/queries/list-projects-for-principal.ts similarity index 74% rename from src/lib/market/api-client/list-projects-for-principal.ts rename to src/lib/market/api-client/projects/projects-core/queries/list-projects-for-principal.ts index 4ab62ad2..b462feb5 100644 --- a/src/lib/market/api-client/list-projects-for-principal.ts +++ b/src/lib/market/api-client/projects/projects-core/queries/list-projects-for-principal.ts @@ -1,7 +1,7 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function listProjectsForPrincipalMethod(this: ApiClientFacade) { return this.request('GET', '/v1/projects'); } diff --git a/src/lib/market/api-client/list-team-projects.ts b/src/lib/market/api-client/projects/projects-core/queries/list-team-projects.ts similarity index 75% rename from src/lib/market/api-client/list-team-projects.ts rename to src/lib/market/api-client/projects/projects-core/queries/list-team-projects.ts index 5feed835..eabcca35 100644 --- a/src/lib/market/api-client/list-team-projects.ts +++ b/src/lib/market/api-client/projects/projects-core/queries/list-team-projects.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function listTeamProjectsMethod(this: ApiClientFacade, teamId: string) { return this.request('GET', `/v1/projects?teamId=${encodeURIComponent(teamId)}`); } diff --git a/src/lib/market/api-client/get-project-repository-topology.ts b/src/lib/market/api-client/projects/repositories/queries/get-project-repository-topology.ts similarity index 76% rename from src/lib/market/api-client/get-project-repository-topology.ts rename to src/lib/market/api-client/projects/repositories/queries/get-project-repository-topology.ts index 02b97dc2..0f289922 100644 --- a/src/lib/market/api-client/get-project-repository-topology.ts +++ b/src/lib/market/api-client/projects/repositories/queries/get-project-repository-topology.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function getProjectRepositoryTopologyMethod(this: ApiClientFacade, projectId: string) { return this.request('GET', `/v1/projects/${encodeURIComponent(projectId)}/repository-topology`); } diff --git a/src/lib/market/api-client/update-project-repository-topology.ts b/src/lib/market/api-client/projects/repositories/updates/update-project-repository-topology.ts similarity index 77% rename from src/lib/market/api-client/update-project-repository-topology.ts rename to src/lib/market/api-client/projects/repositories/updates/update-project-repository-topology.ts index d62997a8..385c80f1 100644 --- a/src/lib/market/api-client/update-project-repository-topology.ts +++ b/src/lib/market/api-client/projects/repositories/updates/update-project-repository-topology.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function updateProjectRepositoryTopologyMethod(this: ApiClientFacade, projectId: string, body: Record) { return this.request('PUT', `/v1/projects/${encodeURIComponent(projectId)}/repository-topology`, { body }); } diff --git a/src/lib/market/api-client/approve-device.ts b/src/lib/market/api-client/runtime/lifecycle/approve-device.ts similarity index 76% rename from src/lib/market/api-client/approve-device.ts rename to src/lib/market/api-client/runtime/lifecycle/approve-device.ts index ef3daadf..dc335c52 100644 --- a/src/lib/market/api-client/approve-device.ts +++ b/src/lib/market/api-client/runtime/lifecycle/approve-device.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export function approveDeviceMethod(this: ApiClientFacade, userCode: string) { return this.request<{ approved: true; }>('POST', '/v1/auth/device/approve', { body: { userCode } }); } diff --git a/src/lib/market/api-client/list-seed-runs.ts b/src/lib/market/api-client/seeds/queries/list-seed-runs.ts similarity index 76% rename from src/lib/market/api-client/list-seed-runs.ts rename to src/lib/market/api-client/seeds/queries/list-seed-runs.ts index 7c1cd730..267701e5 100644 --- a/src/lib/market/api-client/list-seed-runs.ts +++ b/src/lib/market/api-client/seeds/queries/list-seed-runs.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export function listSeedRunsMethod(this: ApiClientFacade, limit = 100) { return this.request('GET', `/v1/seeds/runs?limit=${encodeURIComponent(String(limit))}`); } diff --git a/src/lib/market/api-client/headers.ts b/src/lib/market/api-client/support/contracts/headers.ts similarity index 79% rename from src/lib/market/api-client/headers.ts rename to src/lib/market/api-client/support/contracts/headers.ts index b103460b..cbc1a7c6 100644 --- a/src/lib/market/api-client/headers.ts +++ b/src/lib/market/api-client/support/contracts/headers.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export function headersMethod(this: ApiClientFacade, body = false) { const token = apiAccessTokenFromCookies(this.context); const headers = apiServiceHeaders(this.context, { skipUserAssertion: Boolean(token) }); diff --git a/src/lib/market/api-client/personal-themes.ts b/src/lib/market/api-client/support/contracts/personal-themes.ts similarity index 75% rename from src/lib/market/api-client/personal-themes.ts rename to src/lib/market/api-client/support/contracts/personal-themes.ts index 0e4b2b7b..b00d4eeb 100644 --- a/src/lib/market/api-client/personal-themes.ts +++ b/src/lib/market/api-client/support/contracts/personal-themes.ts @@ -1,7 +1,7 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export function personalThemesMethod(this: ApiClientFacade) { return this.request('GET', '/v1/auth/web/themes'); } diff --git a/src/lib/market/api-client/request.ts b/src/lib/market/api-client/support/contracts/request.ts similarity index 84% rename from src/lib/market/api-client/request.ts rename to src/lib/market/api-client/support/contracts/request.ts index 913b6f26..cf77dab4 100644 --- a/src/lib/market/api-client/request.ts +++ b/src/lib/market/api-client/support/contracts/request.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export async function requestMethod(this: ApiClientFacade, method: string, path: string, options: { body?: unknown; } = {}): Promise { diff --git a/src/lib/market/api-client/url.ts b/src/lib/market/api-client/support/contracts/url.ts similarity index 75% rename from src/lib/market/api-client/url.ts rename to src/lib/market/api-client/support/contracts/url.ts index 0385c246..8dfe46f3 100644 --- a/src/lib/market/api-client/url.ts +++ b/src/lib/market/api-client/support/contracts/url.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export function urlMethod(this: ApiClientFacade, path: string) { return `${resolveApiBaseUrl(this.context.locals)}${path}`; } diff --git a/src/lib/market/api-client/create-personal-theme.ts b/src/lib/market/api-client/support/creation/create-personal-theme.ts similarity index 76% rename from src/lib/market/api-client/create-personal-theme.ts rename to src/lib/market/api-client/support/creation/create-personal-theme.ts index e163b9ed..74fd44d6 100644 --- a/src/lib/market/api-client/create-personal-theme.ts +++ b/src/lib/market/api-client/support/creation/create-personal-theme.ts @@ -1,7 +1,7 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export function createPersonalThemeMethod(this: ApiClientFacade, body: PersonalThemeDraft) { return this.request('POST', '/v1/auth/web/themes', { body }); } diff --git a/src/lib/market/api-client/decide-approval-request.ts b/src/lib/market/api-client/support/lifecycle/decide-approval-request.ts similarity index 77% rename from src/lib/market/api-client/decide-approval-request.ts rename to src/lib/market/api-client/support/lifecycle/decide-approval-request.ts index 8c99bc76..66c9309d 100644 --- a/src/lib/market/api-client/decide-approval-request.ts +++ b/src/lib/market/api-client/support/lifecycle/decide-approval-request.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export function decideApprovalRequestMethod(this: ApiClientFacade, approvalRequestId: string, body: Record) { return this.request('POST', `/v1/approval-requests/${encodeURIComponent(approvalRequestId)}/decide`, { body }); } diff --git a/src/lib/market/api-client/get-decision-planning-status.ts b/src/lib/market/api-client/support/queries/get-decision-planning-status.ts similarity index 76% rename from src/lib/market/api-client/get-decision-planning-status.ts rename to src/lib/market/api-client/support/queries/get-decision-planning-status.ts index 9678f828..100869a3 100644 --- a/src/lib/market/api-client/get-decision-planning-status.ts +++ b/src/lib/market/api-client/support/queries/get-decision-planning-status.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export function getDecisionPlanningStatusMethod(this: ApiClientFacade, decisionId: string) { return this.request('GET', `/v1/decisions/${encodeURIComponent(decisionId)}/planning-status`); } diff --git a/src/lib/market/api-client/list-audit-events-for-target.ts b/src/lib/market/api-client/support/queries/list-audit-events-for-target.ts similarity index 78% rename from src/lib/market/api-client/list-audit-events-for-target.ts rename to src/lib/market/api-client/support/queries/list-audit-events-for-target.ts index 6fb41133..9c551132 100644 --- a/src/lib/market/api-client/list-audit-events-for-target.ts +++ b/src/lib/market/api-client/support/queries/list-audit-events-for-target.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export function listAuditEventsForTargetMethod(this: ApiClientFacade, targetType: string, targetId: string, limit = 100) { return this.request('GET', `/v1/audit-events?targetType=${encodeURIComponent(targetType)}&targetId=${encodeURIComponent(targetId)}&limit=${encodeURIComponent(String(limit))}`); } diff --git a/src/lib/market/api-client/list-decision-execution-inputs.ts b/src/lib/market/api-client/support/queries/list-decision-execution-inputs.ts similarity index 76% rename from src/lib/market/api-client/list-decision-execution-inputs.ts rename to src/lib/market/api-client/support/queries/list-decision-execution-inputs.ts index 0f7be96e..e8ce1cd1 100644 --- a/src/lib/market/api-client/list-decision-execution-inputs.ts +++ b/src/lib/market/api-client/support/queries/list-decision-execution-inputs.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export function listDecisionExecutionInputsMethod(this: ApiClientFacade, decisionId: string) { return this.request('GET', `/v1/decisions/${encodeURIComponent(decisionId)}/execution-inputs`); } diff --git a/src/lib/market/api-client/list-execution-runs.ts b/src/lib/market/api-client/support/queries/list-execution-runs.ts similarity index 86% rename from src/lib/market/api-client/list-execution-runs.ts rename to src/lib/market/api-client/support/queries/list-execution-runs.ts index 26a0e081..826214cf 100644 --- a/src/lib/market/api-client/list-execution-runs.ts +++ b/src/lib/market/api-client/support/queries/list-execution-runs.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export function listExecutionRunsMethod(this: ApiClientFacade, teamId: string, filters: { projectId?: string | null; providerId?: string | null; diff --git a/src/lib/market/api-client/delete-personal-theme.ts b/src/lib/market/api-client/support/retirement/delete-personal-theme.ts similarity index 76% rename from src/lib/market/api-client/delete-personal-theme.ts rename to src/lib/market/api-client/support/retirement/delete-personal-theme.ts index 97a62b95..bc61d155 100644 --- a/src/lib/market/api-client/delete-personal-theme.ts +++ b/src/lib/market/api-client/support/retirement/delete-personal-theme.ts @@ -1,7 +1,7 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export function deletePersonalThemeMethod(this: ApiClientFacade, id: string) { return this.request('DELETE', `/v1/auth/web/themes/${encodeURIComponent(id)}`); } diff --git a/src/lib/market/api-client/update-personal-theme.ts b/src/lib/market/api-client/support/updates/update-personal-theme.ts similarity index 76% rename from src/lib/market/api-client/update-personal-theme.ts rename to src/lib/market/api-client/support/updates/update-personal-theme.ts index f7ed32bc..b5a5bf04 100644 --- a/src/lib/market/api-client/update-personal-theme.ts +++ b/src/lib/market/api-client/support/updates/update-personal-theme.ts @@ -1,7 +1,7 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export function updatePersonalThemeMethod(this: ApiClientFacade, id: string, body: PersonalThemeDraft) { return this.request('PATCH', `/v1/auth/web/themes/${encodeURIComponent(id)}`, { body }); } diff --git a/src/lib/market/api-client/evaluate-team-deletion-blockers.ts b/src/lib/market/api-client/teams/contracts/evaluate-team-deletion-blockers.ts similarity index 76% rename from src/lib/market/api-client/evaluate-team-deletion-blockers.ts rename to src/lib/market/api-client/teams/contracts/evaluate-team-deletion-blockers.ts index 6e6808ef..a14ea718 100644 --- a/src/lib/market/api-client/evaluate-team-deletion-blockers.ts +++ b/src/lib/market/api-client/teams/contracts/evaluate-team-deletion-blockers.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export function evaluateTeamDeletionBlockersMethod(this: ApiClientFacade, teamId: string) { return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/deletion-blockers`); } diff --git a/src/lib/market/api-client/accept-team-invite.ts b/src/lib/market/api-client/teams/lifecycle/accept-team-invite.ts similarity index 76% rename from src/lib/market/api-client/accept-team-invite.ts rename to src/lib/market/api-client/teams/lifecycle/accept-team-invite.ts index d7f788ce..bb24f0f2 100644 --- a/src/lib/market/api-client/accept-team-invite.ts +++ b/src/lib/market/api-client/teams/lifecycle/accept-team-invite.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export function acceptTeamInviteMethod(this: ApiClientFacade, token: string, _principalId: string) { return this.request('POST', `/v1/team-invites/${encodeURIComponent(token)}/accept`, { body: {} }); } diff --git a/src/lib/market/api-client/get-team-access-summary.ts b/src/lib/market/api-client/teams/queries/get-team-access-summary.ts similarity index 76% rename from src/lib/market/api-client/get-team-access-summary.ts rename to src/lib/market/api-client/teams/queries/get-team-access-summary.ts index 8952d1d8..d982cccf 100644 --- a/src/lib/market/api-client/get-team-access-summary.ts +++ b/src/lib/market/api-client/teams/queries/get-team-access-summary.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export function getTeamAccessSummaryMethod(this: ApiClientFacade, teamId: string) { return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/permissions`); } diff --git a/src/lib/market/api-client/get-team-invite.ts b/src/lib/market/api-client/teams/queries/get-team-invite.ts similarity index 76% rename from src/lib/market/api-client/get-team-invite.ts rename to src/lib/market/api-client/teams/queries/get-team-invite.ts index db808a5d..13e5fa0e 100644 --- a/src/lib/market/api-client/get-team-invite.ts +++ b/src/lib/market/api-client/teams/queries/get-team-invite.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export function getTeamInviteMethod(this: ApiClientFacade, token: string) { return this.request('GET', `/v1/team-invites/${encodeURIComponent(token)}`); } diff --git a/src/lib/market/api-client/get-team-web-host.ts b/src/lib/market/api-client/teams/queries/get-team-web-host.ts similarity index 77% rename from src/lib/market/api-client/get-team-web-host.ts rename to src/lib/market/api-client/teams/queries/get-team-web-host.ts index 1483818a..01c7bb43 100644 --- a/src/lib/market/api-client/get-team-web-host.ts +++ b/src/lib/market/api-client/teams/queries/get-team-web-host.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export function getTeamWebHostMethod(this: ApiClientFacade, teamId: string, hostId: string) { return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/web-hosts/${encodeURIComponent(hostId)}`); } diff --git a/src/lib/market/api-client/list-approval-requests-for-team.ts b/src/lib/market/api-client/teams/queries/list-approval-requests-for-team.ts similarity index 80% rename from src/lib/market/api-client/list-approval-requests-for-team.ts rename to src/lib/market/api-client/teams/queries/list-approval-requests-for-team.ts index fe041f90..e9bee8d6 100644 --- a/src/lib/market/api-client/list-approval-requests-for-team.ts +++ b/src/lib/market/api-client/teams/queries/list-approval-requests-for-team.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export function listApprovalRequestsForTeamMethod(this: ApiClientFacade, teamId: string, options: { kind?: string; limit?: number; diff --git a/src/lib/market/api-client/list-persisted-team-inbox-items.ts b/src/lib/market/api-client/teams/queries/list-persisted-team-inbox-items.ts similarity index 76% rename from src/lib/market/api-client/list-persisted-team-inbox-items.ts rename to src/lib/market/api-client/teams/queries/list-persisted-team-inbox-items.ts index b6d5ac0d..c6718c15 100644 --- a/src/lib/market/api-client/list-persisted-team-inbox-items.ts +++ b/src/lib/market/api-client/teams/queries/list-persisted-team-inbox-items.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export function listPersistedTeamInboxItemsMethod(this: ApiClientFacade, teamId: string) { return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/inbox`); } diff --git a/src/lib/market/api-client/list-team-members.ts b/src/lib/market/api-client/teams/queries/list-team-members.ts similarity index 76% rename from src/lib/market/api-client/list-team-members.ts rename to src/lib/market/api-client/teams/queries/list-team-members.ts index 188a8d3e..c087715e 100644 --- a/src/lib/market/api-client/list-team-members.ts +++ b/src/lib/market/api-client/teams/queries/list-team-members.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export function listTeamMembersMethod(this: ApiClientFacade, teamId: string) { return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/members`); } diff --git a/src/lib/market/api-client/list-team-web-hosts.ts b/src/lib/market/api-client/teams/queries/list-team-web-hosts.ts similarity index 76% rename from src/lib/market/api-client/list-team-web-hosts.ts rename to src/lib/market/api-client/teams/queries/list-team-web-hosts.ts index ba7a0473..49a2bd57 100644 --- a/src/lib/market/api-client/list-team-web-hosts.ts +++ b/src/lib/market/api-client/teams/queries/list-team-web-hosts.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export function listTeamWebHostsMethod(this: ApiClientFacade, teamId: string) { return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/web-hosts`); } diff --git a/src/lib/market/api-client/list-teams-for-principal.ts b/src/lib/market/api-client/teams/queries/list-teams-for-principal.ts similarity index 75% rename from src/lib/market/api-client/list-teams-for-principal.ts rename to src/lib/market/api-client/teams/queries/list-teams-for-principal.ts index a84750b3..71eebb25 100644 --- a/src/lib/market/api-client/list-teams-for-principal.ts +++ b/src/lib/market/api-client/teams/queries/list-teams-for-principal.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export function listTeamsForPrincipalMethod(this: ApiClientFacade) { return this.request('GET', '/v1/teams'); } diff --git a/src/lib/market/api-client/load-team-profile-by-name.ts b/src/lib/market/api-client/teams/queries/load-team-profile-by-name.ts similarity index 76% rename from src/lib/market/api-client/load-team-profile-by-name.ts rename to src/lib/market/api-client/teams/queries/load-team-profile-by-name.ts index c9710ea0..e9ba295f 100644 --- a/src/lib/market/api-client/load-team-profile-by-name.ts +++ b/src/lib/market/api-client/teams/queries/load-team-profile-by-name.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export function loadTeamProfileByNameMethod(this: ApiClientFacade, name: string) { return this.request('GET', `/v1/teams/by-name/${encodeURIComponent(name)}/profile`).catch(() => null); } diff --git a/src/lib/market/api-client/delete-team-inbox-items-by-item-key.ts b/src/lib/market/api-client/teams/retirement/delete-team-inbox-items-by-item-key.ts similarity index 75% rename from src/lib/market/api-client/delete-team-inbox-items-by-item-key.ts rename to src/lib/market/api-client/teams/retirement/delete-team-inbox-items-by-item-key.ts index 50318ed0..988f0022 100644 --- a/src/lib/market/api-client/delete-team-inbox-items-by-item-key.ts +++ b/src/lib/market/api-client/teams/retirement/delete-team-inbox-items-by-item-key.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../api-client.ts'; export function deleteTeamInboxItemsByItemKeyMethod(this: ApiClientFacade, _teamId: string, _itemKey: string) { return Promise.resolve({ ok: true }); } diff --git a/src/lib/market/api-client/create-tree-dx-mirror.ts b/src/lib/market/api-client/treedx/repositories/creation/create-tree-dx-mirror.ts similarity index 76% rename from src/lib/market/api-client/create-tree-dx-mirror.ts rename to src/lib/market/api-client/treedx/repositories/creation/create-tree-dx-mirror.ts index 165e4498..33f17293 100644 --- a/src/lib/market/api-client/create-tree-dx-mirror.ts +++ b/src/lib/market/api-client/treedx/repositories/creation/create-tree-dx-mirror.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function createTreeDxMirrorMethod(this: ApiClientFacade, teamId: string, body: Record) { return this.request('POST', `/v1/teams/${encodeURIComponent(teamId)}/treedx/mirrors`, { body }); } diff --git a/src/lib/market/api-client/create-tree-dx-share.ts b/src/lib/market/api-client/treedx/repositories/creation/create-tree-dx-share.ts similarity index 76% rename from src/lib/market/api-client/create-tree-dx-share.ts rename to src/lib/market/api-client/treedx/repositories/creation/create-tree-dx-share.ts index 3f919e61..8ea5cbd6 100644 --- a/src/lib/market/api-client/create-tree-dx-share.ts +++ b/src/lib/market/api-client/treedx/repositories/creation/create-tree-dx-share.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function createTreeDxShareMethod(this: ApiClientFacade, teamId: string, body: Record) { return this.request('POST', `/v1/teams/${encodeURIComponent(teamId)}/treedx/shares`, { body }); } diff --git a/src/lib/market/api-client/provision-team-tree-dx.ts b/src/lib/market/api-client/treedx/repositories/creation/provision-team-tree-dx.ts similarity index 76% rename from src/lib/market/api-client/provision-team-tree-dx.ts rename to src/lib/market/api-client/treedx/repositories/creation/provision-team-tree-dx.ts index 1a0c498d..7978f354 100644 --- a/src/lib/market/api-client/provision-team-tree-dx.ts +++ b/src/lib/market/api-client/treedx/repositories/creation/provision-team-tree-dx.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function provisionTeamTreeDxMethod(this: ApiClientFacade, teamId: string, body: Record = {}) { return this.request('POST', `/v1/teams/${encodeURIComponent(teamId)}/treedx/provision`, { body }); } diff --git a/src/lib/market/api-client/get-team-tree-dx.ts b/src/lib/market/api-client/treedx/repositories/queries/get-team-tree-dx.ts similarity index 75% rename from src/lib/market/api-client/get-team-tree-dx.ts rename to src/lib/market/api-client/treedx/repositories/queries/get-team-tree-dx.ts index 495a80c9..0384d7d4 100644 --- a/src/lib/market/api-client/get-team-tree-dx.ts +++ b/src/lib/market/api-client/treedx/repositories/queries/get-team-tree-dx.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function getTeamTreeDxMethod(this: ApiClientFacade, teamId: string) { return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/treedx`); } diff --git a/src/lib/market/api-client/list-tree-dx-mirrors.ts b/src/lib/market/api-client/treedx/repositories/queries/list-tree-dx-mirrors.ts similarity index 75% rename from src/lib/market/api-client/list-tree-dx-mirrors.ts rename to src/lib/market/api-client/treedx/repositories/queries/list-tree-dx-mirrors.ts index 99889a99..5271206a 100644 --- a/src/lib/market/api-client/list-tree-dx-mirrors.ts +++ b/src/lib/market/api-client/treedx/repositories/queries/list-tree-dx-mirrors.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function listTreeDxMirrorsMethod(this: ApiClientFacade, teamId: string) { return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/treedx/mirrors`); } diff --git a/src/lib/market/api-client/list-tree-dx-shares.ts b/src/lib/market/api-client/treedx/repositories/queries/list-tree-dx-shares.ts similarity index 75% rename from src/lib/market/api-client/list-tree-dx-shares.ts rename to src/lib/market/api-client/treedx/repositories/queries/list-tree-dx-shares.ts index c2a2c0bc..8511d345 100644 --- a/src/lib/market/api-client/list-tree-dx-shares.ts +++ b/src/lib/market/api-client/treedx/repositories/queries/list-tree-dx-shares.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function listTreeDxSharesMethod(this: ApiClientFacade, teamId: string) { return this.request('GET', `/v1/teams/${encodeURIComponent(teamId)}/treedx/shares`); } diff --git a/src/lib/market/api-client/update-team-tree-dx.ts b/src/lib/market/api-client/treedx/repositories/updates/update-team-tree-dx.ts similarity index 76% rename from src/lib/market/api-client/update-team-tree-dx.ts rename to src/lib/market/api-client/treedx/repositories/updates/update-team-tree-dx.ts index 3277f262..d5231aed 100644 --- a/src/lib/market/api-client/update-team-tree-dx.ts +++ b/src/lib/market/api-client/treedx/repositories/updates/update-team-tree-dx.ts @@ -1,9 +1,9 @@ import type { APIContext } from 'astro'; -import { TREESEED_REMOTE_CONTRACT_HEADER, TREESEED_REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; -import { getSiteAuthConfig } from "../../auth/config"; +import { REMOTE_CONTRACT_HEADER, REMOTE_CONTRACT_VERSION } from '@treeseed/sdk/remote'; +import { getSiteAuthConfig } from "../../../../../auth/configuration/config"; import type { AccountDeletionBlocker, AccountEmailAddress, AccountEmailMutationResult, AccountIdentity, AccountMutationResult, AccountNotification, AccountWebSession, AuthProviderCapability, NotificationPreferences, NotificationProject, PersonalTheme, PersonalThemeDraft, UsernameClaimResult, WebAuthenticationResult } from '@treeseed/sdk/account-contracts'; -import type { AstroLike, ApiClientFacade } from '../api-client.ts'; -import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../api-client.ts'; +import type { AstroLike, ApiClientFacade } from '../../../../api-client.ts'; +import { API_SESSION_COOKIE, getNodeCrypto, randomId, runtimeEnv, envValue, resolveApiBaseUrl, encodeAssertionPayload, signAssertionPayload, createTrustedWebUserAssertion, apiServiceHeaders, apiAccessTokenFromCookies, setApiAccessTokenCookie, clearApiAccessTokenCookie, isObject, unwrapEnvelope, createApiFacade, safeTokenEquals } from '../../../../api-client.ts'; export function updateTeamTreeDxMethod(this: ApiClientFacade, teamId: string, body: Record) { return this.request('PUT', `/v1/teams/${encodeURIComponent(teamId)}/treedx`, { body }); } diff --git a/src/lib/runtime/local-cloudflare.ts b/src/lib/runtime/local-cloudflare.ts index 508da8d2..e1b82da7 100644 --- a/src/lib/runtime/local-cloudflare.ts +++ b/src/lib/runtime/local-cloudflare.ts @@ -14,7 +14,7 @@ interface LocalRuntimeState { } declare global { - var __treeseedLocalCloudflareRuntime: Promise | undefined; + var __LocalCloudflareRuntime: Promise | undefined; } class LocalFormGuardKv implements KvNamespaceLike { @@ -99,14 +99,14 @@ function shouldInstallLocalRuntime(locals: RuntimeLocals) { if (locals.runtime?.env?.SITE_DATA_DB) return false; const processEnv = getProcessEnv(); if (!processEnv) return false; - return processEnv.TREESEED_LOCAL_DEV_MODE === 'cloudflare' + return processEnv.LOCAL_DEV_MODE === 'cloudflare' || processEnv.TREESEED_API_D1_DATABASE_NAME === 'SITE_DATA_DB' || processEnv.SITE_DATA_DB === 'SITE_DATA_DB'; } export async function ensureLocalCloudflareRuntime(locals: RuntimeLocals) { if (!shouldInstallLocalRuntime(locals)) return; - const state = await (globalThis.__treeseedLocalCloudflareRuntime ??= createLocalRuntime()); + const state = await (globalThis.__LocalCloudflareRuntime ??= createLocalRuntime()); locals.runtime = { ...(locals.runtime ?? {}), env: { diff --git a/src/middleware.ts b/src/middleware.ts index b4b757b4..6cbd4dec 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -1,9 +1,9 @@ import { defineMiddleware } from 'astro:middleware'; import { resolveEditorialPreview } from '@treeseed/core/middleware/editorial-preview'; -import { getSiteAuthConfig, localAuthCanonicalRedirectUrl } from './lib/auth/config'; +import { getSiteAuthConfig, localAuthCanonicalRedirectUrl } from './lib/auth/configuration/config'; import { apiAccessTokenFromCookies, clearApiAccessTokenCookie, resolveApiBaseUrl } from './lib/market/api-client'; import { ensureLocalCloudflareRuntime } from './lib/runtime/local-cloudflare'; -import { ensureCsrfToken } from './lib/auth/csrf'; +import { ensureCsrfToken } from './lib/auth/support/csrf'; const DEV_RESET_COOKIE = 'ts_market_dev_reset'; const PUBLIC_ROUTE_PREFIXES = [ diff --git a/src/pages/app/account/appearance.astro b/src/pages/app/account/appearance.astro index aeab3ed8..7e55b8a4 100644 --- a/src/pages/app/account/appearance.astro +++ b/src/pages/app/account/appearance.astro @@ -1,8 +1,8 @@ --- -import TreeseedAppLayout from '../../../layouts/TreeseedAppLayout.astro'; +import TreeseedAppLayout from '../../../layouts/AppLayout.astro'; import SettingsTemplate from '@treeseed/ui/components/astro/templates/SettingsTemplate.astro'; import PersonalThemeManager from '@treeseed/ui/components/astro/account/PersonalThemeManager.astro'; -import { resolveAuthenticatedThemePreference } from '../../../lib/auth/appearance'; +import { resolveAuthenticatedThemePreference } from '../../../lib/auth/accounts/appearance'; import { handleAppearanceRequest, loadAccountFrame } from '../../../view-models/account-settings'; if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent('/app/account/appearance')}`); diff --git a/src/pages/app/account/delete.astro b/src/pages/app/account/delete.astro index 92a6647e..aa5529bc 100644 --- a/src/pages/app/account/delete.astro +++ b/src/pages/app/account/delete.astro @@ -1,5 +1,5 @@ --- -import TreeseedAppLayout from '../../../layouts/TreeseedAppLayout.astro'; +import TreeseedAppLayout from '../../../layouts/AppLayout.astro'; import SettingsTemplate from '@treeseed/ui/components/astro/templates/SettingsTemplate.astro'; import AccountDeletionPanel from '@treeseed/ui/components/astro/account/AccountDeletionPanel.astro'; import { handleDeletionRequest, loadAccountFrame } from '../../../view-models/account-settings'; diff --git a/src/pages/app/account/index.astro b/src/pages/app/account/index.astro index 91a9cab1..f7f167ae 100644 --- a/src/pages/app/account/index.astro +++ b/src/pages/app/account/index.astro @@ -1,5 +1,5 @@ --- -import TreeseedAppLayout from '../../../layouts/TreeseedAppLayout.astro'; +import TreeseedAppLayout from '../../../layouts/AppLayout.astro'; import SettingsTemplate from '@treeseed/ui/components/astro/templates/SettingsTemplate.astro'; import AccountIdentitySettings from '@treeseed/ui/components/astro/account/AccountIdentitySettings.astro'; import { handleIdentityRequest, loadAccountFrame } from '../../../view-models/account-settings'; diff --git a/src/pages/app/account/notifications.astro b/src/pages/app/account/notifications.astro index 8202912b..84699ff7 100644 --- a/src/pages/app/account/notifications.astro +++ b/src/pages/app/account/notifications.astro @@ -1,5 +1,5 @@ --- -import TreeseedAppLayout from '../../../layouts/TreeseedAppLayout.astro'; +import TreeseedAppLayout from '../../../layouts/AppLayout.astro'; import SettingsTemplate from '@treeseed/ui/components/astro/templates/SettingsTemplate.astro'; import NotificationPreferencePanel from '@treeseed/ui/components/astro/account/NotificationPreferencePanel.astro'; import { handleNotificationRequest, loadAccountFrame, NOTIFICATION_CONTENT_CAPABILITIES } from '../../../view-models/account-settings'; diff --git a/src/pages/app/account/sessions.astro b/src/pages/app/account/sessions.astro index e3077324..54332a63 100644 --- a/src/pages/app/account/sessions.astro +++ b/src/pages/app/account/sessions.astro @@ -1,5 +1,5 @@ --- -import TreeseedAppLayout from '../../../layouts/TreeseedAppLayout.astro'; +import TreeseedAppLayout from '../../../layouts/AppLayout.astro'; import SettingsTemplate from '@treeseed/ui/components/astro/templates/SettingsTemplate.astro'; import SessionManager from '@treeseed/ui/components/astro/account/SessionManager.astro'; import { handleSessionRequest, loadAccountFrame } from '../../../view-models/account-settings'; diff --git a/src/pages/app/index.astro b/src/pages/app/index.astro index 490eb1fc..1a7217d1 100644 --- a/src/pages/app/index.astro +++ b/src/pages/app/index.astro @@ -1,6 +1,6 @@ --- import DashboardTemplate from '@treeseed/ui/components/astro/templates/DashboardTemplate.astro'; -import TreeseedAppLayout from '../../layouts/TreeseedAppLayout.astro'; +import TreeseedAppLayout from '../../layouts/AppLayout.astro'; import { loadAppContext } from '../../view-models/app-access.js'; import { buildPersonalDashboard } from '../../view-models/contextual-dashboard.vm.js'; diff --git a/src/pages/app/teams/[teamId]/delete.astro b/src/pages/app/teams/[teamId]/delete.astro index 44ecc4f3..9671e444 100644 --- a/src/pages/app/teams/[teamId]/delete.astro +++ b/src/pages/app/teams/[teamId]/delete.astro @@ -1,16 +1,16 @@ --- -import Button from '@treeseed/ui/components/astro/forms/Button.astro'; -import Field from '@treeseed/ui/components/astro/forms/Field.astro'; -import FormActions from '@treeseed/ui/components/astro/forms/FormActions.astro'; -import TextInput from '@treeseed/ui/components/astro/forms/TextInput.astro'; +import Button from '@treeseed/ui/components/astro/forms/actions/Button.astro'; +import Field from '@treeseed/ui/components/astro/forms/fields/Field.astro'; +import FormActions from '@treeseed/ui/components/astro/forms/actions/FormActions.astro'; +import TextInput from '@treeseed/ui/components/astro/forms/fields/TextInput.astro'; import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; import Panel from '@treeseed/ui/components/astro/surface/Panel.astro'; -import PlainTable from '@treeseed/ui/components/astro/app/controls/PlainTable.astro'; -import TreeseedAppLayout from '../../../../layouts/TreeseedAppLayout.astro'; +import PlainTable from '@treeseed/ui/components/astro/app/controls/data/PlainTable.astro'; +import TreeseedAppLayout from '../../../../layouts/AppLayout.astro'; import { escapeHtml as esc } from '../../../../lib/market/control-ui.js'; import { ApiClientFacade } from '../../../../lib/market/api-client'; import { loadAppContext, persistActiveTeamSelection, resolveAppTeam } from '../../../../view-models/app-access.js'; -import { ensureCsrfToken, requireCsrf } from '../../../../lib/auth/csrf'; +import { ensureCsrfToken, requireCsrf } from '../../../../lib/auth/support/csrf'; const teamParam = String(Astro.params.teamId ?? ''); if (!Astro.locals.auth?.principal) { diff --git a/src/pages/app/teams/[teamId]/edit.astro b/src/pages/app/teams/[teamId]/edit.astro index 90af1826..e5189cd5 100644 --- a/src/pages/app/teams/[teamId]/edit.astro +++ b/src/pages/app/teams/[teamId]/edit.astro @@ -1,15 +1,15 @@ --- -import Button from '@treeseed/ui/components/astro/forms/Button.astro'; -import Field from '@treeseed/ui/components/astro/forms/Field.astro'; -import FormActions from '@treeseed/ui/components/astro/forms/FormActions.astro'; -import TextInput from '@treeseed/ui/components/astro/forms/TextInput.astro'; -import Textarea from '@treeseed/ui/components/astro/forms/Textarea.astro'; +import Button from '@treeseed/ui/components/astro/forms/actions/Button.astro'; +import Field from '@treeseed/ui/components/astro/forms/fields/Field.astro'; +import FormActions from '@treeseed/ui/components/astro/forms/actions/FormActions.astro'; +import TextInput from '@treeseed/ui/components/astro/forms/fields/TextInput.astro'; +import Textarea from '@treeseed/ui/components/astro/forms/fields/Textarea.astro'; import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; import Panel from '@treeseed/ui/components/astro/surface/Panel.astro'; -import TreeseedAppLayout from '../../../../layouts/TreeseedAppLayout.astro'; +import TreeseedAppLayout from '../../../../layouts/AppLayout.astro'; import { ApiClientFacade } from '../../../../lib/market/api-client'; import { loadAppContext, persistActiveTeamSelection, resolveAppTeam } from '../../../../view-models/app-access.js'; -import { ensureCsrfToken, requireCsrf } from '../../../../lib/auth/csrf'; +import { ensureCsrfToken, requireCsrf } from '../../../../lib/auth/support/csrf'; const teamId = String(Astro.params.teamId ?? ''); if (!Astro.locals.auth?.principal) { diff --git a/src/pages/app/teams/[teamId]/members.astro b/src/pages/app/teams/[teamId]/members.astro index e9182e86..7a8a80ab 100644 --- a/src/pages/app/teams/[teamId]/members.astro +++ b/src/pages/app/teams/[teamId]/members.astro @@ -1,16 +1,16 @@ --- -import Button from '@treeseed/ui/components/astro/forms/Button.astro'; -import Field from '@treeseed/ui/components/astro/forms/Field.astro'; -import FormActions from '@treeseed/ui/components/astro/forms/FormActions.astro'; -import Select from '@treeseed/ui/components/astro/forms/Select.astro'; -import TextInput from '@treeseed/ui/components/astro/forms/TextInput.astro'; +import Button from '@treeseed/ui/components/astro/forms/actions/Button.astro'; +import Field from '@treeseed/ui/components/astro/forms/fields/Field.astro'; +import FormActions from '@treeseed/ui/components/astro/forms/actions/FormActions.astro'; +import Select from '@treeseed/ui/components/astro/forms/fields/Select.astro'; +import TextInput from '@treeseed/ui/components/astro/forms/fields/TextInput.astro'; import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; import Panel from '@treeseed/ui/components/astro/surface/Panel.astro'; -import PlainTable from '@treeseed/ui/components/astro/app/controls/PlainTable.astro'; -import TreeseedAppLayout from '../../../../layouts/TreeseedAppLayout.astro'; +import PlainTable from '@treeseed/ui/components/astro/app/controls/data/PlainTable.astro'; +import TreeseedAppLayout from '../../../../layouts/AppLayout.astro'; import { escapeHtml as esc } from '../../../../lib/market/control-ui.js'; import { loadAppContext, persistActiveTeamSelection, resolveAppTeam } from '../../../../view-models/app-access.js'; -import { ensureCsrfToken } from '../../../../lib/auth/csrf'; +import { ensureCsrfToken } from '../../../../lib/auth/support/csrf'; const teamParam = String(Astro.params.teamId ?? ''); if (!Astro.locals.auth?.principal) { diff --git a/src/pages/app/teams/index.astro b/src/pages/app/teams/index.astro index e971dd8e..3d450bee 100644 --- a/src/pages/app/teams/index.astro +++ b/src/pages/app/teams/index.astro @@ -1,6 +1,6 @@ --- import DashboardTemplate from '@treeseed/ui/components/astro/templates/DashboardTemplate.astro'; -import TreeseedAppLayout from '../../../layouts/TreeseedAppLayout.astro'; +import TreeseedAppLayout from '../../../layouts/AppLayout.astro'; import { loadAppContext } from '../../../view-models/app-access.js'; import { buildTeamDashboard } from '../../../view-models/contextual-dashboard.vm.js'; diff --git a/src/pages/app/teams/new.astro b/src/pages/app/teams/new.astro index 12d417b3..c6e05681 100644 --- a/src/pages/app/teams/new.astro +++ b/src/pages/app/teams/new.astro @@ -1,14 +1,14 @@ --- -import Button from '@treeseed/ui/components/astro/forms/Button.astro'; -import Field from '@treeseed/ui/components/astro/forms/Field.astro'; -import FormActions from '@treeseed/ui/components/astro/forms/FormActions.astro'; -import TextInput from '@treeseed/ui/components/astro/forms/TextInput.astro'; -import Textarea from '@treeseed/ui/components/astro/forms/Textarea.astro'; +import Button from '@treeseed/ui/components/astro/forms/actions/Button.astro'; +import Field from '@treeseed/ui/components/astro/forms/fields/Field.astro'; +import FormActions from '@treeseed/ui/components/astro/forms/actions/FormActions.astro'; +import TextInput from '@treeseed/ui/components/astro/forms/fields/TextInput.astro'; +import Textarea from '@treeseed/ui/components/astro/forms/fields/Textarea.astro'; import Panel from '@treeseed/ui/components/astro/surface/Panel.astro'; -import TreeseedAppLayout from '../../../layouts/TreeseedAppLayout.astro'; +import TreeseedAppLayout from '../../../layouts/AppLayout.astro'; import { ApiClientFacade } from '../../../lib/market/api-client'; import { loadAppContext } from '../../../view-models/app-access.js'; -import { ensureCsrfToken, requireCsrf } from '../../../lib/auth/csrf'; +import { ensureCsrfToken, requireCsrf } from '../../../lib/auth/support/csrf'; if (!Astro.locals.auth?.principal) { return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent('/app/teams/new')}`); diff --git a/src/pages/auth/callback/[provider].ts b/src/pages/auth/callback/[provider].ts index b795a4bf..d69f90dd 100644 --- a/src/pages/auth/callback/[provider].ts +++ b/src/pages/auth/callback/[provider].ts @@ -1,5 +1,5 @@ import type { APIRoute } from 'astro'; -import { isSupportedAuthProvider, normalizeReturnTo } from '../../../lib/auth/flow'; +import { isSupportedAuthProvider, normalizeReturnTo } from '../../../lib/auth/support/flow'; import { resolveApiBaseUrl, setApiAccessTokenCookie } from '../../../lib/market/api-client'; export const prerender = false; diff --git a/src/pages/auth/check-email.astro b/src/pages/auth/check-email.astro index c3170ccf..a4745dd4 100644 --- a/src/pages/auth/check-email.astro +++ b/src/pages/auth/check-email.astro @@ -1,8 +1,8 @@ --- import AuthShell from '@treeseed/ui/components/astro/auth/AuthShell.astro'; import AuthCard from '@treeseed/ui/components/astro/auth/AuthCard.astro'; -import { resolveAnonymousThemePreference } from '../../lib/auth/appearance'; -import { normalizeReturnTo, redirectAuthenticatedToApp } from '../../lib/auth/flow'; +import { resolveAnonymousThemePreference } from '../../lib/auth/accounts/appearance'; +import { normalizeReturnTo, redirectAuthenticatedToApp } from '../../lib/auth/support/flow'; export const prerender = false; diff --git a/src/pages/auth/confirm-email.astro b/src/pages/auth/confirm-email.astro index 46ef728c..457f4d63 100644 --- a/src/pages/auth/confirm-email.astro +++ b/src/pages/auth/confirm-email.astro @@ -2,8 +2,8 @@ import AuthShell from '@treeseed/ui/components/astro/auth/AuthShell.astro'; import AuthCard from '@treeseed/ui/components/astro/auth/AuthCard.astro'; import { createApiFacade, setApiAccessTokenCookie } from '../../lib/market/api-client'; -import { resolveAnonymousThemePreference, setAnonymousThemeCookies, setPrincipalThemeCookies } from '../../lib/auth/appearance'; -import { normalizeReturnTo, redirectAuthenticatedToApp } from '../../lib/auth/flow'; +import { resolveAnonymousThemePreference, setAnonymousThemeCookies, setPrincipalThemeCookies } from '../../lib/auth/accounts/appearance'; +import { normalizeReturnTo, redirectAuthenticatedToApp } from '../../lib/auth/support/flow'; export const prerender = false; diff --git a/src/pages/auth/device/approve.astro b/src/pages/auth/device/approve.astro index 24d530eb..e9d5b2dd 100644 --- a/src/pages/auth/device/approve.astro +++ b/src/pages/auth/device/approve.astro @@ -1,13 +1,13 @@ --- import AuthShell from '@treeseed/ui/components/astro/auth/AuthShell.astro'; import AuthCard from '@treeseed/ui/components/astro/auth/AuthCard.astro'; -import Field from '@treeseed/ui/components/astro/forms/Field.astro'; -import TextInput from '@treeseed/ui/components/astro/forms/TextInput.astro'; -import Button from '@treeseed/ui/components/astro/forms/Button.astro'; -import FormActions from '@treeseed/ui/components/astro/forms/FormActions.astro'; -import { resolveAnonymousThemePreference } from '../../../lib/auth/appearance'; +import Field from '@treeseed/ui/components/astro/forms/fields/Field.astro'; +import TextInput from '@treeseed/ui/components/astro/forms/fields/TextInput.astro'; +import Button from '@treeseed/ui/components/astro/forms/actions/Button.astro'; +import FormActions from '@treeseed/ui/components/astro/forms/actions/FormActions.astro'; +import { resolveAnonymousThemePreference } from '../../../lib/auth/accounts/appearance'; import { createApiFacade } from '../../../lib/market/api-client'; -import { ensureCsrfToken, requireCsrf } from '../../../lib/auth/csrf'; +import { ensureCsrfToken, requireCsrf } from '../../../lib/auth/support/csrf'; export const prerender = false; diff --git a/src/pages/auth/forgot-password.astro b/src/pages/auth/forgot-password.astro index 07c017fb..198c68ed 100644 --- a/src/pages/auth/forgot-password.astro +++ b/src/pages/auth/forgot-password.astro @@ -1,12 +1,12 @@ --- import AuthShell from '@treeseed/ui/components/astro/auth/AuthShell.astro'; import AuthCard from '@treeseed/ui/components/astro/auth/AuthCard.astro'; -import Field from '@treeseed/ui/components/astro/forms/Field.astro'; -import TextInput from '@treeseed/ui/components/astro/forms/TextInput.astro'; -import Button from '@treeseed/ui/components/astro/forms/Button.astro'; -import FormActions from '@treeseed/ui/components/astro/forms/FormActions.astro'; -import { resolveAnonymousThemePreference } from '../../lib/auth/appearance'; -import { normalizeReturnTo, redirectAuthenticatedToApp } from '../../lib/auth/flow'; +import Field from '@treeseed/ui/components/astro/forms/fields/Field.astro'; +import TextInput from '@treeseed/ui/components/astro/forms/fields/TextInput.astro'; +import Button from '@treeseed/ui/components/astro/forms/actions/Button.astro'; +import FormActions from '@treeseed/ui/components/astro/forms/actions/FormActions.astro'; +import { resolveAnonymousThemePreference } from '../../lib/auth/accounts/appearance'; +import { normalizeReturnTo, redirectAuthenticatedToApp } from '../../lib/auth/support/flow'; import { createApiFacade } from '../../lib/market/api-client'; export const prerender = false; diff --git a/src/pages/auth/logout.ts b/src/pages/auth/logout.ts index a1a46b8e..e02a4ca7 100644 --- a/src/pages/auth/logout.ts +++ b/src/pages/auth/logout.ts @@ -1,5 +1,5 @@ import type { APIRoute } from 'astro'; -import { requireCsrf } from '../../lib/auth/csrf'; +import { requireCsrf } from '../../lib/auth/support/csrf'; import { clearApiAccessTokenCookie, createApiFacade } from '../../lib/market/api-client'; export const prerender = false; diff --git a/src/pages/auth/register.astro b/src/pages/auth/register.astro index 755205bc..00646ee0 100644 --- a/src/pages/auth/register.astro +++ b/src/pages/auth/register.astro @@ -2,10 +2,10 @@ import AuthShell from '@treeseed/ui/components/astro/auth/AuthShell.astro'; import AuthCard from '@treeseed/ui/components/astro/auth/AuthCard.astro'; import RegistrationForm from '@treeseed/ui/components/astro/auth/RegistrationForm.astro'; -import { authProviderCapabilities, normalizeReturnTo, redirectAuthenticatedToApp, submitMarketEmailAuthFlow } from '../../lib/auth/flow'; -import { composeDisplayNameFromParts, normalizeUsername, validateUsername } from '../../lib/auth/profile-validation'; -import { passwordMeetsPolicy, passwordPolicyMessage } from '../../lib/auth/password-policy'; -import { resolveAnonymousThemePreference, setAnonymousThemeCookies } from '../../lib/auth/appearance'; +import { authProviderCapabilities, normalizeReturnTo, redirectAuthenticatedToApp, submitMarketEmailAuthFlow } from '../../lib/auth/support/flow'; +import { composeDisplayNameFromParts, normalizeUsername, validateUsername } from '../../lib/auth/support/profile-validation'; +import { passwordMeetsPolicy, passwordPolicyMessage } from '../../lib/auth/accounts/password-policy'; +import { resolveAnonymousThemePreference, setAnonymousThemeCookies } from '../../lib/auth/accounts/appearance'; export const prerender = false; diff --git a/src/pages/auth/reset-password.astro b/src/pages/auth/reset-password.astro index 1c63e606..4d4494ce 100644 --- a/src/pages/auth/reset-password.astro +++ b/src/pages/auth/reset-password.astro @@ -1,14 +1,14 @@ --- import AuthShell from '@treeseed/ui/components/astro/auth/AuthShell.astro'; import AuthCard from '@treeseed/ui/components/astro/auth/AuthCard.astro'; -import Field from '@treeseed/ui/components/astro/forms/Field.astro'; -import TextInput from '@treeseed/ui/components/astro/forms/TextInput.astro'; -import Button from '@treeseed/ui/components/astro/forms/Button.astro'; -import FormActions from '@treeseed/ui/components/astro/forms/FormActions.astro'; -import PasswordMeter from '@treeseed/ui/components/astro/forms/PasswordMeter.astro'; -import { resolveAnonymousThemePreference } from '../../lib/auth/appearance'; -import { normalizeReturnTo, redirectAuthenticatedToApp } from '../../lib/auth/flow'; -import { passwordMeetsPolicy, passwordPolicyMessage } from '../../lib/auth/password-policy'; +import Field from '@treeseed/ui/components/astro/forms/fields/Field.astro'; +import TextInput from '@treeseed/ui/components/astro/forms/fields/TextInput.astro'; +import Button from '@treeseed/ui/components/astro/forms/actions/Button.astro'; +import FormActions from '@treeseed/ui/components/astro/forms/actions/FormActions.astro'; +import PasswordMeter from '@treeseed/ui/components/astro/forms/fields/PasswordMeter.astro'; +import { resolveAnonymousThemePreference } from '../../lib/auth/accounts/appearance'; +import { normalizeReturnTo, redirectAuthenticatedToApp } from '../../lib/auth/support/flow'; +import { passwordMeetsPolicy, passwordPolicyMessage } from '../../lib/auth/accounts/password-policy'; import { createApiFacade } from '../../lib/market/api-client'; export const prerender = false; diff --git a/src/pages/auth/sign-in.astro b/src/pages/auth/sign-in.astro index 9c5c9421..1f245958 100644 --- a/src/pages/auth/sign-in.astro +++ b/src/pages/auth/sign-in.astro @@ -3,10 +3,10 @@ import AuthShell from '@treeseed/ui/components/astro/auth/AuthShell.astro'; import AuthCard from '@treeseed/ui/components/astro/auth/AuthCard.astro'; import AuthDivider from '@treeseed/ui/components/astro/auth/AuthDivider.astro'; import ProviderButtonList from '@treeseed/ui/components/astro/auth/ProviderButtonList.astro'; -import Field from '@treeseed/ui/components/astro/forms/Field.astro'; -import TextInput from '@treeseed/ui/components/astro/forms/TextInput.astro'; -import Button from '@treeseed/ui/components/astro/forms/Button.astro'; -import FormActions from '@treeseed/ui/components/astro/forms/FormActions.astro'; +import Field from '@treeseed/ui/components/astro/forms/fields/Field.astro'; +import TextInput from '@treeseed/ui/components/astro/forms/fields/TextInput.astro'; +import Button from '@treeseed/ui/components/astro/forms/actions/Button.astro'; +import FormActions from '@treeseed/ui/components/astro/forms/actions/FormActions.astro'; import { authProviderCapabilities, isSupportedAuthProvider, @@ -14,8 +14,8 @@ import { providerSignInPath, redirectAuthenticatedToApp, submitMarketEmailAuthFlow, -} from '../../lib/auth/flow'; -import { resolveAnonymousThemePreference } from '../../lib/auth/appearance'; +} from '../../lib/auth/support/flow'; +import { resolveAnonymousThemePreference } from '../../lib/auth/accounts/appearance'; export const prerender = false; diff --git a/src/pages/auth/username.astro b/src/pages/auth/username.astro index 4bd3cdfd..57ef1f6e 100644 --- a/src/pages/auth/username.astro +++ b/src/pages/auth/username.astro @@ -2,9 +2,9 @@ import AuthShell from '@treeseed/ui/components/astro/auth/AuthShell.astro'; import AuthCard from '@treeseed/ui/components/astro/auth/AuthCard.astro'; import UsernameClaimForm from '@treeseed/ui/components/astro/auth/UsernameClaimForm.astro'; -import { resolveAuthenticatedThemePreference } from '../../lib/auth/appearance'; -import { normalizeReturnTo } from '../../lib/auth/flow'; -import { ensureCsrfToken, requireCsrf } from '../../lib/auth/csrf'; +import { resolveAuthenticatedThemePreference } from '../../lib/auth/accounts/appearance'; +import { normalizeReturnTo } from '../../lib/auth/support/flow'; +import { ensureCsrfToken, requireCsrf } from '../../lib/auth/support/csrf'; import { createApiFacade, setApiAccessTokenCookie } from '../../lib/market/api-client'; export const prerender = false; diff --git a/src/pages/t/[name].astro b/src/pages/t/[name].astro index 821cf08b..4f26e3f7 100644 --- a/src/pages/t/[name].astro +++ b/src/pages/t/[name].astro @@ -1,5 +1,5 @@ --- -import TreeseedPublicLayout from '../../layouts/TreeseedPublicLayout.astro'; +import TreeseedPublicLayout from '../../layouts/PublicLayout.astro'; import PublicProfileHeader from '@treeseed/ui/components/astro/public/PublicProfileHeader.astro'; import PublicSection from '@treeseed/ui/components/astro/public/PublicSection.astro'; import PublicStack from '@treeseed/ui/components/astro/public/PublicStack.astro'; diff --git a/src/pages/team-invites/[token]/accept.astro b/src/pages/team-invites/[token]/accept.astro index 00ce459f..d077902a 100644 --- a/src/pages/team-invites/[token]/accept.astro +++ b/src/pages/team-invites/[token]/accept.astro @@ -1,5 +1,5 @@ --- -import TreeseedPublicLayout from '../../../layouts/TreeseedPublicLayout.astro'; +import TreeseedPublicLayout from '../../../layouts/PublicLayout.astro'; import { resolveApiStore } from '../../../lib/market/store.js'; export const prerender = false; diff --git a/src/pages/u/[username].astro b/src/pages/u/[username].astro index 5d2403fc..88dec1ff 100644 --- a/src/pages/u/[username].astro +++ b/src/pages/u/[username].astro @@ -1,7 +1,7 @@ --- -import TreeseedPublicLayout from '../../layouts/TreeseedPublicLayout.astro'; +import TreeseedPublicLayout from '../../layouts/PublicLayout.astro'; import ProfileTemplate from '@treeseed/ui/components/astro/templates/ProfileTemplate.astro'; -import { normalizeUsername, validateUsername } from '../../lib/auth/profile-validation'; +import { normalizeUsername, validateUsername } from '../../lib/auth/support/profile-validation'; import { resolvePublicUserProfile } from '../../lib/market/public-access.js'; export const prerender = false; diff --git a/src/pages/v1/[...all].ts b/src/pages/v1/[...all].ts index e7d9e55e..d11cdc05 100644 --- a/src/pages/v1/[...all].ts +++ b/src/pages/v1/[...all].ts @@ -6,7 +6,7 @@ import { resolveApiBaseUrl, setApiAccessTokenCookie, } from '../../lib/market/api-client'; -import { csrfMatches, WEB_CSRF_HEADER } from '../../lib/auth/csrf'; +import { csrfMatches, WEB_CSRF_HEADER } from '../../lib/auth/support/csrf'; export const prerender = false; diff --git a/src/plugin.ts b/src/plugin.ts index ba0133df..b81095ee 100644 --- a/src/plugin.ts +++ b/src/plugin.ts @@ -1,6 +1,6 @@ import { envField } from 'astro/config'; -import { defineTreeseedPlugin } from '@treeseed/sdk/platform/plugin'; -import type { TreeseedPlugin } from '@treeseed/sdk/platform/plugin'; +import { definePlugin } from '@treeseed/sdk/platform/plugin'; +import type { Plugin } from '@treeseed/sdk/platform/plugin'; import { ADMIN_ROUTES, ADMIN_SUPPORT_ROUTES } from './routes.js'; import { DEFAULT_ADMIN_COMMERCE_PROVIDER } from './commerce.js'; import { DEFAULT_SECRET_MANAGER_PROVIDERS } from './secret-managers.js'; @@ -108,7 +108,7 @@ export const ADMIN_CAPABILITIES = { })), }; -const adminPlugin: TreeseedPlugin = defineTreeseedPlugin({ +const adminPlugin: Plugin = definePlugin({ id: '@treeseed/admin', siteLayers: [{ root: '.', kinds: ['pages', 'styles', 'components'] }], siteHooks: { diff --git a/src/routes.ts b/src/routes.ts index 4cf79e16..8151ad46 100644 --- a/src/routes.ts +++ b/src/routes.ts @@ -1,13 +1,13 @@ -import { defineTreeseedRoute, validateTreeseedRouteCapabilities, type TreeseedRouteCapability, type TreeseedSiteRouteContribution } from '@treeseed/sdk/platform/plugin'; +import { defineRoute, validateRouteCapabilities, type RouteCapability, type SiteRouteContribution } from '@treeseed/sdk/platform/plugin'; -type CapabilityInput = Partial & Pick; +type CapabilityInput = Partial & Pick; -function adminRoute(pattern: string, resourcePath: string, input: CapabilityInput): TreeseedSiteRouteContribution { +function adminRoute(pattern: string, resourcePath: string, input: CapabilityInput): SiteRouteContribution { const auth = pattern.startsWith('/auth'); const personal = pattern === '/app' || pattern.startsWith('/app/account'); const team = pattern.startsWith('/app/teams') || pattern.startsWith('/t/') || pattern.startsWith('/team-invites'); const support = pattern.startsWith('/v1/'); - return defineTreeseedRoute({ pattern, resourcePath, capability: { + return defineRoute({ pattern, resourcePath, capability: { owner: 'admin', responseKind: support ? 'proxy' : pattern === '/auth/logout' || pattern.startsWith('/team-invites') ? 'redirect' : 'page', archetype: auth ? 'auth-form' : pattern === '/app' ? 'dashboard' : pattern.startsWith('/u/') || pattern.startsWith('/t/') ? 'profile' : pattern.includes('/delete') || personal ? 'settings' : pattern.endsWith('/new') ? 'wizard' : 'collection', @@ -26,7 +26,7 @@ function adminRoute(pattern: string, resourcePath: string, input: CapabilityInpu } }); } -export const ADMIN_ROUTES: readonly TreeseedSiteRouteContribution[] = validateTreeseedRouteCapabilities([ +export const ADMIN_ROUTES: readonly SiteRouteContribution[] = validateRouteCapabilities([ adminRoute('/app', 'pages/app/index.astro', { id: 'admin.app.start', description: 'Authenticated identity and active-team start dashboard.', guarantees: ['guarantee.route.registry'] }), adminRoute('/app/account', 'pages/app/account/index.astro', { id: 'admin.account.identity', description: 'Identity, immutable username, verified email, password, and connected-provider settings.', guarantees: ['guarantee.user.account.edit-account-settings.006'] }), adminRoute('/app/account/sessions', 'pages/app/account/sessions.astro', { id: 'admin.account.sessions', description: 'Account session collection with current-session protection and revocation.', guarantees: ['guarantee.user.account.manage-sessions.007'] }), @@ -53,7 +53,7 @@ export const ADMIN_ROUTES: readonly TreeseedSiteRouteContribution[] = validateTr adminRoute('/team-invites/[token]/accept', 'pages/team-invites/[token]/accept.astro', { id: 'admin.team.invite-accept', description: 'Idempotent invitation acceptance and safe destination.' }), ]); -export const ADMIN_SUPPORT_ROUTES: readonly TreeseedSiteRouteContribution[] = validateTreeseedRouteCapabilities([ +export const ADMIN_SUPPORT_ROUTES: readonly SiteRouteContribution[] = validateRouteCapabilities([ adminRoute('/v1/[...all]', 'pages/v1/[...all].ts', { id: 'admin.support.api-proxy', description: 'Same-origin authenticated API facade with double-submit CSRF enforcement.', diff --git a/src/secret-managers.ts b/src/secret-managers.ts index 09c6ecf5..681b4c10 100644 --- a/src/secret-managers.ts +++ b/src/secret-managers.ts @@ -1,18 +1,18 @@ import { - assertTreeseedGitHubActionsEncryptedSecretDeployment, - buildTreeseedClientEncryptedEscrowEnvelope, - summarizeTreeseedClientEncryptedEscrowStatus, + assertGitHubActionsEncryptedSecretDeployment, + buildClientEncryptedEscrowEnvelope, + summarizeClientEncryptedEscrowStatus, } from '@treeseed/sdk/secrets-capability'; -type TreeseedClientEncryptedEscrowEnvelopeInput = Parameters[0]; -type TreeseedGitHubActionsEncryptedSecretDeployment = ReturnType; +type ClientEncryptedEscrowEnvelopeInput = Parameters[0]; +type GitHubActionsEncryptedSecretDeployment = ReturnType; -export type TreeseedSecretScope = 'local' | 'staging' | 'prod'; +export type SecretScope = 'local' | 'staging' | 'prod'; export interface SecretBindingSummary { id: string; label: string; - scope: TreeseedSecretScope; + scope: SecretScope; status: 'active' | 'missing' | 'error' | (string & {}); metadata?: Record; } @@ -21,32 +21,32 @@ export interface SecretResolution { resolved: boolean; ref: string; value?: string; - diagnostics?: TreeseedSecretManagerDiagnostic[]; + diagnostics?: SecretManagerDiagnostic[]; } export interface SecretWriteInput { ref: string; value: string; - scope: TreeseedSecretScope; + scope: SecretScope; metadata?: Record; } export interface SecretWriteResult { ok: boolean; ref: string; - diagnostics?: TreeseedSecretManagerDiagnostic[]; + diagnostics?: SecretManagerDiagnostic[]; } -export interface TreeseedSecretManagerDiagnostic { +export interface SecretManagerDiagnostic { code: string; severity: 'info' | 'warning' | 'error'; message: string; } -export interface TreeseedSecretManagerProvider { +export interface SecretManagerProvider { id: string; label: string; - supportedScopes: TreeseedSecretScope[]; + supportedScopes: SecretScope[]; capabilities: { write: boolean; rotate: boolean; @@ -56,10 +56,10 @@ export interface TreeseedSecretManagerProvider { listBindings(context: unknown): Promise; resolveSecret(context: unknown, ref: string): Promise; writeSecret(context: unknown, input: SecretWriteInput): Promise; - validateConnection(context: unknown): Promise; + validateConnection(context: unknown): Promise; } -function unsupportedWrite(provider: Pick, input: SecretWriteInput): SecretWriteResult { +function unsupportedWrite(provider: Pick, input: SecretWriteInput): SecretWriteResult { return { ok: false, ref: input.ref, @@ -71,7 +71,7 @@ function unsupportedWrite(provider: Pick, i }; } -function provider(id: string, label: string, capabilities: TreeseedSecretManagerProvider['capabilities']): TreeseedSecretManagerProvider { +function provider(id: string, label: string, capabilities: SecretManagerProvider['capabilities']): SecretManagerProvider { return { id, label, @@ -92,7 +92,7 @@ function provider(id: string, label: string, capabilities: TreeseedSecretManager }; } -export const DEFAULT_SECRET_MANAGER_PROVIDERS: TreeseedSecretManagerProvider[] = [ +export const DEFAULT_SECRET_MANAGER_PROVIDERS: SecretManagerProvider[] = [ provider('treeseed-local-encrypted', 'Treeseed local encrypted payloads', { write: true, rotate: false, import: true, audit: false }), provider('treeseed-config', 'Treeseed machine config', { write: false, rotate: false, import: true, audit: false }), provider('github-actions', 'GitHub Actions secrets and variables', { write: true, rotate: true, import: true, audit: true }), @@ -101,13 +101,13 @@ export const DEFAULT_SECRET_MANAGER_PROVIDERS: TreeseedSecretManagerProvider[] = ]; export function buildAdminClientEncryptedEscrowBody( - input: TreeseedClientEncryptedEscrowEnvelopeInput & { + input: ClientEncryptedEscrowEnvelopeInput & { name?: string; secretClass?: string; secretMetadata?: Record; }, ) { - const envelope = buildTreeseedClientEncryptedEscrowEnvelope(input); + const envelope = buildClientEncryptedEscrowEnvelope(input); return { ...envelope, name: input.name, @@ -117,8 +117,8 @@ export function buildAdminClientEncryptedEscrowBody( }; } -export function describeAdminClientEncryptedEscrowStatus(record: TreeseedClientEncryptedEscrowEnvelopeInput, now = new Date()) { - const summary = summarizeTreeseedClientEncryptedEscrowStatus(record, now); +export function describeAdminClientEncryptedEscrowStatus(record: ClientEncryptedEscrowEnvelopeInput, now = new Date()) { + const summary = summarizeClientEncryptedEscrowStatus(record, now); return { ...summary, label: summary.reentryRequired @@ -131,15 +131,15 @@ export function describeAdminClientEncryptedEscrowStatus(record: TreeseedClientE }; } -export function buildAdminGitHubActionsSecretDeploymentBody(input: TreeseedGitHubActionsEncryptedSecretDeployment & Record) { +export function buildAdminGitHubActionsSecretDeploymentBody(input: GitHubActionsEncryptedSecretDeployment & Record) { return { - ...assertTreeseedGitHubActionsEncryptedSecretDeployment(input), + ...assertGitHubActionsEncryptedSecretDeployment(input), custodyMode: 'github_actions_secret_enclave', }; } export function describeAdminSecretCapabilityState( - input: Partial & { + input: Partial & { custodyMode?: string | null; githubSecretTarget?: Record | null; providerOwned?: boolean | null; @@ -161,7 +161,7 @@ export function describeAdminSecretCapabilityState( : 'metadata_only_reentry' ); const escrow = custodyMode === 'client_encrypted_escrow' - ? describeAdminClientEncryptedEscrowStatus(input as TreeseedClientEncryptedEscrowEnvelopeInput, now) + ? describeAdminClientEncryptedEscrowStatus(input as ClientEncryptedEscrowEnvelopeInput, now) : null; const label = escrow?.label ?? (custodyMode === 'github_actions_secret_enclave' ? 'GitHub-backed' diff --git a/src/view-models/account-settings.ts b/src/view-models/account-settings.ts index 61cd754a..bb5996f9 100644 --- a/src/view-models/account-settings.ts +++ b/src/view-models/account-settings.ts @@ -1,7 +1,7 @@ import type { APIContext } from 'astro'; import { NOTIFICATION_CONTENT_CAPABILITIES, normalizeNotificationPreferences, type PersonalThemeDraft } from '@treeseed/sdk/account-contracts'; import { validateGuidedThemePalette } from '@treeseed/ui/theme'; -import { ensureCsrfToken, requireCsrf } from '../lib/auth/csrf'; +import { ensureCsrfToken, requireCsrf } from '../lib/auth/support/csrf'; import { clearApiAccessTokenCookie, createApiFacade } from '../lib/market/api-client'; import { loadAppContext } from './app-access'; diff --git a/tests/contract/package/admin-package.test.ts b/tests/contract/package/admin-package.test.ts index a3bcbaa1..5158957d 100644 --- a/tests/contract/package/admin-package.test.ts +++ b/tests/contract/package/admin-package.test.ts @@ -2,7 +2,7 @@ import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs'; import { extname, join, relative, resolve } from 'node:path'; import { describe, expect, it } from 'vitest'; import adminPlugin, { ADMIN_CAPABILITIES, ADMIN_ENV_SCHEMA } from '../../../src/plugin'; -import type { TreeseedPluginSiteContext, TreeseedSiteExtensionContribution } from '@treeseed/sdk/platform/plugin'; +import type { PluginSiteContext, SiteExtensionContribution } from '@treeseed/sdk/platform/plugin'; import { ADMIN_ROUTES, ADMIN_SUPPORT_ROUTES } from '../../../src/routes'; import { DEFAULT_ADMIN_COMMERCE_PROVIDER } from '../../../src/commerce'; import { DEFAULT_SECRET_MANAGER_PROVIDERS } from '../../../src/secret-managers'; @@ -56,15 +56,15 @@ function exportTargets(value: unknown): string[] { return Object.values(value as Record).flatMap(exportTargets); } -function resolveSiteHooks(): TreeseedSiteExtensionContribution { +function resolveSiteHooks(): SiteExtensionContribution { const hooks = adminPlugin.siteHooks; if (!hooks) return {}; if (typeof hooks !== 'function') return hooks; return hooks({ projectRoot: process.cwd(), - tenantConfig: {} as TreeseedPluginSiteContext['tenantConfig'], + tenantConfig: {} as PluginSiteContext['tenantConfig'], pluginConfig: {}, - } satisfies TreeseedPluginSiteContext); + } satisfies PluginSiteContext); } describe('@treeseed/admin identity and team surface', () => { @@ -79,7 +79,7 @@ describe('@treeseed/admin identity and team surface', () => { }); it('keeps navigation limited to identity and team management', () => { - const appLayout = readFileSync('src/layouts/TreeseedAppLayout.astro', 'utf8'); + const appLayout = readFileSync('src/layouts/AppLayout.astro', 'utf8'); for (const target of ['/app/', '/app/account', '/app/teams', '/app/teams/new']) { expect(appLayout).toContain(target); } @@ -113,7 +113,7 @@ describe('@treeseed/admin identity and team surface', () => { expect(packageJson.dependencies).not.toHaveProperty('@treeseed/api'); expect(DEFAULT_ADMIN_COMMERCE_PROVIDER.id).toBe('none'); expect(DEFAULT_SECRET_MANAGER_PROVIDERS[0]?.id).toBe('treeseed-local-encrypted'); - expect(readFileSync('src/lib/market/api-client/get-commerce-vendor-sales-summary.ts', 'utf8')).toContain('getCommerceVendorSalesSummaryMethod'); + expect(readFileSync('src/lib/market/api-client/commerce/vendors/queries/get-commerce-vendor-sales-summary.ts', 'utf8')).toContain('getCommerceVendorSalesSummaryMethod'); }); it('builds declarations and valid package exports', () => { diff --git a/tests/support/shims/sdk-platform-plugin.ts b/tests/support/shims/sdk-platform-plugin.ts index 01673225..7d680c53 100644 --- a/tests/support/shims/sdk-platform-plugin.ts +++ b/tests/support/shims/sdk-platform-plugin.ts @@ -1,10 +1,10 @@ -export type TreeseedPlugin = Record; -export type TreeseedSiteRouteContribution = { +export type Plugin = Record; +export type SiteRouteContribution = { pattern: string; resourcePath: string; - capability?: TreeseedRouteCapability; + capability?: RouteCapability; }; -export type TreeseedRouteCapability = { +export type RouteCapability = { id: string; owner: 'market' | 'admin' | 'core'; responseKind: string; @@ -23,14 +23,14 @@ export type TreeseedRouteCapability = { description: string; }; -export function defineTreeseedPlugin(plugin: T): T { +export function definePlugin(plugin: T): T { return plugin; } -export function defineTreeseedRoute(route: T): T { +export function defineRoute(route: T): T { return route; } -export function validateTreeseedRouteCapabilities(routes: T): T { +export function validateRouteCapabilities(routes: T): T { return routes; } From abd01ff7de761698df0d1263d1e5aee6e39df952 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Fri, 24 Jul 2026 06:59:47 -0400 Subject: [PATCH 015/315] build(build): update package metadata Changes: - Updates 1 file across build: 1. - Touches scripts/verify-driver.ts. - Plans package version/tag 0.12.59-dev.staging.20260716T154320Z for @treeseed/admin. --- scripts/verify-driver.ts | 33 ++++----------------------------- 1 file changed, 4 insertions(+), 29 deletions(-) diff --git a/scripts/verify-driver.ts b/scripts/verify-driver.ts index e5fd3583..a565f52c 100644 --- a/scripts/verify-driver.ts +++ b/scripts/verify-driver.ts @@ -1,34 +1,9 @@ #!/usr/bin/env node -import { spawnSync } from 'node:child_process'; +import { runVerifyDriver } from '@treeseed/sdk/verification'; -function runDirectVerify() { - const result = spawnSync('npm', ['run', 'verify:direct'], { - cwd: process.cwd(), - env: process.env, - stdio: 'inherit', - }); - process.exit(result.status ?? 1); +if (process.env.TREESEED_VERIFY_ENTRYPOINT_CHECK === 'true') { + process.exit(0); } -const entrypointCheckOnly = process.env.TREESEED_VERIFY_ENTRYPOINT_CHECK === 'true'; - -try { - await import('@treeseed/sdk/scripts/verify-driver'); - if (entrypointCheckOnly) { - process.exit(0); - } -} catch (error) { - if (error && typeof error === 'object' && 'code' in error && error.code === 'ERR_MODULE_NOT_FOUND') { - if (entrypointCheckOnly) { - process.stderr.write('Treeseed admin verify: @treeseed/sdk is required for verify entrypoint resolution.\n'); - process.exit(1); - } - if (process.env.TREESEED_VERIFY_DRIVER === 'act') { - process.stderr.write('Treeseed admin verify: `act` mode requires @treeseed/sdk to be installed.\n'); - process.exit(1); - } - runDirectVerify(); - } - throw error; -} +process.exit(runVerifyDriver({ packageRoot: process.cwd() })); From d1cbff393176d455ef950df5953c249fc220c221 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Fri, 24 Jul 2026 08:07:46 -0400 Subject: [PATCH 016/315] chore(deps): update @treeseed/sdk and @treeseed/core pointers Changes: - Update package.json and package-lock.json with new dependency hashes. Dependency and pointer updates: - @treeseed/sdk: github:treeseed-ai/sdk#8f2e04cb4dac647d7aa63179dd67b5027d2e393f -> github:treeseed-ai/sdk#f2206b8a01a33ad20f40c59a537239a0f2343f77 - @treeseed/core: github:treeseed-ai/core#3c4750cbd95d27372ebaa4f0dfeac67bb5dfeeab -> github:treeseed-ai/core#a98ecdf205fff69b1f88e5774c3c8839771b875c --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index a7b0c55f..ae322abd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#3c4750cbd95d27372ebaa4f0dfeac67bb5dfeeab", - "@treeseed/sdk": "github:treeseed-ai/sdk#8f2e04cb4dac647d7aa63179dd67b5027d2e393f", + "@treeseed/core": "github:treeseed-ai/core#a98ecdf205fff69b1f88e5774c3c8839771b875c", + "@treeseed/sdk": "github:treeseed-ai/sdk#f2206b8a01a33ad20f40c59a537239a0f2343f77", "@treeseed/ui": "github:treeseed-ai/ui#3703cb057472895d224cf99def95066aa9ea399c", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -6932,7 +6932,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.staging.20260716T185112Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#3c4750cbd95d27372ebaa4f0dfeac67bb5dfeeab", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#a98ecdf205fff69b1f88e5774c3c8839771b875c", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6943,7 +6943,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#8f2e04cb4dac647d7aa63179dd67b5027d2e393f", + "@treeseed/sdk": "github:treeseed-ai/sdk#f2206b8a01a33ad20f40c59a537239a0f2343f77", "@treeseed/ui": "github:treeseed-ai/ui#3703cb057472895d224cf99def95066aa9ea399c", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8948,7 +8948,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.staging.20260716T185056Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#8f2e04cb4dac647d7aa63179dd67b5027d2e393f", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#f2206b8a01a33ad20f40c59a537239a0f2343f77", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index 1ea037f4..f1e7e462 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#3c4750cbd95d27372ebaa4f0dfeac67bb5dfeeab", - "@treeseed/sdk": "github:treeseed-ai/sdk#8f2e04cb4dac647d7aa63179dd67b5027d2e393f", + "@treeseed/core": "github:treeseed-ai/core#a98ecdf205fff69b1f88e5774c3c8839771b875c", + "@treeseed/sdk": "github:treeseed-ai/sdk#f2206b8a01a33ad20f40c59a537239a0f2343f77", "@treeseed/ui": "github:treeseed-ai/ui#3703cb057472895d224cf99def95066aa9ea399c", "react": "^19.2.5", "react-dom": "^19.2.6" From a7cc0015115be2543ac4652b655a29b019aef1c7 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Fri, 24 Jul 2026 09:28:51 -0400 Subject: [PATCH 017/315] chore(deps): update @treeseed/sdk and @treeseed/core Changes: - Update package.json and package-lock.json Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#f2206b8a01a33ad20f40c59a53723 39a0f2343f77 -> github:treeseed-ai/sdk#04423b717d32411ab3ff9920b15b222886911b36 - dependencies.@treeseed/core: github:treeseed-ai/core#a98ecdf205fff69b1f88e57 74c3c8839771b875c -> github:treeseed-ai/core#07e64f229e18152564c6991e1b3df46f7ce 5092d --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index ae322abd..2c77d0f4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#a98ecdf205fff69b1f88e5774c3c8839771b875c", - "@treeseed/sdk": "github:treeseed-ai/sdk#f2206b8a01a33ad20f40c59a537239a0f2343f77", + "@treeseed/core": "github:treeseed-ai/core#07e64f229e18152564c6991e1b3df46f7ce5092d", + "@treeseed/sdk": "github:treeseed-ai/sdk#04423b717d32411ab3ff9920b15b222886911b36", "@treeseed/ui": "github:treeseed-ai/ui#3703cb057472895d224cf99def95066aa9ea399c", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -6932,7 +6932,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.staging.20260716T185112Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#a98ecdf205fff69b1f88e5774c3c8839771b875c", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#07e64f229e18152564c6991e1b3df46f7ce5092d", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6943,7 +6943,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#f2206b8a01a33ad20f40c59a537239a0f2343f77", + "@treeseed/sdk": "github:treeseed-ai/sdk#04423b717d32411ab3ff9920b15b222886911b36", "@treeseed/ui": "github:treeseed-ai/ui#3703cb057472895d224cf99def95066aa9ea399c", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8948,7 +8948,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.staging.20260716T185056Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#f2206b8a01a33ad20f40c59a537239a0f2343f77", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#04423b717d32411ab3ff9920b15b222886911b36", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index f1e7e462..67b66cd5 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#a98ecdf205fff69b1f88e5774c3c8839771b875c", - "@treeseed/sdk": "github:treeseed-ai/sdk#f2206b8a01a33ad20f40c59a537239a0f2343f77", + "@treeseed/core": "github:treeseed-ai/core#07e64f229e18152564c6991e1b3df46f7ce5092d", + "@treeseed/sdk": "github:treeseed-ai/sdk#04423b717d32411ab3ff9920b15b222886911b36", "@treeseed/ui": "github:treeseed-ai/ui#3703cb057472895d224cf99def95066aa9ea399c", "react": "^19.2.5", "react-dom": "^19.2.6" From 1bd02a18ab9be9b375703e399f5ad30ac1773e7f Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Fri, 24 Jul 2026 11:04:06 -0400 Subject: [PATCH 018/315] chore(deps): update @treeseed/sdk and @treeseed/core pointers Changes: - Update dependency commit hashes in package.json and package-lock.json Dependency and pointer updates: - @treeseed/sdk: github:treeseed-ai/sdk#04423b717d32411ab3ff9920b15b222886911b36 -> github:treeseed-ai/sdk#93b7ebe33bba1e0454e90e90f8c6d9b062d46eed - @treeseed/core: github:treeseed-ai/core#07e64f229e18152564c6991e1b3df46f7ce5092d -> github:treeseed-ai/core#cba370c72da9bf35a8f72e624579e35874ed1ab7 --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2c77d0f4..323fd154 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#07e64f229e18152564c6991e1b3df46f7ce5092d", - "@treeseed/sdk": "github:treeseed-ai/sdk#04423b717d32411ab3ff9920b15b222886911b36", + "@treeseed/core": "github:treeseed-ai/core#cba370c72da9bf35a8f72e624579e35874ed1ab7", + "@treeseed/sdk": "github:treeseed-ai/sdk#93b7ebe33bba1e0454e90e90f8c6d9b062d46eed", "@treeseed/ui": "github:treeseed-ai/ui#3703cb057472895d224cf99def95066aa9ea399c", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -6932,7 +6932,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.staging.20260716T185112Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#07e64f229e18152564c6991e1b3df46f7ce5092d", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#cba370c72da9bf35a8f72e624579e35874ed1ab7", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6943,7 +6943,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#04423b717d32411ab3ff9920b15b222886911b36", + "@treeseed/sdk": "github:treeseed-ai/sdk#93b7ebe33bba1e0454e90e90f8c6d9b062d46eed", "@treeseed/ui": "github:treeseed-ai/ui#3703cb057472895d224cf99def95066aa9ea399c", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8948,7 +8948,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.staging.20260716T185056Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#04423b717d32411ab3ff9920b15b222886911b36", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#93b7ebe33bba1e0454e90e90f8c6d9b062d46eed", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index 67b66cd5..0d9199ba 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#07e64f229e18152564c6991e1b3df46f7ce5092d", - "@treeseed/sdk": "github:treeseed-ai/sdk#04423b717d32411ab3ff9920b15b222886911b36", + "@treeseed/core": "github:treeseed-ai/core#cba370c72da9bf35a8f72e624579e35874ed1ab7", + "@treeseed/sdk": "github:treeseed-ai/sdk#93b7ebe33bba1e0454e90e90f8c6d9b062d46eed", "@treeseed/ui": "github:treeseed-ai/ui#3703cb057472895d224cf99def95066aa9ea399c", "react": "^19.2.5", "react-dom": "^19.2.6" From 6667617c09cbe86d64acb28efc2eaad350f89c17 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Fri, 24 Jul 2026 12:38:25 -0400 Subject: [PATCH 019/315] build(build): sync package dependency references Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.staging.20260716T154320Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#93b7ebe33bba1e0454e90e90f8c6d9b062d46eed -> github:treeseed-ai/sdk#2f542a515d9755fbc0980b4678d69d49725dd7db - dependencies.@treeseed/core: github:treeseed-ai/core#cba370c72da9bf35a8f72e624579e35874ed1ab7 -> github:treeseed-ai/core#4ef26fbfb9ba63f5b3e9d26c947ba36561d9b16b --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 323fd154..310dbc30 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#cba370c72da9bf35a8f72e624579e35874ed1ab7", - "@treeseed/sdk": "github:treeseed-ai/sdk#93b7ebe33bba1e0454e90e90f8c6d9b062d46eed", + "@treeseed/core": "github:treeseed-ai/core#4ef26fbfb9ba63f5b3e9d26c947ba36561d9b16b", + "@treeseed/sdk": "github:treeseed-ai/sdk#2f542a515d9755fbc0980b4678d69d49725dd7db", "@treeseed/ui": "github:treeseed-ai/ui#3703cb057472895d224cf99def95066aa9ea399c", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -6932,7 +6932,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.staging.20260716T185112Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#cba370c72da9bf35a8f72e624579e35874ed1ab7", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#4ef26fbfb9ba63f5b3e9d26c947ba36561d9b16b", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6943,7 +6943,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#93b7ebe33bba1e0454e90e90f8c6d9b062d46eed", + "@treeseed/sdk": "github:treeseed-ai/sdk#2f542a515d9755fbc0980b4678d69d49725dd7db", "@treeseed/ui": "github:treeseed-ai/ui#3703cb057472895d224cf99def95066aa9ea399c", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8948,7 +8948,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.staging.20260716T185056Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#93b7ebe33bba1e0454e90e90f8c6d9b062d46eed", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#2f542a515d9755fbc0980b4678d69d49725dd7db", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index 0d9199ba..d029c5d1 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#cba370c72da9bf35a8f72e624579e35874ed1ab7", - "@treeseed/sdk": "github:treeseed-ai/sdk#93b7ebe33bba1e0454e90e90f8c6d9b062d46eed", + "@treeseed/core": "github:treeseed-ai/core#4ef26fbfb9ba63f5b3e9d26c947ba36561d9b16b", + "@treeseed/sdk": "github:treeseed-ai/sdk#2f542a515d9755fbc0980b4678d69d49725dd7db", "@treeseed/ui": "github:treeseed-ai/ui#3703cb057472895d224cf99def95066aa9ea399c", "react": "^19.2.5", "react-dom": "^19.2.6" From 918651a3641e483462fd49402a148b0b056f9bbb Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Fri, 24 Jul 2026 13:59:58 -0400 Subject: [PATCH 020/315] chore(deps): update @treeseed/core and @treeseed/sdk pointers Changes: - Update package.json and package-lock.json Dependency and pointer updates: - @treeseed/sdk: github:treeseed-ai/sdk#2f542a515d9755fbc0980b4678d69d49725dd7db -> github:treeseed-ai/sdk#321ec0914c7f8015d30e2f76f762c33c33c7b9f7 - @treeseed/core: github:treeseed-ai/core#4ef26fbfb9ba63f5b3e9d26c947ba36561d9b16b -> github:treeseed-ai/core#beff4abf525762d68adebfda90caa0186d9aaa7d --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 310dbc30..9c896cb4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#4ef26fbfb9ba63f5b3e9d26c947ba36561d9b16b", - "@treeseed/sdk": "github:treeseed-ai/sdk#2f542a515d9755fbc0980b4678d69d49725dd7db", + "@treeseed/core": "github:treeseed-ai/core#beff4abf525762d68adebfda90caa0186d9aaa7d", + "@treeseed/sdk": "github:treeseed-ai/sdk#321ec0914c7f8015d30e2f76f762c33c33c7b9f7", "@treeseed/ui": "github:treeseed-ai/ui#3703cb057472895d224cf99def95066aa9ea399c", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -6932,7 +6932,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.staging.20260716T185112Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#4ef26fbfb9ba63f5b3e9d26c947ba36561d9b16b", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#beff4abf525762d68adebfda90caa0186d9aaa7d", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6943,7 +6943,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#2f542a515d9755fbc0980b4678d69d49725dd7db", + "@treeseed/sdk": "github:treeseed-ai/sdk#321ec0914c7f8015d30e2f76f762c33c33c7b9f7", "@treeseed/ui": "github:treeseed-ai/ui#3703cb057472895d224cf99def95066aa9ea399c", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8948,7 +8948,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.staging.20260716T185056Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#2f542a515d9755fbc0980b4678d69d49725dd7db", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#321ec0914c7f8015d30e2f76f762c33c33c7b9f7", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index d029c5d1..0d0989a4 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#4ef26fbfb9ba63f5b3e9d26c947ba36561d9b16b", - "@treeseed/sdk": "github:treeseed-ai/sdk#2f542a515d9755fbc0980b4678d69d49725dd7db", + "@treeseed/core": "github:treeseed-ai/core#beff4abf525762d68adebfda90caa0186d9aaa7d", + "@treeseed/sdk": "github:treeseed-ai/sdk#321ec0914c7f8015d30e2f76f762c33c33c7b9f7", "@treeseed/ui": "github:treeseed-ai/ui#3703cb057472895d224cf99def95066aa9ea399c", "react": "^19.2.5", "react-dom": "^19.2.6" From d0de88ec4e74bb7efba6030b36ef325f7842c855 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Fri, 24 Jul 2026 15:36:47 -0400 Subject: [PATCH 021/315] build(build): sync package dependency references Changes: - Updates 3 files across build: 3. - Touches package-lock.json, package.json, scripts/build-dist.ts. - Plans package version/tag 0.12.59-dev.staging.20260716T154320Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#321ec0914c7f8015d30e2f76f762c33c33c7b9f7 -> github:treeseed-ai/sdk#1c0a5f8466b222e4c4d58d0e73724d47925ec476 - dependencies.@treeseed/core: github:treeseed-ai/core#beff4abf525762d68adebfda90caa0186d9aaa7d -> github:treeseed-ai/core#038d1b6626714b7a01ec4f89330dd9d454fe90b5 --- package-lock.json | 10 +++++----- package.json | 8 ++++---- scripts/build-dist.ts | 1 + 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9c896cb4..beef17e0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#beff4abf525762d68adebfda90caa0186d9aaa7d", - "@treeseed/sdk": "github:treeseed-ai/sdk#321ec0914c7f8015d30e2f76f762c33c33c7b9f7", + "@treeseed/core": "github:treeseed-ai/core#038d1b6626714b7a01ec4f89330dd9d454fe90b5", + "@treeseed/sdk": "github:treeseed-ai/sdk#1c0a5f8466b222e4c4d58d0e73724d47925ec476", "@treeseed/ui": "github:treeseed-ai/ui#3703cb057472895d224cf99def95066aa9ea399c", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -6932,7 +6932,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.staging.20260716T185112Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#beff4abf525762d68adebfda90caa0186d9aaa7d", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#038d1b6626714b7a01ec4f89330dd9d454fe90b5", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6943,7 +6943,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#321ec0914c7f8015d30e2f76f762c33c33c7b9f7", + "@treeseed/sdk": "github:treeseed-ai/sdk#1c0a5f8466b222e4c4d58d0e73724d47925ec476", "@treeseed/ui": "github:treeseed-ai/ui#3703cb057472895d224cf99def95066aa9ea399c", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8948,7 +8948,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.staging.20260716T185056Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#321ec0914c7f8015d30e2f76f762c33c33c7b9f7", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#1c0a5f8466b222e4c4d58d0e73724d47925ec476", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index 0d0989a4..87283c12 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#beff4abf525762d68adebfda90caa0186d9aaa7d", - "@treeseed/sdk": "github:treeseed-ai/sdk#321ec0914c7f8015d30e2f76f762c33c33c7b9f7", + "@treeseed/core": "github:treeseed-ai/core#038d1b6626714b7a01ec4f89330dd9d454fe90b5", + "@treeseed/sdk": "github:treeseed-ai/sdk#1c0a5f8466b222e4c4d58d0e73724d47925ec476", "@treeseed/ui": "github:treeseed-ai/ui#3703cb057472895d224cf99def95066aa9ea399c", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -109,7 +109,7 @@ "types": "./dist/view-models/*.d.ts", "default": "./dist/view-models/*.js" }, - "./layouts/TreeseedAppLayout.astro": "./dist/layouts/TreeseedAppLayout.astro", - "./layouts/TreeseedPublicLayout.astro": "./dist/layouts/TreeseedPublicLayout.astro" + "./layouts/AppLayout.astro": "./dist/layouts/AppLayout.astro", + "./layouts/PublicLayout.astro": "./dist/layouts/PublicLayout.astro" } } diff --git a/scripts/build-dist.ts b/scripts/build-dist.ts index 5f9a2b13..4b2c421f 100644 --- a/scripts/build-dist.ts +++ b/scripts/build-dist.ts @@ -252,6 +252,7 @@ async function main() { const releaseBuildLock = await acquireBuildLock(); try { ensureWorkspaceRuntimePackageLinks(); + rmSync(distRoot, { recursive: true, force: true }); mkdirSync(distRoot, { recursive: true }); for (const filePath of walkFiles(srcRoot)) { From dc53aa7189b83bfbc78e24215becf6b46647e46f Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Fri, 24 Jul 2026 15:55:53 -0400 Subject: [PATCH 022/315] chore(deps): update @treeseed/core dependency pointer Changes: - Update package.json and package-lock.json to reflect the new commit pointer for @treeseed/core. Dependency and pointer updates: - dependencies.@treeseed/core: github:treeseed-ai/core#038d1b6626714b7a01ec4f89330dd9d454fe90b5 -> github:treeseed-ai/core#f3da37cfc4ba3a1e39ef1e04111437b1890491aa --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index beef17e0..99431dac 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#038d1b6626714b7a01ec4f89330dd9d454fe90b5", + "@treeseed/core": "github:treeseed-ai/core#f3da37cfc4ba3a1e39ef1e04111437b1890491aa", "@treeseed/sdk": "github:treeseed-ai/sdk#1c0a5f8466b222e4c4d58d0e73724d47925ec476", "@treeseed/ui": "github:treeseed-ai/ui#3703cb057472895d224cf99def95066aa9ea399c", "react": "^19.2.5", @@ -6932,7 +6932,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.staging.20260716T185112Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#038d1b6626714b7a01ec4f89330dd9d454fe90b5", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#f3da37cfc4ba3a1e39ef1e04111437b1890491aa", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", diff --git a/package.json b/package.json index 87283c12..83e9b9ca 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#038d1b6626714b7a01ec4f89330dd9d454fe90b5", + "@treeseed/core": "github:treeseed-ai/core#f3da37cfc4ba3a1e39ef1e04111437b1890491aa", "@treeseed/sdk": "github:treeseed-ai/sdk#1c0a5f8466b222e4c4d58d0e73724d47925ec476", "@treeseed/ui": "github:treeseed-ai/ui#3703cb057472895d224cf99def95066aa9ea399c", "react": "^19.2.5", From 0788f631d06f9c39602d7455c541defff10a5fcc Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Fri, 24 Jul 2026 17:11:09 -0400 Subject: [PATCH 023/315] build(deps): update @treeseed/core and @treeseed/sdk pointers Changes: - Update package.json and package-lock.json Dependency and pointer updates: - @treeseed/sdk: github:treeseed-ai/sdk#1c0a5f8466b222e4c4d58d0e73724d47925ec476 -> github:treeseed-ai/sdk#3ef7bb7c48c2e6256bb2cfded847e0d4ee4eb45e - @treeseed/core: github:treeseed-ai/core#f3da37cfc4ba3a1e39ef1e04111437b1890491aa -> github:treeseed-ai/core#2e8866ec7694546edd36319fbeaa2dea9f71d5e9 --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 99431dac..ad47ff01 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#f3da37cfc4ba3a1e39ef1e04111437b1890491aa", - "@treeseed/sdk": "github:treeseed-ai/sdk#1c0a5f8466b222e4c4d58d0e73724d47925ec476", + "@treeseed/core": "github:treeseed-ai/core#2e8866ec7694546edd36319fbeaa2dea9f71d5e9", + "@treeseed/sdk": "github:treeseed-ai/sdk#3ef7bb7c48c2e6256bb2cfded847e0d4ee4eb45e", "@treeseed/ui": "github:treeseed-ai/ui#3703cb057472895d224cf99def95066aa9ea399c", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -6932,7 +6932,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.staging.20260716T185112Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#f3da37cfc4ba3a1e39ef1e04111437b1890491aa", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#2e8866ec7694546edd36319fbeaa2dea9f71d5e9", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6943,7 +6943,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#1c0a5f8466b222e4c4d58d0e73724d47925ec476", + "@treeseed/sdk": "github:treeseed-ai/sdk#3ef7bb7c48c2e6256bb2cfded847e0d4ee4eb45e", "@treeseed/ui": "github:treeseed-ai/ui#3703cb057472895d224cf99def95066aa9ea399c", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8948,7 +8948,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.staging.20260716T185056Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#1c0a5f8466b222e4c4d58d0e73724d47925ec476", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#3ef7bb7c48c2e6256bb2cfded847e0d4ee4eb45e", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index 83e9b9ca..8291fc53 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#f3da37cfc4ba3a1e39ef1e04111437b1890491aa", - "@treeseed/sdk": "github:treeseed-ai/sdk#1c0a5f8466b222e4c4d58d0e73724d47925ec476", + "@treeseed/core": "github:treeseed-ai/core#2e8866ec7694546edd36319fbeaa2dea9f71d5e9", + "@treeseed/sdk": "github:treeseed-ai/sdk#3ef7bb7c48c2e6256bb2cfded847e0d4ee4eb45e", "@treeseed/ui": "github:treeseed-ai/ui#3703cb057472895d224cf99def95066aa9ea399c", "react": "^19.2.5", "react-dom": "^19.2.6" From 536fc778bdc34298a8b2f0d12b61779eff8f3316 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Sat, 25 Jul 2026 00:07:32 -0400 Subject: [PATCH 024/315] build(build): sync package dependency references Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.staging.20260716T154320Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#3ef7bb7c48c2e6256bb2cfded847e0d4ee4eb45e -> github:treeseed-ai/sdk#5c6b5d62e04d7d34f67eeaa250ecfb237aa8f50f - dependencies.@treeseed/core: github:treeseed-ai/core#2e8866ec7694546edd36319fbeaa2dea9f71d5e9 -> github:treeseed-ai/core#dee85f16aa134ab66af58e3306682db4b7689697 --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index ad47ff01..71164943 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#2e8866ec7694546edd36319fbeaa2dea9f71d5e9", - "@treeseed/sdk": "github:treeseed-ai/sdk#3ef7bb7c48c2e6256bb2cfded847e0d4ee4eb45e", + "@treeseed/core": "github:treeseed-ai/core#dee85f16aa134ab66af58e3306682db4b7689697", + "@treeseed/sdk": "github:treeseed-ai/sdk#5c6b5d62e04d7d34f67eeaa250ecfb237aa8f50f", "@treeseed/ui": "github:treeseed-ai/ui#3703cb057472895d224cf99def95066aa9ea399c", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -6932,7 +6932,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.staging.20260716T185112Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#2e8866ec7694546edd36319fbeaa2dea9f71d5e9", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#dee85f16aa134ab66af58e3306682db4b7689697", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6943,7 +6943,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#3ef7bb7c48c2e6256bb2cfded847e0d4ee4eb45e", + "@treeseed/sdk": "github:treeseed-ai/sdk#5c6b5d62e04d7d34f67eeaa250ecfb237aa8f50f", "@treeseed/ui": "github:treeseed-ai/ui#3703cb057472895d224cf99def95066aa9ea399c", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8948,7 +8948,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.staging.20260716T185056Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#3ef7bb7c48c2e6256bb2cfded847e0d4ee4eb45e", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#5c6b5d62e04d7d34f67eeaa250ecfb237aa8f50f", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index 8291fc53..12f4a77d 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#2e8866ec7694546edd36319fbeaa2dea9f71d5e9", - "@treeseed/sdk": "github:treeseed-ai/sdk#3ef7bb7c48c2e6256bb2cfded847e0d4ee4eb45e", + "@treeseed/core": "github:treeseed-ai/core#dee85f16aa134ab66af58e3306682db4b7689697", + "@treeseed/sdk": "github:treeseed-ai/sdk#5c6b5d62e04d7d34f67eeaa250ecfb237aa8f50f", "@treeseed/ui": "github:treeseed-ai/ui#3703cb057472895d224cf99def95066aa9ea399c", "react": "^19.2.5", "react-dom": "^19.2.6" From 3360da1b52eec23b6f547b4cda3a0bd691f18201 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Sat, 25 Jul 2026 20:13:34 -0400 Subject: [PATCH 025/315] feat(guarantees): complete identity and team membership guarantees Intent: - complete admin identity and team guarantees Changes: - Update team and user guarantees with execution keys, entry routes, and audit requirements. - Enhance membership and account service journey scenes, including Mailpit-based invitation flows. - Update user authentication and account management guarantees and scenes. - Implement team management pages for editing teams, managing members, and creating new teams. - Update application routes, layouts, and routing definitions. Dependency and pointer updates: - @treeseed/ui: github:treeseed-ai/ui#3703cb057472895d224cf99def95066aa9ea399c -> github:treeseed-ai/ui#ccadc27c31a74db3a4d7ffe6657b5fb0f949612b - @treeseed/sdk: github:treeseed-ai/sdk#5c6b5d62e04d7d34f67eeaa250ecfb237aa8f50f -> github:treeseed-ai/sdk#c0421b331dd3d9721a0859162b8c6bb7911fe67e - @treeseed/core: github:treeseed-ai/core#dee85f16aa134ab66af58e3306682db4b7689697 -> github:treeseed-ai/core#b05f3ea0a459e5b3bc5edc66107dc56bdbe5227c --- .../accept-team-invitation.guarantee.yaml | 12 +-- .../change-member-role.guarantee.yaml | 8 +- .../invite-team-members.guarantee.yaml | 12 +-- .../remove-team-member.guarantee.yaml | 12 +-- .../scenes/accept-team-invitation.scene.yaml | 78 ++++++++++++--- .../scenes/change-member-role.scene.yaml | 44 ++++++--- .../scenes/invite-team-members.scene.yaml | 56 ++++++++--- .../scenes/remove-team-member.scene.yaml | 33 ++++--- guarantees/team/scenes/create-team.scene.yaml | 35 ++++--- guarantees/team/scenes/delete-team.scene.yaml | 53 ++++++++-- .../team/scenes/edit-team-settings.scene.yaml | 53 ++++++++-- .../team/scenes/switch-active-team.scene.yaml | 47 +++++++-- .../team/scenes/view-team-profile.scene.yaml | 46 ++++++--- .../team/team/create-team.guarantee.yaml | 6 +- .../team/team/delete-team.guarantee.yaml | 16 +-- .../team/edit-team-settings.guarantee.yaml | 12 +-- .../team/switch-active-team.guarantee.yaml | 2 +- .../team/view-team-profile.guarantee.yaml | 14 ++- .../user/account/delete-user.guarantee.yaml | 17 ++-- .../edit-account-settings.guarantee.yaml | 7 +- .../account/manage-appearance.guarantee.yaml | 7 +- .../manage-notifications.guarantee.yaml | 5 +- .../account/manage-sessions.guarantee.yaml | 11 ++- .../account/scenes/delete-user.scene.yaml | 98 +++++++++++++++++-- .../scenes/edit-account-settings.scene.yaml | 45 +++++++-- .../scenes/manage-appearance.scene.yaml | 70 +++++++++++-- .../scenes/manage-notifications.scene.yaml | 10 +- .../account/scenes/manage-sessions.scene.yaml | 61 ++++++++++-- .../scenes/view-user-profile.scene.yaml | 56 +++++++---- .../account/view-user-profile.guarantee.yaml | 11 ++- .../auth/forgot-reset-password.guarantee.yaml | 13 +-- .../user/auth/register-user.guarantee.yaml | 9 +- .../scenes/forgot-reset-password.scene.yaml | 50 +++++++++- .../user/auth/scenes/register-user.scene.yaml | 28 ++++-- .../user/auth/scenes/user-login.scene.yaml | 46 ++++++--- .../user/auth/scenes/user-logout.scene.yaml | 14 ++- .../user/auth/user-login.guarantee.yaml | 9 +- .../user/auth/user-logout.guarantee.yaml | 20 ++-- .../user/auth/verify-email.guarantee.yaml | 13 +-- guarantees/verifiers/ui.verifiers.yaml | 12 +++ package-lock.json | 16 +-- package.json | 6 +- src/layouts/AppLayout.astro | 7 +- src/pages/app/teams/[teamId]/edit.astro | 4 +- src/pages/app/teams/[teamId]/members.astro | 1 + src/pages/app/teams/new.astro | 2 +- src/routes.ts | 18 ++-- 47 files changed, 908 insertions(+), 297 deletions(-) diff --git a/guarantees/team/membership/accept-team-invitation.guarantee.yaml b/guarantees/team/membership/accept-team-invitation.guarantee.yaml index baba25ff..c744c262 100644 --- a/guarantees/team/membership/accept-team-invitation.guarantee.yaml +++ b/guarantees/team/membership/accept-team-invitation.guarantee.yaml @@ -14,10 +14,8 @@ dependencies: - guarantee.team.membership.invite-team-members.017 actors: allowed: - - team_admin - - team_owner - forbidden: - anonymous_user + forbidden: - unauthorized_user devices: required: @@ -30,16 +28,16 @@ preconditions: fixtures: - integrated_treeseed_project notes: - - Planned by guarantee journey audit: the referenced UI route/behavior is not implemented as an executable service journey yet. - "Journey dependencies must be satisfied: 17" scene: required: true manifest: ./scenes/accept-team-invitation.scene.yaml + executionKey: admin.team.accept-invite mode: acceptance: true demo: true training: true - entryRoute: /app/teams/visual-audit-team/members + entryRoute: /team-invites/[token]/accept componentContract: redirect/session service journey expectedEvidence: - playwright_trace @@ -55,8 +53,8 @@ content: required: false verifierRefs: [] audit: - required: false - verifierRefs: [] + required: true + verifierRefs: [api.team.lifecycle.audit] negativeCases: - id: non-member-denied actor: non_member diff --git a/guarantees/team/membership/change-member-role.guarantee.yaml b/guarantees/team/membership/change-member-role.guarantee.yaml index a5736a91..ea3a8cc9 100644 --- a/guarantees/team/membership/change-member-role.guarantee.yaml +++ b/guarantees/team/membership/change-member-role.guarantee.yaml @@ -30,16 +30,16 @@ preconditions: fixtures: - integrated_treeseed_project notes: - - Planned by guarantee journey audit: the referenced UI route/behavior is not implemented as an executable service journey yet. - "Journey dependencies must be satisfied: 18" scene: required: true manifest: ./scenes/change-member-role.scene.yaml + executionKey: admin.team.change-member-role mode: acceptance: true demo: true training: true - entryRoute: /app/teams/visual-audit-team/members + entryRoute: /app/teams/[teamId]/members componentContract: record-modal-form service journey expectedEvidence: - playwright_trace @@ -55,8 +55,8 @@ content: required: false verifierRefs: [] audit: - required: false - verifierRefs: [] + required: true + verifierRefs: [api.team.lifecycle.audit] negativeCases: - id: non-member-denied actor: non_member diff --git a/guarantees/team/membership/invite-team-members.guarantee.yaml b/guarantees/team/membership/invite-team-members.guarantee.yaml index f69e0e4c..e329c601 100644 --- a/guarantees/team/membership/invite-team-members.guarantee.yaml +++ b/guarantees/team/membership/invite-team-members.guarantee.yaml @@ -9,9 +9,9 @@ summary: Create team invitation records and send notices; roles should map to AP status: active dependencies: journeys: - - 12 + - 14 guarantees: - - guarantee.team.team.create-team.012 + - guarantee.team.team.edit-team-settings.014 actors: allowed: - team_admin @@ -30,16 +30,16 @@ preconditions: fixtures: - integrated_treeseed_project notes: - - Planned by guarantee journey audit: the referenced UI route/behavior is not implemented as an executable service journey yet. - "Journey dependencies must be satisfied: 12" scene: required: true manifest: ./scenes/invite-team-members.scene.yaml + executionKey: admin.team.invite mode: acceptance: true demo: true training: true - entryRoute: /app/teams/visual-audit-team/members + entryRoute: /app/teams/[teamId]/members componentContract: modal-form service journey expectedEvidence: - playwright_trace @@ -55,8 +55,8 @@ content: required: false verifierRefs: [] audit: - required: false - verifierRefs: [] + required: true + verifierRefs: [api.team.lifecycle.audit] negativeCases: - id: non-member-denied actor: non_member diff --git a/guarantees/team/membership/remove-team-member.guarantee.yaml b/guarantees/team/membership/remove-team-member.guarantee.yaml index 3d39ffa6..9c69d985 100644 --- a/guarantees/team/membership/remove-team-member.guarantee.yaml +++ b/guarantees/team/membership/remove-team-member.guarantee.yaml @@ -9,9 +9,9 @@ summary: Remove or deactivate a team member with auditability; must avoid orphan status: active dependencies: journeys: - - 18 + - 19 guarantees: - - guarantee.team.membership.accept-team-invitation.018 + - guarantee.team.membership.change-member-role.019 actors: allowed: - team_admin @@ -30,16 +30,16 @@ preconditions: fixtures: - integrated_treeseed_project notes: - - Planned by guarantee journey audit: the referenced UI route/behavior is not implemented as an executable service journey yet. - "Journey dependencies must be satisfied: 18" scene: required: true manifest: ./scenes/remove-team-member.scene.yaml + executionKey: admin.team.remove-member mode: acceptance: true demo: true training: true - entryRoute: /app/teams/visual-audit-team/members + entryRoute: /app/teams/[teamId]/members componentContract: record-action service journey expectedEvidence: - playwright_trace @@ -55,8 +55,8 @@ content: required: false verifierRefs: [] audit: - required: false - verifierRefs: [] + required: true + verifierRefs: [api.team.lifecycle.audit] negativeCases: - id: non-member-denied actor: non_member diff --git a/guarantees/team/membership/scenes/accept-team-invitation.scene.yaml b/guarantees/team/membership/scenes/accept-team-invitation.scene.yaml index 3e1c18ec..77ce07f0 100644 --- a/guarantees/team/membership/scenes/accept-team-invitation.scene.yaml +++ b/guarantees/team/membership/scenes/accept-team-invitation.scene.yaml @@ -11,11 +11,14 @@ journey: - Accept Team Invitation opens the canonical @treeseed/admin dashboard read model workflow. - Accept Team Invitation exercises a service journey instead of only loading /app/teams/visual-audit-team/members. - Accept Team Invitation records reviewable evidence for the visible result before activation. - minimumSteps: 2 + minimumSteps: 5 requiresInteractiveAction: true consumesState: - - key: team.primary - kind: team + - key: team.invitation + kind: marker + producesState: + - key: team.membership-accepted + kind: marker mode: test: true demo: true @@ -74,18 +77,71 @@ artifacts: timeline: true appLogs: true workflow: - - id: open-entry-route - title: Open Accept Team Invitation + - id: open-exact-invitation + title: Open the exact invitation from Mailpit action: - goto: /app/teams/visual-audit-team/members + mailpitConfirmLatest: + mailpitUrl: http://127.0.0.1:8025 + email: invite-{{runId}}-{{deviceId}}@treeseed.local + subjectIncludes: You're invited to join Verified {{runShort}} {{deviceId}} expect: - urlIncludes: /app/teams - - id: inspect-service-surface - title: Inspect Accept Team Invitation service surface + urlIncludes: /auth/register + text: Create account + - id: fill-invited-first-name + title: Set the invited user's first name action: - keyboard: Tab + fill: + role: textbox + name: First name + value: Invited expect: - urlIncludes: /app/teams + text: Create account + - id: fill-invited-last-name + title: Set the invited user's last name + action: + fill: + role: textbox + name: Last name + value: Member + expect: + text: Create account + - id: fill-invited-username + title: Set the invited user's username + action: + fill: + role: textbox + name: Username + value: i-{{runShort}}-{{deviceId}} + expect: + text: Create account + - id: fill-invited-password + title: Set the invited user's password + action: + fill: + css: '#registerPassword' + internal: true + value: TreeSeedInviteGuarantee123! + expect: + text: Create account + - id: confirm-invited-password + title: Confirm the invited user's password + action: + fill: + css: 'input[name="confirmPassword"]' + internal: true + value: TreeSeedInviteGuarantee123! + expect: + text: Create account + - id: submit-invited-registration + title: Register and accept as the invited principal + action: + click: + role: button + name: Create account + expect: + urlIncludes: /app + visible: + - scene: app-shell chapters: [] overlays: [] diagrams: [] diff --git a/guarantees/team/membership/scenes/change-member-role.scene.yaml b/guarantees/team/membership/scenes/change-member-role.scene.yaml index d4e31fa2..1f168d42 100644 --- a/guarantees/team/membership/scenes/change-member-role.scene.yaml +++ b/guarantees/team/membership/scenes/change-member-role.scene.yaml @@ -11,13 +11,16 @@ journey: - Change Member Role opens the canonical @treeseed/admin dashboard read model workflow. - Change Member Role exercises a service journey instead of only loading /app/teams/visual-audit-team/members. - Change Member Role records reviewable evidence for the visible result before activation. - minimumSteps: 2 + minimumSteps: 4 requiresInteractiveAction: true consumesState: - - key: auth.owner - kind: user - - key: team.primary - kind: team + - key: auth.primary-session + kind: browser-storage + - key: team.membership-accepted + kind: marker + producesState: + - key: team.member-role-changed + kind: marker mode: test: true demo: true @@ -82,15 +85,34 @@ workflow: - id: open-entry-route title: Open Change Member Role action: - goto: /app/teams/visual-audit-team/members + goto: /app/teams/gt-{{runShort}}-{{deviceId}}/members expect: - urlIncludes: /app/teams - - id: inspect-service-surface - title: Inspect Change Member Role service surface + text: invite-{{runId}}-{{deviceId}}@treeseed.local + - id: choose-reviewer-role + title: Change the invited member to reviewer action: - keyboard: Tab + select: + css: '[data-scene="team.member.invite-{{runId}}-{{deviceId}}@treeseed.local"] select[name="roleKey"]' + internal: true + value: reviewer expect: - urlIncludes: /app/teams + text: invite-{{runId}}-{{deviceId}}@treeseed.local + - id: save-member-role + title: Persist the member role + action: + click: + css: '[data-scene="team.member.invite-{{runId}}-{{deviceId}}@treeseed.local"] button[type="submit"]' + internal: true + expect: + urlIncludes: updated= + - id: verify-member-role + title: Verify role persistence after reload + action: + goto: /app/teams/gt-{{runShort}}-{{deviceId}}/members + expect: + visible: + - css: '[data-scene="team.member.invite-{{runId}}-{{deviceId}}@treeseed.local"][data-scene-state="reviewer"]' + internal: true chapters: [] overlays: [] diagrams: [] diff --git a/guarantees/team/membership/scenes/invite-team-members.scene.yaml b/guarantees/team/membership/scenes/invite-team-members.scene.yaml index baa44ab1..22ddfbcf 100644 --- a/guarantees/team/membership/scenes/invite-team-members.scene.yaml +++ b/guarantees/team/membership/scenes/invite-team-members.scene.yaml @@ -11,13 +11,16 @@ journey: - Invite Team Members opens the canonical @treeseed/admin record modal form workflow. - Invite Team Members exercises a service journey instead of only loading /app/teams/visual-audit-team/members. - Invite Team Members records reviewable evidence for the visible result before activation. - minimumSteps: 2 + minimumSteps: 5 requiresInteractiveAction: true consumesState: - - key: auth.owner - kind: user - - key: team.primary - kind: team + - key: auth.primary-session + kind: browser-storage + - key: team.updated + kind: marker + producesState: + - key: team.invitation + kind: marker mode: test: true demo: true @@ -82,15 +85,46 @@ workflow: - id: open-entry-route title: Open Invite Team Members action: - goto: /app/teams/visual-audit-team/members + goto: /app/teams/gt-{{runShort}}-{{deviceId}}/members expect: - urlIncludes: /app/teams - - id: inspect-service-surface - title: Inspect Invite Team Members service surface + text: Invite member + - id: fill-recipient + title: Enter a unique invited user action: - keyboard: Tab + fill: + role: textbox + name: Email + value: invite-{{runId}}-{{deviceId}}@treeseed.local expect: - urlIncludes: /app/teams + text: Invite member + - id: choose-role + title: Select the initial contributor role + action: + select: + role: combobox + name: Role + value: contributor + expect: + text: Invite member + - id: send-invitation + title: Send the invitation through the member UI + action: + click: + role: button + name: Invite member + expect: + text: Invite sent to invite-{{runId}}-{{deviceId}}@treeseed.local. + - id: observe-invitation-email + title: Observe exact invitation delivery in Mailpit + action: + mailpitConfirmLatest: + mailpitUrl: http://127.0.0.1:8025 + email: invite-{{runId}}-{{deviceId}}@treeseed.local + subjectIncludes: You're invited to join Verified {{runShort}} {{deviceId}} + navigate: false + expect: + urlIncludes: /members + text: Invite sent chapters: [] overlays: [] diagrams: [] diff --git a/guarantees/team/membership/scenes/remove-team-member.scene.yaml b/guarantees/team/membership/scenes/remove-team-member.scene.yaml index 8097852a..b221cb51 100644 --- a/guarantees/team/membership/scenes/remove-team-member.scene.yaml +++ b/guarantees/team/membership/scenes/remove-team-member.scene.yaml @@ -11,13 +11,16 @@ journey: - Remove Team Member opens the canonical @treeseed/admin destructive confirmation workflow. - Remove Team Member exercises a service journey instead of only loading /app/teams/visual-audit-team/members. - Remove Team Member records reviewable evidence for the visible result before activation. - minimumSteps: 2 + minimumSteps: 3 requiresInteractiveAction: true consumesState: - - key: auth.owner - kind: user - - key: team.primary - kind: team + - key: auth.primary-session + kind: browser-storage + - key: team.member-role-changed + kind: marker + producesState: + - key: team.member-removed + kind: marker mode: test: true demo: true @@ -82,15 +85,23 @@ workflow: - id: open-entry-route title: Open Remove Team Member action: - goto: /app/teams/visual-audit-team/members + goto: /app/teams/gt-{{runShort}}-{{deviceId}}/members expect: - urlIncludes: /app/teams - - id: inspect-service-surface - title: Inspect Remove Team Member service surface + text: invite-{{runId}}-{{deviceId}}@treeseed.local + - id: remove-invited-member + title: Remove the invited member action: - keyboard: Tab + click: + css: '[data-scene="team.member.invite-{{runId}}-{{deviceId}}@treeseed.local"] button[data-remove-member]' + internal: true expect: - urlIncludes: /app/teams + urlIncludes: removed= + - id: verify-member-removed + title: Verify the member no longer appears + action: + goto: /app/teams/gt-{{runShort}}-{{deviceId}}/members + expect: + notText: invite-{{runId}}-{{deviceId}}@treeseed.local chapters: [] overlays: [] diagrams: [] diff --git a/guarantees/team/scenes/create-team.scene.yaml b/guarantees/team/scenes/create-team.scene.yaml index 96aad962..d3b2d757 100644 --- a/guarantees/team/scenes/create-team.scene.yaml +++ b/guarantees/team/scenes/create-team.scene.yaml @@ -15,10 +15,10 @@ journey: requiresInteractiveAction: true producesState: - key: team.primary - kind: team + kind: marker consumesState: - - key: auth.owner - kind: user + - key: auth.primary-session + kind: browser-storage mode: test: true demo: true @@ -87,20 +87,13 @@ workflow: expect: urlIncludes: /app/teams text: Create team - - id: fill-team-name - title: Fill team name - action: - fill: - css: '#name' - value: guarantee-team-{{runShort}} - expect: - text: Create team - id: fill-team-display-name title: Fill team display name action: fill: css: '#displayName' - value: Guarantee Team {{runShort}} + internal: true + value: Guarantee {{runShort}} {{deviceId}} expect: text: Create team - id: fill-team-summary @@ -112,6 +105,15 @@ workflow: value: Team created by the guarantee service journey for downstream UI verification. expect: text: Create team + - id: fill-team-name + title: Fill team name after dependent identity fields + action: + fill: + css: '#name' + internal: true + value: gt-{{runShort}}-{{deviceId}} + expect: + text: Create team - id: submit-team title: Submit team creation action: @@ -121,11 +123,14 @@ workflow: expect: urlIncludes: /app/teams - id: inspect-service-surface - title: Inspect Create Team service surface + title: Reload the durable team settings action: - keyboard: Tab + goto: /app/teams/gt-{{runShort}}-{{deviceId}}/edit expect: - urlIncludes: /app/teams + urlIncludes: /edit + visible: + - role: textbox + name: Display name chapters: [] overlays: [] diagrams: [] diff --git a/guarantees/team/scenes/delete-team.scene.yaml b/guarantees/team/scenes/delete-team.scene.yaml index 70e6b421..8d86dacf 100644 --- a/guarantees/team/scenes/delete-team.scene.yaml +++ b/guarantees/team/scenes/delete-team.scene.yaml @@ -11,13 +11,16 @@ journey: - Delete Team opens the canonical @treeseed/admin destructive confirmation workflow. - Delete Team exercises a service journey instead of only loading /app/teams/visual-audit-team/delete. - Delete Team records reviewable evidence for the visible result before activation. - minimumSteps: 2 + minimumSteps: 5 requiresInteractiveAction: true consumesState: - - key: auth.owner - kind: user - - key: team.primary - kind: team + - key: auth.primary-session + kind: browser-storage + - key: team.member-removed + kind: marker + producesState: + - key: team.deleted + kind: marker mode: test: true demo: true @@ -82,15 +85,47 @@ workflow: - id: open-entry-route title: Open Delete Team action: - goto: /app/teams/visual-audit-team/delete + goto: /app/teams/gt-{{runShort}}-{{deviceId}}/delete + expect: + text: No blockers found + - id: enter-incorrect-confirmation + title: Enter an incorrect deletion confirmation + action: + fill: + role: textbox + name: Type "DELETE gt-{{runShort}}-{{deviceId}}" + value: DELETE wrong-team + expect: + text: Delete team + - id: enter-exact-confirmation + title: Enter the exact deletion confirmation + action: + fill: + role: textbox + name: Type "DELETE gt-{{runShort}}-{{deviceId}}" + value: DELETE gt-{{runShort}}-{{deviceId}} + expect: + text: Delete team + - id: delete-team + title: Permanently delete the run-owned team + action: + click: + role: button + name: Delete team expect: urlIncludes: /app/teams - - id: inspect-service-surface - title: Inspect Delete Team service surface + notText: Verified {{runShort}} {{deviceId}} + - id: verify-team-lookup-cleared + title: Verify the deleted team no longer resolves action: - keyboard: Tab + apiRequest: + base: web + method: GET + path: /t/gt-{{runShort}}-{{deviceId}} + expectedStatus: 404 expect: urlIncludes: /app/teams + notText: Verified {{runShort}} {{deviceId}} chapters: [] overlays: [] diagrams: [] diff --git a/guarantees/team/scenes/edit-team-settings.scene.yaml b/guarantees/team/scenes/edit-team-settings.scene.yaml index 0b725daa..16b34e9a 100644 --- a/guarantees/team/scenes/edit-team-settings.scene.yaml +++ b/guarantees/team/scenes/edit-team-settings.scene.yaml @@ -11,13 +11,16 @@ journey: - Edit Team Settings opens the canonical @treeseed/admin full page form workflow. - Edit Team Settings exercises a service journey instead of only loading /app/teams/visual-audit-team/edit. - Edit Team Settings records reviewable evidence for the visible result before activation. - minimumSteps: 2 + minimumSteps: 5 requiresInteractiveAction: true consumesState: - - key: auth.owner - kind: user - - key: team.primary - kind: team + - key: auth.primary-session + kind: browser-storage + - key: team.active + kind: marker + producesState: + - key: team.updated + kind: marker mode: test: true demo: true @@ -82,15 +85,45 @@ workflow: - id: open-entry-route title: Open Edit Team Settings action: - goto: /app/teams/visual-audit-team/edit + goto: /app/teams/gt-{{runShort}}-{{deviceId}}/edit expect: urlIncludes: /app/teams - - id: inspect-service-surface - title: Inspect Edit Team Settings service surface + text: Edit team + - id: update-display-name + title: Update the public team display name action: - keyboard: Tab + fill: + css: '#displayName' + internal: true + value: Verified {{runShort}} {{deviceId}} expect: - urlIncludes: /app/teams + text: Save team + - id: update-summary + title: Update the identity-only public summary + action: + fill: + role: textbox + name: Profile summary + value: Public identity verified by a complete team settings service journey. + expect: + text: Save team + - id: save-team + title: Persist the team settings + action: + click: + role: button + name: Save team + expect: + urlIncludes: saved=1 + text: Saved. + - id: reload-team + title: Reload persisted settings + action: + goto: /app/teams/gt-{{runShort}}-{{deviceId}}/edit + expect: + visible: + - css: '[data-team-display-name="Verified {{runShort}} {{deviceId}}"]' + internal: true chapters: [] overlays: [] diagrams: [] diff --git a/guarantees/team/scenes/switch-active-team.scene.yaml b/guarantees/team/scenes/switch-active-team.scene.yaml index b058801e..16c385cb 100644 --- a/guarantees/team/scenes/switch-active-team.scene.yaml +++ b/guarantees/team/scenes/switch-active-team.scene.yaml @@ -11,13 +11,16 @@ journey: - Switch Active Team opens the canonical @treeseed/admin dashboard read model workflow. - Switch Active Team exercises a service journey instead of only loading /app/teams. - Switch Active Team records reviewable evidence for the visible result before activation. - minimumSteps: 2 + minimumSteps: 4 requiresInteractiveAction: true consumesState: - - key: auth.owner - kind: user + - key: auth.primary-session + kind: browser-storage - key: team.primary - kind: team + kind: marker + producesState: + - key: team.active + kind: marker mode: test: true demo: true @@ -85,12 +88,40 @@ workflow: goto: /app/teams expect: urlIncludes: /app/teams - - id: inspect-service-surface - title: Inspect Switch Active Team service surface + visible: + - css: '[data-active-team-label="TreeSeed"]:visible' + internal: true + - id: switch-to-personal-team + title: Select the personal team through the shell action: - keyboard: Tab + select: + role: combobox + name: Active team + label: Tree Seed expect: - urlIncludes: /app/teams + visible: + - css: '[data-active-team-label="Tree Seed"]:visible' + internal: true + - id: switch-to-created-team + title: Select the created team through the shell + action: + select: + role: combobox + name: Active team + label: Guarantee {{runShort}} {{deviceId}} + expect: + visible: + - css: '[data-active-team-label="Guarantee {{runShort}} {{deviceId}}"]:visible' + internal: true + - id: reload-active-team + title: Prove active-team cookie persistence after reload + action: + goto: /app + expect: + urlIncludes: /app + visible: + - css: '[data-active-team-label="Guarantee {{runShort}} {{deviceId}}"]:visible' + internal: true chapters: [] overlays: [] diagrams: [] diff --git a/guarantees/team/scenes/view-team-profile.scene.yaml b/guarantees/team/scenes/view-team-profile.scene.yaml index fad84f24..88ef8d72 100644 --- a/guarantees/team/scenes/view-team-profile.scene.yaml +++ b/guarantees/team/scenes/view-team-profile.scene.yaml @@ -11,13 +11,11 @@ journey: - View Team Profile opens the public identity-only @treeseed/admin profile. - View Team Profile does not expose project, capacity, catalog, or knowledge distribution links. - View Team Profile records reviewable evidence for the visible result before activation. - minimumSteps: 2 + minimumSteps: 3 requiresInteractiveAction: true consumesState: - - key: auth.owner - kind: user - - key: team.primary - kind: team + - key: team.updated + kind: marker mode: test: true demo: true @@ -67,9 +65,6 @@ setup: dev: required: true reuseExisting: true - auth: - role: owner - required: true artifacts: trace: true video: true @@ -82,15 +77,38 @@ workflow: - id: open-entry-route title: Open View Team Profile action: - goto: /t/treeseed + goto: /t/gt-{{runShort}}-{{deviceId}} + expect: + urlIncludes: /t/gt- + text: Verified {{runShort}} {{deviceId}} + visible: + - css: 'main' + internal: true + - id: exercise-anonymous-account-boundary + title: Follow the account action from the anonymous profile + action: + click: + css: 'a[aria-label="Account and teams"]' + internal: true + expect: + urlIncludes: /auth/sign-in + text: Sign in + - id: verify-private-links-redacted + title: Return anonymously and verify private team aggregates remain absent + action: + goto: /t/gt-{{runShort}}-{{deviceId}} expect: - urlIncludes: /t/treeseed - - id: inspect-service-surface - title: Inspect View Team Profile service surface + text: Public identity verified by a complete team settings service journey. + notText: Projects + notVisible: + - role: link + name: Manage members + - id: verify-private-email-redacted + title: Verify private contact data remains absent action: - keyboard: Tab + goto: /t/gt-{{runShort}}-{{deviceId}} expect: - urlIncludes: /t/treeseed + notText: "@treeseed.local" chapters: [] overlays: [] diagrams: [] diff --git a/guarantees/team/team/create-team.guarantee.yaml b/guarantees/team/team/create-team.guarantee.yaml index 6677680f..9a1192f5 100644 --- a/guarantees/team/team/create-team.guarantee.yaml +++ b/guarantees/team/team/create-team.guarantee.yaml @@ -29,11 +29,11 @@ preconditions: fixtures: - integrated_treeseed_project notes: - - Planned by guarantee journey audit: the referenced UI route/behavior is not implemented as an executable service journey yet. - "Journey dependencies must be satisfied: 4" scene: required: true manifest: ../scenes/create-team.scene.yaml + executionKey: admin.team.create mode: acceptance: true demo: true @@ -54,8 +54,8 @@ content: required: false verifierRefs: [] audit: - required: false - verifierRefs: [] + required: true + verifierRefs: [api.team.lifecycle.audit] negativeCases: - id: non-member-denied actor: non_member diff --git a/guarantees/team/team/delete-team.guarantee.yaml b/guarantees/team/team/delete-team.guarantee.yaml index 4cffb5c9..090940cd 100644 --- a/guarantees/team/team/delete-team.guarantee.yaml +++ b/guarantees/team/team/delete-team.guarantee.yaml @@ -8,10 +8,10 @@ ownerPackage: "@treeseed/admin" summary: Delete or archive a team only after checking projects hosts capacity and content ownership; likely requires explicit retention and transfer rules. status: active dependencies: - journeys: - - 12 + journeys: [] guarantees: - - guarantee.team.team.create-team.012 + - guarantee.team.membership.remove-team-member.020 + - guarantee.team.team.view-team-profile.015 actors: allowed: - team_admin @@ -30,16 +30,16 @@ preconditions: fixtures: - integrated_treeseed_project notes: - - Planned by guarantee journey audit: the referenced UI route/behavior is not implemented as an executable service journey yet. - - "Journey dependencies must be satisfied: 12" + - Membership lifecycle and public profile verification must finish before deletion. scene: required: true manifest: ../scenes/delete-team.scene.yaml + executionKey: admin.team.delete mode: acceptance: true demo: true training: true - entryRoute: /app/teams/visual-audit-team/delete + entryRoute: /app/teams/[teamId]/delete componentContract: destructive-confirmation service journey expectedEvidence: - playwright_trace @@ -55,8 +55,8 @@ content: required: false verifierRefs: [] audit: - required: false - verifierRefs: [] + required: true + verifierRefs: [api.team.lifecycle.audit] negativeCases: - id: non-member-denied actor: non_member diff --git a/guarantees/team/team/edit-team-settings.guarantee.yaml b/guarantees/team/team/edit-team-settings.guarantee.yaml index 5ea71ab9..ed95c2bb 100644 --- a/guarantees/team/team/edit-team-settings.guarantee.yaml +++ b/guarantees/team/team/edit-team-settings.guarantee.yaml @@ -9,9 +9,9 @@ summary: Update team metadata and policy knobs; should not mutate package or pro status: active dependencies: journeys: - - 12 + - 13 guarantees: - - guarantee.team.team.create-team.012 + - guarantee.team.team.switch-active-team.013 actors: allowed: - team_admin @@ -30,16 +30,16 @@ preconditions: fixtures: - integrated_treeseed_project notes: - - Planned by guarantee journey audit: the referenced UI route/behavior is not implemented as an executable service journey yet. - "Journey dependencies must be satisfied: 12" scene: required: true manifest: ../scenes/edit-team-settings.scene.yaml + executionKey: admin.team.edit mode: acceptance: true demo: true training: true - entryRoute: /app/teams/visual-audit-team/edit + entryRoute: /app/teams/[teamId]/edit componentContract: full-page-form service journey expectedEvidence: - playwright_trace @@ -55,8 +55,8 @@ content: required: false verifierRefs: [] audit: - required: false - verifierRefs: [] + required: true + verifierRefs: [api.team.lifecycle.audit] negativeCases: - id: non-member-denied actor: non_member diff --git a/guarantees/team/team/switch-active-team.guarantee.yaml b/guarantees/team/team/switch-active-team.guarantee.yaml index 986ff559..2e36cc69 100644 --- a/guarantees/team/team/switch-active-team.guarantee.yaml +++ b/guarantees/team/team/switch-active-team.guarantee.yaml @@ -30,11 +30,11 @@ preconditions: fixtures: - integrated_treeseed_project notes: - - Planned by guarantee journey audit: the referenced UI route/behavior is not implemented as an executable service journey yet. - "Journey dependencies must be satisfied: 12" scene: required: true manifest: ../scenes/switch-active-team.scene.yaml + executionKey: admin.team.select-active mode: acceptance: true demo: true diff --git a/guarantees/team/team/view-team-profile.guarantee.yaml b/guarantees/team/team/view-team-profile.guarantee.yaml index 6baacece..deee8fce 100644 --- a/guarantees/team/team/view-team-profile.guarantee.yaml +++ b/guarantees/team/team/view-team-profile.guarantee.yaml @@ -9,16 +9,14 @@ summary: Display public team identity and profile metadata without project, capa status: active dependencies: journeys: - - 12 + - 14 guarantees: - - guarantee.team.team.create-team.012 + - guarantee.team.team.edit-team-settings.014 actors: allowed: - - team_admin - - team_owner - forbidden: - anonymous_user - - unauthorized_user + forbidden: + - none devices: required: - desktop_chromium @@ -30,16 +28,16 @@ preconditions: fixtures: - integrated_treeseed_project notes: - - Planned by guarantee journey audit: the referenced UI route/behavior is not implemented as an executable service journey yet. - "Journey dependencies must be satisfied: 12" scene: required: true manifest: ../scenes/view-team-profile.scene.yaml + executionKey: admin.team.public-profile mode: acceptance: true demo: true training: true - entryRoute: /t/treeseed + entryRoute: /t/[name] componentContract: public team identity profile expectedEvidence: - playwright_trace diff --git a/guarantees/user/account/delete-user.guarantee.yaml b/guarantees/user/account/delete-user.guarantee.yaml index f22e643b..7039df79 100644 --- a/guarantees/user/account/delete-user.guarantee.yaml +++ b/guarantees/user/account/delete-user.guarantee.yaml @@ -6,12 +6,11 @@ subtype: account journey: Delete User ownerPackage: "@treeseed/admin" summary: Perform a destructive account removal with ownership and membership checks; needs policy around teams projects content and provider-owned auth records. -status: planned +status: active dependencies: - journeys: - - 4 + journeys: [] guarantees: - - guarantee.user.auth.user-login.004 + - guarantee.user.auth.user-logout.005 actors: allowed: - verified_user @@ -29,11 +28,11 @@ preconditions: fixtures: - integrated_treeseed_project notes: - - Planned by guarantee journey audit: the referenced UI route/behavior is not implemented as an executable service journey yet. - - "Journey dependencies must be satisfied: 4" + - Team deletion and logout must complete before final account deletion. scene: required: true manifest: ./scenes/delete-user.scene.yaml + executionKey: admin.account.delete mode: acceptance: true demo: true @@ -54,8 +53,8 @@ content: required: false verifierRefs: [] audit: - required: false - verifierRefs: [] + required: true + verifierRefs: [api.auth.lifecycle.audit] negativeCases: - id: anonymous-denied actor: anonymous_user @@ -73,4 +72,4 @@ notes: surface: admin-ui run: timeoutSeconds: 300 - requiredForRelease: false + requiredForRelease: true diff --git a/guarantees/user/account/edit-account-settings.guarantee.yaml b/guarantees/user/account/edit-account-settings.guarantee.yaml index 074bfd51..e7ecfc72 100644 --- a/guarantees/user/account/edit-account-settings.guarantee.yaml +++ b/guarantees/user/account/edit-account-settings.guarantee.yaml @@ -6,7 +6,7 @@ subtype: account journey: Edit Account Settings ownerPackage: "@treeseed/admin" summary: Edit user profile preferences owned by the admin/account surface; persistence should live in the API or auth metadata and not in root Market-only state. -status: planned +status: active dependencies: journeys: - 4 @@ -29,11 +29,12 @@ preconditions: fixtures: - integrated_treeseed_project notes: - - Planned by guarantee journey audit: the referenced UI route/behavior is not implemented as an executable service journey yet. + - The onboarding identity supplies the stable username used by the anonymous profile proof. - "Journey dependencies must be satisfied: 4" scene: required: true manifest: ./scenes/edit-account-settings.scene.yaml + executionKey: admin.account.edit-profile mode: acceptance: true demo: true @@ -73,4 +74,4 @@ notes: surface: admin-ui run: timeoutSeconds: 300 - requiredForRelease: false + requiredForRelease: true diff --git a/guarantees/user/account/manage-appearance.guarantee.yaml b/guarantees/user/account/manage-appearance.guarantee.yaml index e04693ed..d581b24d 100644 --- a/guarantees/user/account/manage-appearance.guarantee.yaml +++ b/guarantees/user/account/manage-appearance.guarantee.yaml @@ -6,7 +6,7 @@ subtype: account journey: Manage Appearance ownerPackage: "@treeseed/admin" summary: Set theme and interface preferences for the admin shell; should use reusable UI/theme tokens and persist per user where available. -status: planned +status: active dependencies: journeys: - 4 @@ -29,11 +29,12 @@ preconditions: fixtures: - integrated_treeseed_project notes: - - Planned by guarantee journey audit: the referenced UI route/behavior is not implemented as an executable service journey yet. + - The authenticated account has access to personal theme creation and shell selection. - "Journey dependencies must be satisfied: 4" scene: required: true manifest: ./scenes/manage-appearance.scene.yaml + executionKey: admin.account.appearance mode: acceptance: true demo: true @@ -73,4 +74,4 @@ notes: surface: admin-ui run: timeoutSeconds: 300 - requiredForRelease: false + requiredForRelease: true diff --git a/guarantees/user/account/manage-notifications.guarantee.yaml b/guarantees/user/account/manage-notifications.guarantee.yaml index 4556d1ae..19dd897b 100644 --- a/guarantees/user/account/manage-notifications.guarantee.yaml +++ b/guarantees/user/account/manage-notifications.guarantee.yaml @@ -6,7 +6,7 @@ subtype: account journey: Manage Notifications ownerPackage: "@treeseed/admin" summary: Configure global content-type notification preferences, exact per-project replacements, and one email cadence without weakening project authorization. -status: planned +status: active dependencies: journeys: [4] guarantees: [guarantee.user.auth.user-login.004] @@ -23,6 +23,7 @@ preconditions: scene: required: true manifest: ./scenes/manage-notifications.scene.yaml + executionKey: admin.account.notifications mode: { acceptance: true, demo: true, training: true } entryRoute: /app/account/notifications componentContract: notification-preference-panel @@ -44,4 +45,4 @@ notes: surface: admin-ui run: timeoutSeconds: 300 - requiredForRelease: false + requiredForRelease: true diff --git a/guarantees/user/account/manage-sessions.guarantee.yaml b/guarantees/user/account/manage-sessions.guarantee.yaml index 85c556be..b60fa96c 100644 --- a/guarantees/user/account/manage-sessions.guarantee.yaml +++ b/guarantees/user/account/manage-sessions.guarantee.yaml @@ -6,7 +6,7 @@ subtype: account journey: Manage Sessions ownerPackage: "@treeseed/admin" summary: List and revoke active sessions through the auth/session facade; this may be missing if the selected auth provider does not expose session management yet. -status: planned +status: active dependencies: journeys: - 4 @@ -29,11 +29,12 @@ preconditions: fixtures: - integrated_treeseed_project notes: - - Planned by guarantee journey audit: the referenced UI route/behavior is not implemented as an executable service journey yet. + - The acceptance fixture supplies a third revocable session while preserving both journey sessions. - "Journey dependencies must be satisfied: 4" scene: required: true manifest: ./scenes/manage-sessions.scene.yaml + executionKey: admin.account.sessions mode: acceptance: true demo: true @@ -54,8 +55,8 @@ content: required: false verifierRefs: [] audit: - required: false - verifierRefs: [] + required: true + verifierRefs: [api.auth.lifecycle.audit] negativeCases: - id: anonymous-denied actor: anonymous_user @@ -73,4 +74,4 @@ notes: surface: admin-ui run: timeoutSeconds: 300 - requiredForRelease: false + requiredForRelease: true diff --git a/guarantees/user/account/scenes/delete-user.scene.yaml b/guarantees/user/account/scenes/delete-user.scene.yaml index 17dadd2a..c4d07777 100644 --- a/guarantees/user/account/scenes/delete-user.scene.yaml +++ b/guarantees/user/account/scenes/delete-user.scene.yaml @@ -11,11 +11,18 @@ journey: - Delete User opens the canonical @treeseed/admin destructive confirmation workflow. - Delete User exercises a service journey instead of only loading /app/account. - Delete User records reviewable evidence for the visible result before activation. - minimumSteps: 2 + minimumSteps: 10 requiresInteractiveAction: true consumesState: - - key: auth.owner - kind: user + - key: auth.onboarding-session + kind: browser-storage + - key: auth.logged-out + kind: marker + - key: team.deleted + kind: marker + producesState: + - key: account.deleted + kind: marker mode: test: true demo: true @@ -83,12 +90,91 @@ workflow: goto: /app/account/delete expect: urlIncludes: /app/account/delete - - id: inspect-service-surface - title: Inspect Delete User service surface + visible: + - scene: account-delete + - id: enter-invalid-confirmation + title: Enter an invalid deletion confirmation action: - keyboard: Tab + fill: + role: textbox + name: Type "DELETE MY ACCOUNT" + value: DELETE + expect: + text: Delete account + - id: enter-current-password + title: Reauthenticate account deletion + action: + fill: + css: "#currentPassword" + internal: true + value: TreeSeedGuaranteeReset123! + expect: + text: Current password + - id: reject-invalid-deletion + title: Reject invalid account deletion + action: + click: + role: button + name: Delete my account expect: urlIncludes: /app/account/delete + text: DELETE MY ACCOUNT + - id: enter-valid-confirmation + title: Enter the exact deletion confirmation + action: + fill: + css: "#confirmation" + internal: true + value: DELETE MY ACCOUNT + expect: + text: Delete account + - id: reauthenticate-valid-deletion + title: Reauthenticate the valid deletion request + action: + fill: + css: "#currentPassword" + internal: true + value: TreeSeedGuaranteeReset123! + expect: + text: Current password + - id: delete-account + title: Permanently delete the account + action: + click: + role: button + name: Delete my account + expect: + urlIncludes: /auth/sign-in + visible: + - role: heading + name: Sign in + - id: enter-deleted-account-email + title: Try the deleted account email + action: + fill: + role: textbox + name: Email or username + value: guarantee-{{runId}}-{{deviceId}}@treeseed.local + expect: + urlIncludes: /auth/sign-in + - id: enter-deleted-account-password + title: Try the deleted account password + action: + fill: + css: "#password" + internal: true + value: TreeSeedGuaranteeReset123! + expect: + urlIncludes: /auth/sign-in + - id: reject-deleted-account-login + title: Reject authentication for the deleted identity + action: + click: + role: button + name: Sign in + expect: + urlIncludes: /auth/sign-in + text: Authentication failed chapters: [] overlays: [] diagrams: [] diff --git a/guarantees/user/account/scenes/edit-account-settings.scene.yaml b/guarantees/user/account/scenes/edit-account-settings.scene.yaml index 1521677f..857ba367 100644 --- a/guarantees/user/account/scenes/edit-account-settings.scene.yaml +++ b/guarantees/user/account/scenes/edit-account-settings.scene.yaml @@ -11,11 +11,14 @@ journey: - Edit Account Settings opens the canonical @treeseed/admin full page form workflow. - Edit Account Settings exercises a service journey instead of only loading /app/account. - Edit Account Settings records reviewable evidence for the visible result before activation. - minimumSteps: 2 + minimumSteps: 5 requiresInteractiveAction: true consumesState: - - key: auth.owner - kind: user + - key: auth.primary-session + kind: browser-storage + producesState: + - key: account.profile-updated + kind: marker mode: test: true demo: true @@ -83,12 +86,42 @@ workflow: goto: /app/account expect: urlIncludes: /app/account - - id: inspect-service-surface - title: Inspect Edit Account Settings service surface + visible: + - scene: account-identity + - id: edit-first-name + title: Edit the public first name action: - keyboard: Tab + fill: + role: textbox + name: First name + value: Guarantee + expect: + text: Public profile + - id: edit-last-name + title: Edit the public last name + action: + fill: + role: textbox + name: Last name + value: "{{deviceId}}" + expect: + text: Public profile + - id: save-profile + title: Save account identity + action: + click: + role: button + name: Save identity expect: urlIncludes: /app/account + text: Identity saved. + - id: reload-profile + title: Reload the durable profile + action: + goto: /app/account + expect: + visible: + - scene: account-identity chapters: [] overlays: [] diagrams: [] diff --git a/guarantees/user/account/scenes/manage-appearance.scene.yaml b/guarantees/user/account/scenes/manage-appearance.scene.yaml index a5c03d78..6cf7a28a 100644 --- a/guarantees/user/account/scenes/manage-appearance.scene.yaml +++ b/guarantees/user/account/scenes/manage-appearance.scene.yaml @@ -11,11 +11,14 @@ journey: - Manage Appearance opens the canonical @treeseed/admin dashboard read model workflow. - Manage Appearance exercises a service journey instead of only loading /app/account. - Manage Appearance records reviewable evidence for the visible result before activation. - minimumSteps: 2 + minimumSteps: 8 requiresInteractiveAction: true consumesState: - - key: auth.owner - kind: user + - key: auth.primary-session + kind: browser-storage + producesState: + - key: account.appearance-updated + kind: marker mode: test: true demo: true @@ -83,12 +86,67 @@ workflow: goto: /app/account/appearance expect: urlIncludes: /app/account/appearance - - id: inspect-service-surface - title: Inspect Manage Appearance service surface + visible: + - scene: account-appearance + - id: open-theme-dialog + title: Open personal theme creation action: - keyboard: Tab + click: + role: button + name: Create theme + expect: + text: Create a personal theme + - id: name-personal-theme + title: Name the personal theme + action: + fill: + role: textbox + name: Theme name + value: Guarantee {{deviceId}} + expect: + text: Base theme + - id: create-personal-theme + title: Create the personal theme + action: + click: + testId: create-personal-theme-submit expect: urlIncludes: /app/account/appearance + text: Theme saved. + - id: reload-personal-theme + title: Reload the personal theme collection + action: + goto: /app/account/appearance + expect: + visible: + - scene: account-appearance + - id: open-appearance-selector + title: Open the application appearance selector + action: + click: + css: '[data-testid="appearance-menu-trigger"]:visible' + internal: true + expect: + text: Color scheme + - id: activate-personal-theme + title: Select the personal theme + action: + select: + role: combobox + name: Color scheme + label: Guarantee {{deviceId}} + expect: + visible: + - css: '[data-testid="appearance-menu-trigger"]:visible' + internal: true + - id: verify-persisted-shell-theme + title: Reload and verify the active shell theme + action: + goto: /app/account/appearance + expect: + visible: + - css: '[data-active-personal-theme-name="Guarantee {{deviceId}}"]' + internal: true chapters: [] overlays: [] diagrams: [] diff --git a/guarantees/user/account/scenes/manage-notifications.scene.yaml b/guarantees/user/account/scenes/manage-notifications.scene.yaml index 694a091a..8cef2698 100644 --- a/guarantees/user/account/scenes/manage-notifications.scene.yaml +++ b/guarantees/user/account/scenes/manage-notifications.scene.yaml @@ -12,7 +12,9 @@ journey: minimumSteps: 4 requiresInteractiveAction: true consumesState: - - { key: auth.owner, kind: user } + - { key: auth.primary-session, kind: browser-storage } + producesState: + - { key: account.notifications-updated, kind: marker } mode: { test: true, demo: true, training: true } target: app: market @@ -49,7 +51,7 @@ workflow: - id: open-notifications title: Open notification preferences action: { goto: /app/account/notifications } - expect: { urlIncludes: /app/account/notifications, text: Notification preferences } + expect: { urlIncludes: /app/account/notifications, visible: [{ scene: account-notifications }] } - id: select-weekly title: Select weekly email cadence action: { click: { role: radio, name: Weekly } } @@ -62,6 +64,10 @@ workflow: title: Save notification preferences action: { click: { role: button, name: Save notification preferences } } expect: { urlIncludes: /app/account/notifications, text: Notification preferences saved. } + - id: reload-preferences + title: Reload persisted notification preferences + action: { goto: /app/account/notifications } + expect: { urlIncludes: /app/account/notifications, text: Weekly } chapters: [] overlays: [] diagrams: [] diff --git a/guarantees/user/account/scenes/manage-sessions.scene.yaml b/guarantees/user/account/scenes/manage-sessions.scene.yaml index cf3c65a7..b8cd2f20 100644 --- a/guarantees/user/account/scenes/manage-sessions.scene.yaml +++ b/guarantees/user/account/scenes/manage-sessions.scene.yaml @@ -11,11 +11,14 @@ journey: - Manage Sessions opens the canonical @treeseed/admin dashboard read model workflow. - Manage Sessions exercises a service journey instead of only loading /app/account. - Manage Sessions records reviewable evidence for the visible result before activation. - minimumSteps: 2 + minimumSteps: 5 requiresInteractiveAction: true consumesState: - - key: auth.owner - kind: user + - key: auth.primary-session + kind: browser-storage + producesState: + - key: account.sessions-reviewed + kind: marker mode: test: true demo: true @@ -83,12 +86,58 @@ workflow: goto: /app/account/sessions expect: urlIncludes: /app/account/sessions - - id: inspect-service-surface - title: Inspect Manage Sessions service surface + visible: + - scene: account-sessions + text: Current session + - id: create-revocable-session + title: Create an additional session owned by this run action: - keyboard: Tab + apiRequest: + base: api + path: /v1/auth/web/sign-in + method: POST + expectedStatus: 200 + headers: + user-agent: Treeseed Guarantee Revocable Session + body: + email: guarantee-{{runId}}-{{deviceId}}@treeseed.local + password: TreeSeedGuaranteeReset123! expect: urlIncludes: /app/account/sessions + text: Current session + - id: reload-session-list + title: Load the run-owned revocable session + action: + goto: /app/account/sessions + expect: + visible: + - scene: account-sessions + text: Revoke session + - id: reject-current-session-revocation + title: Prove no current-session revoke control is exposed + action: + goto: /app/account/sessions + expect: + urlIncludes: /app/account/sessions + text: Current session + notText: Revoke current session + - id: revoke-extra-session + title: Revoke the additional non-current session + action: + click: + css: '[data-session-user-agent="treeseed-guarantee-revocable-session"]' + internal: true + expect: + urlIncludes: /app/account/sessions + text: Session revoked. + - id: verify-revoked-session + title: Verify the revoked session remains observable + action: + goto: /app/account/sessions + expect: + visible: + - scene: account-sessions + text: Revoked chapters: [] overlays: [] diagrams: [] diff --git a/guarantees/user/account/scenes/view-user-profile.scene.yaml b/guarantees/user/account/scenes/view-user-profile.scene.yaml index 1cd23d62..44f0f808 100644 --- a/guarantees/user/account/scenes/view-user-profile.scene.yaml +++ b/guarantees/user/account/scenes/view-user-profile.scene.yaml @@ -11,8 +11,11 @@ journey: - View User Profile opens the public identity-only @treeseed/admin profile. - View User Profile does not expose project, catalog, or knowledge distribution links. - View User Profile records reviewable evidence for the visible result before activation. - minimumSteps: 2 + minimumSteps: 3 requiresInteractiveAction: true + consumesState: + - key: account.profile-updated + kind: marker mode: test: true demo: true @@ -62,9 +65,6 @@ setup: dev: required: true reuseExisting: true - auth: - role: owner - required: true artifacts: trace: true video: true @@ -75,25 +75,47 @@ artifacts: appLogs: true workflow: - id: open-entry-route - title: Open account settings + title: Open the anonymous public profile action: - goto: /app/account + goto: /u/g-{{runShort}}-{{deviceId}} expect: - urlIncludes: /app/account - - id: open-public-profile - title: Follow the public profile link + urlIncludes: /u/g- + text: Public TreeSeed account identity. + visible: + - scene: profile-template + - id: verify-private-data-redacted + title: Verify private identity data is redacted action: - click: - css: 'a[href^="/u/"]' - internal: true + goto: /u/g-{{runShort}}-{{deviceId}} expect: - urlIncludes: /u/ - - id: inspect-identity-surface - title: Inspect the identity-only profile + notText: guarantee-{{runId}}-{{deviceId}}@treeseed.local + - id: verify-memberships-redacted + title: Verify memberships are not published action: - keyboard: Tab + goto: /u/g-{{runShort}}-{{deviceId}} + expect: + notText: Memberships + - id: verify-projects-redacted + title: Verify projects are not published + action: + goto: /u/g-{{runShort}}-{{deviceId}} + expect: + notText: Projects + - id: verify-roles-redacted + title: Verify roles are not published + action: + goto: /u/g-{{runShort}}-{{deviceId}} + expect: + notText: Roles + - id: leave-public-profile + title: Follow the public manager link + action: + click: + role: link + name: Manager expect: - text: TreeSeed account + urlIncludes: /auth/sign-in + text: Sign in chapters: [] overlays: [] diagrams: [] diff --git a/guarantees/user/account/view-user-profile.guarantee.yaml b/guarantees/user/account/view-user-profile.guarantee.yaml index eb3f7373..084c0f81 100644 --- a/guarantees/user/account/view-user-profile.guarantee.yaml +++ b/guarantees/user/account/view-user-profile.guarantee.yaml @@ -6,12 +6,12 @@ subtype: account journey: View User Profile ownerPackage: "@treeseed/admin" summary: Show public user identity and profile metadata without project, catalog, or knowledge distribution details. -status: planned +status: active dependencies: journeys: - - 1 + - 6 guarantees: - - guarantee.user.auth.register-user.001 + - guarantee.user.account.edit-account-settings.006 actors: allowed: - verified_user @@ -34,11 +34,12 @@ preconditions: scene: required: true manifest: ./scenes/view-user-profile.scene.yaml + executionKey: admin.account.public-profile mode: acceptance: true demo: true training: true - entryRoute: /app/account + entryRoute: /u/[username] componentContract: public identity profile expectedEvidence: - playwright_trace @@ -73,4 +74,4 @@ notes: surface: admin-ui run: timeoutSeconds: 300 - requiredForRelease: false + requiredForRelease: true diff --git a/guarantees/user/auth/forgot-reset-password.guarantee.yaml b/guarantees/user/auth/forgot-reset-password.guarantee.yaml index 95d9c774..61b3f235 100644 --- a/guarantees/user/auth/forgot-reset-password.guarantee.yaml +++ b/guarantees/user/auth/forgot-reset-password.guarantee.yaml @@ -7,12 +7,12 @@ journey: Forgot / Reset Password ownerPackage: "@treeseed/admin" summary: Request and complete password reset through the auth provider; missing pieces should be handled as auth integration work instead of custom user-table mutation. -status: planned +status: active dependencies: journeys: - - 1 + - 2 guarantees: - - guarantee.user.auth.register-user.001 + - guarantee.user.auth.verify-email.002 actors: allowed: - anonymous_user @@ -34,6 +34,7 @@ preconditions: scene: required: true manifest: ./scenes/forgot-reset-password.scene.yaml + executionKey: admin.identity.password-reset mode: acceptance: true demo: true @@ -54,8 +55,8 @@ content: required: false verifierRefs: [] audit: - required: false - verifierRefs: [] + required: true + verifierRefs: [api.auth.lifecycle.audit] negativeCases: - id: anonymous-denied actor: anonymous_user @@ -74,4 +75,4 @@ notes: surface: admin-ui run: timeoutSeconds: 300 - requiredForRelease: false + requiredForRelease: true diff --git a/guarantees/user/auth/register-user.guarantee.yaml b/guarantees/user/auth/register-user.guarantee.yaml index 5ef0c3de..5c93d3e5 100644 --- a/guarantees/user/auth/register-user.guarantee.yaml +++ b/guarantees/user/auth/register-user.guarantee.yaml @@ -7,7 +7,7 @@ journey: Register User ownerPackage: "@treeseed/admin" summary: Create an account record and start email verification through the auth provider used by the admin/core runtime; this is product plumbing rather than a Treeseed content operation. -status: planned +status: active dependencies: journeys: [] guarantees: [] @@ -31,6 +31,7 @@ preconditions: scene: required: true manifest: ./scenes/register-user.scene.yaml + executionKey: admin.identity.onboarding mode: acceptance: true demo: true @@ -51,8 +52,8 @@ content: required: false verifierRefs: [] audit: - required: false - verifierRefs: [] + required: true + verifierRefs: [api.auth.lifecycle.audit] negativeCases: - id: anonymous-denied actor: anonymous_user @@ -71,4 +72,4 @@ notes: surface: admin-ui run: timeoutSeconds: 300 - requiredForRelease: false + requiredForRelease: true diff --git a/guarantees/user/auth/scenes/forgot-reset-password.scene.yaml b/guarantees/user/auth/scenes/forgot-reset-password.scene.yaml index 550f9a97..ecd3510a 100644 --- a/guarantees/user/auth/scenes/forgot-reset-password.scene.yaml +++ b/guarantees/user/auth/scenes/forgot-reset-password.scene.yaml @@ -11,8 +11,14 @@ journey: - anonymous user can open password reset - reset form accepts account email - reset submission reaches the check-email flow - minimumSteps: 3 + minimumSteps: 7 requiresInteractiveAction: true + consumesState: + - key: identity.primary + kind: marker + producesState: + - key: credentials.reset + kind: marker mode: test: true demo: true @@ -99,7 +105,7 @@ workflow: fill: role: textbox name: Email - value: owner+{{runSlug}}@treeseed.local + value: guarantee-{{runId}}-{{deviceId}}@treeseed.local expect: visible: - role: textbox @@ -111,7 +117,47 @@ workflow: role: button name: Send reset link expect: + urlIncludes: /auth/check-email text: Check your email + - id: open-reset-link + title: Open the delivered reset link + action: + mailpitConfirmLatest: + mailpitUrl: http://127.0.0.1:8025 + email: guarantee-{{runId}}-{{deviceId}}@treeseed.local + subjectIncludes: Reset your TreeSeed password + displayInboxSeconds: 1 + displayMessageSeconds: 1 + expect: + urlIncludes: /auth/reset-password + text: Choose a new password + - id: enter-new-password + title: Enter a new password + action: + fill: + css: "#resetPassword" + internal: true + value: TreeSeedGuaranteeReset123! + expect: + text: New password + - id: confirm-new-password + title: Confirm the new password + action: + fill: + css: "input[name='confirmPassword']" + internal: true + value: TreeSeedGuaranteeReset123! + expect: + text: Confirm new password + - id: complete-password-reset + title: Complete password reset + action: + click: + role: button + name: Reset password + expect: + urlIncludes: /auth/sign-in + text: Password reset complete chapters: [] overlays: [] diagrams: [] diff --git a/guarantees/user/auth/scenes/register-user.scene.yaml b/guarantees/user/auth/scenes/register-user.scene.yaml index 713ab91b..cda26219 100644 --- a/guarantees/user/auth/scenes/register-user.scene.yaml +++ b/guarantees/user/auth/scenes/register-user.scene.yaml @@ -11,11 +11,13 @@ journey: - anonymous user can open registration - registration form accepts required profile fields - registration submits into the email verification flow - minimumSteps: 8 + minimumSteps: 9 requiresInteractiveAction: true producesState: - - key: auth.owner - kind: user + - key: identity.primary + kind: marker + - key: auth.onboarding-session + kind: browser-storage mode: test: true demo: true @@ -124,7 +126,7 @@ workflow: fill: role: textbox name: Username - value: review-{{runShort}} + value: g-{{runShort}}-{{deviceId}} expect: text: Username is available. - id: verify-username-immutability @@ -139,10 +141,7 @@ workflow: fill: role: textbox name: Email - # Staging intentionally verifies the real SMTP delivery path. Use an - # authorized mailbox and a run-specific plus address so every run is - # independently traceable without reusing a prior registration. - value: adrian.webb+review-{{runShort}}@knowledge.coop + value: guarantee-{{runId}}-{{deviceId}}@treeseed.local expect: text: Email is available. - id: enter-password @@ -172,6 +171,19 @@ workflow: expect: urlIncludes: /auth/check-email text: Check your email + - id: confirm-registration-email + title: Confirm the delivered registration email + action: + mailpitConfirmLatest: + mailpitUrl: http://127.0.0.1:8025 + email: guarantee-{{runId}}-{{deviceId}}@treeseed.local + subjectIncludes: Confirm your Treeseed Market email + displayInboxSeconds: 1 + displayMessageSeconds: 1 + expect: + urlIncludes: /app + visible: + - scene: app-shell chapters: [] overlays: [] diagrams: [] diff --git a/guarantees/user/auth/scenes/user-login.scene.yaml b/guarantees/user/auth/scenes/user-login.scene.yaml index 5d204c3a..62f09078 100644 --- a/guarantees/user/auth/scenes/user-login.scene.yaml +++ b/guarantees/user/auth/scenes/user-login.scene.yaml @@ -11,14 +11,14 @@ journey: - anonymous user can open sign-in - sign-in form accepts credentials - sign-in submission reaches authenticated app shell or returns a visible auth error - minimumSteps: 4 + minimumSteps: 7 requiresInteractiveAction: true consumesState: - - key: auth.verified-owner - kind: user + - key: credentials.reset + kind: marker producesState: - - key: auth.session - kind: user + - key: auth.primary-session + kind: browser-storage mode: test: true demo: true @@ -83,10 +83,6 @@ setup: dev: required: true reuseExisting: true - auth: - role: owner - required: true - seedOnly: true artifacts: trace: true video: true @@ -109,7 +105,7 @@ workflow: fill: role: textbox name: Email or username - value: visual.owner@treeseed.io + value: guarantee-{{runId}}-{{deviceId}}@treeseed.local expect: visible: - role: textbox @@ -120,11 +116,29 @@ workflow: fill: css: input[name='password'] internal: true - value: TreeSeedVisualAudit!2026 + value: incorrect-password + expect: + text: Password + - id: reject-invalid-sign-in + title: Reject invalid credentials + action: + click: + role: button + name: Sign in + expect: + urlIncludes: /auth/sign-in + text: Authentication failed. + - id: enter-correct-password + title: Enter the reset password + action: + fill: + css: input[name='password'] + internal: true + value: TreeSeedGuaranteeReset123! expect: text: Password - id: submit-sign-in - title: Submit sign in + title: Submit valid sign in action: click: role: button @@ -133,6 +147,14 @@ workflow: urlIncludes: /app visible: - scene: app-shell + - id: reload-authenticated-dashboard + title: Reload the authenticated dashboard + action: + goto: /app + expect: + urlIncludes: /app + visible: + - scene: app-shell chapters: [] overlays: [] diagrams: [] diff --git a/guarantees/user/auth/scenes/user-logout.scene.yaml b/guarantees/user/auth/scenes/user-logout.scene.yaml index 36c5f37e..cea0f23c 100644 --- a/guarantees/user/auth/scenes/user-logout.scene.yaml +++ b/guarantees/user/auth/scenes/user-logout.scene.yaml @@ -13,6 +13,14 @@ journey: - The session-ending route produces screenshot evidence before and after logout. minimumSteps: 2 requiresInteractiveAction: true + consumesState: + - key: auth.primary-session + kind: browser-storage + - key: team.deleted + kind: marker + producesState: + - key: auth.logged-out + kind: marker mode: test: true demo: true @@ -90,11 +98,11 @@ artifacts: appLogs: true workflow: - id: open-account-sessions - title: Open logout confirmation + title: Open the authenticated application shell action: - goto: /auth/logout + goto: /app/ expect: - urlIncludes: /auth/logout + urlIncludes: /app text: Sign out - id: submit-user-logout title: End the current session diff --git a/guarantees/user/auth/user-login.guarantee.yaml b/guarantees/user/auth/user-login.guarantee.yaml index d8dd7c29..0fbeb468 100644 --- a/guarantees/user/auth/user-login.guarantee.yaml +++ b/guarantees/user/auth/user-login.guarantee.yaml @@ -7,12 +7,12 @@ journey: User Login ownerPackage: "@treeseed/admin" summary: Establish an authenticated session for Market/admin surfaces; downstream journeys assume API calls carry the authenticated user context. -status: planned +status: active dependencies: journeys: - - 2 + - 3 guarantees: - - guarantee.user.auth.verify-email.002 + - guarantee.user.auth.forgot-reset-password.003 actors: allowed: - anonymous_user @@ -34,6 +34,7 @@ preconditions: scene: required: true manifest: ./scenes/user-login.scene.yaml + executionKey: admin.identity.login mode: acceptance: true demo: true @@ -74,4 +75,4 @@ notes: surface: admin-ui run: timeoutSeconds: 300 - requiredForRelease: false + requiredForRelease: true diff --git a/guarantees/user/auth/user-logout.guarantee.yaml b/guarantees/user/auth/user-logout.guarantee.yaml index 5be9032a..db546a05 100644 --- a/guarantees/user/auth/user-logout.guarantee.yaml +++ b/guarantees/user/auth/user-logout.guarantee.yaml @@ -6,12 +6,15 @@ subtype: auth journey: User Logout ownerPackage: "@treeseed/admin" summary: End the provider session and clear local admin state before redirecting to the anonymous sign-in surface. -status: planned +status: active dependencies: - journeys: - - 4 + journeys: [] guarantees: - - guarantee.user.auth.user-login.004 + - guarantee.user.account.view-user-profile.010 + - guarantee.user.account.manage-sessions.007 + - guarantee.user.account.manage-notifications.008 + - guarantee.user.account.manage-appearance.009 + - guarantee.team.team.delete-team.016 actors: allowed: - verified_user @@ -35,11 +38,12 @@ preconditions: scene: required: true manifest: ./scenes/user-logout.scene.yaml + executionKey: admin.identity.logout mode: acceptance: true demo: true training: true - entryRoute: /auth/logout + entryRoute: /app/ componentContract: redirect/session guarantee harness expectedEvidence: - playwright_trace @@ -55,8 +59,8 @@ content: required: false verifierRefs: [] audit: - required: false - verifierRefs: [] + required: true + verifierRefs: [api.auth.lifecycle.audit] negativeCases: - id: anonymous-denied actor: anonymous_user @@ -74,4 +78,4 @@ notes: surface: admin-ui run: timeoutSeconds: 300 - requiredForRelease: false + requiredForRelease: true diff --git a/guarantees/user/auth/verify-email.guarantee.yaml b/guarantees/user/auth/verify-email.guarantee.yaml index 032771f4..48931284 100644 --- a/guarantees/user/auth/verify-email.guarantee.yaml +++ b/guarantees/user/auth/verify-email.guarantee.yaml @@ -7,7 +7,7 @@ journey: Verify Email ownerPackage: "@treeseed/admin" summary: Complete auth-provider verification then redirect into the authenticated Market/admin shell; implementation should not bypass the provider session model. -status: planned +status: active dependencies: journeys: - 1 @@ -33,12 +33,13 @@ preconditions: - "Journey dependencies must be satisfied: 1" scene: required: true - manifest: ./scenes/verify-email.scene.yaml + manifest: ./scenes/register-user.scene.yaml + executionKey: admin.identity.onboarding mode: acceptance: true demo: true training: true - entryRoute: /auth/confirm-email + entryRoute: /auth/register componentContract: redirect/session guarantee harness expectedEvidence: - playwright_trace @@ -54,8 +55,8 @@ content: required: false verifierRefs: [] audit: - required: false - verifierRefs: [] + required: true + verifierRefs: [api.auth.lifecycle.audit] negativeCases: - id: anonymous-denied actor: anonymous_user @@ -75,4 +76,4 @@ notes: surface: admin-ui run: timeoutSeconds: 300 - requiredForRelease: false + requiredForRelease: true diff --git a/guarantees/verifiers/ui.verifiers.yaml b/guarantees/verifiers/ui.verifiers.yaml index b9f6dd45..746ae063 100644 --- a/guarantees/verifiers/ui.verifiers.yaml +++ b/guarantees/verifiers/ui.verifiers.yaml @@ -1,6 +1,18 @@ schemaVersion: treeseed.guarantee-verifiers/v1 ownerPackage: "@treeseed/admin" verifiers: + api.auth.lifecycle.audit: + kind: vitestCase + ownerPackage: "@treeseed/api" + testFile: tests/integration/api/treedx/repositories/seeds-and-treedx.test.ts + testName: owns web auth lifecycle and acceptance session seeding in the API + description: Web identity lifecycle records canonical dotted audit events and durable session evidence. + api.team.lifecycle.audit: + kind: vitestCase + ownerPackage: "@treeseed/api" + testFile: tests/integration/api/governance/policy/teams-and-governance.test.ts + testName: manages team profiles, invites, member roles, and guarded deletion + description: Team identity, invitation, membership, and deletion mutations record canonical dotted audit events. api.auth.signup.mailpit: kind: apiAcceptanceCase caseId: auth.web.sign-up.sends-confirmation-email diff --git a/package-lock.json b/package-lock.json index 71164943..7d5031c7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,9 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#dee85f16aa134ab66af58e3306682db4b7689697", - "@treeseed/sdk": "github:treeseed-ai/sdk#5c6b5d62e04d7d34f67eeaa250ecfb237aa8f50f", - "@treeseed/ui": "github:treeseed-ai/ui#3703cb057472895d224cf99def95066aa9ea399c", + "@treeseed/core": "github:treeseed-ai/core#b05f3ea0a459e5b3bc5edc66107dc56bdbe5227c", + "@treeseed/sdk": "github:treeseed-ai/sdk#c0421b331dd3d9721a0859162b8c6bb7911fe67e", + "@treeseed/ui": "github:treeseed-ai/ui#ccadc27c31a74db3a4d7ffe6657b5fb0f949612b", "react": "^19.2.5", "react-dom": "^19.2.6" }, @@ -6932,7 +6932,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.staging.20260716T185112Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#dee85f16aa134ab66af58e3306682db4b7689697", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#b05f3ea0a459e5b3bc5edc66107dc56bdbe5227c", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6943,8 +6943,8 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#5c6b5d62e04d7d34f67eeaa250ecfb237aa8f50f", - "@treeseed/ui": "github:treeseed-ai/ui#3703cb057472895d224cf99def95066aa9ea399c", + "@treeseed/sdk": "github:treeseed-ai/sdk#c0421b331dd3d9721a0859162b8c6bb7911fe67e", + "@treeseed/ui": "github:treeseed-ai/ui#ccadc27c31a74db3a4d7ffe6657b5fb0f949612b", "astro": "^5.6.1", "esbuild": "^0.28.0", "katex": "^0.16.22", @@ -8948,7 +8948,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.staging.20260716T185056Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#5c6b5d62e04d7d34f67eeaa250ecfb237aa8f50f", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#c0421b331dd3d9721a0859162b8c6bb7911fe67e", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", @@ -9645,7 +9645,7 @@ }, "node_modules/@treeseed/ui": { "version": "0.12.18-dev.staging.20260716T185026Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#3703cb057472895d224cf99def95066aa9ea399c", + "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#ccadc27c31a74db3a4d7ffe6657b5fb0f949612b", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", diff --git a/package.json b/package.json index 12f4a77d..deece5a3 100644 --- a/package.json +++ b/package.json @@ -49,9 +49,9 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#dee85f16aa134ab66af58e3306682db4b7689697", - "@treeseed/sdk": "github:treeseed-ai/sdk#5c6b5d62e04d7d34f67eeaa250ecfb237aa8f50f", - "@treeseed/ui": "github:treeseed-ai/ui#3703cb057472895d224cf99def95066aa9ea399c", + "@treeseed/core": "github:treeseed-ai/core#b05f3ea0a459e5b3bc5edc66107dc56bdbe5227c", + "@treeseed/sdk": "github:treeseed-ai/sdk#c0421b331dd3d9721a0859162b8c6bb7911fe67e", + "@treeseed/ui": "github:treeseed-ai/ui#ccadc27c31a74db3a4d7ffe6657b5fb0f949612b", "react": "^19.2.5", "react-dom": "^19.2.6" }, diff --git a/src/layouts/AppLayout.astro b/src/layouts/AppLayout.astro index 4f188599..1ad9ed08 100644 --- a/src/layouts/AppLayout.astro +++ b/src/layouts/AppLayout.astro @@ -44,7 +44,10 @@ const [personalThemes, notifications] = await Promise.all([ const customSchemes = Object.fromEntries(personalThemes.flatMap((theme) => { try { return [[theme.schemeId, compileGuidedThemePalette(theme.palette, theme.baseScheme)]]; } catch { return []; } })); -const themeConfig = { schemes: customSchemes }; +const themeConfig = { + schemes: customSchemes, + schemeNames: Object.fromEntries(personalThemes.map((theme) => [theme.schemeId, theme.name])), +}; const csrfToken = ensureCsrfToken(Astro); const teamOptions = teams.map((team) => ({ id: team.id, @@ -82,7 +85,7 @@ const teamOptions = teams.map((team) => ({ { label: 'Sign out', action: '/auth/logout', method: 'post' as const, hiddenFields: { csrfToken }, variant: 'secondary' as const }, ]} > -
+
Active team
{teams.length > 0 ? ( diff --git a/src/pages/app/teams/[teamId]/edit.astro b/src/pages/app/teams/[teamId]/edit.astro index e5189cd5..cfff5499 100644 --- a/src/pages/app/teams/[teamId]/edit.astro +++ b/src/pages/app/teams/[teamId]/edit.astro @@ -64,7 +64,7 @@ if (Astro.request.method === 'POST' && team && canManageTeam) { {team && canManageTeam ? ( -
+
@@ -72,7 +72,7 @@ if (Astro.request.method === 'POST' && team && canManageTeam) { {saved && !formError &&

Saved.

}
- + diff --git a/src/pages/app/teams/[teamId]/members.astro b/src/pages/app/teams/[teamId]/members.astro index 7a8a80ab..b1703625 100644 --- a/src/pages/app/teams/[teamId]/members.astro +++ b/src/pages/app/teams/[teamId]/members.astro @@ -43,6 +43,7 @@ function roleSelectOptions(roleKey: string) { const rows = members.map((member: any) => ({ id: `member-${esc(member.id ?? member.userId)}`, sceneId: `team.member.${member.email ?? member.userId ?? member.id ?? 'unknown'}`, + sceneState: String(member.roleKey ?? member.role ?? 'contributor'), name: `${esc(member.displayName ?? member.email ?? member.userId ?? 'Member')}${esc(member.email ?? member.userId ?? '')}`, role: esc(roleOptions.find((option) => option.value === (member.roleKey ?? member.role))?.label ?? member.roleKey ?? member.role ?? 'member'), actions: ``, diff --git a/src/pages/app/teams/new.astro b/src/pages/app/teams/new.astro index c6e05681..8b2fdcda 100644 --- a/src/pages/app/teams/new.astro +++ b/src/pages/app/teams/new.astro @@ -64,7 +64,7 @@ const context = await loadAppContext(Astro); {formError && }
- + diff --git a/src/routes.ts b/src/routes.ts index 8151ad46..fbab30bc 100644 --- a/src/routes.ts +++ b/src/routes.ts @@ -27,17 +27,17 @@ function adminRoute(pattern: string, resourcePath: string, input: CapabilityInpu } export const ADMIN_ROUTES: readonly SiteRouteContribution[] = validateRouteCapabilities([ - adminRoute('/app', 'pages/app/index.astro', { id: 'admin.app.start', description: 'Authenticated identity and active-team start dashboard.', guarantees: ['guarantee.route.registry'] }), + adminRoute('/app', 'pages/app/index.astro', { id: 'admin.app.start', description: 'Authenticated identity and active-team start dashboard.', guarantees: ['guarantee.user.auth.user-login.004', 'guarantee.team.team.switch-active-team.013'] }), adminRoute('/app/account', 'pages/app/account/index.astro', { id: 'admin.account.identity', description: 'Identity, immutable username, verified email, password, and connected-provider settings.', guarantees: ['guarantee.user.account.edit-account-settings.006'] }), adminRoute('/app/account/sessions', 'pages/app/account/sessions.astro', { id: 'admin.account.sessions', description: 'Account session collection with current-session protection and revocation.', guarantees: ['guarantee.user.account.manage-sessions.007'] }), - adminRoute('/app/account/notifications', 'pages/app/account/notifications.astro', { id: 'admin.account.notifications', description: 'Global and per-project content notification preferences and email cadence.', guarantees: ['guarantee.user.account.manage-notifications.011'] }), + adminRoute('/app/account/notifications', 'pages/app/account/notifications.astro', { id: 'admin.account.notifications', description: 'Global and per-project content notification preferences and email cadence.', guarantees: ['guarantee.user.account.manage-notifications.008'] }), adminRoute('/app/account/appearance', 'pages/app/account/appearance.astro', { id: 'admin.account.appearance', description: 'Personal theme creation and management; activation remains in the shell selector.', guarantees: ['guarantee.user.account.manage-appearance.009'] }), adminRoute('/app/account/delete', 'pages/app/account/delete.astro', { id: 'admin.account.delete', description: 'Blocked, reauthenticated, exact-confirmation account deletion.', guarantees: ['guarantee.user.account.delete-user.011'] }), - adminRoute('/app/teams', 'pages/app/teams/index.astro', { id: 'admin.team.collection', description: 'Teams available to the principal and active-team selection.' }), - adminRoute('/app/teams/new', 'pages/app/teams/new.astro', { id: 'admin.team.create', description: 'Authenticated team creation.' }), - adminRoute('/app/teams/[teamId]/edit', 'pages/app/teams/[teamId]/edit.astro', { id: 'admin.team.edit', description: 'Authorized team identity settings.' }), - adminRoute('/app/teams/[teamId]/delete', 'pages/app/teams/[teamId]/delete.astro', { id: 'admin.team.delete', description: 'Authorized, blocker-aware team deletion.' }), - adminRoute('/app/teams/[teamId]/members', 'pages/app/teams/[teamId]/members.astro', { id: 'admin.team.members', description: 'Team membership, invitation, role, and removal operations.' }), + adminRoute('/app/teams', 'pages/app/teams/index.astro', { id: 'admin.team.collection', description: 'Teams available to the principal and active-team selection.', guarantees: ['guarantee.team.team.switch-active-team.013'] }), + adminRoute('/app/teams/new', 'pages/app/teams/new.astro', { id: 'admin.team.create', description: 'Authenticated team creation.', guarantees: ['guarantee.team.team.create-team.012'] }), + adminRoute('/app/teams/[teamId]/edit', 'pages/app/teams/[teamId]/edit.astro', { id: 'admin.team.edit', description: 'Authorized team identity settings.', guarantees: ['guarantee.team.team.edit-team-settings.014'] }), + adminRoute('/app/teams/[teamId]/delete', 'pages/app/teams/[teamId]/delete.astro', { id: 'admin.team.delete', description: 'Authorized, blocker-aware team deletion.', guarantees: ['guarantee.team.team.delete-team.016'] }), + adminRoute('/app/teams/[teamId]/members', 'pages/app/teams/[teamId]/members.astro', { id: 'admin.team.members', description: 'Team membership, invitation, role, and removal operations.', guarantees: ['guarantee.team.membership.invite-team-members.017', 'guarantee.team.membership.change-member-role.019', 'guarantee.team.membership.remove-team-member.020'] }), adminRoute('/auth/register', 'pages/auth/register.astro', { id: 'admin.auth.register', description: 'Credential registration with username/email availability and immutable username disclosure.', guarantees: ['guarantee.user.auth.register-user.001'] }), adminRoute('/auth/check-email', 'pages/auth/check-email.astro', { id: 'admin.auth.check-email', description: 'Hidden verification/reset check-inbox continuation.', archetype: 'message', template: 'MessageTemplate' }), adminRoute('/auth/confirm-email', 'pages/auth/confirm-email.astro', { id: 'admin.auth.confirm-email', description: 'Email-confirmation token result and recovery.', archetype: 'message', guarantees: ['guarantee.user.auth.verify-email.002'] }), @@ -49,8 +49,8 @@ export const ADMIN_ROUTES: readonly SiteRouteContribution[] = validateRouteCapab adminRoute('/auth/device/approve', 'pages/auth/device/approve.astro', { id: 'admin.auth.device-approve', description: 'Authenticated CLI/device authorization approval.', accessPolicy: ['signed-in principal', 'valid pending device request'] }), adminRoute('/auth/callback/[provider]', 'pages/auth/callback/[provider].ts', { id: 'admin.auth.provider-callback', description: 'Hidden configured-provider callback with one-time state, nonce, PKCE, and safe redirect.', responseKind: 'redirect', archetype: 'redirect', accessPolicy: ['configured provider', 'one-time database state', 'nonce and PKCE validation', 'safe return URL'] }), adminRoute('/u/[username]', 'pages/u/[username].astro', { id: 'admin.profile.user', description: 'Public identity-only user profile.', guarantees: ['guarantee.user.account.view-user-profile.010'] }), - adminRoute('/t/[name]', 'pages/t/[name].astro', { id: 'admin.profile.team', description: 'Public identity-only team profile.' }), - adminRoute('/team-invites/[token]/accept', 'pages/team-invites/[token]/accept.astro', { id: 'admin.team.invite-accept', description: 'Idempotent invitation acceptance and safe destination.' }), + adminRoute('/t/[name]', 'pages/t/[name].astro', { id: 'admin.profile.team', description: 'Public identity-only team profile.', guarantees: ['guarantee.team.team.view-team-profile.015'] }), + adminRoute('/team-invites/[token]/accept', 'pages/team-invites/[token]/accept.astro', { id: 'admin.team.invite-accept', description: 'Idempotent invitation acceptance and safe destination.', guarantees: ['guarantee.team.membership.accept-team-invitation.018'] }), ]); export const ADMIN_SUPPORT_ROUTES: readonly SiteRouteContribution[] = validateRouteCapabilities([ From a3d2e1a0b86a6a77e4a62beb229500367b1bcfe2 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Mon, 27 Jul 2026 05:53:47 -0400 Subject: [PATCH 026/315] build(ui): save unified identity and interface improvements Intent: - Save hint: save unified identity and interface improvements Changes: - Updates 53 files across ui: 22, config: 16, source: 11, build: 2, docs: 1, tests: 1. - Touches docs/src/config.yaml, guarantees/team/membership/scenes/change-member-role.scene.yaml, guarantees/team/membership/scenes/invite-team-members.scene.yaml, guarantees/team/membership/scenes/remove-team-member.scene.yaml, guarantees/team/scenes/edit-team-settings.scene.yaml, guarantees/team/scenes/switch-active-team.scene.yaml, .... - Plans package version/tag 0.12.59-dev.staging.20260716T154320Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/ui: github:treeseed-ai/ui#ccadc27c31a74db3a4d7ffe6657b5fb0f949612b -> github:treeseed-ai/ui#2315c1b9d52719307f2c30072e364c5020dc3152 - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#c0421b331dd3d9721a0859162b8c6bb7911fe67e -> github:treeseed-ai/sdk#ab361c416b2b55e554f46113a9d5474531c26064 - dependencies.@treeseed/core: github:treeseed-ai/core#b05f3ea0a459e5b3bc5edc66107dc56bdbe5227c -> github:treeseed-ai/core#24464951d79588ef74f987b34ea5fe53c081a9ef --- docs/src/config.yaml | 2 +- .../scenes/change-member-role.scene.yaml | 8 +- .../scenes/invite-team-members.scene.yaml | 8 +- .../scenes/remove-team-member.scene.yaml | 6 +- .../team/scenes/edit-team-settings.scene.yaml | 7 +- .../team/scenes/switch-active-team.scene.yaml | 10 ++ .../team/scenes/view-team-profile.scene.yaml | 6 +- .../edit-account-settings.guarantee.yaml | 11 +- .../account/manage-sessions.guarantee.yaml | 4 +- .../scenes/edit-account-settings.scene.yaml | 78 +++++++++ .../scenes/manage-appearance.scene.yaml | 37 +++-- .../scenes/manage-notifications.scene.yaml | 41 ++++- .../account/scenes/manage-sessions.scene.yaml | 16 ++ .../scenes/forgot-reset-password.scene.yaml | 15 +- .../user/auth/scenes/register-user.scene.yaml | 27 +++- .../user/auth/scenes/user-login.scene.yaml | 64 +++++++- guarantees/verifiers/ui.verifiers.yaml | 17 +- package-lock.json | 16 +- package.json | 6 +- src/layouts/AppLayout.astro | 69 +++++--- src/layouts/PublicLayout.astro | 7 +- src/lib/auth/accounts/appearance.ts | 4 + src/lib/auth/support/access-policy.ts | 18 +++ src/lib/forms/page-submission.ts | 22 +++ .../accounts/contracts/account-preferences.ts | 6 + .../updates/update-account-preferences.ts | 6 + src/lib/market/api-client/interface.ts | 2 + src/lib/market/api-client/methods.ts | 4 + src/middleware.ts | 6 + src/pages/app/account/appearance.astro | 4 +- src/pages/app/account/delete.astro | 4 +- src/pages/app/account/index.astro | 8 +- src/pages/app/account/notifications.astro | 4 +- src/pages/app/account/sessions.astro | 4 +- src/pages/app/index.astro | 1 + src/pages/app/teams/[teamId]/delete.astro | 41 ++++- src/pages/app/teams/[teamId]/edit.astro | 42 +++-- src/pages/app/teams/[teamId]/members.astro | 58 +------ src/pages/app/teams/index.astro | 1 + src/pages/app/teams/new.astro | 37 ++++- src/pages/auth/device/approve.astro | 27 ++-- src/pages/auth/forgot-password.astro | 14 +- src/pages/auth/logout.ts | 12 +- src/pages/auth/register.astro | 39 +++-- src/pages/auth/reset-password.astro | 40 +++-- src/pages/auth/sign-in.astro | 17 +- src/pages/auth/username.astro | 11 +- src/pages/t/[name].astro | 3 +- src/pages/u/[username].astro | 3 +- src/plugin.ts | 1 + src/routes.ts | 22 ++- src/view-models/account-settings.ts | 87 +++++++--- tests/contract/package/admin-package.test.ts | 150 ++++++++++++++++++ 53 files changed, 881 insertions(+), 272 deletions(-) create mode 100644 src/lib/auth/support/access-policy.ts create mode 100644 src/lib/forms/page-submission.ts create mode 100644 src/lib/market/api-client/accounts/contracts/account-preferences.ts create mode 100644 src/lib/market/api-client/accounts/updates/update-account-preferences.ts diff --git a/docs/src/config.yaml b/docs/src/config.yaml index 94419c35..e0469ddc 100644 --- a/docs/src/config.yaml +++ b/docs/src/config.yaml @@ -3,7 +3,7 @@ site: src: https://treeseed.ai/logo.svg alt: TreeSeed admin Knowledge Hub logo name: TreeSeed Admin Knowledge Hub - statement: TreeSeed Admin package knowledge, agents, and workday memory + statement: Grow what you know siteUrl: https://admin.treeseed.ai githubRepository: https://github.com/treeseed-ai/admin discordLink: https://discord.gg/example diff --git a/guarantees/team/membership/scenes/change-member-role.scene.yaml b/guarantees/team/membership/scenes/change-member-role.scene.yaml index 1f168d42..5d62f955 100644 --- a/guarantees/team/membership/scenes/change-member-role.scene.yaml +++ b/guarantees/team/membership/scenes/change-member-role.scene.yaml @@ -101,10 +101,14 @@ workflow: title: Persist the member role action: click: - css: '[data-scene="team.member.invite-{{runId}}-{{deviceId}}@treeseed.local"] button[type="submit"]' + css: '[data-scene="team.member.invite-{{runId}}-{{deviceId}}@treeseed.local"] form[data-ts-method="PATCH"] button[type="submit"]' internal: true expect: - urlIncludes: updated= + urlIncludes: /members + text: Member role updated. + visible: + - css: '[data-ts-toast-id][data-tone="success"]' + internal: true - id: verify-member-role title: Verify role persistence after reload action: diff --git a/guarantees/team/membership/scenes/invite-team-members.scene.yaml b/guarantees/team/membership/scenes/invite-team-members.scene.yaml index 22ddfbcf..d46d1116 100644 --- a/guarantees/team/membership/scenes/invite-team-members.scene.yaml +++ b/guarantees/team/membership/scenes/invite-team-members.scene.yaml @@ -113,7 +113,11 @@ workflow: role: button name: Invite member expect: - text: Invite sent to invite-{{runId}}-{{deviceId}}@treeseed.local. + urlIncludes: /members + text: Invitation sent. + visible: + - css: '[data-ts-toast-id][data-tone="success"]' + internal: true - id: observe-invitation-email title: Observe exact invitation delivery in Mailpit action: @@ -124,7 +128,7 @@ workflow: navigate: false expect: urlIncludes: /members - text: Invite sent + text: Invite member chapters: [] overlays: [] diagrams: [] diff --git a/guarantees/team/membership/scenes/remove-team-member.scene.yaml b/guarantees/team/membership/scenes/remove-team-member.scene.yaml index b221cb51..6aaa4461 100644 --- a/guarantees/team/membership/scenes/remove-team-member.scene.yaml +++ b/guarantees/team/membership/scenes/remove-team-member.scene.yaml @@ -95,7 +95,11 @@ workflow: css: '[data-scene="team.member.invite-{{runId}}-{{deviceId}}@treeseed.local"] button[data-remove-member]' internal: true expect: - urlIncludes: removed= + urlIncludes: /members + text: Member removed. + visible: + - css: '[data-ts-toast-id][data-tone="success"]' + internal: true - id: verify-member-removed title: Verify the member no longer appears action: diff --git a/guarantees/team/scenes/edit-team-settings.scene.yaml b/guarantees/team/scenes/edit-team-settings.scene.yaml index 16b34e9a..c172a927 100644 --- a/guarantees/team/scenes/edit-team-settings.scene.yaml +++ b/guarantees/team/scenes/edit-team-settings.scene.yaml @@ -114,8 +114,11 @@ workflow: role: button name: Save team expect: - urlIncludes: saved=1 - text: Saved. + urlIncludes: /edit + text: Team saved. + visible: + - css: '[data-ts-toast-id][data-tone="success"]' + internal: true - id: reload-team title: Reload persisted settings action: diff --git a/guarantees/team/scenes/switch-active-team.scene.yaml b/guarantees/team/scenes/switch-active-team.scene.yaml index 16c385cb..0b76c3ca 100644 --- a/guarantees/team/scenes/switch-active-team.scene.yaml +++ b/guarantees/team/scenes/switch-active-team.scene.yaml @@ -91,6 +91,11 @@ workflow: visible: - css: '[data-active-team-label="TreeSeed"]:visible' internal: true + - css: '[data-page-header-owner="content"] .ts-page-header' + internal: true + notVisible: + - css: '[data-page-header-owner="content"] > .ts-product-shell__body .ts-control-surface > .ts-control-surface__header' + internal: true - id: switch-to-personal-team title: Select the personal team through the shell action: @@ -122,6 +127,11 @@ workflow: visible: - css: '[data-active-team-label="Guarantee {{runShort}} {{deviceId}}"]:visible' internal: true + - css: '[data-page-header-owner="content"] .ts-page-header' + internal: true + notVisible: + - css: '[data-page-header-owner="content"] > .ts-product-shell__body .ts-control-surface > .ts-control-surface__header' + internal: true chapters: [] overlays: [] diagrams: [] diff --git a/guarantees/team/scenes/view-team-profile.scene.yaml b/guarantees/team/scenes/view-team-profile.scene.yaml index 88ef8d72..17afac03 100644 --- a/guarantees/team/scenes/view-team-profile.scene.yaml +++ b/guarantees/team/scenes/view-team-profile.scene.yaml @@ -85,11 +85,11 @@ workflow: - css: 'main' internal: true - id: exercise-anonymous-account-boundary - title: Follow the account action from the anonymous profile + title: Follow the sign-in action from the anonymous profile action: click: - css: 'a[aria-label="Account and teams"]' - internal: true + role: link + name: Sign in expect: urlIncludes: /auth/sign-in text: Sign in diff --git a/guarantees/user/account/edit-account-settings.guarantee.yaml b/guarantees/user/account/edit-account-settings.guarantee.yaml index e7ecfc72..eedda023 100644 --- a/guarantees/user/account/edit-account-settings.guarantee.yaml +++ b/guarantees/user/account/edit-account-settings.guarantee.yaml @@ -5,7 +5,7 @@ type: user subtype: account journey: Edit Account Settings ownerPackage: "@treeseed/admin" -summary: Edit user profile preferences owned by the admin/account surface; persistence should live in the API or auth metadata and not in root Market-only state. +summary: Edit user identity, verify additional account emails, and persist the account-wide time zone used by every UI timestamp. status: active dependencies: journeys: @@ -51,12 +51,15 @@ api: required: true verifierRefs: - api.auth.profile.update + - api.auth.account-preferences + - api.auth.email.lifecycle content: required: false verifierRefs: [] audit: - required: false - verifierRefs: [] + required: true + verifierRefs: + - api.auth.lifecycle.audit negativeCases: - id: anonymous-denied actor: anonymous_user @@ -70,7 +73,7 @@ evidence: optional: - mailpit_message notes: - - Edit user profile preferences owned by the admin/account surface; persistence should live in the API or auth metadata and not in root Market-only state. + - Account identity, additional verified emails, and the selected IANA time zone persist through API-owned records; notification delivery consumes the same account time zone. surface: admin-ui run: timeoutSeconds: 300 diff --git a/guarantees/user/account/manage-sessions.guarantee.yaml b/guarantees/user/account/manage-sessions.guarantee.yaml index b60fa96c..1d1870d0 100644 --- a/guarantees/user/account/manage-sessions.guarantee.yaml +++ b/guarantees/user/account/manage-sessions.guarantee.yaml @@ -5,7 +5,7 @@ type: user subtype: account journey: Manage Sessions ownerPackage: "@treeseed/admin" -summary: List and revoke active sessions through the auth/session facade; this may be missing if the selected auth provider does not expose session management yet. +summary: List active sessions with source IP and account-time-zone-aware activity dates, revoke a non-current session, and preserve the current session through the auth/session facade. status: active dependencies: journeys: @@ -70,7 +70,7 @@ evidence: optional: - mailpit_message notes: - - List and revoke active sessions through the auth/session facade; this may be missing if the selected auth provider does not expose session management yet. + - Session metadata records the trusted forwarded client address at authentication and presents an explicit fallback when an address was unavailable. surface: admin-ui run: timeoutSeconds: 300 diff --git a/guarantees/user/account/scenes/edit-account-settings.scene.yaml b/guarantees/user/account/scenes/edit-account-settings.scene.yaml index 857ba367..3c5cf662 100644 --- a/guarantees/user/account/scenes/edit-account-settings.scene.yaml +++ b/guarantees/user/account/scenes/edit-account-settings.scene.yaml @@ -10,6 +10,7 @@ journey: proves: - Edit Account Settings opens the canonical @treeseed/admin full page form workflow. - Edit Account Settings exercises a service journey instead of only loading /app/account. + - A signed-in user can add an email, consume the delivered confirmation link, and observe its verified state. - Edit Account Settings records reviewable evidence for the visible result before activation. minimumSteps: 5 requiresInteractiveAction: true @@ -88,6 +89,11 @@ workflow: urlIncludes: /app/account visible: - scene: account-identity + - css: '[data-page-header-owner="content"] .ts-page-header' + internal: true + notVisible: + - css: '[data-page-header-owner="content"] > .ts-product-shell__body .ts-control-surface > .ts-control-surface__header' + internal: true - id: edit-first-name title: Edit the public first name action: @@ -115,6 +121,9 @@ workflow: expect: urlIncludes: /app/account text: Identity saved. + visible: + - css: '[data-ts-toast-id][data-tone="success"]' + internal: true - id: reload-profile title: Reload the durable profile action: @@ -122,6 +131,75 @@ workflow: expect: visible: - scene: account-identity + - scene: account-time-zone + - id: select-time-zone + title: Select an account-wide display time zone + action: + select: + role: combobox + name: Display time zone + label: America / New York + expect: + text: Dates and times across the application use this time zone. + - id: save-time-zone + title: Save the display time zone without leaving account settings + action: + click: + role: button + name: Save time zone + expect: + urlIncludes: /app/account + text: Time zone saved. + visible: + - css: '[data-ts-toast-id][data-tone="success"]' + internal: true + - id: reload-time-zone + title: Reload the durable account time zone + action: + goto: /app/account + expect: + urlIncludes: /app/account + visible: + - css: '[data-scene="account-time-zone"][data-time-zone="America/New_York"]' + internal: true + - id: enter-additional-email + title: Enter an additional account email + action: + fill: + role: textbox + name: Add email + value: guarantee-extra-{{runId}}-{{deviceId}}@treeseed.local + expect: + visible: + - scene: account-identity + - id: send-additional-email-verification + title: Add the pending email and send its verification message + action: + click: + role: button + name: Add and verify + expect: + urlIncludes: /app/account + text: Verification email sent. + visible: + - css: '[data-ts-toast-id][data-tone="success"]' + internal: true + - css: '[data-account-email="guarantee-extra-{{runId}}-{{deviceId}}@treeseed.local"][data-account-email-status="pending"]' + internal: true + - id: confirm-additional-email + title: Confirm the additional email while the account session remains active + action: + mailpitConfirmLatest: + mailpitUrl: http://127.0.0.1:8025 + email: guarantee-extra-{{runId}}-{{deviceId}}@treeseed.local + subjectIncludes: Confirm your Treeseed Market email + displayInboxSeconds: 1 + displayMessageSeconds: 1 + expect: + urlIncludes: /app/account + visible: + - css: '[data-account-email="guarantee-extra-{{runId}}-{{deviceId}}@treeseed.local"][data-account-email-status="verified"]' + internal: true chapters: [] overlays: [] diagrams: [] diff --git a/guarantees/user/account/scenes/manage-appearance.scene.yaml b/guarantees/user/account/scenes/manage-appearance.scene.yaml index 6cf7a28a..5d9e2d67 100644 --- a/guarantees/user/account/scenes/manage-appearance.scene.yaml +++ b/guarantees/user/account/scenes/manage-appearance.scene.yaml @@ -88,6 +88,8 @@ workflow: urlIncludes: /app/account/appearance visible: - scene: account-appearance + - css: '[data-built-in-theme-table]' + internal: true - id: open-theme-dialog title: Open personal theme creation action: @@ -102,9 +104,22 @@ workflow: fill: role: textbox name: Theme name - value: Guarantee {{deviceId}} + value: Guarantee {{runId}} {{deviceId}} expect: - text: Base theme + visible: + - css: "[data-personal-theme-builder] [data-personal-theme-base]" + internal: true + - id: change-personal-theme-base + title: Seed the custom palette from another built-in theme + action: + select: + role: combobox + name: Base theme + label: Cedar Clay + expect: + visible: + - css: '[data-personal-theme-builder][data-theme-palette-source="cedar"] [data-theme-color-mode="light"][data-theme-color-key="accent"][data-theme-color-value="#b86b3c"]' + internal: true - id: create-personal-theme title: Create the personal theme action: @@ -113,6 +128,9 @@ workflow: expect: urlIncludes: /app/account/appearance text: Theme saved. + visible: + - css: '[data-ts-toast-id][data-tone="success"]' + internal: true - id: reload-personal-theme title: Reload the personal theme collection action: @@ -129,23 +147,16 @@ workflow: expect: text: Color scheme - id: activate-personal-theme - title: Select the personal theme + title: Select the personal theme and reload the appearance page action: select: role: combobox name: Color scheme - label: Guarantee {{deviceId}} - expect: - visible: - - css: '[data-testid="appearance-menu-trigger"]:visible' - internal: true - - id: verify-persisted-shell-theme - title: Reload and verify the active shell theme - action: - goto: /app/account/appearance + label: Guarantee {{runId}} {{deviceId}} expect: + urlIncludes: /app/account/appearance visible: - - css: '[data-active-personal-theme-name="Guarantee {{deviceId}}"]' + - css: '[data-active-personal-theme-name="Guarantee {{runId}} {{deviceId}}"]' internal: true chapters: [] overlays: [] diff --git a/guarantees/user/account/scenes/manage-notifications.scene.yaml b/guarantees/user/account/scenes/manage-notifications.scene.yaml index 8cef2698..71278b59 100644 --- a/guarantees/user/account/scenes/manage-notifications.scene.yaml +++ b/guarantees/user/account/scenes/manage-notifications.scene.yaml @@ -59,15 +59,50 @@ workflow: - id: select-questions title: Select questions globally action: { click: { role: checkbox, name: Questions } } - expect: { text: These choices apply to every project } + expect: + text: These choices apply to every project + visible: + - css: '[data-notification-content-choices][data-orientation="vertical"][aria-label="All-project content types"]' + internal: true + - id: select-project-override + title: Expand a project-specific content policy + action: + click: + css: '[data-notification-project-name="TreeSeed Market"] [data-notification-project-toggle]' + internal: true + expect: + text: New research questions and published answers. + visible: + - css: '[data-notification-project-name="TreeSeed Market"][open] [aria-label="TreeSeed Market content types"]' + internal: true + - id: select-project-questions + title: Select questions for the project override + action: + click: + css: '[data-notification-project-name="TreeSeed Market"] input[name^="projectTypes:"][value="questions"]' + internal: true + expect: + visible: + - css: '[data-notification-project-name="TreeSeed Market"][open] input[name^="projectTypes:"][value="questions"]:checked' + internal: true - id: save-preferences title: Save notification preferences action: { click: { role: button, name: Save notification preferences } } - expect: { urlIncludes: /app/account/notifications, text: Notification preferences saved. } + expect: + urlIncludes: /app/account/notifications + text: Notification preferences saved. + visible: + - css: '[data-ts-toast-id][data-tone="success"]' + internal: true - id: reload-preferences title: Reload persisted notification preferences action: { goto: /app/account/notifications } - expect: { urlIncludes: /app/account/notifications, text: Weekly } + expect: + urlIncludes: /app/account/notifications + text: Weekly + visible: + - css: '[data-notification-project-name="TreeSeed Market"][open] input[name^="projectTypes:"][value="questions"]:checked' + internal: true chapters: [] overlays: [] diagrams: [] diff --git a/guarantees/user/account/scenes/manage-sessions.scene.yaml b/guarantees/user/account/scenes/manage-sessions.scene.yaml index b8cd2f20..d1482913 100644 --- a/guarantees/user/account/scenes/manage-sessions.scene.yaml +++ b/guarantees/user/account/scenes/manage-sessions.scene.yaml @@ -99,6 +99,7 @@ workflow: expectedStatus: 200 headers: user-agent: Treeseed Guarantee Revocable Session + x-forwarded-for: 198.51.100.27 body: email: guarantee-{{runId}}-{{deviceId}}@treeseed.local password: TreeSeedGuaranteeReset123! @@ -113,6 +114,18 @@ workflow: visible: - scene: account-sessions text: Revoke session + - id: verify-session-network-and-pretty-time + title: Verify the session network origin and formatted time + action: + goto: /app/account/sessions + expect: + text: 198.51.100.27 + notText: T00:00:00.000Z + visible: + - css: '[data-session-entry="treeseed-guarantee-revocable-session"] [data-session-ip]' + internal: true + - css: '[data-session-entry="treeseed-guarantee-revocable-session"] .account-session-signed-in' + internal: true - id: reject-current-session-revocation title: Prove no current-session revoke control is exposed action: @@ -130,6 +143,9 @@ workflow: expect: urlIncludes: /app/account/sessions text: Session revoked. + visible: + - css: '[data-ts-toast-id][data-tone="success"]' + internal: true - id: verify-revoked-session title: Verify the revoked session remains observable action: diff --git a/guarantees/user/auth/scenes/forgot-reset-password.scene.yaml b/guarantees/user/auth/scenes/forgot-reset-password.scene.yaml index ecd3510a..934aef02 100644 --- a/guarantees/user/auth/scenes/forgot-reset-password.scene.yaml +++ b/guarantees/user/auth/scenes/forgot-reset-password.scene.yaml @@ -139,16 +139,25 @@ workflow: internal: true value: TreeSeedGuaranteeReset123! expect: - text: New password + text: Strong - id: confirm-new-password - title: Confirm the new password + title: Reject a mismatched password confirmation + action: + fill: + css: "input[name='confirmPassword']" + internal: true + value: TreeSeedGuaranteeMismatch123! + expect: + text: Passwords do not match. + - id: correct-new-password-confirmation + title: Confirm the matching new password action: fill: css: "input[name='confirmPassword']" internal: true value: TreeSeedGuaranteeReset123! expect: - text: Confirm new password + text: Passwords match. - id: complete-password-reset title: Complete password reset action: diff --git a/guarantees/user/auth/scenes/register-user.scene.yaml b/guarantees/user/auth/scenes/register-user.scene.yaml index cda26219..349a64a7 100644 --- a/guarantees/user/auth/scenes/register-user.scene.yaml +++ b/guarantees/user/auth/scenes/register-user.scene.yaml @@ -128,7 +128,10 @@ workflow: name: Username value: g-{{runShort}}-{{deviceId}} expect: - text: Username is available. + visible: + - role: textbox + name: Username + notText: Username is available. - id: verify-username-immutability title: Verify permanent username disclosure action: @@ -143,7 +146,10 @@ workflow: name: Email value: guarantee-{{runId}}-{{deviceId}}@treeseed.local expect: - text: Email is available. + visible: + - role: textbox + name: Email + notText: Email is available. - id: enter-password title: Enter password action: @@ -152,16 +158,25 @@ workflow: internal: true value: TreeSeedReviewPass123! expect: - text: Password + text: Strong - id: confirm-password - title: Confirm password + title: Reject mismatched password confirmation + action: + fill: + css: "[data-ts-confirm-password-input]" + internal: true + value: TreeSeedReviewMismatch123! + expect: + text: Passwords do not match. + - id: correct-password-confirmation + title: Confirm matching password action: fill: - css: "[data-confirm-password-input]" + css: "[data-ts-confirm-password-input]" internal: true value: TreeSeedReviewPass123! expect: - text: Confirm password + text: Passwords match. - id: submit-registration title: Submit registration action: diff --git a/guarantees/user/auth/scenes/user-login.scene.yaml b/guarantees/user/auth/scenes/user-login.scene.yaml index 62f09078..ccc519a9 100644 --- a/guarantees/user/auth/scenes/user-login.scene.yaml +++ b/guarantees/user/auth/scenes/user-login.scene.yaml @@ -118,7 +118,9 @@ workflow: internal: true value: incorrect-password expect: - text: Password + visible: + - css: "input[name='password']" + internal: true - id: reject-invalid-sign-in title: Reject invalid credentials action: @@ -136,7 +138,9 @@ workflow: internal: true value: TreeSeedGuaranteeReset123! expect: - text: Password + visible: + - css: "input[name='password']" + internal: true - id: submit-sign-in title: Submit valid sign in action: @@ -155,6 +159,62 @@ workflow: urlIncludes: /app visible: - scene: app-shell + - id: reject-authenticated-sign-in + title: Redirect an active session away from sign in + action: + goto: /auth/sign-in + expect: + urlIncludes: /app + visible: + - scene: app-shell + - id: reject-authenticated-registration + title: Redirect an active session away from registration + action: + goto: /auth/register + expect: + urlIncludes: /app + visible: + - scene: app-shell + - id: reject-authenticated-password-recovery + title: Redirect an active session away from password recovery + action: + goto: /auth/forgot-password + expect: + urlIncludes: /app + visible: + - scene: app-shell + - id: reject-authenticated-password-reset + title: Redirect an active session away from password reset + action: + goto: /auth/reset-password?token=active-session-must-not-consume + expect: + urlIncludes: /app + visible: + - scene: app-shell + - id: reject-authenticated-email-continuation + title: Redirect an active session away from the check-email page + action: + goto: /auth/check-email + expect: + urlIncludes: /app + visible: + - scene: app-shell + - id: reject-authenticated-email-confirmation + title: Redirect an active session away from email confirmation + action: + goto: /auth/confirm-email + expect: + urlIncludes: /app + visible: + - scene: app-shell + - id: reject-authenticated-provider-callback + title: Redirect an active session away from provider callbacks + action: + goto: /auth/callback/github + expect: + urlIncludes: /app + visible: + - scene: app-shell chapters: [] overlays: [] diagrams: [] diff --git a/guarantees/verifiers/ui.verifiers.yaml b/guarantees/verifiers/ui.verifiers.yaml index 746ae063..4c47b28b 100644 --- a/guarantees/verifiers/ui.verifiers.yaml +++ b/guarantees/verifiers/ui.verifiers.yaml @@ -17,12 +17,12 @@ verifiers: kind: apiAcceptanceCase caseId: auth.web.sign-up.sends-confirmation-email ownerPackage: "@treeseed/api" - description: Signup succeeds and emits a verification email into local Mailpit. + description: Signup emits a verification email whose confirmation link uses the configured web origin. api.auth.password-reset.request.mailpit: kind: apiAcceptanceCase caseId: auth.password-reset.request.mailpit ownerPackage: "@treeseed/api" - description: Password reset request succeeds and emits a reset email into local Mailpit. + description: Password reset emits an email whose reset link uses the configured web origin. api.auth.signin: kind: apiAcceptanceCase caseId: auth.web.sign-in.site-admin @@ -43,6 +43,17 @@ verifiers: caseId: auth.profile.update.team-owner ownerPackage: "@treeseed/api" description: Authenticated users can update profile details. + api.auth.account-preferences: + kind: apiAcceptanceCase + caseId: auth.account-preferences.team-owner + ownerPackage: "@treeseed/api" + description: Authenticated users can persist the IANA time zone used for UI timestamps and notification scheduling. + api.auth.email.lifecycle: + kind: vitestCase + ownerPackage: "@treeseed/api" + testFile: tests/integration/api/accounts/authentication-and-identity.test.ts + testName: supports multiple verified account emails for login, primary selection, deletion, reset, and invite lookup + description: A signed-in account can add a pending email, consume its one-time confirmation token, observe verified persistence, and then use the address for authentication. api.auth.sessions: kind: apiAcceptanceCase caseId: auth.sessions.team-owner @@ -82,7 +93,7 @@ verifiers: kind: apiAcceptanceCase caseId: teams.invite.team-owner ownerPackage: "@treeseed/api" - description: Team owner can invite a member and Mailpit receives the invite email. + description: Team invitation emits an email whose acceptance link uses the configured web origin. api.team.members.nonmember: kind: apiAcceptanceCase caseId: team-role-matrix.team-members.nonMember diff --git a/package-lock.json b/package-lock.json index 7d5031c7..c930ef44 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,9 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#b05f3ea0a459e5b3bc5edc66107dc56bdbe5227c", - "@treeseed/sdk": "github:treeseed-ai/sdk#c0421b331dd3d9721a0859162b8c6bb7911fe67e", - "@treeseed/ui": "github:treeseed-ai/ui#ccadc27c31a74db3a4d7ffe6657b5fb0f949612b", + "@treeseed/core": "github:treeseed-ai/core#24464951d79588ef74f987b34ea5fe53c081a9ef", + "@treeseed/sdk": "github:treeseed-ai/sdk#ab361c416b2b55e554f46113a9d5474531c26064", + "@treeseed/ui": "github:treeseed-ai/ui#2315c1b9d52719307f2c30072e364c5020dc3152", "react": "^19.2.5", "react-dom": "^19.2.6" }, @@ -6932,7 +6932,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.staging.20260716T185112Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#b05f3ea0a459e5b3bc5edc66107dc56bdbe5227c", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#24464951d79588ef74f987b34ea5fe53c081a9ef", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6943,8 +6943,8 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#c0421b331dd3d9721a0859162b8c6bb7911fe67e", - "@treeseed/ui": "github:treeseed-ai/ui#ccadc27c31a74db3a4d7ffe6657b5fb0f949612b", + "@treeseed/sdk": "github:treeseed-ai/sdk#ab361c416b2b55e554f46113a9d5474531c26064", + "@treeseed/ui": "github:treeseed-ai/ui#2315c1b9d52719307f2c30072e364c5020dc3152", "astro": "^5.6.1", "esbuild": "^0.28.0", "katex": "^0.16.22", @@ -8948,7 +8948,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.staging.20260716T185056Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#c0421b331dd3d9721a0859162b8c6bb7911fe67e", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#ab361c416b2b55e554f46113a9d5474531c26064", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", @@ -9645,7 +9645,7 @@ }, "node_modules/@treeseed/ui": { "version": "0.12.18-dev.staging.20260716T185026Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#ccadc27c31a74db3a4d7ffe6657b5fb0f949612b", + "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#2315c1b9d52719307f2c30072e364c5020dc3152", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", diff --git a/package.json b/package.json index deece5a3..1bd10ac8 100644 --- a/package.json +++ b/package.json @@ -49,9 +49,9 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#b05f3ea0a459e5b3bc5edc66107dc56bdbe5227c", - "@treeseed/sdk": "github:treeseed-ai/sdk#c0421b331dd3d9721a0859162b8c6bb7911fe67e", - "@treeseed/ui": "github:treeseed-ai/ui#ccadc27c31a74db3a4d7ffe6657b5fb0f949612b", + "@treeseed/core": "github:treeseed-ai/core#24464951d79588ef74f987b34ea5fe53c081a9ef", + "@treeseed/sdk": "github:treeseed-ai/sdk#ab361c416b2b55e554f46113a9d5474531c26064", + "@treeseed/ui": "github:treeseed-ai/ui#2315c1b9d52719307f2c30072e364c5020dc3152", "react": "^19.2.5", "react-dom": "^19.2.6" }, diff --git a/src/layouts/AppLayout.astro b/src/layouts/AppLayout.astro index 1ad9ed08..605b8b28 100644 --- a/src/layouts/AppLayout.astro +++ b/src/layouts/AppLayout.astro @@ -5,10 +5,13 @@ import '@treeseed/ui/styles/ui.css'; import '@treeseed/ui/styles/forms.css'; import '@treeseed/ui/styles/app-shell.css'; import '@treeseed/ui/styles/app-controls.css'; +import '@treeseed/ui/styles/account/forms.css'; import '@treeseed/ui/styles/auth.css'; import ProductShell from '@treeseed/ui/components/astro/shell/layout/ProductShell.astro'; +import ShellIcon from '@treeseed/ui/components/astro/shell/navigation/ShellIcon.astro'; import { resolveAuthenticatedThemePreference } from '../lib/auth/accounts/appearance'; import { compileGuidedThemePalette } from '@treeseed/ui/theme'; +import { SITE_SLOGAN } from '@treeseed/ui/site-brand'; import { createApiFacade } from '../lib/market/api-client'; import { ensureCsrfToken } from '../lib/auth/support/csrf'; @@ -25,6 +28,8 @@ interface Props { currentPath: string; teams: TeamEntry[]; activeTeam?: TeamEntry | null; + contentOwnsPageHeader?: boolean; + timeZone?: string; } const { @@ -33,13 +38,15 @@ const { currentPath, teams, activeTeam = null, + contentOwnsPageHeader = false, + timeZone: suppliedTimeZone, } = Astro.props as Props; const appearance = await resolveAuthenticatedThemePreference(Astro); const api = createApiFacade(Astro); -const [personalThemes, notifications] = await Promise.all([ +const [personalThemes, preferences] = await Promise.all([ api.personalThemes().catch(() => []), - api.accountNotifications(8).catch(() => []), + suppliedTimeZone ? Promise.resolve({ timeZone: suppliedTimeZone }) : api.accountPreferences().catch(() => ({ timeZone: 'UTC' })), ]); const customSchemes = Object.fromEntries(personalThemes.flatMap((theme) => { try { return [[theme.schemeId, compileGuidedThemePalette(theme.palette, theme.baseScheme)]]; } catch { return []; } @@ -60,29 +67,28 @@ const teamOptions = teams.map((team) => ({ description={description} currentPath={currentPath} appearance={appearance} + contentOwnsPageHeader={contentOwnsPageHeader} themeConfig={themeConfig} - notifications={notifications} - notificationCsrfToken={csrfToken} + timeZone={preferences.timeZone} brand={{ name: 'TreeSeed', - tag: 'Identity and teams', + tag: SITE_SLOGAN, href: '/app/', logoSrc: '/logo.svg', logoAlt: '', }} navItems={[ - { label: 'Start', href: '/app/' }, - { label: 'Teams', href: '/app/teams' }, + { label: 'Start', href: '/app/', icon: 'start' }, ]} siteItems={[{ label: 'Home', href: '/' }]} quickActions={[ activeTeam - ? { label: 'Manage team', href: `/app/teams/${encodeURIComponent(activeTeam.id)}/edit`, variant: 'primary' as const } - : { label: 'Create team', href: '/app/teams/new', variant: 'primary' as const }, + ? { label: 'Manage team', href: `/app/teams/${encodeURIComponent(activeTeam.id)}/edit`, variant: 'primary' as const, icon: 'team-settings' as const } + : { label: 'Create team', href: '/app/teams/new', variant: 'primary' as const, icon: 'create' as const }, ]} accountActions={[ - { label: 'Account', href: '/app/account', variant: 'secondary' as const }, - { label: 'Sign out', action: '/auth/logout', method: 'post' as const, hiddenFields: { csrfToken }, variant: 'secondary' as const }, + { label: 'Account', href: '/app/account', variant: 'secondary' as const, icon: 'account' as const }, + { label: 'Sign out', action: '/auth/logout', method: 'post' as const, hiddenFields: { csrfToken }, variant: 'secondary' as const, icon: 'sign-out' as const, iconOnly: true }, ]} >
@@ -96,10 +102,15 @@ const teamOptions = teams.map((team) => ({ ))} - Manage + + + ) : ( - Create team + + + Create team + )}
@@ -117,20 +128,28 @@ const teamOptions = teams.map((team) => ({ }); - diff --git a/src/layouts/PublicLayout.astro b/src/layouts/PublicLayout.astro index 0e8598c4..8803c69a 100644 --- a/src/layouts/PublicLayout.astro +++ b/src/layouts/PublicLayout.astro @@ -7,7 +7,7 @@ import '@treeseed/ui/styles/app-shell.css'; import '@treeseed/ui/styles/site.css'; import PublicShell from '@treeseed/ui/components/astro/shell/layout/PublicShell.astro'; import PublicFooter from '@treeseed/ui/components/astro/shell/chrome/PublicFooter.astro'; -import ShellIconLink from '@treeseed/ui/components/astro/shell/navigation/ShellIconLink.astro'; +import { SITE_SLOGAN } from '@treeseed/ui/site-brand'; import { resolveAnonymousThemePreference, resolveAuthenticatedThemePreference } from '../lib/auth/accounts/appearance'; interface Props { @@ -32,15 +32,12 @@ const appearance = isSignedIn description={description} currentPath={currentPath} appearance={appearance} - brand={{ name: 'TreeSeed', tag: 'Identity and teams', href: '/', logoSrc: '/logo.svg', logoAlt: '' }} + brand={{ name: 'TreeSeed', tag: SITE_SLOGAN, href: '/', logoSrc: '/logo.svg', logoAlt: '' }} navItems={[{ label: 'Home', href: '/' }]} actions={isSignedIn ? [] : [{ label: 'Sign in', href: '/auth/sign-in', variant: 'ghost' as const }]} showAppearanceControl preferServerAppearance={isSignedIn} > - - - ; +export function shouldReloadAppearancePage(pathname: string, persisted: boolean) { + return persisted && pathname.replace(/\/+$/u, '') === '/app/account/appearance'; +} + export function resolveAnonymousThemePreference( context: AnonymousAppearanceContext, form?: FormData, diff --git a/src/lib/auth/support/access-policy.ts b/src/lib/auth/support/access-policy.ts new file mode 100644 index 00000000..fb4019de --- /dev/null +++ b/src/lib/auth/support/access-policy.ts @@ -0,0 +1,18 @@ +const ANONYMOUS_AUTH_ROUTES = new Set([ + '/auth/check-email', + '/auth/forgot-password', + '/auth/register', + '/auth/reset-password', + '/auth/sign-in', +]); + +export function isAnonymousAuthRoute(pathname: string) { + return ANONYMOUS_AUTH_ROUTES.has(pathname) || pathname.startsWith('/auth/callback/'); +} + +export function authenticatedAuthRedirect(pathname: string, hasUsername: boolean) { + if (!isAnonymousAuthRoute(pathname)) return null; + return hasUsername + ? '/app/' + : `/auth/username?returnTo=${encodeURIComponent('/app/')}`; +} diff --git a/src/lib/forms/page-submission.ts b/src/lib/forms/page-submission.ts new file mode 100644 index 00000000..414b9e84 --- /dev/null +++ b/src/lib/forms/page-submission.ts @@ -0,0 +1,22 @@ +import type { APIContext } from 'astro'; +import { formSubmissionResponse, type FormSubmissionResponse } from '@treeseed/ui/forms'; + +export function pageFormResponse( + context: APIContext, + result: FormSubmissionResponse, + fallbackRedirect: string, +) { + const response = formSubmissionResponse(context.request, result, { fallbackRedirect }); + for (const cookie of context.cookies.headers()) response.headers.append('set-cookie', cookie); + return response; +} + +export function pageFormFailure( + context: APIContext, + message: string, + fallbackRedirect: string, + fieldErrors?: Record, + code = 'form_submission_failed', +) { + return pageFormResponse(context, { ok: false, code, message, fieldErrors }, fallbackRedirect); +} diff --git a/src/lib/market/api-client/accounts/contracts/account-preferences.ts b/src/lib/market/api-client/accounts/contracts/account-preferences.ts new file mode 100644 index 00000000..1fcee9f5 --- /dev/null +++ b/src/lib/market/api-client/accounts/contracts/account-preferences.ts @@ -0,0 +1,6 @@ +import type { AccountPreferences } from '@treeseed/sdk/account-contracts'; +import type { ApiClientFacade } from '../../../api-client.ts'; + +export function accountPreferencesMethod(this: ApiClientFacade) { + return this.request('GET', '/v1/auth/web/preferences'); +} diff --git a/src/lib/market/api-client/accounts/updates/update-account-preferences.ts b/src/lib/market/api-client/accounts/updates/update-account-preferences.ts new file mode 100644 index 00000000..1a7718a5 --- /dev/null +++ b/src/lib/market/api-client/accounts/updates/update-account-preferences.ts @@ -0,0 +1,6 @@ +import type { AccountPreferences } from '@treeseed/sdk/account-contracts'; +import type { ApiClientFacade } from '../../../api-client.ts'; + +export function updateAccountPreferencesMethod(this: ApiClientFacade, body: AccountPreferences) { + return this.request('PATCH', '/v1/auth/web/preferences', { body }); +} diff --git a/src/lib/market/api-client/interface.ts b/src/lib/market/api-client/interface.ts index 8b2872c6..b658e585 100644 --- a/src/lib/market/api-client/interface.ts +++ b/src/lib/market/api-client/interface.ts @@ -3,6 +3,7 @@ declare module '../api-client.ts' { acceptTeamInvite: typeof import('./teams/lifecycle/accept-team-invite.ts').acceptTeamInviteMethod; accountDeletionBlockers: typeof import('./accounts/contracts/account-deletion-blockers.ts').accountDeletionBlockersMethod; accountIdentity: typeof import('./accounts/contracts/account-identity.ts').accountIdentityMethod; + accountPreferences: typeof import('./accounts/contracts/account-preferences.ts').accountPreferencesMethod; accountNotifications: typeof import('./accounts/contracts/account-notifications.ts').accountNotificationsMethod; accountSessions: typeof import('./accounts/contracts/account-sessions.ts').accountSessionsMethod; addAccountEmail: typeof import('./accounts/creation/add-account-email.ts').addAccountEmailMethod; @@ -161,6 +162,7 @@ declare module '../api-client.ts' { suspendCommerceCapacityListing: typeof import('./commerce/capacity/retirement/suspend-commerce-capacity-listing.ts').suspendCommerceCapacityListingMethod; unlinkAccountProvider: typeof import('./capacity/providers/contracts/unlink-account-provider.ts').unlinkAccountProviderMethod; updateAccountPassword: typeof import('./accounts/updates/update-account-password.ts').updateAccountPasswordMethod; + updateAccountPreferences: typeof import('./accounts/updates/update-account-preferences.ts').updateAccountPreferencesMethod; updateAccountProfile: typeof import('./accounts/updates/update-account-profile.ts').updateAccountProfileMethod; updateCommerceCapacityListing: typeof import('./commerce/capacity/updates/update-commerce-capacity-listing.ts').updateCommerceCapacityListingMethod; updateCommerceContribution: typeof import('./commerce/governance/updates/update-commerce-contribution.ts').updateCommerceContributionMethod; diff --git a/src/lib/market/api-client/methods.ts b/src/lib/market/api-client/methods.ts index 79ea2a52..96b456ee 100644 --- a/src/lib/market/api-client/methods.ts +++ b/src/lib/market/api-client/methods.ts @@ -3,6 +3,7 @@ import { headersMethod } from './support/contracts/headers.ts'; import { urlMethod } from './support/contracts/url.ts'; import { requestMethod } from './support/contracts/request.ts'; import { accountIdentityMethod } from './accounts/contracts/account-identity.ts'; +import { accountPreferencesMethod } from './accounts/contracts/account-preferences.ts'; import { authProvidersMethod } from './capacity/providers/contracts/auth-providers.ts'; import { requestPasswordResetMethod } from './accounts/creation/request-password-reset.ts'; import { completePasswordResetMethod } from './accounts/lifecycle/complete-password-reset.ts'; @@ -10,6 +11,7 @@ import { confirmEmailMethod } from './accounts/lifecycle/confirm-email.ts'; import { approveDeviceMethod } from './runtime/lifecycle/approve-device.ts'; import { claimUsernameMethod } from './accounts/lifecycle/claim-username.ts'; import { updateAccountProfileMethod } from './accounts/updates/update-account-profile.ts'; +import { updateAccountPreferencesMethod } from './accounts/updates/update-account-preferences.ts'; import { addAccountEmailMethod } from './accounts/creation/add-account-email.ts'; import { resendAccountEmailMethod } from './accounts/contracts/resend-account-email.ts'; import { setPrimaryAccountEmailMethod } from './accounts/updates/set-primary-account-email.ts'; @@ -181,6 +183,7 @@ export function installApiClientFacadeMethods(prototype: ApiClientFacade) { prototype.url = urlMethod; prototype.request = requestMethod; prototype.accountIdentity = accountIdentityMethod; + prototype.accountPreferences = accountPreferencesMethod; prototype.authProviders = authProvidersMethod; prototype.requestPasswordReset = requestPasswordResetMethod; prototype.completePasswordReset = completePasswordResetMethod; @@ -188,6 +191,7 @@ export function installApiClientFacadeMethods(prototype: ApiClientFacade) { prototype.approveDevice = approveDeviceMethod; prototype.claimUsername = claimUsernameMethod; prototype.updateAccountProfile = updateAccountProfileMethod; + prototype.updateAccountPreferences = updateAccountPreferencesMethod; prototype.addAccountEmail = addAccountEmailMethod; prototype.resendAccountEmail = resendAccountEmailMethod; prototype.setPrimaryAccountEmail = setPrimaryAccountEmailMethod; diff --git a/src/middleware.ts b/src/middleware.ts index 6cbd4dec..5f0948df 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -4,6 +4,7 @@ import { getSiteAuthConfig, localAuthCanonicalRedirectUrl } from './lib/auth/con import { apiAccessTokenFromCookies, clearApiAccessTokenCookie, resolveApiBaseUrl } from './lib/market/api-client'; import { ensureLocalCloudflareRuntime } from './lib/runtime/local-cloudflare'; import { ensureCsrfToken } from './lib/auth/support/csrf'; +import { authenticatedAuthRedirect } from './lib/auth/support/access-policy'; const DEV_RESET_COOKIE = 'ts_market_dev_reset'; const PUBLIC_ROUTE_PREFIXES = [ @@ -68,6 +69,11 @@ function isPublicRoute(pathname: string) { function authRedirectFor(context: any) { if (context.locals.auth?.principal) { const username = String(context.locals.auth.principal.metadata?.username ?? '').trim(); + const anonymousAuthRedirect = authenticatedAuthRedirect(context.url.pathname, Boolean(username)); + if (anonymousAuthRedirect) { + const status = ['GET', 'HEAD'].includes(context.request.method.toUpperCase()) ? 302 : 303; + return context.redirect(anonymousAuthRedirect, status); + } if (!username && !isPublicRoute(context.url.pathname) && context.url.pathname !== '/auth/username') { const returnTo = `${context.url.pathname}${context.url.search}`; return context.redirect(`/auth/username?returnTo=${encodeURIComponent(returnTo)}`, 302); diff --git a/src/pages/app/account/appearance.astro b/src/pages/app/account/appearance.astro index 7e55b8a4..16342fef 100644 --- a/src/pages/app/account/appearance.astro +++ b/src/pages/app/account/appearance.astro @@ -12,8 +12,8 @@ if (response) return response; const [themes, appearance] = await Promise.all([frame.api.personalThemes(), resolveAuthenticatedThemePreference(Astro)]); --- - + - + diff --git a/src/pages/app/account/delete.astro b/src/pages/app/account/delete.astro index aa5529bc..2374e591 100644 --- a/src/pages/app/account/delete.astro +++ b/src/pages/app/account/delete.astro @@ -12,8 +12,8 @@ const [identity, deletion, providers] = await Promise.all([frame.api.accountIden const reauthenticationGrantId = Astro.url.searchParams.get('reauthenticationGrantId'); --- - + - provider.provider)} callbackBaseUrl={Astro.url.origin} reauthenticationGrantId={reauthenticationGrantId} csrfToken={frame.csrfToken} error={frame.error} /> + provider.provider)} callbackBaseUrl={Astro.url.origin} reauthenticationGrantId={reauthenticationGrantId} csrfToken={frame.csrfToken} /> diff --git a/src/pages/app/account/index.astro b/src/pages/app/account/index.astro index f7f167ae..572ade0c 100644 --- a/src/pages/app/account/index.astro +++ b/src/pages/app/account/index.astro @@ -2,6 +2,7 @@ import TreeseedAppLayout from '../../../layouts/AppLayout.astro'; import SettingsTemplate from '@treeseed/ui/components/astro/templates/SettingsTemplate.astro'; import AccountIdentitySettings from '@treeseed/ui/components/astro/account/AccountIdentitySettings.astro'; +import AccountTimeZoneSettings from '@treeseed/ui/components/astro/account/AccountTimeZoneSettings.astro'; import { handleIdentityRequest, loadAccountFrame } from '../../../view-models/account-settings'; if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent('/app/account')}`); @@ -13,8 +14,9 @@ const providers = await frame.api.authProviders(); const passwordGrantId = Astro.url.searchParams.get('reauthenticationGrantId'); --- - - - + + + + diff --git a/src/pages/app/account/notifications.astro b/src/pages/app/account/notifications.astro index 84699ff7..64d77d9f 100644 --- a/src/pages/app/account/notifications.astro +++ b/src/pages/app/account/notifications.astro @@ -11,8 +11,8 @@ if (response) return response; const [preferences, projects] = await Promise.all([frame.api.notificationPreferences(), frame.api.listProjectsForPrincipal()]); --- - + - + diff --git a/src/pages/app/account/sessions.astro b/src/pages/app/account/sessions.astro index 54332a63..0f6c4c24 100644 --- a/src/pages/app/account/sessions.astro +++ b/src/pages/app/account/sessions.astro @@ -11,8 +11,8 @@ if (response) return response; const sessions = await frame.api.accountSessions(); --- - + - + diff --git a/src/pages/app/index.astro b/src/pages/app/index.astro index 1a7217d1..95d59f33 100644 --- a/src/pages/app/index.astro +++ b/src/pages/app/index.astro @@ -18,6 +18,7 @@ const dashboard = buildPersonalDashboard(context); currentPath={Astro.url.pathname} teams={context.teams} activeTeam={context.activeTeam} + contentOwnsPageHeader > diff --git a/src/pages/app/teams/[teamId]/delete.astro b/src/pages/app/teams/[teamId]/delete.astro index 9671e444..fc3a0537 100644 --- a/src/pages/app/teams/[teamId]/delete.astro +++ b/src/pages/app/teams/[teamId]/delete.astro @@ -6,6 +6,7 @@ import TextInput from '@treeseed/ui/components/astro/forms/fields/TextInput.astr import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; import Panel from '@treeseed/ui/components/astro/surface/Panel.astro'; import PlainTable from '@treeseed/ui/components/astro/app/controls/data/PlainTable.astro'; +import { formSubmissionResponse } from '@treeseed/ui/forms'; import TreeseedAppLayout from '../../../../layouts/AppLayout.astro'; import { escapeHtml as esc } from '../../../../lib/market/control-ui.js'; import { ApiClientFacade } from '../../../../lib/market/api-client'; @@ -33,18 +34,34 @@ const blockerRows = Object.entries(blockers ?? {}) .map(([key, value]) => ({ name: esc(key), value: esc(Array.isArray(value) ? value.length : value) })); const hasDeletionBlockers = blockerRows.length > 0; const confirmation = team ? `DELETE ${team.name}` : ''; -let formError = ''; const csrfToken = ensureCsrfToken(Astro); let confirmationValue = ''; if (Astro.request.method === 'POST' && team && canManageTeam) { const data = await Astro.request.formData(); - requireCsrf(Astro, data.get('csrfToken')); + try { + requireCsrf(Astro, data.get('csrfToken')); + } catch { + return formSubmissionResponse(Astro.request, { + ok: false, + code: 'csrf_invalid', + message: 'Your form session expired. Refresh the page and try again.', + }, { fallbackRedirect: `/app/teams/${encodeURIComponent(team.id)}/delete` }); + } confirmationValue = String(data.get('confirmation') ?? ''); if (hasDeletionBlockers) { - formError = 'Blocking records must be removed before this team can be deleted.'; + return formSubmissionResponse(Astro.request, { + ok: false, + code: 'team_delete_blocked', + message: 'Blocking records must be removed before this team can be deleted.', + }, { fallbackRedirect: `/app/teams/${encodeURIComponent(team.id)}/delete` }); } else if (confirmationValue !== confirmation) { - formError = `Type "${confirmation}" to delete this team.`; + return formSubmissionResponse(Astro.request, { + ok: false, + code: 'team_delete_confirmation_invalid', + message: 'Please correct the highlighted fields.', + fieldErrors: { confirmation: `Type "${confirmation}" to delete this team.` }, + }, { fallbackRedirect: `/app/teams/${encodeURIComponent(team.id)}/delete` }); } else { try { await new ApiClientFacade(Astro).request('DELETE', `/v1/teams/${encodeURIComponent(team.id)}`, { @@ -54,9 +71,18 @@ if (Astro.request.method === 'POST' && team && canManageTeam) { path: '/app', secure: Astro.url.protocol === 'https:', }); - return Astro.redirect('/app/teams', 303); + return formSubmissionResponse(Astro.request, { + ok: true, + code: 'team_deleted', + message: 'Team deleted.', + redirect: '/app/teams', + }, { fallbackRedirect: '/app/teams' }); } catch (error) { - formError = error instanceof Error ? error.message : 'Team could not be deleted.'; + return formSubmissionResponse(Astro.request, { + ok: false, + code: 'team_delete_failed', + message: error instanceof Error ? error.message : 'Team could not be deleted.', + }, { fallbackRedirect: `/app/teams/${encodeURIComponent(team.id)}/delete` }); } } } @@ -67,9 +93,8 @@ if (Astro.request.method === 'POST' && team && canManageTeam) {
-
+ - {formError && } diff --git a/src/pages/app/teams/[teamId]/edit.astro b/src/pages/app/teams/[teamId]/edit.astro index cfff5499..e690c35e 100644 --- a/src/pages/app/teams/[teamId]/edit.astro +++ b/src/pages/app/teams/[teamId]/edit.astro @@ -6,6 +6,7 @@ import TextInput from '@treeseed/ui/components/astro/forms/fields/TextInput.astr import Textarea from '@treeseed/ui/components/astro/forms/fields/Textarea.astro'; import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; import Panel from '@treeseed/ui/components/astro/surface/Panel.astro'; +import { formSubmissionResponse } from '@treeseed/ui/forms'; import TreeseedAppLayout from '../../../../layouts/AppLayout.astro'; import { ApiClientFacade } from '../../../../lib/market/api-client'; import { loadAppContext, persistActiveTeamSelection, resolveAppTeam } from '../../../../view-models/app-access.js'; @@ -27,9 +28,7 @@ const canManageTeam = Boolean(access?.roles?.some((role: string) => manageableRo if (!team) Astro.response.status = teamResolution.status === 'forbidden' ? 403 : 404; else if (!canManageTeam) Astro.response.status = 403; -let formError = ''; const csrfToken = ensureCsrfToken(Astro); -const saved = Astro.url.searchParams.get('saved') === '1'; const formValues = { name: team?.name ?? '', displayName: team?.displayName ?? '', @@ -39,7 +38,15 @@ const formValues = { if (Astro.request.method === 'POST' && team && canManageTeam) { const data = await Astro.request.formData(); - requireCsrf(Astro, data.get('csrfToken')); + try { + requireCsrf(Astro, data.get('csrfToken')); + } catch { + return formSubmissionResponse(Astro.request, { + ok: false, + code: 'csrf_invalid', + message: 'Your form session expired. Refresh the page and try again.', + }, { fallbackRedirect: `/app/teams/${encodeURIComponent(team.id)}/edit` }); + } const body = { name: String(data.get('name') ?? '').trim(), displayName: String(data.get('displayName') ?? '').trim(), @@ -48,15 +55,28 @@ if (Astro.request.method === 'POST' && team && canManageTeam) { }; if (!body.name) { - formError = 'Name is required.'; - Object.assign(formValues, body); + return formSubmissionResponse(Astro.request, { + ok: false, + code: 'team_name_required', + message: 'Please correct the highlighted fields.', + fieldErrors: { name: 'Name is required.' }, + }, { fallbackRedirect: `/app/teams/${encodeURIComponent(team.id)}/edit` }); } else { try { await new ApiClientFacade(Astro).request('PATCH', `/v1/teams/${encodeURIComponent(team.id)}`, { body }); - return Astro.redirect(`/app/teams/${encodeURIComponent(team.id)}/edit?saved=1`, 303); + return formSubmissionResponse(Astro.request, { + ok: true, + code: 'team_updated', + message: 'Team saved.', + }, { fallbackRedirect: `/app/teams/${encodeURIComponent(team.id)}/edit` }); } catch (error) { - formError = error instanceof Error ? error.message : 'Team could not be saved.'; - Object.assign(formValues, body); + const message = error instanceof Error ? error.message : 'Team could not be saved.'; + return formSubmissionResponse(Astro.request, { + ok: false, + code: 'team_update_failed', + message, + fieldErrors: /(?:name|slug|already exists|taken)/iu.test(message) ? { name: message } : undefined, + }, { fallbackRedirect: `/app/teams/${encodeURIComponent(team.id)}/edit` }); } } } @@ -64,12 +84,10 @@ if (Astro.request.method === 'POST' && team && canManageTeam) { {team && canManageTeam ? ( -
+
- + - {formError && } - {saved && !formError &&

Saved.

}
diff --git a/src/pages/app/teams/[teamId]/members.astro b/src/pages/app/teams/[teamId]/members.astro index b1703625..f11fc8cf 100644 --- a/src/pages/app/teams/[teamId]/members.astro +++ b/src/pages/app/teams/[teamId]/members.astro @@ -46,15 +46,16 @@ const rows = members.map((member: any) => ({ sceneState: String(member.roleKey ?? member.role ?? 'contributor'), name: `${esc(member.displayName ?? member.email ?? member.userId ?? 'Member')}${esc(member.email ?? member.userId ?? '')}`, role: esc(roleOptions.find((option) => option.value === (member.roleKey ?? member.role))?.label ?? member.roleKey ?? member.role ?? 'member'), - actions: ``, + actions: `
`, })); --- {team && canManageTeam ? ( -
+
-
+ +
@@ -73,7 +74,6 @@ const rows = members.map((member: any) => ({ - @@ -91,53 +91,3 @@ const rows = members.map((member: any) => ({ )} - - diff --git a/src/pages/app/teams/index.astro b/src/pages/app/teams/index.astro index 3d450bee..d9babbcb 100644 --- a/src/pages/app/teams/index.astro +++ b/src/pages/app/teams/index.astro @@ -18,6 +18,7 @@ const dashboard = await buildTeamDashboard(context); currentPath={Astro.url.pathname} teams={context.teams} activeTeam={context.activeTeam} + contentOwnsPageHeader > diff --git a/src/pages/app/teams/new.astro b/src/pages/app/teams/new.astro index 8b2fdcda..f77b8926 100644 --- a/src/pages/app/teams/new.astro +++ b/src/pages/app/teams/new.astro @@ -5,6 +5,7 @@ import FormActions from '@treeseed/ui/components/astro/forms/actions/FormActions import TextInput from '@treeseed/ui/components/astro/forms/fields/TextInput.astro'; import Textarea from '@treeseed/ui/components/astro/forms/fields/Textarea.astro'; import Panel from '@treeseed/ui/components/astro/surface/Panel.astro'; +import { formSubmissionResponse } from '@treeseed/ui/forms'; import TreeseedAppLayout from '../../../layouts/AppLayout.astro'; import { ApiClientFacade } from '../../../lib/market/api-client'; import { loadAppContext } from '../../../view-models/app-access.js'; @@ -14,7 +15,6 @@ if (!Astro.locals.auth?.principal) { return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent('/app/teams/new')}`); } -let formError = ''; const csrfToken = ensureCsrfToken(Astro); let formValues = { name: '', @@ -25,7 +25,15 @@ let formValues = { if (Astro.request.method === 'POST') { const data = await Astro.request.formData(); - requireCsrf(Astro, data.get('csrfToken')); + try { + requireCsrf(Astro, data.get('csrfToken')); + } catch { + return formSubmissionResponse(Astro.request, { + ok: false, + code: 'csrf_invalid', + message: 'Your form session expired. Refresh the page and try again.', + }, { fallbackRedirect: '/app/teams/new' }); + } formValues = { name: String(data.get('name') ?? '').trim(), displayName: String(data.get('displayName') ?? '').trim(), @@ -34,7 +42,12 @@ if (Astro.request.method === 'POST') { }; if (!formValues.name) { - formError = 'Name is required.'; + return formSubmissionResponse(Astro.request, { + ok: false, + code: 'team_name_required', + message: 'Please correct the highlighted fields.', + fieldErrors: { name: 'Name is required.' }, + }, { fallbackRedirect: '/app/teams/new' }); } else { try { const team = await new ApiClientFacade(Astro).request('POST', '/v1/teams', { @@ -46,9 +59,20 @@ if (Astro.request.method === 'POST') { secure: Astro.url.protocol === 'https:', maxAge: 31_536_000, }); - return Astro.redirect('/app/teams', 303); + return formSubmissionResponse(Astro.request, { + ok: true, + code: 'team_created', + message: 'Team created.', + redirect: '/app/teams', + }, { fallbackRedirect: '/app/teams' }); } catch (error) { - formError = error instanceof Error ? error.message : 'Team could not be created.'; + const message = error instanceof Error ? error.message : 'Team could not be created.'; + return formSubmissionResponse(Astro.request, { + ok: false, + code: 'team_create_failed', + message, + fieldErrors: /(?:name|slug|already exists|taken)/iu.test(message) ? { name: message } : undefined, + }, { fallbackRedirect: '/app/teams/new' }); } } } @@ -59,9 +83,8 @@ const context = await loadAppContext(Astro);
-
+ - {formError && }
diff --git a/src/pages/auth/device/approve.astro b/src/pages/auth/device/approve.astro index e9d5b2dd..8c23d98f 100644 --- a/src/pages/auth/device/approve.astro +++ b/src/pages/auth/device/approve.astro @@ -8,6 +8,7 @@ import FormActions from '@treeseed/ui/components/astro/forms/actions/FormActions import { resolveAnonymousThemePreference } from '../../../lib/auth/accounts/appearance'; import { createApiFacade } from '../../../lib/market/api-client'; import { ensureCsrfToken, requireCsrf } from '../../../lib/auth/support/csrf'; +import { pageFormFailure, pageFormResponse } from '../../../lib/forms/page-submission'; export const prerender = false; @@ -34,21 +35,23 @@ const directApprovalAction = `${Astro.url.pathname}${Astro.url.search}`; if (Astro.request.method === 'POST') { const form = await Astro.request.formData(); - requireCsrf(Astro, form.get('csrfToken')); userCode = String(form.get('userCode') ?? '').trim().toUpperCase(); - if (!userCode) { - error = 'Enter the CLI login code to approve this session.'; - } else { - try { + try { + requireCsrf(Astro, form.get('csrfToken')); + if (!userCode) { + return pageFormFailure(Astro, 'Please correct the highlighted fields.', directApprovalAction, { userCode: 'Enter the CLI login code to approve this session.' }); + } else { const approvedByApi = await approveThroughApi(); if (!approvedByApi) throw new Error('Device login approval endpoint was not found.'); - approved = true; - notice = 'CLI login approved. You can return to your terminal.'; - } catch (approvalError) { - error = approvalError instanceof Error - ? approvalError.message - : 'CLI login approval failed.'; + return pageFormResponse(Astro, { + ok: true, + code: 'device_login_approved', + message: 'CLI login approved.', + redirect: `${Astro.url.pathname}?approved=1`, + }, directApprovalAction); } + } catch (approvalError) { + return pageFormFailure(Astro, approvalError instanceof Error ? approvalError.message : 'CLI login approval failed.', directApprovalAction); } } --- @@ -68,7 +71,7 @@ if (Astro.request.method === 'POST') { You may close this tab.

) : ( - + diff --git a/src/pages/auth/forgot-password.astro b/src/pages/auth/forgot-password.astro index 198c68ed..e797ffe1 100644 --- a/src/pages/auth/forgot-password.astro +++ b/src/pages/auth/forgot-password.astro @@ -8,6 +8,7 @@ import FormActions from '@treeseed/ui/components/astro/forms/actions/FormActions import { resolveAnonymousThemePreference } from '../../lib/auth/accounts/appearance'; import { normalizeReturnTo, redirectAuthenticatedToApp } from '../../lib/auth/support/flow'; import { createApiFacade } from '../../lib/market/api-client'; +import { pageFormFailure, pageFormResponse } from '../../lib/forms/page-submission'; export const prerender = false; @@ -27,13 +28,18 @@ if (Astro.request.method === 'POST') { const email = String(form.get('email') ?? '').trim(); submittedEmail = email; if (!email) { - error = 'Email is required.'; + return pageFormFailure(Astro, 'Please correct the highlighted fields.', Astro.url.pathname + Astro.url.search, { email: 'Email is required.' }); } else { try { await api.requestPasswordReset(email); - return Astro.redirect(`/auth/check-email?kind=reset&email=${encodeURIComponent(email)}&returnTo=${encodeURIComponent(returnTo)}`, 303); + return pageFormResponse(Astro, { + ok: true, + code: 'password_reset_requested', + message: 'Password reset email sent.', + redirect: `/auth/check-email?kind=reset&email=${encodeURIComponent(email)}&returnTo=${encodeURIComponent(returnTo)}`, + }, Astro.url.pathname + Astro.url.search); } catch (requestError) { - error = requestError instanceof Error ? requestError.message : 'Password reset could not be requested.'; + return pageFormFailure(Astro, requestError instanceof Error ? requestError.message : 'Password reset could not be requested.', Astro.url.pathname + Astro.url.search); } } } @@ -49,7 +55,7 @@ if (Astro.request.method === 'POST') { Back to sign in - + diff --git a/src/pages/auth/logout.ts b/src/pages/auth/logout.ts index e02a4ca7..336e8f07 100644 --- a/src/pages/auth/logout.ts +++ b/src/pages/auth/logout.ts @@ -1,6 +1,7 @@ import type { APIRoute } from 'astro'; import { requireCsrf } from '../../lib/auth/support/csrf'; import { clearApiAccessTokenCookie, createApiFacade } from '../../lib/market/api-client'; +import { pageFormFailure, pageFormResponse } from '../../lib/forms/page-submission'; export const prerender = false; @@ -12,10 +13,13 @@ export const POST: APIRoute = async (context) => { requireCsrf(context, form.get('csrfToken')); await createApiFacade(context).request('POST', '/v1/auth/logout', { body: {} }); clearApiAccessTokenCookie(context); - const response = context.redirect('/auth/sign-in?signedOut=1', 303); - for (const cookie of context.cookies.headers()) response.headers.append('set-cookie', cookie); - return response; + return pageFormResponse(context, { + ok: true, + code: 'signed_out', + message: 'You have been signed out.', + redirect: '/auth/sign-in?signedOut=1', + }, '/auth/sign-in'); } catch { - return context.redirect('/auth/sign-in?error=Unable%20to%20sign%20out', 303); + return pageFormFailure(context, 'Unable to sign out.', '/auth/sign-in'); } }; diff --git a/src/pages/auth/register.astro b/src/pages/auth/register.astro index 00646ee0..7b1e6af8 100644 --- a/src/pages/auth/register.astro +++ b/src/pages/auth/register.astro @@ -6,6 +6,7 @@ import { authProviderCapabilities, normalizeReturnTo, redirectAuthenticatedToApp import { composeDisplayNameFromParts, normalizeUsername, validateUsername } from '../../lib/auth/support/profile-validation'; import { passwordMeetsPolicy, passwordPolicyMessage } from '../../lib/auth/accounts/password-policy'; import { resolveAnonymousThemePreference, setAnonymousThemeCookies } from '../../lib/auth/accounts/appearance'; +import { pageFormFailure, pageFormResponse } from '../../lib/forms/page-submission'; export const prerender = false; @@ -46,13 +47,20 @@ if (Astro.request.method === 'POST') { submittedEmail = email; const usernameValidation = validateUsername(username); if (!firstName || !lastName || !username || !email || !password || !confirmPassword) { - error = 'First name, last name, username, email, password, and password confirmation are required.'; + return pageFormFailure(Astro, 'Please correct the highlighted fields.', Astro.url.pathname + Astro.url.search, { + ...(!firstName ? { firstName: 'First name is required.' } : {}), + ...(!lastName ? { lastName: 'Last name is required.' } : {}), + ...(!username ? { username: 'Username is required.' } : {}), + ...(!email ? { email: 'Email is required.' } : {}), + ...(!password ? { password: 'Password is required.' } : {}), + ...(!confirmPassword ? { confirmPassword: 'Password confirmation is required.' } : {}), + }); } else if (!usernameValidation.ok) { - error = usernameValidation.message; + return pageFormFailure(Astro, 'Please correct the highlighted fields.', Astro.url.pathname + Astro.url.search, { username: usernameValidation.message }); } else if (password !== confirmPassword) { - error = 'Passwords do not match.'; + return pageFormFailure(Astro, 'Please correct the highlighted fields.', Astro.url.pathname + Astro.url.search, { confirmPassword: 'Passwords do not match.' }); } else if (!passwordMeetsPolicy(password)) { - error = passwordPolicyMessage(); + return pageFormFailure(Astro, 'Please correct the highlighted fields.', Astro.url.pathname + Astro.url.search, { password: passwordPolicyMessage() }); } else { const result = await submitMarketEmailAuthFlow(Astro, 'sign-up/email', { name, @@ -70,23 +78,28 @@ if (Astro.request.method === 'POST') { if (result.ok) { setAnonymousThemeCookies(Astro, appearance); if (result.confirmationRequired) { - return Astro.redirect(`/auth/check-email?kind=verify&email=${encodeURIComponent(email)}&returnTo=${encodeURIComponent(returnTo)}`, 303); - } - const response = Astro.redirect(returnTo, 303); - for (const cookie of Astro.cookies.headers()) { - response.headers.append('set-cookie', cookie); + return pageFormResponse(Astro, { + ok: true, + code: 'registration_confirmation_required', + message: 'Account created. Check your email to continue.', + redirect: `/auth/check-email?kind=verify&email=${encodeURIComponent(email)}&returnTo=${encodeURIComponent(returnTo)}`, + }, Astro.url.pathname + Astro.url.search); } - return response; + return pageFormResponse(Astro, { ok: true, code: 'registration_complete', message: 'Account created.', redirect: returnTo }, Astro.url.pathname + Astro.url.search); } - error = result.error; + const resultMessage = result.error.toLowerCase(); + const fieldErrors = { + ...(resultMessage.includes('username') ? { username: 'This username is not available to register.' } : {}), + ...(resultMessage.includes('email') || resultMessage.includes('already exists') ? { email: 'This email is not available to register.' } : {}), + }; + return pageFormFailure(Astro, result.error, Astro.url.pathname + Astro.url.search, fieldErrors); } } --- - + Back to sign in - + - - - - - - - + diff --git a/src/pages/auth/sign-in.astro b/src/pages/auth/sign-in.astro index 1f245958..853f6acd 100644 --- a/src/pages/auth/sign-in.astro +++ b/src/pages/auth/sign-in.astro @@ -16,6 +16,7 @@ import { submitMarketEmailAuthFlow, } from '../../lib/auth/support/flow'; import { resolveAnonymousThemePreference } from '../../lib/auth/accounts/appearance'; +import { pageFormFailure, pageFormResponse } from '../../lib/forms/page-submission'; export const prerender = false; @@ -61,7 +62,10 @@ if (Astro.request.method === 'POST') { const password = String(form.get('password') ?? ''); submittedIdentifier = identifier; if (!identifier || !password) { - error = 'Email or username and password are required.'; + return pageFormFailure(Astro, 'Please correct the highlighted fields.', Astro.url.pathname + Astro.url.search, { + ...(!identifier ? { login: 'Email or username is required.' } : {}), + ...(!password ? { password: 'Password is required.' } : {}), + }); } else { const result = await submitMarketEmailAuthFlow(Astro, 'sign-in/email', { login: identifier, @@ -69,13 +73,9 @@ if (Astro.request.method === 'POST') { rememberMe: true, }); if (result.ok) { - const response = Astro.redirect(returnTo, 303); - for (const cookie of Astro.cookies.headers()) { - response.headers.append('set-cookie', cookie); - } - return response; + return pageFormResponse(Astro, { ok: true, code: 'signed_in', message: 'Signed in.', redirect: returnTo }, Astro.url.pathname + Astro.url.search); } - error = result.error; + return pageFormFailure(Astro, result.error, Astro.url.pathname + Astro.url.search); } } @@ -86,7 +86,6 @@ const appearance = resolveAnonymousThemePreference(Astro); {capabilities.internal.enabled ? ( - + diff --git a/src/pages/auth/username.astro b/src/pages/auth/username.astro index 57ef1f6e..0d127990 100644 --- a/src/pages/auth/username.astro +++ b/src/pages/auth/username.astro @@ -6,6 +6,7 @@ import { resolveAuthenticatedThemePreference } from '../../lib/auth/accounts/app import { normalizeReturnTo } from '../../lib/auth/support/flow'; import { ensureCsrfToken, requireCsrf } from '../../lib/auth/support/csrf'; import { createApiFacade, setApiAccessTokenCookie } from '../../lib/market/api-client'; +import { pageFormFailure, pageFormResponse } from '../../lib/forms/page-submission'; export const prerender = false; if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname + Astro.url.search)}`, 302); @@ -21,10 +22,12 @@ if (Astro.request.method === 'POST') { requireCsrf(Astro, form.get('csrfToken')); const result = await createApiFacade(Astro).claimUsername(value); if (result.accessToken) setApiAccessTokenCookie(Astro, result.accessToken, Number(result.expiresInSeconds ?? 900)); - const redirect = Astro.redirect(returnTo, 303); - for (const cookie of Astro.cookies.headers()) redirect.headers.append('set-cookie', cookie); - return redirect; - } catch (caught) { error = caught instanceof Error ? caught.message : 'Username could not be assigned.'; } + return pageFormResponse(Astro, { ok: true, code: 'username_claimed', message: 'Username saved.', redirect: returnTo }, Astro.url.pathname + Astro.url.search); + } catch (caught) { + return pageFormFailure(Astro, 'Please correct the highlighted fields.', Astro.url.pathname + Astro.url.search, { + username: caught instanceof Error ? caught.message : 'Username could not be assigned.', + }); + } } const appearance = await resolveAuthenticatedThemePreference(Astro); --- diff --git a/src/pages/t/[name].astro b/src/pages/t/[name].astro index 4f26e3f7..974415cd 100644 --- a/src/pages/t/[name].astro +++ b/src/pages/t/[name].astro @@ -3,6 +3,7 @@ import TreeseedPublicLayout from '../../layouts/PublicLayout.astro'; import PublicProfileHeader from '@treeseed/ui/components/astro/public/PublicProfileHeader.astro'; import PublicSection from '@treeseed/ui/components/astro/public/PublicSection.astro'; import PublicStack from '@treeseed/ui/components/astro/public/PublicStack.astro'; +import { formatTimestamp } from '@treeseed/ui/timestamps'; import { resolvePublicTeamProfile } from '../../lib/market/public-access.js'; export const prerender = false; @@ -17,7 +18,7 @@ if (!profile?.team) return new Response('Not found', { status: 404 }); const team = profile.team; const displayName = team.displayName ?? team.name; const createdDate = team.createdAt - ? new Date(team.createdAt).toLocaleDateString('en', { month: 'long', year: 'numeric' }) + ? formatTimestamp(team.createdAt, { style: 'date', timeZone: 'UTC' }) : null; --- diff --git a/src/pages/u/[username].astro b/src/pages/u/[username].astro index 88dec1ff..fd3bfcb0 100644 --- a/src/pages/u/[username].astro +++ b/src/pages/u/[username].astro @@ -1,6 +1,7 @@ --- import TreeseedPublicLayout from '../../layouts/PublicLayout.astro'; import ProfileTemplate from '@treeseed/ui/components/astro/templates/ProfileTemplate.astro'; +import { formatTimestamp } from '@treeseed/ui/timestamps'; import { normalizeUsername, validateUsername } from '../../lib/auth/support/profile-validation'; import { resolvePublicUserProfile } from '../../lib/market/public-access.js'; @@ -17,7 +18,7 @@ if (!profile?.user) return new Response('Not found', { status: 404 }); const user = profile.user; const displayName = user.displayName || `@${user.username}`; const joinedDate = user.joinedAt - ? new Date(user.joinedAt).toLocaleDateString('en', { month: 'long', year: 'numeric' }) + ? formatTimestamp(user.joinedAt, { style: 'date', timeZone: 'UTC' }) : null; --- diff --git a/src/plugin.ts b/src/plugin.ts index b81095ee..d3646726 100644 --- a/src/plugin.ts +++ b/src/plugin.ts @@ -120,6 +120,7 @@ const adminPlugin: Plugin = definePlugin({ '@treeseed/ui/styles/forms.css', '@treeseed/ui/styles/app-shell.css', '@treeseed/ui/styles/app-controls.css', + '@treeseed/ui/styles/account/forms.css', '@treeseed/ui/styles/auth.css', ], envSchema: ADMIN_ENV_SCHEMA, diff --git a/src/routes.ts b/src/routes.ts index fbab30bc..6b7c5562 100644 --- a/src/routes.ts +++ b/src/routes.ts @@ -2,8 +2,18 @@ import { defineRoute, validateRouteCapabilities, type RouteCapability, type Site type CapabilityInput = Partial & Pick; +const anonymousAuthPatterns = new Set([ + '/auth/register', + '/auth/check-email', + '/auth/sign-in', + '/auth/forgot-password', + '/auth/reset-password', + '/auth/callback/[provider]', +]); + function adminRoute(pattern: string, resourcePath: string, input: CapabilityInput): SiteRouteContribution { const auth = pattern.startsWith('/auth'); + const anonymousAuth = anonymousAuthPatterns.has(pattern); const personal = pattern === '/app' || pattern.startsWith('/app/account'); const team = pattern.startsWith('/app/teams') || pattern.startsWith('/t/') || pattern.startsWith('/team-invites'); const support = pattern.startsWith('/v1/'); @@ -15,7 +25,7 @@ function adminRoute(pattern: string, resourcePath: string, input: CapabilityInpu template: auth ? 'AuthCard' : pattern === '/app' ? 'DashboardTemplate' : pattern.startsWith('/u/') || pattern.startsWith('/t/') ? 'ProfileTemplate' : support ? 'Standalone' : pattern.endsWith('/new') ? 'WizardTemplate' : pattern.startsWith('/app/account') || pattern.includes('/delete') ? 'SettingsTemplate' : 'CollectionTemplate', surface: auth ? 'auth' : personal ? 'personal' : team ? 'team' : support ? 'system' : 'public', resourceType: auth ? 'auth-session' : personal ? 'account' : team ? 'team' : support ? 'api-proxy' : 'user-profile', - accessPolicy: auth ? ['anonymous-safe auth flow', 'safe return URL'] : support ? ['target API policy'] : pattern.startsWith('/u/') || pattern.startsWith('/t/') ? ['public read'] : ['signed-in principal'], + accessPolicy: anonymousAuth ? ['anonymous principal only', 'safe return URL'] : auth ? ['signed-in principal'] : support ? ['target API policy'] : pattern.startsWith('/u/') || pattern.startsWith('/t/') ? ['public read'] : ['signed-in principal'], viewModelDependencies: ['Admin auth/session API facade'], navigation: auth || support || pattern.includes('/delete') ? 'hidden' : personal ? 'secondary' : 'contextual', states: ['loading', 'forbidden', 'unavailable', 'validation', 'conflict', 'retry', 'success', 'not-found'], @@ -40,14 +50,20 @@ export const ADMIN_ROUTES: readonly SiteRouteContribution[] = validateRouteCapab adminRoute('/app/teams/[teamId]/members', 'pages/app/teams/[teamId]/members.astro', { id: 'admin.team.members', description: 'Team membership, invitation, role, and removal operations.', guarantees: ['guarantee.team.membership.invite-team-members.017', 'guarantee.team.membership.change-member-role.019', 'guarantee.team.membership.remove-team-member.020'] }), adminRoute('/auth/register', 'pages/auth/register.astro', { id: 'admin.auth.register', description: 'Credential registration with username/email availability and immutable username disclosure.', guarantees: ['guarantee.user.auth.register-user.001'] }), adminRoute('/auth/check-email', 'pages/auth/check-email.astro', { id: 'admin.auth.check-email', description: 'Hidden verification/reset check-inbox continuation.', archetype: 'message', template: 'MessageTemplate' }), - adminRoute('/auth/confirm-email', 'pages/auth/confirm-email.astro', { id: 'admin.auth.confirm-email', description: 'Email-confirmation token result and recovery.', archetype: 'message', guarantees: ['guarantee.user.auth.verify-email.002'] }), + adminRoute('/auth/confirm-email', 'pages/auth/confirm-email.astro', { + id: 'admin.auth.confirm-email', + description: 'Email-confirmation token result and recovery for registration and signed-in account email management.', + archetype: 'message', + accessPolicy: ['valid one-time confirmation token', 'anonymous or signed-in principal', 'safe return URL'], + guarantees: ['guarantee.user.auth.verify-email.002', 'guarantee.user.account.edit-account-settings.006'], + }), adminRoute('/auth/sign-in', 'pages/auth/sign-in.astro', { id: 'admin.auth.sign-in', description: 'Credential and configured-provider sign-in.', guarantees: ['guarantee.user.auth.user-login.004'] }), adminRoute('/auth/logout', 'pages/auth/logout.ts', { id: 'admin.auth.logout', description: 'CSRF-safe POST session termination; non-mutating GET redirect.', responseKind: 'redirect', archetype: 'redirect', accessPolicy: ['GET is non-mutating', 'POST requires signed-in session and double-submit CSRF'], guarantees: ['guarantee.user.auth.user-logout.005'] }), adminRoute('/auth/forgot-password', 'pages/auth/forgot-password.astro', { id: 'admin.auth.forgot-password', description: 'Privacy-safe password-reset request.' }), adminRoute('/auth/reset-password', 'pages/auth/reset-password.astro', { id: 'admin.auth.reset-password', description: 'Token-bound password reset.', guarantees: ['guarantee.user.auth.forgot-reset-password.003'] }), adminRoute('/auth/username', 'pages/auth/username.astro', { id: 'admin.auth.username-claim', description: 'Permanent username claim for first-time provider users.', accessPolicy: ['restricted provider-onboarding session', 'username not already assigned', 'safe return URL'] }), adminRoute('/auth/device/approve', 'pages/auth/device/approve.astro', { id: 'admin.auth.device-approve', description: 'Authenticated CLI/device authorization approval.', accessPolicy: ['signed-in principal', 'valid pending device request'] }), - adminRoute('/auth/callback/[provider]', 'pages/auth/callback/[provider].ts', { id: 'admin.auth.provider-callback', description: 'Hidden configured-provider callback with one-time state, nonce, PKCE, and safe redirect.', responseKind: 'redirect', archetype: 'redirect', accessPolicy: ['configured provider', 'one-time database state', 'nonce and PKCE validation', 'safe return URL'] }), + adminRoute('/auth/callback/[provider]', 'pages/auth/callback/[provider].ts', { id: 'admin.auth.provider-callback', description: 'Hidden configured-provider callback with one-time state, nonce, PKCE, and safe redirect.', responseKind: 'redirect', archetype: 'redirect', accessPolicy: ['anonymous principal only', 'configured provider', 'one-time database state', 'nonce and PKCE validation', 'safe return URL'] }), adminRoute('/u/[username]', 'pages/u/[username].astro', { id: 'admin.profile.user', description: 'Public identity-only user profile.', guarantees: ['guarantee.user.account.view-user-profile.010'] }), adminRoute('/t/[name]', 'pages/t/[name].astro', { id: 'admin.profile.team', description: 'Public identity-only team profile.', guarantees: ['guarantee.team.team.view-team-profile.015'] }), adminRoute('/team-invites/[token]/accept', 'pages/team-invites/[token]/accept.astro', { id: 'admin.team.invite-accept', description: 'Idempotent invitation acceptance and safe destination.', guarantees: ['guarantee.team.membership.accept-team-invitation.018'] }), diff --git a/src/view-models/account-settings.ts b/src/view-models/account-settings.ts index bb5996f9..1fc5f30c 100644 --- a/src/view-models/account-settings.ts +++ b/src/view-models/account-settings.ts @@ -1,6 +1,9 @@ import type { APIContext } from 'astro'; import { NOTIFICATION_CONTENT_CAPABILITIES, normalizeNotificationPreferences, type PersonalThemeDraft } from '@treeseed/sdk/account-contracts'; import { validateGuidedThemePalette } from '@treeseed/ui/theme'; +import { formSubmissionResponse, type FormSubmissionResponse } from '@treeseed/ui/forms'; +import { isValidTimeZone } from '@treeseed/ui/timestamps'; +import { passwordMeetsPolicy, passwordPolicyMessage } from '../lib/auth/accounts/password-policy'; import { ensureCsrfToken, requireCsrf } from '../lib/auth/support/csrf'; import { clearApiAccessTokenCookie, createApiFacade } from '../lib/market/api-client'; import { loadAppContext } from './app-access'; @@ -13,73 +16,109 @@ export const ACCOUNT_SECTIONS = [ { id: 'delete', label: 'Delete', href: '/app/account/delete' }, ] as const; -function redirectStatus(context: APIContext, route: string, status: string, error = false) { - const target = new URL(route, context.url.origin); - target.searchParams.set(error ? 'error' : 'status', status); - return context.redirect(`${target.pathname}${target.search}`, 303); +function respond(context: APIContext, route: string, result: FormSubmissionResponse) { + return formSubmissionResponse(context.request, result, { fallbackRedirect: route }); } function errorMessage(error: unknown) { return error instanceof Error ? error.message : 'The account operation failed.'; } +function failure(error: unknown, fieldErrors?: Record): FormSubmissionResponse { + return { ok: false, code: 'account_operation_failed', message: errorMessage(error), fieldErrors }; +} + export async function loadAccountFrame(context: APIContext, section: typeof ACCOUNT_SECTIONS[number]['id']) { const app = await loadAppContext(context); + const api = createApiFacade(context); return { app, - api: createApiFacade(context), + api, + preferences: await api.accountPreferences().catch(() => ({ timeZone: 'UTC' })), csrfToken: ensureCsrfToken(context), sections: ACCOUNT_SECTIONS.map((entry) => ({ ...entry, current: entry.id === section })), - status: context.url.searchParams.get('status'), - error: context.url.searchParams.get('error'), }; } export async function handleIdentityRequest(context: APIContext, api: ReturnType) { if (context.request.method !== 'POST') return null; const form = await context.request.formData(); - requireCsrf(context, form.get('csrfToken')); const intent = String(form.get('intent') ?? ''); try { + requireCsrf(context, form.get('csrfToken')); if (intent === 'profile') await api.updateAccountProfile({ firstName: String(form.get('firstName') ?? ''), lastName: String(form.get('lastName') ?? ''), image: String(form.get('image') ?? '') || null }); + else if (intent === 'time-zone') { + const timeZone = String(form.get('timeZone') ?? ''); + if (!isValidTimeZone(timeZone)) throw new Error('Select a valid time zone.'); + await api.updateAccountPreferences({ timeZone }); + } else if (intent === 'add-email') await api.addAccountEmail(String(form.get('email') ?? '')); else if (intent === 'resend-email') await api.resendAccountEmail(String(form.get('emailId') ?? '')); else if (intent === 'primary-email') await api.setPrimaryAccountEmail(String(form.get('emailId') ?? '')); else if (intent === 'delete-email') await api.deleteAccountEmail(String(form.get('emailId') ?? '')); - else if (intent === 'password') await api.updateAccountPassword({ currentPassword: String(form.get('currentPassword') ?? ''), password: String(form.get('password') ?? ''), reauthenticationGrantId: String(form.get('reauthenticationGrantId') ?? '') || undefined }); + else if (intent === 'password') { + const password = String(form.get('password') ?? ''); + const confirmPassword = String(form.get('confirmPassword') ?? ''); + if (password !== confirmPassword) throw new Error('Passwords do not match.'); + if (!passwordMeetsPolicy(password)) throw new Error(passwordPolicyMessage()); + await api.updateAccountPassword({ currentPassword: String(form.get('currentPassword') ?? ''), password, reauthenticationGrantId: String(form.get('reauthenticationGrantId') ?? '') || undefined }); + } else if (intent === 'unlink-provider') await api.unlinkAccountProvider(String(form.get('identityId') ?? '')); else throw new Error('Unknown account action.'); - return redirectStatus(context, '/app/account', intent === 'profile' ? 'Identity saved.' : intent === 'password' ? 'Password updated.' : 'Account updated.'); + return respond(context, '/app/account', { + ok: true, + code: intent === 'password' ? 'password_updated' : 'account_updated', + message: intent === 'profile' + ? 'Identity saved.' + : intent === 'time-zone' + ? 'Time zone saved.' + : intent === 'password' + ? 'Password updated.' + : intent === 'add-email' || intent === 'resend-email' + ? 'Verification email sent.' + : 'Account updated.', + }); } catch (error) { - return redirectStatus(context, '/app/account', errorMessage(error), true); + const message = errorMessage(error); + const fieldErrors: Record | undefined = intent === 'password' + ? message === 'Passwords do not match.' + ? { confirmPassword: message } + : /current password|reauthentication/iu.test(message) + ? { currentPassword: message } + : { password: message } + : intent === 'add-email' + ? { email: message } + : intent === 'time-zone' + ? { timeZone: message } + : undefined; + return respond(context, '/app/account', failure(error, fieldErrors)); } } export async function handleSessionRequest(context: APIContext, api: ReturnType) { if (context.request.method !== 'POST') return null; const form = await context.request.formData(); - requireCsrf(context, form.get('csrfToken')); try { + requireCsrf(context, form.get('csrfToken')); await api.revokeAccountSession(String(form.get('sessionId') ?? '')); - return redirectStatus(context, '/app/account/sessions', 'Session revoked.'); - } catch (error) { return redirectStatus(context, '/app/account/sessions', errorMessage(error), true); } + return respond(context, '/app/account/sessions', { ok: true, code: 'session_revoked', message: 'Session revoked.' }); + } catch (error) { return respond(context, '/app/account/sessions', failure(error)); } } export async function handleNotificationRequest(context: APIContext, api: ReturnType) { if (context.request.method !== 'POST') return null; const form = await context.request.formData(); - requireCsrf(context, form.get('csrfToken')); const overrideProjects = form.getAll('overrideProjects').map(String); const preferences = normalizeNotificationPreferences({ emailCadence: String(form.get('emailCadence') ?? 'daily') as any, - timeZone: String(form.get('timeZone') ?? 'UTC'), globalContentTypes: form.getAll('globalContentTypes').map(String), projectOverrides: overrideProjects.map((projectId) => ({ projectId, contentTypes: form.getAll(`projectTypes:${projectId}`).map(String) })), }); try { + requireCsrf(context, form.get('csrfToken')); await api.updateNotificationPreferences(preferences); - return redirectStatus(context, '/app/account/notifications', 'Notification preferences saved.'); - } catch (error) { return redirectStatus(context, '/app/account/notifications', errorMessage(error), true); } + return respond(context, '/app/account/notifications', { ok: true, code: 'notification_preferences_saved', message: 'Notification preferences saved.' }); + } catch (error) { return respond(context, '/app/account/notifications', failure(error)); } } function themeDraft(form: FormData): PersonalThemeDraft { @@ -95,26 +134,26 @@ function themeDraft(form: FormData): PersonalThemeDraft { export async function handleAppearanceRequest(context: APIContext, api: ReturnType) { if (context.request.method !== 'POST') return null; const form = await context.request.formData(); - requireCsrf(context, form.get('csrfToken')); const intent = String(form.get('intent') ?? ''); try { + requireCsrf(context, form.get('csrfToken')); if (intent === 'create-theme') await api.createPersonalTheme(themeDraft(form)); else if (intent === 'update-theme') await api.updatePersonalTheme(String(form.get('themeId') ?? ''), themeDraft(form)); else if (intent === 'delete-theme') await api.deletePersonalTheme(String(form.get('themeId') ?? '')); else throw new Error('Unknown appearance action.'); - return redirectStatus(context, '/app/account/appearance', intent === 'delete-theme' ? 'Theme deleted.' : 'Theme saved.'); - } catch (error) { return redirectStatus(context, '/app/account/appearance', errorMessage(error), true); } + return respond(context, '/app/account/appearance', { ok: true, code: intent === 'delete-theme' ? 'theme_deleted' : 'theme_saved', message: intent === 'delete-theme' ? 'Theme deleted.' : 'Theme saved.' }); + } catch (error) { return respond(context, '/app/account/appearance', failure(error)); } } export async function handleDeletionRequest(context: APIContext, api: ReturnType) { if (context.request.method !== 'POST') return null; const form = await context.request.formData(); - requireCsrf(context, form.get('csrfToken')); try { + requireCsrf(context, form.get('csrfToken')); await api.deleteCurrentAccount({ confirmation: String(form.get('confirmation') ?? ''), currentPassword: String(form.get('currentPassword') ?? ''), reauthenticationGrantId: String(form.get('reauthenticationGrantId') ?? '') || undefined }); clearApiAccessTokenCookie(context); - return context.redirect('/auth/sign-in?deleted=1', 303); - } catch (error) { return redirectStatus(context, '/app/account/delete', errorMessage(error), true); } + return respond(context, '/app/account/delete', { ok: true, code: 'account_deleted', message: 'Account deleted.', redirect: '/auth/sign-in?deleted=1' }); + } catch (error) { return respond(context, '/app/account/delete', failure(error)); } } export { NOTIFICATION_CONTENT_CAPABILITIES }; diff --git a/tests/contract/package/admin-package.test.ts b/tests/contract/package/admin-package.test.ts index 5158957d..e70855a3 100644 --- a/tests/contract/package/admin-package.test.ts +++ b/tests/contract/package/admin-package.test.ts @@ -6,6 +6,7 @@ import type { PluginSiteContext, SiteExtensionContribution } from '@treeseed/sdk import { ADMIN_ROUTES, ADMIN_SUPPORT_ROUTES } from '../../../src/routes'; import { DEFAULT_ADMIN_COMMERCE_PROVIDER } from '../../../src/commerce'; import { DEFAULT_SECRET_MANAGER_PROVIDERS } from '../../../src/secret-managers'; +import { authenticatedAuthRedirect, isAnonymousAuthRoute } from '../../../src/lib/auth/support/access-policy'; const EXPECTED_ROUTES = [ '/app', @@ -78,8 +79,45 @@ describe('@treeseed/admin identity and team surface', () => { ); }); + it('keeps anonymous authentication routes inaccessible to active sessions', () => { + const anonymousRoutes = [ + '/auth/register', + '/auth/check-email', + '/auth/sign-in', + '/auth/forgot-password', + '/auth/reset-password', + '/auth/callback/github', + ]; + for (const route of anonymousRoutes) { + expect(isAnonymousAuthRoute(route), route).toBe(true); + expect(authenticatedAuthRedirect(route, true), route).toBe('/app/'); + expect(authenticatedAuthRedirect(route, false), route).toBe('/auth/username?returnTo=%2Fapp%2F'); + } + for (const route of ['/auth/confirm-email', '/auth/logout', '/auth/username', '/auth/device/approve', '/team-invites/token/accept']) { + expect(isAnonymousAuthRoute(route), route).toBe(false); + expect(authenticatedAuthRedirect(route, true), route).toBeNull(); + } + const routes = new Map(ADMIN_ROUTES.map((route) => [route.pattern, route.capability?.accessPolicy ?? []])); + for (const route of [ + '/auth/register', + '/auth/check-email', + '/auth/sign-in', + '/auth/forgot-password', + '/auth/reset-password', + '/auth/callback/[provider]', + ]) { + expect(routes.get(route), route).toContain('anonymous principal only'); + } + expect(routes.get('/auth/confirm-email')).toEqual(expect.arrayContaining([ + 'valid one-time confirmation token', + 'anonymous or signed-in principal', + 'safe return URL', + ])); + }); + it('keeps navigation limited to identity and team management', () => { const appLayout = readFileSync('src/layouts/AppLayout.astro', 'utf8'); + const publicLayout = readFileSync('src/layouts/PublicLayout.astro', 'utf8'); for (const target of ['/app/', '/app/account', '/app/teams', '/app/teams/new']) { expect(appLayout).toContain(target); } @@ -87,6 +125,36 @@ describe('@treeseed/admin identity and team surface', () => { const escaped = target.replace(/[.*+?^${}()|[\]\\]/gu, '\\$&'); expect(appLayout).not.toMatch(new RegExp(`(?:href|action)\\s*[:=]\\s*['"\\x60]${escaped}`, 'u')); } + expect(appLayout).not.toContain('accountNotifications'); + expect(appLayout).not.toMatch(/\bnotifications=/u); + expect(appLayout).toContain('SITE_SLOGAN'); + expect(appLayout).toContain("from '@treeseed/ui/site-brand'"); + expect(appLayout).toContain("from '@treeseed/ui/components/astro/shell/navigation/ShellIcon.astro'"); + for (const icon of ['start', 'team-settings', 'account', 'sign-out']) { + expect(appLayout).toContain(`icon: '${icon}'`); + } + expect(appLayout).not.toContain("{ label: 'Teams'"); + expect(appLayout).toContain(' { + const appLayout = readFileSync('src/layouts/AppLayout.astro', 'utf8'); + const appPages = filesUnder('src/pages/app').filter((path) => path.endsWith('.astro')); + + expect(appLayout).toContain('contentOwnsPageHeader={contentOwnsPageHeader}'); + for (const path of appPages) { + const source = readFileSync(path, 'utf8'); + const contentTemplateOwnsHeader = /<(?:DashboardTemplate|SettingsTemplate)\b/u.test(source); + expect(source.includes('contentOwnsPageHeader'), path).toBe(contentTemplateOwnsHeader); + } }); it('uses public package boundaries and retained UI styles', () => { @@ -106,6 +174,88 @@ describe('@treeseed/admin identity and team surface', () => { expect(Object.keys(ADMIN_ENV_SCHEMA)).toContain('TREESEED_BETTER_AUTH_SECRET'); }); + it('uses one password setup interaction for registration, reset, and account changes', () => { + const reset = readFileSync('src/pages/auth/reset-password.astro', 'utf8'); + const accountSettings = readFileSync('src/view-models/account-settings.ts', 'utf8'); + const registrationScene = readFileSync('guarantees/user/auth/scenes/register-user.scene.yaml', 'utf8'); + + expect(reset).toContain("PasswordSetupFields from '@treeseed/ui/components/astro/forms/fields/PasswordSetupFields.astro'"); + expect(reset).toContain('passwordId="resetPassword"'); + expect(reset).toContain('confirmLabel="Confirm new password"'); + expect(accountSettings).toContain("const confirmPassword = String(form.get('confirmPassword') ?? '')"); + expect(accountSettings).toContain("if (password !== confirmPassword) throw new Error('Passwords do not match.')"); + expect(accountSettings).toContain('if (!passwordMeetsPolicy(password))'); + expect(registrationScene).toContain('[data-ts-confirm-password-input]'); + expect(registrationScene).not.toContain('[data-confirm-password-input]'); + }); + + it('uses one account timezone and timestamp presentation contract', () => { + const accountPage = readFileSync('src/pages/app/account/index.astro', 'utf8'); + const sessionsPage = readFileSync('src/pages/app/account/sessions.astro', 'utf8'); + const accountHandler = readFileSync('src/view-models/account-settings.ts', 'utf8'); + const appLayout = readFileSync('src/layouts/AppLayout.astro', 'utf8'); + const notifications = readFileSync('../ui/src/astro/account/NotificationPreferencePanel.astro', 'utf8'); + const sessionManager = readFileSync('../ui/src/astro/account/SessionManager.astro', 'utf8'); + + expect(accountPage).toContain('AccountTimeZoneSettings'); + expect(accountHandler).toContain("intent === 'time-zone'"); + expect(accountHandler).toContain('updateAccountPreferences'); + expect(appLayout).toContain('timeZone={preferences.timeZone}'); + expect(sessionsPage).toContain('timeZone={frame.preferences.timeZone}'); + expect(notifications).not.toContain('data-time-zone'); + expect(sessionManager).toContain('data-session-ip'); + expect(sessionManager).toContain(' { + const astroSources = filesUnder('src') + .filter((path) => path.endsWith('.astro')) + .map((path) => [path, readFileSync(path, 'utf8')] as const); + const postFormConsumers = astroSources.filter(([, source]) => ( + /]*\bmethod=(?:["']POST["']|["']post["']|\{[^}]*post[^}]*\})/u.test(source) + )); + for (const [path, source] of postFormConsumers) { + expect(source, `${path} should use delegated enhancement`).toContain('data-ts-submit="enhanced"'); + } + + const accountHandler = readFileSync('src/view-models/account-settings.ts', 'utf8'); + const pageHelper = readFileSync('src/lib/forms/page-submission.ts', 'utf8'); + const memberPage = readFileSync('src/pages/app/teams/[teamId]/members.astro', 'utf8'); + const authPages = [ + 'src/pages/auth/register.astro', + 'src/pages/auth/sign-in.astro', + 'src/pages/auth/forgot-password.astro', + 'src/pages/auth/reset-password.astro', + 'src/pages/auth/username.astro', + ].map((path) => readFileSync(path, 'utf8')).join('\n'); + + expect(accountHandler).toContain("from '@treeseed/ui/forms'"); + expect(accountHandler).not.toContain('Astro.redirect'); + expect(pageHelper).toContain('formSubmissionResponse'); + expect(authPages).toContain('pageFormResponse'); + expect(authPages).toContain('pageFormFailure'); + expect(memberPage).toContain('data-ts-form-adapter="json"'); + expect(memberPage).not.toContain('location.reload'); + expect(memberPage).not.toMatch(/\bfetch\s*\(/u); + }); + + it('keeps inline guarantee mutations on their route and proves success toasts', () => { + const scenePaths = [ + 'guarantees/user/account/scenes/edit-account-settings.scene.yaml', + 'guarantees/user/account/scenes/manage-appearance.scene.yaml', + 'guarantees/user/account/scenes/manage-notifications.scene.yaml', + 'guarantees/user/account/scenes/manage-sessions.scene.yaml', + 'guarantees/team/scenes/edit-team-settings.scene.yaml', + 'guarantees/team/membership/scenes/change-member-role.scene.yaml', + 'guarantees/team/membership/scenes/remove-team-member.scene.yaml', + ]; + for (const path of scenePaths) { + const scene = readFileSync(path, 'utf8'); + expect(scene, path).toContain('[data-ts-toast-id][data-tone="success"]'); + expect(scene, path).not.toMatch(/urlIncludes:\s*(?:saved|updated|removed)=/u); + } + }); + it('retains domain facades without route-specific UI dependencies', () => { const packageJson = JSON.parse(readFileSync('package.json', 'utf8')) as { dependencies?: Record }; expect(packageJson.dependencies).not.toHaveProperty('@mdxeditor/editor'); From 1aec8c111a446d06f8d6579164ff3b7879526643 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Mon, 27 Jul 2026 07:00:23 -0400 Subject: [PATCH 027/315] build(build): save unified identity and interface improvements Intent: - Save hint: save unified identity and interface improvements Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.staging.20260716T154320Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#ab361c416b2b55e554f46113a9d5474531c26064 -> github:treeseed-ai/sdk#794a1e08f806ee2a54567cfd5a2b7cfaed20eeb1 - dependencies.@treeseed/core: github:treeseed-ai/core#24464951d79588ef74f987b34ea5fe53c081a9ef -> github:treeseed-ai/core#077c280609472193a6f47a9f6b7551283e730442 --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index c930ef44..06d049f3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#24464951d79588ef74f987b34ea5fe53c081a9ef", - "@treeseed/sdk": "github:treeseed-ai/sdk#ab361c416b2b55e554f46113a9d5474531c26064", + "@treeseed/core": "github:treeseed-ai/core#077c280609472193a6f47a9f6b7551283e730442", + "@treeseed/sdk": "github:treeseed-ai/sdk#794a1e08f806ee2a54567cfd5a2b7cfaed20eeb1", "@treeseed/ui": "github:treeseed-ai/ui#2315c1b9d52719307f2c30072e364c5020dc3152", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -6932,7 +6932,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.staging.20260716T185112Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#24464951d79588ef74f987b34ea5fe53c081a9ef", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#077c280609472193a6f47a9f6b7551283e730442", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6943,7 +6943,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#ab361c416b2b55e554f46113a9d5474531c26064", + "@treeseed/sdk": "github:treeseed-ai/sdk#794a1e08f806ee2a54567cfd5a2b7cfaed20eeb1", "@treeseed/ui": "github:treeseed-ai/ui#2315c1b9d52719307f2c30072e364c5020dc3152", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8948,7 +8948,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.staging.20260716T185056Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#ab361c416b2b55e554f46113a9d5474531c26064", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#794a1e08f806ee2a54567cfd5a2b7cfaed20eeb1", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index 1bd10ac8..0dad7027 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#24464951d79588ef74f987b34ea5fe53c081a9ef", - "@treeseed/sdk": "github:treeseed-ai/sdk#ab361c416b2b55e554f46113a9d5474531c26064", + "@treeseed/core": "github:treeseed-ai/core#077c280609472193a6f47a9f6b7551283e730442", + "@treeseed/sdk": "github:treeseed-ai/sdk#794a1e08f806ee2a54567cfd5a2b7cfaed20eeb1", "@treeseed/ui": "github:treeseed-ai/ui#2315c1b9d52719307f2c30072e364c5020dc3152", "react": "^19.2.5", "react-dom": "^19.2.6" From 5e64442f7d57a3bcdeef38223f74bef700e6ab0a Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Mon, 27 Jul 2026 07:19:06 -0400 Subject: [PATCH 028/315] build(build): fix standalone admin staging verification Intent: - Save hint: fix standalone admin staging verification Changes: - Updates 2 files across build: 1, tests: 1. - Touches scripts/build-dist.ts, tests/contract/package/admin-package.test.ts. - Plans package version/tag 0.12.59-dev.staging.20260716T154320Z for @treeseed/admin. --- scripts/build-dist.ts | 6 ++++-- tests/contract/package/admin-package.test.ts | 12 +++++++----- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/scripts/build-dist.ts b/scripts/build-dist.ts index 4b2c421f..cdda1c21 100644 --- a/scripts/build-dist.ts +++ b/scripts/build-dist.ts @@ -281,7 +281,9 @@ async function main() { } } -main().catch((error) => { +try { + await main(); +} catch (error) { console.error(error instanceof Error ? error.message : String(error)); process.exit(1); -}); +} diff --git a/tests/contract/package/admin-package.test.ts b/tests/contract/package/admin-package.test.ts index e70855a3..c884b47e 100644 --- a/tests/contract/package/admin-package.test.ts +++ b/tests/contract/package/admin-package.test.ts @@ -192,19 +192,21 @@ describe('@treeseed/admin identity and team surface', () => { it('uses one account timezone and timestamp presentation contract', () => { const accountPage = readFileSync('src/pages/app/account/index.astro', 'utf8'); const sessionsPage = readFileSync('src/pages/app/account/sessions.astro', 'utf8'); + const notificationsPage = readFileSync('src/pages/app/account/notifications.astro', 'utf8'); const accountHandler = readFileSync('src/view-models/account-settings.ts', 'utf8'); const appLayout = readFileSync('src/layouts/AppLayout.astro', 'utf8'); - const notifications = readFileSync('../ui/src/astro/account/NotificationPreferencePanel.astro', 'utf8'); - const sessionManager = readFileSync('../ui/src/astro/account/SessionManager.astro', 'utf8'); expect(accountPage).toContain('AccountTimeZoneSettings'); expect(accountHandler).toContain("intent === 'time-zone'"); expect(accountHandler).toContain('updateAccountPreferences'); expect(appLayout).toContain('timeZone={preferences.timeZone}'); + expect(sessionsPage).toContain( + "SessionManager from '@treeseed/ui/components/astro/account/SessionManager.astro'", + ); expect(sessionsPage).toContain('timeZone={frame.preferences.timeZone}'); - expect(notifications).not.toContain('data-time-zone'); - expect(sessionManager).toContain('data-session-ip'); - expect(sessionManager).toContain(' { From 46afa7c46b5be3815f15b39e4109c2d92b737dce Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Wed, 29 Jul 2026 08:50:52 -0400 Subject: [PATCH 029/315] build(config): complete team lifecycle, profile access, and shared Intent: - Save hint: complete team lifecycle, profile access, and shared profile design Changes: - Updates 79 files across config: 42, source: 15, ui: 15, tests: 4, build: 2, docs: 1. - Touches README.md, guarantees/evidence-admissibility/2026-07-27-team-evidence.yaml, guarantees/reconciliation/generated-team-guarantees.csv, guarantees/reconciliation/treeseed-journeys-12-20.yaml, guarantees/team/membership/accept-team-invitation.guarantee.yaml, guarantees/team/membership/change-member-role.guarantee.yaml, .... - Plans package version/tag 0.12.59-dev.staging.20260716T154320Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/ui: github:treeseed-ai/ui#2315c1b9d52719307f2c30072e364c5020dc3152 -> github:treeseed-ai/ui#8f850b33e8b0a64c047cd787c87dd1e12e8a3e5b - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#794a1e08f806ee2a54567cfd5a2b7cfaed20eeb1 -> github:treeseed-ai/sdk#062bdabb6038a98c56f90e3bbf774817f27db2f7 - dependencies.@treeseed/core: github:treeseed-ai/core#077c280609472193a6f47a9f6b7551283e730442 -> github:treeseed-ai/core#95a4ac840472233b1ad3a513def1b97e07652776 --- README.md | 4 +- .../2026-07-27-team-evidence.yaml | 35 ++ .../generated-team-guarantees.csv | 12 + .../treeseed-journeys-12-20.yaml | 78 +++++ .../accept-team-invitation.guarantee.yaml | 22 +- .../change-member-role.guarantee.yaml | 19 +- .../invite-team-members.guarantee.yaml | 19 +- .../remove-team-member.guarantee.yaml | 19 +- .../scenes/accept-team-invitation.scene.yaml | 109 +++++- .../scenes/change-member-role.scene.yaml | 238 +++++++++++++- .../invitation-mismatched-user.scene.yaml | 55 ++++ .../scenes/invite-team-members.scene.yaml | 158 ++++++++- .../scenes/remove-team-member.scene.yaml | 236 ++++++++++++- guarantees/team/scenes/create-team.scene.yaml | 82 ++++- guarantees/team/scenes/delete-team.scene.yaml | 118 ++++++- .../team/scenes/edit-team-settings.scene.yaml | 76 ++++- .../negative/anonymous-team-access.scene.yaml | 56 ++++ .../negative/edit-contributor.scene.yaml | 55 ++++ .../lifecycle-project-lead.scene.yaml | 51 +++ .../negative/members-contributor.scene.yaml | 73 +++++ .../negative/overview-nonmember.scene.yaml | 52 +++ .../team/scenes/switch-active-team.scene.yaml | 60 ++-- .../view-public-team-profile.scene.yaml | 100 ++++++ .../team/scenes/view-team-overview.scene.yaml | 206 ++++++++++++ .../team/scenes/view-team-profile.scene.yaml | 148 --------- .../team/team-management.ui-feature.yaml | 158 +++++++++ .../team/team/create-team.guarantee.yaml | 18 +- .../team/team/delete-team.guarantee.yaml | 24 +- .../team/edit-team-settings.guarantee.yaml | 19 +- .../team/switch-active-team.guarantee.yaml | 16 +- ...gement-production-readiness.guarantee.yaml | 51 +++ .../view-public-team-profile.guarantee.yaml | 57 ++++ .../team/view-team-overview.guarantee.yaml | 86 +++++ .../team/view-team-profile.guarantee.yaml | 75 ----- .../scenes/view-user-profile.scene.yaml | 32 +- .../account/view-user-profile.guarantee.yaml | 15 +- .../auth/forgot-reset-password.guarantee.yaml | 1 + .../user/auth/register-user.guarantee.yaml | 1 + .../scenes/forgot-reset-password.scene.yaml | 15 + .../user/auth/scenes/register-user.scene.yaml | 15 + .../user/auth/scenes/user-login.scene.yaml | 15 + .../user/auth/user-login.guarantee.yaml | 1 + .../user/auth/verify-email.guarantee.yaml | 1 + guarantees/verifiers/ui.verifiers.yaml | 167 ++++++++-- package-lock.json | 16 +- package.json | 6 +- .../account/AccountNavigation.astro | 18 + src/components/team/TeamAccessDetails.astro | 22 ++ src/components/team/TeamNavigation.astro | 28 ++ src/layouts/AppLayout.astro | 20 +- src/layouts/PublicLayout.astro | 29 +- src/lib/accounts/navigation.ts | 7 + .../updates/update-account-profile.ts | 5 + .../api-client/support/contracts/request.ts | 2 +- src/lib/market/store.ts | 2 +- src/lib/teams/access-display.ts | 53 +++ src/lib/teams/audit-display.ts | 138 ++++++++ src/pages/app/domain-overview.astro | 67 ++++ src/pages/app/teams/[teamId]/delete.astro | 259 ++++++++++----- src/pages/app/teams/[teamId]/edit.astro | 80 ++++- src/pages/app/teams/[teamId]/index.astro | 135 ++++++++ src/pages/app/teams/[teamId]/members.astro | 309 ++++++++++++++---- src/pages/app/teams/active.ts | 56 ++++ src/pages/app/teams/index.astro | 128 +++++++- src/pages/app/teams/new.astro | 40 ++- src/pages/auth/logout.ts | 15 +- src/pages/auth/sign-in.astro | 7 +- src/pages/t/[name].astro | 83 ++++- src/pages/team-invites/[token]/accept.astro | 129 ++++++-- src/pages/u/[username].astro | 65 +++- src/plugin.ts | 1 + src/routes.ts | 9 +- src/view-models/account-settings.ts | 20 +- src/view-models/app-access.ts | 46 +-- src/view-models/shared.ts | 2 + tests/contract/package/admin-package.test.ts | 21 +- .../public-knowledge-profiles.test.ts | 74 +++++ .../team-management-architecture.test.ts | 258 +++++++++++++++ tests/unit/teams/audit-display.test.ts | 58 ++++ 79 files changed, 4292 insertions(+), 764 deletions(-) create mode 100644 guarantees/evidence-admissibility/2026-07-27-team-evidence.yaml create mode 100644 guarantees/reconciliation/generated-team-guarantees.csv create mode 100644 guarantees/reconciliation/treeseed-journeys-12-20.yaml create mode 100644 guarantees/team/membership/scenes/invitation-mismatched-user.scene.yaml create mode 100644 guarantees/team/scenes/negative/anonymous-team-access.scene.yaml create mode 100644 guarantees/team/scenes/negative/edit-contributor.scene.yaml create mode 100644 guarantees/team/scenes/negative/lifecycle-project-lead.scene.yaml create mode 100644 guarantees/team/scenes/negative/members-contributor.scene.yaml create mode 100644 guarantees/team/scenes/negative/overview-nonmember.scene.yaml create mode 100644 guarantees/team/scenes/view-public-team-profile.scene.yaml create mode 100644 guarantees/team/scenes/view-team-overview.scene.yaml delete mode 100644 guarantees/team/scenes/view-team-profile.scene.yaml create mode 100644 guarantees/team/team-management.ui-feature.yaml create mode 100644 guarantees/team/team/team-management-production-readiness.guarantee.yaml create mode 100644 guarantees/team/team/view-public-team-profile.guarantee.yaml create mode 100644 guarantees/team/team/view-team-overview.guarantee.yaml delete mode 100644 guarantees/team/team/view-team-profile.guarantee.yaml create mode 100644 src/components/account/AccountNavigation.astro create mode 100644 src/components/team/TeamAccessDetails.astro create mode 100644 src/components/team/TeamNavigation.astro create mode 100644 src/lib/accounts/navigation.ts create mode 100644 src/lib/teams/access-display.ts create mode 100644 src/lib/teams/audit-display.ts create mode 100644 src/pages/app/domain-overview.astro create mode 100644 src/pages/app/teams/[teamId]/index.astro create mode 100644 src/pages/app/teams/active.ts create mode 100644 tests/contract/public-profiles/public-knowledge-profiles.test.ts create mode 100644 tests/contract/team-management/team-management-architecture.test.ts create mode 100644 tests/unit/teams/audit-display.test.ts diff --git a/README.md b/README.md index 753644c5..d5d5bec0 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # @treeseed/admin -`@treeseed/admin` is the distributable AGPLv3 identity and team administration layer for Treeseed sites. During preparation for the comprehensive UI redesign, its rendered surface is intentionally limited to authentication, account management, team management, active-team selection, invitations, and public user/team identity profiles. +`@treeseed/admin` is the distributable AGPLv3 identity and team administration layer for Treeseed sites. Its rendered surface includes authentication, account management, team management, active-team selection, invitations, and public user/team knowledge profiles. The removed pre-redesign surface is archived in the root [legacy route inventory](../../docs/legacy-routes.md). The redesign direction is described in [ui-redesign.md](../../docs/ui-redesign.md). @@ -17,7 +17,7 @@ Add `@treeseed/admin/plugin` to the host `treeseed.site.yaml`, use the config he - `/app` and focused account routes for Identity, Sessions, Notifications, Appearance, and Delete - `/app/teams`, team creation, edit, delete, membership, and active-team selection - registration, verification, sign-in/out, recovery, OAuth callback, username, and device approval -- `/u/[username]` and `/t/[name]` identity-only public profiles +- `/u/[username]` and `/t/[name]` public knowledge profiles with explicit attribution and privacy-safe publication trails - invitation acceptance and the shared `/v1/[...all]` API facade `ADMIN_ROUTES` and `ADMIN_SUPPORT_ROUTES` are exported from `@treeseed/admin/routes`, use the SDK route-capability contract, and are tested against the package page tree. Account routes contain only focused controllers and standardized UI-package composition. There are no project, capacity, host, work, knowledge, catalog, seller, commerce, or Markdown-preview routes and no compatibility redirects for them. diff --git a/guarantees/evidence-admissibility/2026-07-27-team-evidence.yaml b/guarantees/evidence-admissibility/2026-07-27-team-evidence.yaml new file mode 100644 index 00000000..0ff120f5 --- /dev/null +++ b/guarantees/evidence-admissibility/2026-07-27-team-evidence.yaml @@ -0,0 +1,35 @@ +schemaVersion: treeseed.guarantee-evidence-admissibility/v1 +ownerPackage: "@treeseed/admin" +recordedAt: 2026-07-27T17:00:00.000Z +scope: + guaranteeIds: + - guarantee.team.team.create-team.012 + - guarantee.team.team.switch-active-team.013 + - guarantee.team.team.edit-team-settings.014 + - guarantee.team.team.view-team-profile.015 + - guarantee.team.team.delete-team.016 + - guarantee.team.membership.invite-team-members.017 + - guarantee.team.membership.accept-team-invitation.018 + - guarantee.team.membership.change-member-role.019 + - guarantee.team.membership.remove-team-member.020 + runIds: + - 2026-07-27T00-25-09-417Z + - 2026-07-27T00-27-48-988Z + - 2026-07-27T00-34-25-348Z + - 2026-07-27T00-50-52-953Z + - 2026-07-27T01-00-37-183Z + - 2026-07-27T01-09-35-100Z +decision: inadmissible +reasons: + - Mobile graph nodes were populated from scenes whose reports recorded desktop Chromium device metadata and a 1600x900 desktop viewport. + - Per-device graph status copied aggregate guarantee status instead of using the actual result for the requested device. + - Several durable verifiers inspected fixture-created records rather than the records created by the corresponding rendered UI journey. + - Journey 15 asserted the anonymous public profile instead of the required authenticated operational overview. +history: + immutable: true + action: Preserve the original report, graph, scene, trace, screenshot, console, network, and API artifacts as historical diagnostics. + acceptanceUse: forbidden +replacementRequirements: + - Exact requested and actual device metadata must match before evidence is accepted. + - UI-created record identifiers must flow through run state to API and audit verifiers. + - Journeys 12 through 20 and the separate public-profile guarantee must pass from the current source closure. diff --git a/guarantees/reconciliation/generated-team-guarantees.csv b/guarantees/reconciliation/generated-team-guarantees.csv new file mode 100644 index 00000000..a7c2d50b --- /dev/null +++ b/guarantees/reconciliation/generated-team-guarantees.csv @@ -0,0 +1,12 @@ +Guarantee ID,Journey Index,Type,Subtype,Journey,Owner Package,Surface,Status,Dependencies,Actor Roles,Forbidden Roles,Device Coverage,Preconditions,Scene Manifest,API Verifier Refs,Content Verifier Refs,Audit Verifier Refs,Negative Cases,Release Gates,Evidence Required,Notes,Source Path +guarantee.team.team.create-team.012,12,team,team,Create Team,@treeseed/admin,admin-ui,active,guarantee.user.auth.user-login.004; journey:4,verified_user,anonymous_user,desktop_chromium; tablet_chromium; mobile_chromium,integrated_treeseed_project; Journey dependencies must be satisfied: 4,../scenes/create-team.scene.yaml,api.team.create.correlated,,api.team.create.correlated,anonymous-denied,core; release,playwright_trace; scene_video; api_verification_log,Create the durable team identity and membership boundary used by active-team selection and team management.,packages/admin/guarantees/team/team/create-team.guarantee.yaml +guarantee.team.team.switch-active-team.013,13,team,team,Switch Active Team,@treeseed/admin,admin-ui,active,guarantee.team.team.create-team.012; journey:12,team_admin; team_owner,anonymous_user,desktop_chromium; tablet_chromium; mobile_chromium,integrated_treeseed_project; Journey dependencies must be satisfied: 12,../scenes/switch-active-team.scene.yaml,api.team.active.correlated,,,anonymous-denied,core; release,playwright_trace; scene_video; api_verification_log,Change the active team context used by admin and API requests; must refresh project capacity and membership-scoped views.,packages/admin/guarantees/team/team/switch-active-team.guarantee.yaml +guarantee.team.team.edit-team-settings.014,14,team,team,Edit Team Settings,@treeseed/admin,admin-ui,active,guarantee.team.team.switch-active-team.013; journey:13,team_admin; team_owner,contributor,desktop_chromium; tablet_chromium; mobile_chromium,integrated_treeseed_project; Journey dependencies must be satisfied: 12,../scenes/edit-team-settings.scene.yaml,api.team.update.correlated,,api.team.update.correlated,contributor-denied,core; release,playwright_trace; scene_video; api_verification_log,Update team metadata and policy knobs; should not mutate package or provider infrastructure directly.,packages/admin/guarantees/team/team/edit-team-settings.guarantee.yaml +guarantee.team.team.view-team-overview.015,15,team,team,View Team Overview,@treeseed/admin,admin-ui,active,guarantee.team.team.edit-team-settings.014; journey:14,team_member,anonymous_user; non_member,desktop_chromium; tablet_chromium; mobile_chromium,integrated_treeseed_project; Journey dependencies must be satisfied: 12,../scenes/view-team-overview.scene.yaml,api.team.overview.correlated,,,anonymous-denied; non-member-denied,core; release,playwright_trace; scene_video; api_verification_log,Public identity is covered separately by guarantee.team.team.view-public-team-profile.021.,packages/admin/guarantees/team/team/view-team-overview.guarantee.yaml +guarantee.team.membership.invite-team-members.017,17,team,membership,Invite Team Members,@treeseed/admin,admin-ui,active,guarantee.team.team.edit-team-settings.014; journey:14,team_admin; team_owner,contributor,desktop_chromium; mobile_chromium,integrated_treeseed_project; Journey dependencies must be satisfied: 12,./scenes/invite-team-members.scene.yaml,api.team.invite.correlated,,api.team.invite.correlated,contributor-denied,core; release,playwright_trace; scene_video; api_verification_log,Create team invitation records and send notices; roles should map to API/admin authorization rather than client-only checks.,packages/admin/guarantees/team/membership/invite-team-members.guarantee.yaml +guarantee.team.membership.accept-team-invitation.018,18,team,membership,Accept Team Invitation,@treeseed/admin,admin-ui,active,guarantee.team.membership.invite-team-members.017; journey:17,invited_user,mismatched_user,desktop_chromium; mobile_chromium,integrated_treeseed_project; Journey dependencies must be satisfied: 17,./scenes/accept-team-invitation.scene.yaml,api.team.accept.correlated,,api.team.accept.correlated,mismatched-user-denied; invalid-expired-revoked-replay,core; release,playwright_trace; scene_video; api_verification_log,Redeem an invite and attach the user to the team; should handle authenticated and newly registered users cleanly.,packages/admin/guarantees/team/membership/accept-team-invitation.guarantee.yaml +guarantee.team.membership.change-member-role.019,19,team,membership,Change Member Role,@treeseed/admin,admin-ui,active,guarantee.team.membership.accept-team-invitation.018; journey:18,team_admin; team_owner,contributor,desktop_chromium; mobile_chromium,integrated_treeseed_project; Journey dependencies must be satisfied: 18,./scenes/change-member-role.scene.yaml,api.team.role.correlated,,api.team.role.correlated,contributor-denied,core; release,playwright_trace; scene_video; api_verification_log,Update membership role with authorization and last-owner protections; changes should immediately affect API permission decisions.,packages/admin/guarantees/team/membership/change-member-role.guarantee.yaml +guarantee.team.membership.remove-team-member.020,20,team,membership,Remove Team Member,@treeseed/admin,admin-ui,active,guarantee.team.membership.change-member-role.019; journey:19,team_admin; team_owner,contributor,desktop_chromium; mobile_chromium,integrated_treeseed_project; Journey dependencies must be satisfied: 18,./scenes/remove-team-member.scene.yaml,api.team.remove.correlated,,api.team.remove.correlated,contributor-denied,core; release,playwright_trace; scene_video; api_verification_log,Remove or deactivate a team member with auditability; must avoid orphaning owned projects decisions or running workdays.,packages/admin/guarantees/team/membership/remove-team-member.guarantee.yaml +guarantee.team.team.view-public-team-profile.021,,team,team,View Public Team Profile,@treeseed/admin,admin-ui,active,guarantee.team.team.edit-team-settings.014; journey:14,anonymous_user,,desktop_chromium; tablet_chromium; mobile_chromium,integrated_treeseed_project; The owning team identity must already exist.,../scenes/view-public-team-profile.scene.yaml,api.team.public-profile.correlated,,,archived-not-found,core; release,playwright_trace; scene_video; api_verification_log,"This supplemental guarantee intentionally has no CSV journey index.; Public projects, templates, knowledge packs, and their publication trail are explicit public projections, never private operational aggregates.",packages/admin/guarantees/team/team/view-public-team-profile.guarantee.yaml +guarantee.team.team.delete-team.016,16,team,team,Delete Team,@treeseed/admin,admin-ui,active,guarantee.team.membership.remove-team-member.020; guarantee.team.team.view-public-team-profile.021,team_admin; team_owner,project_lead,desktop_chromium; mobile_chromium,integrated_treeseed_project; Membership lifecycle and public profile verification must finish before deletion.,../scenes/delete-team.scene.yaml,api.team.delete.correlated,,api.team.delete.correlated,project-lead-denied,core; release,playwright_trace; scene_video; api_verification_log,"Archiving is reversible during the displayed recovery window; permanent deletion is separately available without an archive delay and requires blocker checks, the exact team name, and the current password.",packages/admin/guarantees/team/team/delete-team.guarantee.yaml +guarantee.team.team.team-management-production-readiness.022,,team,team,Team Management Production Readiness,@treeseed/admin,scene,active,guarantee.team.team.view-public-team-profile.021; journey:12; journey:13; journey:14; journey:15; journey:16; journey:17; journey:18; journey:19; journey:20,release_operator,,desktop_chromium; mobile_chromium,integrated_treeseed_project; Every required feature guarantee must be active and pass against the same current source closure.,,admin.team.production-readiness; admin.team.ui-contracts; api.team.lifecycle-contracts; sdk.team.ui-evidence-trust,,,stale-or-mismatched-evidence-denied,core; release,execution_graph; api_verification_log; cleanup_report,"Fails closed unless every required team guarantee, feature contract, current-source verifier, and cleanup check passes.",packages/admin/guarantees/team/team/team-management-production-readiness.guarantee.yaml diff --git a/guarantees/reconciliation/treeseed-journeys-12-20.yaml b/guarantees/reconciliation/treeseed-journeys-12-20.yaml new file mode 100644 index 00000000..d390c582 --- /dev/null +++ b/guarantees/reconciliation/treeseed-journeys-12-20.yaml @@ -0,0 +1,78 @@ +schemaVersion: treeseed.guarantee-reconciliation/v1 +ownerPackage: "@treeseed/admin" +requirementsInput: /home/adrian/Downloads/treeseed.journeys.csv +scope: [12, 13, 14, 15, 16, 17, 18, 19, 20] +generatedFrom: package-local guarantee manifests +status: active +notes: + - The downloaded CSV is requirements input and was not edited. + - Current routes and execution keys are canonical in the package manifests. + - Journey 15 is the authenticated operational overview. The anonymous redacted profile is supplemental guarantee 021. + - Active status authorizes current-source execution; every run still fails closed unless rendered positive and forbidden-actor scenes, correlated API/audit evidence, exact devices, and cleanup pass. +journeys: + - index: 12 + id: guarantee.team.team.create-team.012 + inputRoute: /admin/teams/:teamId/create-team + canonicalRoute: /app/teams/new + executionKey: admin.team.create + correction: Creation has no pre-existing team identifier and does not implicitly select the new team. + - index: 13 + id: guarantee.team.team.switch-active-team.013 + inputRoute: /admin/teams/:teamId/switch-active-team + canonicalRoute: /app/teams + actionRoute: /app/teams/active + executionKey: admin.team.select-active + correction: Active selection is an explicit membership-validated action and never a page-visit side effect. + - index: 14 + id: guarantee.team.team.edit-team-settings.014 + inputRoute: /admin/teams/:teamId/edit-team-settings + canonicalRoute: /app/teams/[teamId]/edit + executionKey: admin.team.edit + correction: Settings include identity, visibility, validation, conflict, authorization, preview, and reload persistence. + - index: 15 + id: guarantee.team.team.view-team-overview.015 + inputId: guarantee.team.team.view-team-profile.015 + inputJourney: View Team Profile + inputRoute: /admin/teams/:teamId/view-team-profile + canonicalRoute: /app/teams/[teamId] + executionKey: admin.team.overview + correction: This is the authenticated operational overview; it is not the anonymous public profile. + - index: 16 + id: guarantee.team.team.delete-team.016 + inputRoute: /admin/teams/:teamId/delete-team + canonicalRoute: /app/teams/[teamId]/delete + executionKey: admin.team.delete + correction: The lifecycle separates reversible archive and restore with a timezone-aware recovery countdown from immediate permanent deletion guarded by blockers, exact-name confirmation, and reauthentication. + - index: 17 + id: guarantee.team.membership.invite-team-members.017 + inputRoute: /admin/teams/:teamId/invite-team-members + canonicalRoute: /app/teams/[teamId]/members + executionKey: admin.team.invite + correction: Pending invitations are visible and support accurate send, resend, revoke, expiry, and audit states. + - index: 18 + id: guarantee.team.membership.accept-team-invitation.018 + inputRoute: /admin/teams/:teamId/accept-team-invitation + canonicalRoute: /team-invites/[token]/accept + executionKey: admin.team.accept-invite + correction: GET previews consent state; a CSRF-protected POST accepts for the exact verified recipient. + - index: 19 + id: guarantee.team.membership.change-member-role.019 + inputRoute: /admin/teams/:teamId/change-member-role + canonicalRoute: /app/teams/[teamId]/members + executionKey: admin.team.change-member-role + correction: Role changes prove owner restrictions, last-owner safety, visible-control changes, and API permission changes. + - index: 20 + id: guarantee.team.membership.remove-team-member.020 + inputRoute: /admin/teams/:teamId/remove-team-member + canonicalRoute: /app/teams/[teamId]/members + executionKey: admin.team.remove-member + correction: Removal and self-leave expose blockers, require confirmation, preserve the last owner, and prove lost access. +supplemental: + - id: guarantee.team.team.view-public-team-profile.021 + journeyIndex: null + route: /t/[name] + executionKey: admin.team.public-profile + purpose: Anonymous active-team identity-only profile with operational and membership redaction. + - id: guarantee.team.team.team-management-production-readiness.022 + journeyIndex: null + purpose: Release-required aggregate over the feature contract and all team journeys. diff --git a/guarantees/team/membership/accept-team-invitation.guarantee.yaml b/guarantees/team/membership/accept-team-invitation.guarantee.yaml index c744c262..c640cbc8 100644 --- a/guarantees/team/membership/accept-team-invitation.guarantee.yaml +++ b/guarantees/team/membership/accept-team-invitation.guarantee.yaml @@ -14,9 +14,9 @@ dependencies: - guarantee.team.membership.invite-team-members.017 actors: allowed: - - anonymous_user + - invited_user forbidden: - - unauthorized_user + - mismatched_user devices: required: - desktop_chromium @@ -29,6 +29,9 @@ preconditions: - integrated_treeseed_project notes: - "Journey dependencies must be satisfied: 17" +uiFeature: + contract: ../team-management.ui-feature.yaml + capabilities: [team.invitation-consent] scene: required: true manifest: ./scenes/accept-team-invitation.scene.yaml @@ -48,18 +51,21 @@ scene: api: required: true verifierRefs: - - api.team.invite.mailpit + - api.team.accept.correlated content: required: false verifierRefs: [] audit: required: true - verifierRefs: [api.team.lifecycle.audit] + verifierRefs: [api.team.accept.correlated] negativeCases: - - id: non-member-denied - actor: non_member - verifierRefs: - - api.team.members.nonmember + - id: mismatched-user-denied + actor: mismatched_user + sceneManifest: scenes/invitation-mismatched-user.scene.yaml + executionKey: admin.team.invitation.mismatched-user + verifierRefs: [api.team.invitation.mismatch-denied] + - id: invalid-expired-revoked-replay + verifierRefs: [api.team.invitation.terminal-states] evidence: required: - playwright_trace diff --git a/guarantees/team/membership/change-member-role.guarantee.yaml b/guarantees/team/membership/change-member-role.guarantee.yaml index ea3a8cc9..15e50202 100644 --- a/guarantees/team/membership/change-member-role.guarantee.yaml +++ b/guarantees/team/membership/change-member-role.guarantee.yaml @@ -17,8 +17,7 @@ actors: - team_admin - team_owner forbidden: - - anonymous_user - - unauthorized_user + - contributor devices: required: - desktop_chromium @@ -31,6 +30,9 @@ preconditions: - integrated_treeseed_project notes: - "Journey dependencies must be satisfied: 18" +uiFeature: + contract: ../team-management.ui-feature.yaml + capabilities: [team.member-roles, team.ownership] scene: required: true manifest: ./scenes/change-member-role.scene.yaml @@ -50,18 +52,19 @@ scene: api: required: true verifierRefs: - - api.team.member.role + - api.team.role.correlated content: required: false verifierRefs: [] audit: required: true - verifierRefs: [api.team.lifecycle.audit] + verifierRefs: [api.team.role.correlated] negativeCases: - - id: non-member-denied - actor: non_member - verifierRefs: - - api.team.members.nonmember + - id: contributor-denied + actor: contributor + sceneManifest: ../scenes/negative/members-contributor.scene.yaml + executionKey: admin.team.negative.members-contributor + verifierRefs: [api.team.role.contributor-denied] evidence: required: - playwright_trace diff --git a/guarantees/team/membership/invite-team-members.guarantee.yaml b/guarantees/team/membership/invite-team-members.guarantee.yaml index e329c601..69dbd7d5 100644 --- a/guarantees/team/membership/invite-team-members.guarantee.yaml +++ b/guarantees/team/membership/invite-team-members.guarantee.yaml @@ -17,8 +17,7 @@ actors: - team_admin - team_owner forbidden: - - anonymous_user - - unauthorized_user + - contributor devices: required: - desktop_chromium @@ -31,6 +30,9 @@ preconditions: - integrated_treeseed_project notes: - "Journey dependencies must be satisfied: 12" +uiFeature: + contract: ../team-management.ui-feature.yaml + capabilities: [team.member-directory, team.invitations] scene: required: true manifest: ./scenes/invite-team-members.scene.yaml @@ -50,18 +52,19 @@ scene: api: required: true verifierRefs: - - api.team.invite.mailpit + - api.team.invite.correlated content: required: false verifierRefs: [] audit: required: true - verifierRefs: [api.team.lifecycle.audit] + verifierRefs: [api.team.invite.correlated] negativeCases: - - id: non-member-denied - actor: non_member - verifierRefs: - - api.team.members.nonmember + - id: contributor-denied + actor: contributor + sceneManifest: ../scenes/negative/members-contributor.scene.yaml + executionKey: admin.team.negative.members-contributor + verifierRefs: [api.team.invite.contributor-denied] evidence: required: - playwright_trace diff --git a/guarantees/team/membership/remove-team-member.guarantee.yaml b/guarantees/team/membership/remove-team-member.guarantee.yaml index 9c69d985..48ab8837 100644 --- a/guarantees/team/membership/remove-team-member.guarantee.yaml +++ b/guarantees/team/membership/remove-team-member.guarantee.yaml @@ -17,8 +17,7 @@ actors: - team_admin - team_owner forbidden: - - anonymous_user - - unauthorized_user + - contributor devices: required: - desktop_chromium @@ -31,6 +30,9 @@ preconditions: - integrated_treeseed_project notes: - "Journey dependencies must be satisfied: 18" +uiFeature: + contract: ../team-management.ui-feature.yaml + capabilities: [team.member-removal, team.member-leave] scene: required: true manifest: ./scenes/remove-team-member.scene.yaml @@ -50,18 +52,19 @@ scene: api: required: true verifierRefs: - - api.team.member.remove + - api.team.remove.correlated content: required: false verifierRefs: [] audit: required: true - verifierRefs: [api.team.lifecycle.audit] + verifierRefs: [api.team.remove.correlated] negativeCases: - - id: non-member-denied - actor: non_member - verifierRefs: - - api.team.members.nonmember + - id: contributor-denied + actor: contributor + sceneManifest: ../scenes/negative/members-contributor.scene.yaml + executionKey: admin.team.negative.members-contributor + verifierRefs: [api.team.remove.contributor-denied] evidence: required: - playwright_trace diff --git a/guarantees/team/membership/scenes/accept-team-invitation.scene.yaml b/guarantees/team/membership/scenes/accept-team-invitation.scene.yaml index 77ce07f0..d10a75bb 100644 --- a/guarantees/team/membership/scenes/accept-team-invitation.scene.yaml +++ b/guarantees/team/membership/scenes/accept-team-invitation.scene.yaml @@ -8,10 +8,8 @@ audience: journey: kind: service proves: - - Accept Team Invitation opens the canonical @treeseed/admin dashboard read model workflow. - - Accept Team Invitation exercises a service journey instead of only loading /app/teams/visual-audit-team/members. - - Accept Team Invitation records reviewable evidence for the visible result before activation. - minimumSteps: 5 + - team.invitation-consent + minimumSteps: 17 requiresInteractiveAction: true consumesState: - key: team.invitation @@ -19,6 +17,8 @@ journey: producesState: - key: team.membership-accepted kind: marker + value: + recipient: invite-{{runId}}-{{deviceId}}@treeseed.local mode: test: true demo: true @@ -84,6 +84,24 @@ workflow: mailpitUrl: http://127.0.0.1:8025 email: invite-{{runId}}-{{deviceId}}@treeseed.local subjectIncludes: You're invited to join Verified {{runShort}} {{deviceId}} + expect: + urlIncludes: /team-invites/ + text: Team invitation + - id: open-invited-registration + title: Safely sign out while preserving the invitation token + action: + click: + role: button + name: Switch account + expect: + urlIncludes: /auth/sign-in + text: Sign in + - id: choose-invited-registration + title: Choose registration while preserving the invitation token + action: + click: + role: link + name: Create account expect: urlIncludes: /auth/register text: Create account @@ -133,15 +151,92 @@ workflow: expect: text: Create account - id: submit-invited-registration - title: Register and accept as the invited principal + title: Register the invited principal without silently accepting membership action: click: role: button name: Create account expect: - urlIncludes: /app + urlIncludes: /auth/check-email + text: Check your email + - id: confirm-invited-email + title: Confirm the invited user's email through Mailpit + action: + mailpitConfirmLatest: + mailpitUrl: http://127.0.0.1:8025 + email: invite-{{runId}}-{{deviceId}}@treeseed.local + subjectIncludes: Confirm your Treeseed Market email + displayInboxSeconds: 1 + displayMessageSeconds: 1 + expect: + urlIncludes: /team-invites/ + text: Accept invitation + - id: explicitly-accept-invitation + title: Explicitly accept the invitation through the CSRF-protected form + action: + click: + role: button + name: Accept invitation + expect: + urlIncludes: /app/teams/ + text: Operational overview visible: - scene: app-shell + - id: open-existing-user-invitation + title: Open the existing verified user's exact invitation + action: + mailpitConfirmLatest: + mailpitUrl: http://127.0.0.1:8025 + email: visual.member@treeseed.io + subjectIncludes: You're invited to join Verified {{runShort}} {{deviceId}} + expect: + urlIncludes: /team-invites/ + text: Switch to the invited account before accepting. + - id: switch-to-existing-user + title: Use the safe POST account switch while preserving the invitation + action: + click: + role: button + name: Switch account + expect: + urlIncludes: /auth/sign-in + text: Sign in + - id: fill-existing-user-login + title: Enter the existing verified user's email + action: + fill: + role: textbox + name: Email or username + value: visual.member@treeseed.io + expect: + text: Sign in + - id: fill-existing-user-password + title: Enter the existing verified user's password + action: + fill: + css: 'input[name="password"]' + internal: true + value: TreeSeedVisualAudit!2026 + expect: + text: Sign in + - id: sign-in-existing-user + title: Sign in and return to the preserved invitation token + action: + click: + role: button + name: Sign in + expect: + urlIncludes: /team-invites/ + text: Accept invitation + - id: explicitly-accept-as-existing-user + title: Accept explicitly as the existing verified user + action: + click: + role: button + name: Accept invitation + expect: + urlIncludes: /app/teams/ + text: Operational overview chapters: [] overlays: [] diagrams: [] @@ -178,4 +273,4 @@ runtime: continueOnFailure: false training: {} visualAudit: - enabled: false + enabled: true diff --git a/guarantees/team/membership/scenes/change-member-role.scene.yaml b/guarantees/team/membership/scenes/change-member-role.scene.yaml index 5d62f955..ecf832f9 100644 --- a/guarantees/team/membership/scenes/change-member-role.scene.yaml +++ b/guarantees/team/membership/scenes/change-member-role.scene.yaml @@ -8,10 +8,9 @@ audience: journey: kind: service proves: - - Change Member Role opens the canonical @treeseed/admin dashboard read model workflow. - - Change Member Role exercises a service journey instead of only loading /app/teams/visual-audit-team/members. - - Change Member Role records reviewable evidence for the visible result before activation. - minimumSteps: 4 + - team.member-roles + - team.ownership + minimumSteps: 18 requiresInteractiveAction: true consumesState: - key: auth.primary-session @@ -21,6 +20,8 @@ journey: producesState: - key: team.member-role-changed kind: marker + - key: auth.primary-session-after-role + kind: browser-storage mode: test: true demo: true @@ -85,14 +86,48 @@ workflow: - id: open-entry-route title: Open Change Member Role action: - goto: /app/teams/gt-{{runShort}}-{{deviceId}}/members + goto: /app/teams + expect: + visible: + - css: '[data-team-name="gt-{{runShort}}-{{deviceId}}"]' + internal: true + - id: open-members + title: Open members for the run-created team + action: + click: + css: '[data-team-name="gt-{{runShort}}-{{deviceId}}"] a[href$="/members"]' + internal: true expect: text: invite-{{runId}}-{{deviceId}}@treeseed.local + visible: + - scene: team.navigation + - scene: team.roles.reference.open + - id: open-role-reference + title: Open the role responsibility reference + action: + click: + role: button + name: Open role reference + expect: + text: Roles and responsibilities + visible: + - css: '#team-role-reference[open] .ts-disclosure-list' + internal: true + - id: close-role-reference + title: Close the role responsibility reference + action: + click: + role: button + name: Close dialog + expect: + notVisible: + - css: '#team-role-reference[open]' + internal: true - id: choose-reviewer-role title: Change the invited member to reviewer action: select: - css: '[data-scene="team.member.invite-{{runId}}-{{deviceId}}@treeseed.local"] select[name="roleKey"]' + css: '[data-member-email="invite-{{runId}}-{{deviceId}}@treeseed.local"] select[name="roleKey"]' internal: true value: reviewer expect: @@ -101,21 +136,202 @@ workflow: title: Persist the member role action: click: - css: '[data-scene="team.member.invite-{{runId}}-{{deviceId}}@treeseed.local"] form[data-ts-method="PATCH"] button[type="submit"]' + css: '[data-member-email="invite-{{runId}}-{{deviceId}}@treeseed.local"] form[data-ts-method="PATCH"] button[type="submit"]' internal: true expect: urlIncludes: /members text: Member role updated. visible: - - css: '[data-ts-toast-id][data-tone="success"]' + - css: '[data-ts-toast-id][data-tone="success"]:last-of-type' internal: true - id: verify-member-role - title: Verify role persistence after reload + title: Prove the reviewer role persisted after the refreshed member panel + action: + goto: /app/teams + expect: + visible: + - css: '[data-team-name="gt-{{runShort}}-{{deviceId}}"]' + internal: true + - id: reopen-members-after-role-change + title: Reopen members and prove the role persisted + action: + click: + css: '[data-team-name="gt-{{runShort}}-{{deviceId}}"] a[href$="/members"]' + internal: true + expect: + visible: + - css: '[data-member-email="invite-{{runId}}-{{deviceId}}@treeseed.local"][data-member-role="reviewer"]' + internal: true + - scene: team.roles.reference.open + - id: transfer-ownership-to-invited-member + title: Transfer ownership through the visible owner-only control + action: + click: + css: '[data-member-email="invite-{{runId}}-{{deviceId}}@treeseed.local"] form[data-scene="team.ownership.transfer"] button[type="submit"]' + internal: true + expect: + text: Ownership transferred. + visible: + - css: '[data-ts-toast-id][data-tone="success"]:last-of-type' + internal: true + - css: '[data-member-email="invite-{{runId}}-{{deviceId}}@treeseed.local"][data-member-role="team_owner"]' + internal: true + - css: '[data-member-email="guarantee-{{runId}}-{{deviceId}}@treeseed.local"][data-member-role="project_lead"]' + internal: true + - id: sign-out-former-owner + title: End the former owner's browser session before restoring ownership + action: + clickVisibleSequence: + - role: button + name: Open team operations + - role: button + name: Sign out + expect: + urlIncludes: /auth/sign-in + text: Sign in + - id: enter-invited-owner-email + title: Sign in as the newly transferred owner + action: + fill: + role: textbox + name: Email or username + value: invite-{{runId}}-{{deviceId}}@treeseed.local + expect: + text: Sign in + - id: enter-invited-owner-password + title: Enter the invited owner's password + action: + fill: + css: 'input[name="password"]' + internal: true + value: TreeSeedInviteGuarantee123! + expect: + text: Sign in + - id: sign-in-invited-owner + title: Authenticate as the invited owner + action: + click: + role: button + name: Sign in + expect: + urlIncludes: /app + visible: + - scene: app-shell + - id: open-team-as-invited-owner + title: Open the same run-created team as its current owner + action: + goto: /app/teams + expect: + visible: + - css: '[data-team-name="gt-{{runShort}}-{{deviceId}}"]' + internal: true + - id: open-members-as-invited-owner + title: Open ownership administration as the invited owner + action: + click: + css: '[data-team-name="gt-{{runShort}}-{{deviceId}}"] a[href$="/members"]' + internal: true + expect: + visible: + - css: '[data-member-email="guarantee-{{runId}}-{{deviceId}}@treeseed.local"][data-member-role="project_lead"]' + internal: true + - id: restore-primary-ownership + title: Transfer ownership back through the same visible owner-only control + action: + click: + css: '[data-member-email="guarantee-{{runId}}-{{deviceId}}@treeseed.local"] form[data-scene="team.ownership.transfer"] button[type="submit"]' + internal: true + expect: + text: Ownership transferred. + visible: + - css: '[data-member-email="guarantee-{{runId}}-{{deviceId}}@treeseed.local"][data-member-role="team_owner"]' + internal: true + - css: '[data-member-email="invite-{{runId}}-{{deviceId}}@treeseed.local"][data-member-role="project_lead"]' + internal: true + - id: sign-out-invited-owner + title: End the invited user's session after ownership is restored + action: + clickVisibleSequence: + - role: button + name: Open team operations + - role: button + name: Sign out + expect: + urlIncludes: /auth/sign-in + text: Sign in + - id: enter-primary-owner-email + title: Enter the restored primary owner's account + action: + fill: + role: textbox + name: Email or username + value: guarantee-{{runId}}-{{deviceId}}@treeseed.local + expect: + text: Sign in + - id: enter-primary-owner-password + title: Enter the primary owner's reset password + action: + fill: + css: 'input[name="password"]' + internal: true + value: TreeSeedGuaranteeReset123! + expect: + text: Sign in + - id: sign-in-primary-owner + title: Authenticate as the restored primary owner + action: + click: + role: button + name: Sign in + expect: + urlIncludes: /app + visible: + - scene: app-shell + - id: reopen-members-as-primary-owner + title: Reopen membership administration as the restored primary owner action: goto: /app/teams/gt-{{runShort}}-{{deviceId}}/members expect: visible: - - css: '[data-scene="team.member.invite-{{runId}}-{{deviceId}}@treeseed.local"][data-scene-state="reviewer"]' + - css: '[data-member-email="invite-{{runId}}-{{deviceId}}@treeseed.local"][data-member-role="project_lead"]' + internal: true + - id: choose-final-reviewer-role + title: Remove the invited user's ownership while preserving another owner + action: + select: + css: '[data-member-email="invite-{{runId}}-{{deviceId}}@treeseed.local"] select[name="roleKey"]' + internal: true + value: reviewer + expect: + text: invite-{{runId}}-{{deviceId}}@treeseed.local + - id: save-final-reviewer-role + title: Persist the final non-owner role through the rendered form + action: + click: + css: '[data-member-email="invite-{{runId}}-{{deviceId}}@treeseed.local"] form[data-ts-method="PATCH"] button[type="submit"]' + internal: true + expect: + text: Member role updated. + visible: + - css: '[data-member-email="invite-{{runId}}-{{deviceId}}@treeseed.local"][data-member-role="reviewer"]' + internal: true + - id: reload-team-collection-after-role-change + title: Reload the team collection after ownership and role changes + action: + goto: /app/teams + expect: + visible: + - css: '[data-team-name="gt-{{runShort}}-{{deviceId}}"]' + internal: true + - id: prove-final-role-after-reload + title: Prove the final role remains durable after a fresh page load + action: + click: + css: '[data-team-name="gt-{{runShort}}-{{deviceId}}"] a[href$="/members"]' + internal: true + expect: + visible: + - css: '[data-member-email="invite-{{runId}}-{{deviceId}}@treeseed.local"][data-member-role="reviewer"]' internal: true chapters: [] overlays: [] @@ -153,4 +369,4 @@ runtime: continueOnFailure: false training: {} visualAudit: - enabled: false + enabled: true diff --git a/guarantees/team/membership/scenes/invitation-mismatched-user.scene.yaml b/guarantees/team/membership/scenes/invitation-mismatched-user.scene.yaml new file mode 100644 index 00000000..8dc60329 --- /dev/null +++ b/guarantees/team/membership/scenes/invitation-mismatched-user.scene.yaml @@ -0,0 +1,55 @@ +schemaVersion: treeseed.scene/v1 +id: team.membership.invitation-mismatched-user +title: Mismatched Invitation Account Denial +description: A signed-in user whose email does not match the invitation cannot render or submit acceptance. +audience: [operator, evaluator] +journey: + kind: service + proves: [team.invitation-consent] + minimumSteps: 2 + requiresInteractiveAction: true + consumesState: + - { key: auth.primary-session, kind: browser-storage } + - { key: team.invitation, kind: marker } +mode: { test: true, demo: true, training: true } +target: { app: market, environment: local, baseUrl: auto, browser: chromium, viewport: { width: 1600, height: 900 } } +devices: + defaultProfile: desktop_chromium + profiles: + - { id: desktop_chromium, title: Desktop Chromium, orientation: landscape, viewport: { width: 1600, height: 900 }, video: { width: 1600, height: 900 }, output: { width: 1920, height: 1080 }, deviceScaleFactor: 1, isMobile: false, hasTouch: false } + - { id: mobile_chromium, title: Mobile Chromium, orientation: portrait, viewport: { width: 390, height: 844 }, video: { width: 390, height: 844 }, output: { width: 390, height: 844 }, deviceScaleFactor: 2, isMobile: true, hasTouch: true } +setup: + dev: { required: true, reuseExisting: true } +artifacts: { trace: true, video: true, screenshots: true, console: true, network: true, timeline: true, appLogs: true } +workflow: + - id: prove-primary-session + title: Begin from the authenticated primary account + action: { goto: /app/ } + expect: { urlIncludes: /app, visible: [{ scene: app-shell }] } + - id: open-mismatched-invitation + title: Open the exact pending invitation while signed in as a different account + action: + mailpitConfirmLatest: + mailpitUrl: http://127.0.0.1:8025 + email: mismatch-{{runId}}-{{deviceId}}@treeseed.local + subjectIncludes: You're invited to join Verified {{runShort}} {{deviceId}} + expect: + urlIncludes: /team-invites/ + text: Switch to the invited account + notVisible: [{ role: button, name: Accept invitation }] +chapters: [] +overlays: [] +diagrams: [] +render: + remotion: + composition: treeseed-training-default + output: { format: mp4, fps: 30, resolution: { width: 1920, height: 1080 } } + capture: { viewport: { width: 1600, height: 900 }, video: { width: 1600, height: 900 }, evidenceFit: fixed-browser } +runtime: + mode: training + timeouts: { sceneSeconds: 300, chapterSeconds: 120, stepSeconds: 60 } + checkpoints: { enabled: true, defaultResumable: true, everyStep: true } + progress: { heartbeatSeconds: 15 } + failure: { continueOnFailure: false } +training: {} +visualAudit: { enabled: true } diff --git a/guarantees/team/membership/scenes/invite-team-members.scene.yaml b/guarantees/team/membership/scenes/invite-team-members.scene.yaml index d46d1116..745cac73 100644 --- a/guarantees/team/membership/scenes/invite-team-members.scene.yaml +++ b/guarantees/team/membership/scenes/invite-team-members.scene.yaml @@ -8,10 +8,9 @@ audience: journey: kind: service proves: - - Invite Team Members opens the canonical @treeseed/admin record modal form workflow. - - Invite Team Members exercises a service journey instead of only loading /app/teams/visual-audit-team/members. - - Invite Team Members records reviewable evidence for the visible result before activation. - minimumSteps: 5 + - team.member-directory + - team.invitations + minimumSteps: 16 requiresInteractiveAction: true consumesState: - key: auth.primary-session @@ -21,6 +20,11 @@ journey: producesState: - key: team.invitation kind: marker + value: + recipient: invite-{{runId}}-{{deviceId}}@treeseed.local + existingRecipient: visual.member@treeseed.io + revokedRecipient: revoke-{{runId}}-{{deviceId}}@treeseed.local + mismatchRecipient: mismatch-{{runId}}-{{deviceId}}@treeseed.local mode: test: true demo: true @@ -85,38 +89,67 @@ workflow: - id: open-entry-route title: Open Invite Team Members action: - goto: /app/teams/gt-{{runShort}}-{{deviceId}}/members + goto: /app/teams expect: - text: Invite member + visible: + - css: '[data-team-name="gt-{{runShort}}-{{deviceId}}"]' + internal: true + - id: open-members + title: Open membership administration from the run-owned team + action: + click: + css: '[data-team-name="gt-{{runShort}}-{{deviceId}}"] a[href$="/members"]' + internal: true + expect: + urlIncludes: /members + text: Invite a member + - id: enter-invalid-recipient + title: Enter an invalid recipient address + action: + fill: + role: textbox + name: Recipient email + value: not-an-email + expect: + urlIncludes: /members + - id: reject-invalid-recipient + title: Reject the invalid recipient without creating pending state + action: + click: + role: button + name: Send invitation + expect: + urlIncludes: /members + notText: Invitation sent. - id: fill-recipient title: Enter a unique invited user action: fill: role: textbox - name: Email + name: Recipient email value: invite-{{runId}}-{{deviceId}}@treeseed.local expect: - text: Invite member + text: Invite a member - id: choose-role title: Select the initial contributor role action: select: role: combobox - name: Role + name: Initial role value: contributor expect: - text: Invite member + text: Invite a member - id: send-invitation title: Send the invitation through the member UI action: click: role: button - name: Invite member + name: Send invitation expect: urlIncludes: /members text: Invitation sent. visible: - - css: '[data-ts-toast-id][data-tone="success"]' + - css: '[data-ts-toast-id][data-tone="success"]:last-of-type' internal: true - id: observe-invitation-email title: Observe exact invitation delivery in Mailpit @@ -128,7 +161,104 @@ workflow: navigate: false expect: urlIncludes: /members - text: Invite member + text: Pending invitations + - id: fill-existing-recipient + title: Enter the existing verified fixture user + action: + fill: + role: textbox + name: Recipient email + value: visual.member@treeseed.io + expect: + text: Invite a member + - id: send-existing-user-invitation + title: Send an invitation without silently adding the existing user + action: + click: + role: button + name: Send invitation + expect: + visible: + - css: '[data-invite-email="visual.member@treeseed.io"]' + internal: true + notVisible: + - css: '[data-member-email="visual.member@treeseed.io"]' + internal: true + - id: fill-revocable-recipient + title: Enter a second run-scoped recipient for resend and revoke + action: + fill: + role: textbox + name: Recipient email + value: revoke-{{runId}}-{{deviceId}}@treeseed.local + expect: + text: Invite a member + - id: send-revocable-invitation + title: Create the second pending invitation through the UI + action: + click: + role: button + name: Send invitation + expect: + visible: + - css: '[data-invite-email="revoke-{{runId}}-{{deviceId}}@treeseed.local"]' + internal: true + - id: resend-pending-invitation + title: Resend the exact pending invitation + action: + click: + css: '[data-invite-email="revoke-{{runId}}-{{deviceId}}@treeseed.local"] form[action$="/resend"] button' + internal: true + expect: + text: Invitation resent. + visible: + - css: '[data-ts-toast-id][data-tone="success"]:last-of-type' + internal: true + - id: revoke-pending-invitation + title: Revoke the exact pending invitation + action: + click: + css: '[data-invite-email="revoke-{{runId}}-{{deviceId}}@treeseed.local"] form[data-ts-method="DELETE"] button' + internal: true + expect: + text: Invitation revoked. + - id: reload-after-revocation + title: Reload through the durable team collection after revocation + action: + goto: /app/teams + expect: + visible: + - css: '[data-team-name="gt-{{runShort}}-{{deviceId}}"]' + internal: true + - id: reopen-members-after-revocation + title: Reopen pending invitations and prove the revoked record stays absent + action: + click: + css: '[data-team-name="gt-{{runShort}}-{{deviceId}}"] a[href$="/members"]' + internal: true + expect: + notVisible: + - css: '[data-invite-email="revoke-{{runId}}-{{deviceId}}@treeseed.local"]' + internal: true + - id: fill-mismatched-recipient + title: Enter a pending recipient used by the mismatched-account denial journey + action: + fill: + role: textbox + name: Recipient email + value: mismatch-{{runId}}-{{deviceId}}@treeseed.local + expect: + text: Invite a member + - id: send-mismatched-invitation + title: Create the exact pending invitation used by the browser denial scene + action: + click: + role: button + name: Send invitation + expect: + visible: + - css: '[data-invite-email="mismatch-{{runId}}-{{deviceId}}@treeseed.local"]' + internal: true chapters: [] overlays: [] diagrams: [] @@ -165,4 +295,4 @@ runtime: continueOnFailure: false training: {} visualAudit: - enabled: false + enabled: true diff --git a/guarantees/team/membership/scenes/remove-team-member.scene.yaml b/guarantees/team/membership/scenes/remove-team-member.scene.yaml index 6aaa4461..162bd313 100644 --- a/guarantees/team/membership/scenes/remove-team-member.scene.yaml +++ b/guarantees/team/membership/scenes/remove-team-member.scene.yaml @@ -8,19 +8,20 @@ audience: journey: kind: service proves: - - Remove Team Member opens the canonical @treeseed/admin destructive confirmation workflow. - - Remove Team Member exercises a service journey instead of only loading /app/teams/visual-audit-team/members. - - Remove Team Member records reviewable evidence for the visible result before activation. - minimumSteps: 3 + - team.member-removal + - team.member-leave + minimumSteps: 23 requiresInteractiveAction: true consumesState: - - key: auth.primary-session + - key: auth.primary-session-after-role kind: browser-storage - key: team.member-role-changed kind: marker producesState: - key: team.member-removed kind: marker + - key: auth.primary-session-after-membership + kind: browser-storage mode: test: true demo: true @@ -85,27 +86,238 @@ workflow: - id: open-entry-route title: Open Remove Team Member action: - goto: /app/teams/gt-{{runShort}}-{{deviceId}}/members + goto: /app/teams + expect: + visible: + - css: '[data-team-name="gt-{{runShort}}-{{deviceId}}"]' + internal: true + - id: open-members + title: Open members for the run-created team + action: + click: + css: '[data-team-name="gt-{{runShort}}-{{deviceId}}"] a[href$="/members"]' + internal: true expect: text: invite-{{runId}}-{{deviceId}}@treeseed.local - id: remove-invited-member title: Remove the invited member action: click: - css: '[data-scene="team.member.invite-{{runId}}-{{deviceId}}@treeseed.local"] button[data-remove-member]' + css: '[data-member-email="invite-{{runId}}-{{deviceId}}@treeseed.local"] summary' internal: true expect: urlIncludes: /members + text: Confirm removal + - id: confirm-member-removal + title: Confirm removal through the visible destructive control + action: + click: + role: button + name: Confirm removal + expect: text: Member removed. visible: - - css: '[data-ts-toast-id][data-tone="success"]' + - css: '[data-ts-toast-id][data-tone="success"]:last-of-type' internal: true - id: verify-member-removed - title: Verify the member no longer appears + title: Return through the durable team collection action: - goto: /app/teams/gt-{{runShort}}-{{deviceId}}/members + goto: /app/teams expect: - notText: invite-{{runId}}-{{deviceId}}@treeseed.local + visible: + - css: '[data-team-name="gt-{{runShort}}-{{deviceId}}"]' + internal: true + - id: sign-out-removing-owner + title: End the owner session before proving the removed user lost access + action: + clickVisibleSequence: + - role: button + name: Open team operations + - role: button + name: Sign out + expect: + urlIncludes: /auth/sign-in + text: Sign in + - id: enter-removed-member-email + title: Enter the removed member's account + action: + fill: + role: textbox + name: Email or username + value: invite-{{runId}}-{{deviceId}}@treeseed.local + expect: + text: Sign in + - id: enter-removed-member-password + title: Enter the removed member's password + action: + fill: + css: 'input[name="password"]' + internal: true + value: TreeSeedInviteGuarantee123! + expect: + text: Sign in + - id: sign-in-removed-member + title: Authenticate the removed user + action: + click: + role: button + name: Sign in + expect: + urlIncludes: /app + - id: prove-removed-member-lost-access + title: Prove the removed user's team collection no longer exposes the run-created team + action: + goto: /app/teams + expect: + notVisible: + - css: '[data-team-name="gt-{{runShort}}-{{deviceId}}"]' + internal: true + - id: sign-out-removed-member + title: End the removed user's session + action: + clickVisibleSequence: + - role: button + name: Open team operations + - role: button + name: Sign out + expect: + urlIncludes: /auth/sign-in + text: Sign in + - id: enter-existing-member-email + title: Enter the existing accepted member's account + action: + fill: + role: textbox + name: Email or username + value: visual.member@treeseed.io + expect: + text: Sign in + - id: enter-existing-member-password + title: Enter the existing accepted member's password + action: + fill: + css: 'input[name="password"]' + internal: true + value: TreeSeedVisualAudit!2026 + expect: + text: Sign in + - id: sign-in-existing-member + title: Authenticate the existing accepted member + action: + click: + role: button + name: Sign in + expect: + urlIncludes: /app + - id: open-existing-member-team + title: Open the run-created team as the existing member + action: + goto: /app/teams + expect: + visible: + - css: '[data-team-name="gt-{{runShort}}-{{deviceId}}"]' + internal: true + - id: open-existing-member-access + title: Open the existing member's own access controls + action: + click: + css: '[data-team-name="gt-{{runShort}}-{{deviceId}}"] a[href$="/members"]' + internal: true + expect: + text: Leave team + notVisible: + - role: button + name: Send invitation + - id: leave-as-existing-member + title: Leave the team through the visible self-service control + action: + click: + role: button + name: Leave team + expect: + urlIncludes: /app/teams + text: You left the team. + notVisible: + - css: '[data-team-name="gt-{{runShort}}-{{deviceId}}"]' + internal: true + - id: prove-self-leave-lost-access + title: Prove the former member still cannot recover the team through the collection + action: + goto: /app/teams + expect: + notVisible: + - css: '[data-team-name="gt-{{runShort}}-{{deviceId}}"]' + internal: true + - id: sign-out-former-member + title: End the former member's session + action: + clickVisibleSequence: + - role: button + name: Open team operations + - role: button + name: Sign out + expect: + urlIncludes: /auth/sign-in + text: Sign in + - id: enter-primary-owner-email + title: Enter the primary owner's account + action: + fill: + role: textbox + name: Email or username + value: guarantee-{{runId}}-{{deviceId}}@treeseed.local + expect: + text: Sign in + - id: enter-primary-owner-password + title: Enter the primary owner's reset password + action: + fill: + css: 'input[name="password"]' + internal: true + value: TreeSeedGuaranteeReset123! + expect: + text: Sign in + - id: sign-in-primary-owner + title: Authenticate as the remaining owner + action: + click: + role: button + name: Sign in + expect: + urlIncludes: /app + - id: open-primary-owner-team-collection + title: Return to the run-created team as its remaining owner + action: + goto: /app/teams + expect: + visible: + - css: '[data-team-name="gt-{{runShort}}-{{deviceId}}"]' + internal: true + - id: open-last-owner-membership + title: Open the remaining owner's membership controls + action: + click: + css: '[data-team-name="gt-{{runShort}}-{{deviceId}}"] a[href$="/members"]' + internal: true + expect: + text: Leave team + visible: + - css: '[data-member-email="guarantee-{{runId}}-{{deviceId}}@treeseed.local"][data-member-role="team_owner"]' + internal: true + - id: reject-last-owner-leave + title: Reject self-leave when it would orphan the team + action: + click: + role: button + name: Leave team + expect: + urlIncludes: /members + text: A team must keep at least one owner. + visible: + - css: '[data-ts-toast-id][data-tone="error"]:last-of-type' + internal: true + - css: '[data-member-email="guarantee-{{runId}}-{{deviceId}}@treeseed.local"][data-member-role="team_owner"]' + internal: true chapters: [] overlays: [] diagrams: [] @@ -142,4 +354,4 @@ runtime: continueOnFailure: false training: {} visualAudit: - enabled: false + enabled: true diff --git a/guarantees/team/scenes/create-team.scene.yaml b/guarantees/team/scenes/create-team.scene.yaml index d3b2d757..69a60e9e 100644 --- a/guarantees/team/scenes/create-team.scene.yaml +++ b/guarantees/team/scenes/create-team.scene.yaml @@ -8,14 +8,15 @@ audience: journey: kind: service proves: - - Create Team opens the canonical @treeseed/admin full page form workflow. - - A verified owner can fill and submit the team creation form. - - The created team becomes visible in the authenticated team area for dependent journeys. - minimumSteps: 5 + - team.create + minimumSteps: 8 requiresInteractiveAction: true producesState: - key: team.primary kind: marker + value: + name: gt-{{runShort}}-{{deviceId}} + displayName: Guarantee {{runShort}} {{deviceId}} consumesState: - key: auth.primary-session kind: browser-storage @@ -49,6 +50,21 @@ devices: deviceScaleFactor: 1 isMobile: false hasTouch: false + - id: tablet_chromium + title: Tablet Chromium + orientation: portrait + viewport: + width: 820 + height: 1180 + video: + width: 820 + height: 1180 + output: + width: 820 + height: 1180 + deviceScaleFactor: 2 + isMobile: true + hasTouch: true - id: mobile_chromium title: Mobile Chromium orientation: portrait @@ -86,7 +102,30 @@ workflow: goto: /app/teams/new expect: urlIncludes: /app/teams - text: Create team + visible: + - css: '[data-scene="team.create.form"]' + internal: true + - id: enter-invalid-team-name + title: Enter an invalid team name + action: + fill: + css: '[data-scene="team.create.form"] input[name="name"]' + internal: true + value: Invalid Team Name + expect: + urlIncludes: /app/teams/new + visible: + - css: '[data-scene="team.create.form"]' + internal: true + - id: reject-invalid-team-name + title: Reject invalid input without creating a team + action: + click: + role: button + name: Create team + expect: + urlIncludes: /app/teams/new + notText: Team created. - id: fill-team-display-name title: Fill team display name action: @@ -95,7 +134,9 @@ workflow: internal: true value: Guarantee {{runShort}} {{deviceId}} expect: - text: Create team + visible: + - css: '[data-scene="team.create.form"]' + internal: true - id: fill-team-summary title: Fill team profile summary action: @@ -104,7 +145,9 @@ workflow: name: Profile summary value: Team created by the guarantee service journey for downstream UI verification. expect: - text: Create team + visible: + - css: '[data-scene="team.create.form"]' + internal: true - id: fill-team-name title: Fill team name after dependent identity fields action: @@ -113,7 +156,9 @@ workflow: internal: true value: gt-{{runShort}}-{{deviceId}} expect: - text: Create team + visible: + - css: '[data-scene="team.create.form"]' + internal: true - id: submit-team title: Submit team creation action: @@ -123,14 +168,23 @@ workflow: expect: urlIncludes: /app/teams - id: inspect-service-surface - title: Reload the durable team settings + title: Prove the run-created team appears in the collection action: - goto: /app/teams/gt-{{runShort}}-{{deviceId}}/edit + goto: /app/teams expect: - urlIncludes: /edit + urlIncludes: /app/teams visible: - - role: textbox - name: Display name + - css: '[data-team-name="gt-{{runShort}}-{{deviceId}}"]' + internal: true + - id: inspect-owner-membership + title: Open members and prove owner management controls + action: + click: + css: '[data-team-name="gt-{{runShort}}-{{deviceId}}"] a[href$="/members"]' + internal: true + expect: + urlIncludes: /members + text: Invite a member chapters: [] overlays: [] diagrams: [] @@ -167,4 +221,4 @@ runtime: continueOnFailure: false training: {} visualAudit: - enabled: false + enabled: true diff --git a/guarantees/team/scenes/delete-team.scene.yaml b/guarantees/team/scenes/delete-team.scene.yaml index 8d86dacf..e9695304 100644 --- a/guarantees/team/scenes/delete-team.scene.yaml +++ b/guarantees/team/scenes/delete-team.scene.yaml @@ -8,19 +8,19 @@ audience: journey: kind: service proves: - - Delete Team opens the canonical @treeseed/admin destructive confirmation workflow. - - Delete Team exercises a service journey instead of only loading /app/teams/visual-audit-team/delete. - - Delete Team records reviewable evidence for the visible result before activation. - minimumSteps: 5 + - team.lifecycle + minimumSteps: 14 requiresInteractiveAction: true consumesState: - - key: auth.primary-session + - key: auth.primary-session-after-membership kind: browser-storage - key: team.member-removed kind: marker producesState: - key: team.deleted kind: marker + value: + name: gt-{{runShort}}-{{deviceId}} mode: test: true demo: true @@ -83,38 +83,118 @@ artifacts: appLogs: true workflow: - id: open-entry-route - title: Open Delete Team + title: Open the run-owned team collection action: - goto: /app/teams/gt-{{runShort}}-{{deviceId}}/delete + goto: /app/teams expect: - text: No blockers found + visible: + - css: '[data-team-name="gt-{{runShort}}-{{deviceId}}"]' + internal: true + - id: open-lifecycle + title: Open owner-only lifecycle controls + action: + click: + css: '[data-team-name="gt-{{runShort}}-{{deviceId}}"] a[href$="/delete"]' + internal: true + expect: + text: No active lifecycle blockers were found. + - id: archive-team + title: Archive the team through the visible lifecycle control + action: + click: + role: button + name: Archive team + expect: + urlIncludes: /app/teams + text: Team archived. + - id: reopen-archived-lifecycle + title: Reopen the archived team and its recovery window + action: + click: + css: '[data-team-name="gt-{{runShort}}-{{deviceId}}"] a[href$="/delete"]' + internal: true + expect: + visible: + - css: '[data-ts-countdown]' + internal: true + - id: prove-archived-deletion-available + title: Prove deletion remains a distinct immediate operation while archived + action: + keyboard: Tab + expect: + text: Delete team permanently + - id: restore-team + title: Restore the archived team during its recovery window + action: + click: + role: button + name: Restore team + expect: + urlIncludes: /app/teams/ + text: Operational overview + - id: return-to-collection + title: Return to the team collection + action: + goto: /app/teams + expect: + visible: + - css: '[data-team-name="gt-{{runShort}}-{{deviceId}}"]' + internal: true + - id: reopen-active-lifecycle + title: Reopen lifecycle after restoration and delete without another archive + action: + click: + css: '[data-team-name="gt-{{runShort}}-{{deviceId}}"] a[href$="/delete"]' + internal: true + expect: + text: Deletion is immediate - id: enter-incorrect-confirmation title: Enter an incorrect deletion confirmation action: fill: role: textbox - name: Type "DELETE gt-{{runShort}}-{{deviceId}}" - value: DELETE wrong-team + name: Type "gt-{{runShort}}-{{deviceId}}" exactly + value: wrong-team + expect: + text: Delete team permanently + - id: enter-reauthentication + title: Reauthenticate for the destructive operation + action: + fill: + role: textbox + name: Current password + value: TreeSeedGuaranteeReset123! + expect: + text: Delete team permanently + - id: reject-incorrect-confirmation + title: Reject an incorrect exact-name confirmation + action: + click: + role: button + name: Delete team permanently expect: - text: Delete team + urlIncludes: /delete + text: Type - id: enter-exact-confirmation title: Enter the exact deletion confirmation action: fill: role: textbox - name: Type "DELETE gt-{{runShort}}-{{deviceId}}" - value: DELETE gt-{{runShort}}-{{deviceId}} + name: Type "gt-{{runShort}}-{{deviceId}}" exactly + value: gt-{{runShort}}-{{deviceId}} expect: - text: Delete team + text: Delete team permanently - id: delete-team title: Permanently delete the run-owned team action: click: role: button - name: Delete team + name: Delete team permanently expect: urlIncludes: /app/teams - notText: Verified {{runShort}} {{deviceId}} + notVisible: + - css: '[data-team-name="gt-{{runShort}}-{{deviceId}}"]' + internal: true - id: verify-team-lookup-cleared title: Verify the deleted team no longer resolves action: @@ -125,7 +205,9 @@ workflow: expectedStatus: 404 expect: urlIncludes: /app/teams - notText: Verified {{runShort}} {{deviceId}} + notVisible: + - css: '[data-team-name="gt-{{runShort}}-{{deviceId}}"]' + internal: true chapters: [] overlays: [] diagrams: [] @@ -162,4 +244,4 @@ runtime: continueOnFailure: false training: {} visualAudit: - enabled: false + enabled: true diff --git a/guarantees/team/scenes/edit-team-settings.scene.yaml b/guarantees/team/scenes/edit-team-settings.scene.yaml index c172a927..8124cbc4 100644 --- a/guarantees/team/scenes/edit-team-settings.scene.yaml +++ b/guarantees/team/scenes/edit-team-settings.scene.yaml @@ -8,10 +8,8 @@ audience: journey: kind: service proves: - - Edit Team Settings opens the canonical @treeseed/admin full page form workflow. - - Edit Team Settings exercises a service journey instead of only loading /app/teams/visual-audit-team/edit. - - Edit Team Settings records reviewable evidence for the visible result before activation. - minimumSteps: 5 + - team.identity-settings + minimumSteps: 9 requiresInteractiveAction: true consumesState: - key: auth.primary-session @@ -51,6 +49,21 @@ devices: deviceScaleFactor: 1 isMobile: false hasTouch: false + - id: tablet_chromium + title: Tablet Chromium + orientation: portrait + viewport: + width: 820 + height: 1180 + video: + width: 820 + height: 1180 + output: + width: 820 + height: 1180 + deviceScaleFactor: 2 + isMobile: true + hasTouch: true - id: mobile_chromium title: Mobile Chromium orientation: portrait @@ -85,9 +98,54 @@ workflow: - id: open-entry-route title: Open Edit Team Settings action: - goto: /app/teams/gt-{{runShort}}-{{deviceId}}/edit + goto: /app/teams expect: urlIncludes: /app/teams + visible: + - css: '[data-team-name="gt-{{runShort}}-{{deviceId}}"]' + internal: true + - id: open-settings-control + title: Open settings from the exact run-owned team card + action: + click: + css: '[data-team-name="gt-{{runShort}}-{{deviceId}}"] a[href$="/edit"]' + internal: true + expect: + urlIncludes: /edit + text: Edit team + - id: force-stale-version + title: Prepare a stale optimistic version without mutating the team + action: + fill: + css: 'input[name="expectedUpdatedAt"]' + internal: true + value: 2000-01-01T00:00:00.000Z + expect: + text: Edit team + - id: reject-stale-update + title: Reject the stale update and preserve the persisted identity + action: + click: + role: button + name: Save team + expect: + urlIncludes: /edit + text: changed + - id: return-to-current-settings + title: Reload the current version through the collection + action: + goto: /app/teams + expect: + visible: + - css: '[data-team-name="gt-{{runShort}}-{{deviceId}}"]' + internal: true + - id: reopen-current-settings + title: Reopen settings with the current optimistic version + action: + click: + css: '[data-team-name="gt-{{runShort}}-{{deviceId}}"] a[href$="/edit"]' + internal: true + expect: text: Edit team - id: update-display-name title: Update the public team display name @@ -117,15 +175,15 @@ workflow: urlIncludes: /edit text: Team saved. visible: - - css: '[data-ts-toast-id][data-tone="success"]' + - css: '[data-ts-toast-id][data-tone="success"]:last-of-type' internal: true - id: reload-team title: Reload persisted settings action: - goto: /app/teams/gt-{{runShort}}-{{deviceId}}/edit + goto: /app/teams expect: visible: - - css: '[data-team-display-name="Verified {{runShort}} {{deviceId}}"]' + - css: '[data-team-name="gt-{{runShort}}-{{deviceId}}"]' internal: true chapters: [] overlays: [] @@ -163,4 +221,4 @@ runtime: continueOnFailure: false training: {} visualAudit: - enabled: false + enabled: true diff --git a/guarantees/team/scenes/negative/anonymous-team-access.scene.yaml b/guarantees/team/scenes/negative/anonymous-team-access.scene.yaml new file mode 100644 index 00000000..eaf4fbd3 --- /dev/null +++ b/guarantees/team/scenes/negative/anonymous-team-access.scene.yaml @@ -0,0 +1,56 @@ +schemaVersion: treeseed.scene/v1 +id: team.negative.anonymous-access +title: Anonymous Team Administration Denial +description: Anonymous visitors cannot reach team collection, creation, or operational overview controls. +audience: [operator, evaluator] +journey: + kind: service + proves: [team.create, team.active-selection, team.operational-overview] + minimumSteps: 3 + requiresInteractiveAction: true +mode: { test: true, demo: true, training: true } +target: { app: market, environment: local, baseUrl: auto, browser: chromium, viewport: { width: 1600, height: 900 } } +devices: + defaultProfile: desktop_chromium + profiles: + - { id: desktop_chromium, title: Desktop Chromium, orientation: landscape, viewport: { width: 1600, height: 900 }, video: { width: 1600, height: 900 }, output: { width: 1920, height: 1080 }, deviceScaleFactor: 1, isMobile: false, hasTouch: false } + - { id: tablet_chromium, title: Tablet Chromium, orientation: portrait, viewport: { width: 820, height: 1180 }, video: { width: 820, height: 1180 }, output: { width: 820, height: 1180 }, deviceScaleFactor: 2, isMobile: true, hasTouch: true } + - { id: mobile_chromium, title: Mobile Chromium, orientation: portrait, viewport: { width: 390, height: 844 }, video: { width: 390, height: 844 }, output: { width: 390, height: 844 }, deviceScaleFactor: 2, isMobile: true, hasTouch: true } +setup: + dev: { required: true, reuseExisting: true } + auth: { role: anonymous, required: false } +artifacts: { trace: true, video: true, screenshots: true, console: true, network: true, timeline: true, appLogs: true } +workflow: + - id: deny-team-collection + title: Redirect anonymous collection access + action: { goto: /app/teams } + expect: { urlIncludes: "/auth/sign-in?returnTo=", text: Sign in } + - id: exercise-sign-in-validation + title: Keep anonymous access on the sign-in boundary + action: + click: { role: button, name: Sign in } + expect: + urlIncludes: "/auth/sign-in?returnTo=" + visible: [{ role: textbox, name: Email or username }] + - id: deny-team-creation + title: Redirect anonymous create access without rendering mutation controls + action: { goto: /app/teams/new } + expect: + urlIncludes: "/auth/sign-in?returnTo=" + notVisible: [{ role: button, name: Create team }] +chapters: [] +overlays: [] +diagrams: [] +render: + remotion: + composition: treeseed-training-default + output: { format: mp4, fps: 30, resolution: { width: 1920, height: 1080 } } + capture: { viewport: { width: 1600, height: 900 }, video: { width: 1600, height: 900 }, evidenceFit: fixed-browser } +runtime: + mode: training + timeouts: { sceneSeconds: 300, chapterSeconds: 120, stepSeconds: 60 } + checkpoints: { enabled: true, defaultResumable: true, everyStep: true } + progress: { heartbeatSeconds: 15 } + failure: { continueOnFailure: false } +training: {} +visualAudit: { enabled: true } diff --git a/guarantees/team/scenes/negative/edit-contributor.scene.yaml b/guarantees/team/scenes/negative/edit-contributor.scene.yaml new file mode 100644 index 00000000..ded9c988 --- /dev/null +++ b/guarantees/team/scenes/negative/edit-contributor.scene.yaml @@ -0,0 +1,55 @@ +schemaVersion: treeseed.scene/v1 +id: team.negative.edit-contributor +title: Contributor Team Settings Denial +description: A contributor can view team context but cannot render or submit identity controls. +audience: [operator, evaluator] +journey: + kind: service + proves: [team.identity-settings] + minimumSteps: 2 + requiresInteractiveAction: true +mode: { test: true, demo: true, training: true } +target: { app: market, environment: local, baseUrl: auto, browser: chromium, viewport: { width: 1600, height: 900 } } +devices: + defaultProfile: desktop_chromium + profiles: + - { id: desktop_chromium, title: Desktop Chromium, orientation: landscape, viewport: { width: 1600, height: 900 }, video: { width: 1600, height: 900 }, output: { width: 1920, height: 1080 }, deviceScaleFactor: 1, isMobile: false, hasTouch: false } + - { id: tablet_chromium, title: Tablet Chromium, orientation: portrait, viewport: { width: 820, height: 1180 }, video: { width: 820, height: 1180 }, output: { width: 820, height: 1180 }, deviceScaleFactor: 2, isMobile: true, hasTouch: true } + - { id: mobile_chromium, title: Mobile Chromium, orientation: portrait, viewport: { width: 390, height: 844 }, video: { width: 390, height: 844 }, output: { width: 390, height: 844 }, deviceScaleFactor: 2, isMobile: true, hasTouch: true } +setup: + dev: { required: true, reuseExisting: true } + auth: { role: member, required: true } +artifacts: { trace: true, video: true, screenshots: true, console: true, network: true, timeline: true, appLogs: true } +workflow: + - id: deny-settings-form + title: Omit identity mutation controls for contributors + action: + goto: + path: /app/teams/visual-audit-team/edit + expectedStatus: 403 + expect: + text: Team controls unavailable + notVisible: [{ role: button, name: Save team }] + - id: return-to-overview + title: Return to the safe team collection + action: + click: { role: link, name: Back to teams } + expect: + urlIncludes: /app/teams + visible: [{ scene: team.collection }] +chapters: [] +overlays: [] +diagrams: [] +render: + remotion: + composition: treeseed-training-default + output: { format: mp4, fps: 30, resolution: { width: 1920, height: 1080 } } + capture: { viewport: { width: 1600, height: 900 }, video: { width: 1600, height: 900 }, evidenceFit: fixed-browser } +runtime: + mode: training + timeouts: { sceneSeconds: 300, chapterSeconds: 120, stepSeconds: 60 } + checkpoints: { enabled: true, defaultResumable: true, everyStep: true } + progress: { heartbeatSeconds: 15 } + failure: { continueOnFailure: false } +training: {} +visualAudit: { enabled: true } diff --git a/guarantees/team/scenes/negative/lifecycle-project-lead.scene.yaml b/guarantees/team/scenes/negative/lifecycle-project-lead.scene.yaml new file mode 100644 index 00000000..2658cf7d --- /dev/null +++ b/guarantees/team/scenes/negative/lifecycle-project-lead.scene.yaml @@ -0,0 +1,51 @@ +schemaVersion: treeseed.scene/v1 +id: team.negative.lifecycle-project-lead +title: Project Lead Lifecycle Denial +description: Project leads cannot archive, restore, or permanently delete a team. +audience: [operator, evaluator] +journey: + kind: service + proves: [team.lifecycle] + minimumSteps: 2 + requiresInteractiveAction: true +mode: { test: true, demo: true, training: true } +target: { app: market, environment: local, baseUrl: auto, browser: chromium, viewport: { width: 1600, height: 900 } } +devices: + defaultProfile: desktop_chromium + profiles: + - { id: desktop_chromium, title: Desktop Chromium, orientation: landscape, viewport: { width: 1600, height: 900 }, video: { width: 1600, height: 900 }, output: { width: 1920, height: 1080 }, deviceScaleFactor: 1, isMobile: false, hasTouch: false } + - { id: mobile_chromium, title: Mobile Chromium, orientation: portrait, viewport: { width: 390, height: 844 }, video: { width: 390, height: 844 }, output: { width: 390, height: 844 }, deviceScaleFactor: 2, isMobile: true, hasTouch: true } +setup: + dev: { required: true, reuseExisting: true } + auth: { role: admin, required: true } +artifacts: { trace: true, video: true, screenshots: true, console: true, network: true, timeline: true, appLogs: true } +workflow: + - id: deny-lifecycle-controls + title: Omit owner-only lifecycle controls + action: { goto: /app/teams/visual-audit-team/delete } + expect: + text: Owner access required + notVisible: + - { role: button, name: Archive team } + - { role: button, name: Delete team permanently } + - id: return-to-overview + title: Preserve project lead operational access + action: + click: { role: link, name: Team overview } + expect: { urlIncludes: /app/teams/visual-audit-team, text: Operational overview } +chapters: [] +overlays: [] +diagrams: [] +render: + remotion: + composition: treeseed-training-default + output: { format: mp4, fps: 30, resolution: { width: 1920, height: 1080 } } + capture: { viewport: { width: 1600, height: 900 }, video: { width: 1600, height: 900 }, evidenceFit: fixed-browser } +runtime: + mode: training + timeouts: { sceneSeconds: 300, chapterSeconds: 120, stepSeconds: 60 } + checkpoints: { enabled: true, defaultResumable: true, everyStep: true } + progress: { heartbeatSeconds: 15 } + failure: { continueOnFailure: false } +training: {} +visualAudit: { enabled: true } diff --git a/guarantees/team/scenes/negative/members-contributor.scene.yaml b/guarantees/team/scenes/negative/members-contributor.scene.yaml new file mode 100644 index 00000000..9597f78a --- /dev/null +++ b/guarantees/team/scenes/negative/members-contributor.scene.yaml @@ -0,0 +1,73 @@ +schemaVersion: treeseed.scene/v1 +id: team.negative.members-contributor +title: Contributor Member Directory and Administration Denial +description: Contributors can list and search teammates while invitation, role, ownership, and removal controls stay absent. +audience: [operator, evaluator] +journey: + kind: service + proves: [team.member-directory, team.invitations, team.member-roles, team.member-removal] + minimumSteps: 3 + requiresInteractiveAction: true +mode: { test: true, demo: true, training: true } +target: { app: market, environment: local, baseUrl: auto, browser: chromium, viewport: { width: 1600, height: 900 } } +devices: + defaultProfile: desktop_chromium + profiles: + - { id: desktop_chromium, title: Desktop Chromium, orientation: landscape, viewport: { width: 1600, height: 900 }, video: { width: 1600, height: 900 }, output: { width: 1920, height: 1080 }, deviceScaleFactor: 1, isMobile: false, hasTouch: false } + - { id: mobile_chromium, title: Mobile Chromium, orientation: portrait, viewport: { width: 390, height: 844 }, video: { width: 390, height: 844 }, output: { width: 390, height: 844 }, deviceScaleFactor: 2, isMobile: true, hasTouch: true } +setup: + dev: { required: true, reuseExisting: true } + auth: { role: member, required: true } +artifacts: { trace: true, video: true, screenshots: true, console: true, network: true, timeline: true, appLogs: true } +workflow: + - id: open-member-directory + title: Show the member directory without administration controls + action: { goto: /app/teams/visual-audit-team/members } + expect: + text: Team members + visible: + - { css: "#team-member-search", internal: true } + - { css: "[data-scene^='team.member.']", internal: true } + notVisible: + - { role: button, name: Send invitation } + - { role: button, name: Save } + - { role: button, name: Transfer ownership } + - { role: button, name: Confirm removal } + - id: search-member-directory + title: Search members through the visible directory + action: + fill: + role: searchbox + name: Search members + value: contributor + expect: + visible: + - { css: "#team-member-search", internal: true } + - id: submit-member-search + title: Return matching members without exposing mutation controls + action: + click: { role: button, name: Search } + expect: + urlIncludes: q=contributor + text: Contributor + notVisible: + - { role: button, name: Send invitation } + - { role: button, name: Save } + - { role: button, name: Transfer ownership } + - { role: button, name: Confirm removal } +chapters: [] +overlays: [] +diagrams: [] +render: + remotion: + composition: treeseed-training-default + output: { format: mp4, fps: 30, resolution: { width: 1920, height: 1080 } } + capture: { viewport: { width: 1600, height: 900 }, video: { width: 1600, height: 900 }, evidenceFit: fixed-browser } +runtime: + mode: training + timeouts: { sceneSeconds: 300, chapterSeconds: 120, stepSeconds: 60 } + checkpoints: { enabled: true, defaultResumable: true, everyStep: true } + progress: { heartbeatSeconds: 15 } + failure: { continueOnFailure: false } +training: {} +visualAudit: { enabled: true } diff --git a/guarantees/team/scenes/negative/overview-nonmember.scene.yaml b/guarantees/team/scenes/negative/overview-nonmember.scene.yaml new file mode 100644 index 00000000..bcfc9882 --- /dev/null +++ b/guarantees/team/scenes/negative/overview-nonmember.scene.yaml @@ -0,0 +1,52 @@ +schemaVersion: treeseed.scene/v1 +id: team.negative.overview-nonmember +title: Non-member Team Overview Denial +description: An authenticated comparison user cannot discover or open the run-owned team. +audience: [operator, evaluator] +journey: + kind: service + proves: [team.collection, team.operational-overview] + minimumSteps: 2 + requiresInteractiveAction: true +mode: { test: true, demo: true, training: true } +target: { app: market, environment: local, baseUrl: auto, browser: chromium, viewport: { width: 1600, height: 900 } } +devices: + defaultProfile: desktop_chromium + profiles: + - { id: desktop_chromium, title: Desktop Chromium, orientation: landscape, viewport: { width: 1600, height: 900 }, video: { width: 1600, height: 900 }, output: { width: 1920, height: 1080 }, deviceScaleFactor: 1, isMobile: false, hasTouch: false } + - { id: tablet_chromium, title: Tablet Chromium, orientation: portrait, viewport: { width: 820, height: 1180 }, video: { width: 820, height: 1180 }, output: { width: 820, height: 1180 }, deviceScaleFactor: 2, isMobile: true, hasTouch: true } + - { id: mobile_chromium, title: Mobile Chromium, orientation: portrait, viewport: { width: 390, height: 844 }, video: { width: 390, height: 844 }, output: { width: 390, height: 844 }, deviceScaleFactor: 2, isMobile: true, hasTouch: true } +setup: + dev: { required: true, reuseExisting: true } + auth: { role: member, required: true } +artifacts: { trace: true, video: true, screenshots: true, console: true, network: true, timeline: true, appLogs: true } +workflow: + - id: hide-run-team + title: Hide the run-owned team from the comparison principal + action: { goto: /app/teams } + expect: + urlIncludes: /app/teams + notText: Verified {{runShort}} {{deviceId}} + - id: exercise-available-overview + title: Preserve access to the comparison user's own overview + action: + click: { role: link, name: Overview } + expect: + urlIncludes: /app/teams/ + text: Operational overview +chapters: [] +overlays: [] +diagrams: [] +render: + remotion: + composition: treeseed-training-default + output: { format: mp4, fps: 30, resolution: { width: 1920, height: 1080 } } + capture: { viewport: { width: 1600, height: 900 }, video: { width: 1600, height: 900 }, evidenceFit: fixed-browser } +runtime: + mode: training + timeouts: { sceneSeconds: 300, chapterSeconds: 120, stepSeconds: 60 } + checkpoints: { enabled: true, defaultResumable: true, everyStep: true } + progress: { heartbeatSeconds: 15 } + failure: { continueOnFailure: false } +training: {} +visualAudit: { enabled: true } diff --git a/guarantees/team/scenes/switch-active-team.scene.yaml b/guarantees/team/scenes/switch-active-team.scene.yaml index 0b76c3ca..057857a6 100644 --- a/guarantees/team/scenes/switch-active-team.scene.yaml +++ b/guarantees/team/scenes/switch-active-team.scene.yaml @@ -8,9 +8,7 @@ audience: journey: kind: service proves: - - Switch Active Team opens the canonical @treeseed/admin dashboard read model workflow. - - Switch Active Team exercises a service journey instead of only loading /app/teams. - - Switch Active Team records reviewable evidence for the visible result before activation. + - team.active-selection minimumSteps: 4 requiresInteractiveAction: true consumesState: @@ -51,6 +49,21 @@ devices: deviceScaleFactor: 1 isMobile: false hasTouch: false + - id: tablet_chromium + title: Tablet Chromium + orientation: portrait + viewport: + width: 820 + height: 1180 + video: + width: 820 + height: 1180 + output: + width: 820 + height: 1180 + deviceScaleFactor: 2 + isMobile: true + hasTouch: true - id: mobile_chromium title: Mobile Chromium orientation: portrait @@ -89,34 +102,36 @@ workflow: expect: urlIncludes: /app/teams visible: - - css: '[data-active-team-label="TreeSeed"]:visible' + - css: '[data-scene="team.collection"]' + internal: true + - css: '[data-team-display-name="Tree Seed"]' internal: true - - css: '[data-page-header-owner="content"] .ts-page-header' + - css: '[data-team-name="gt-{{runShort}}-{{deviceId}}"]' + internal: true + - css: '[data-scene="team.collection"] > .ts-page-header' internal: true notVisible: - - css: '[data-page-header-owner="content"] > .ts-product-shell__body .ts-control-surface > .ts-control-surface__header' + - css: '[data-scene="team.collection"] [data-active="true"]' internal: true - id: switch-to-personal-team - title: Select the personal team through the shell + title: Select the personal team through its explicit collection control action: - select: - role: combobox - name: Active team - label: Tree Seed + click: + css: '[data-team-display-name="Tree Seed"] [data-scene="team.active.set"] button' + internal: true expect: visible: - - css: '[data-active-team-label="Tree Seed"]:visible' + - css: '[data-team-display-name="Tree Seed"][data-active="true"]' internal: true - id: switch-to-created-team - title: Select the created team through the shell + title: Select the created team through its explicit collection control action: - select: - role: combobox - name: Active team - label: Guarantee {{runShort}} {{deviceId}} + click: + css: '[data-team-name="gt-{{runShort}}-{{deviceId}}"] [data-scene="team.active.set"] button' + internal: true expect: visible: - - css: '[data-active-team-label="Guarantee {{runShort}} {{deviceId}}"]:visible' + - css: '[data-team-name="gt-{{runShort}}-{{deviceId}}"][data-active="true"]' internal: true - id: reload-active-team title: Prove active-team cookie persistence after reload @@ -125,12 +140,11 @@ workflow: expect: urlIncludes: /app visible: - - css: '[data-active-team-label="Guarantee {{runShort}} {{deviceId}}"]:visible' + - css: '[data-scene="dashboard-template"] .ts-page-header' internal: true - - css: '[data-page-header-owner="content"] .ts-page-header' + - css: '[aria-labelledby="dashboard-section-identity-context"] .ts-dashboard-metric:has-text("Active team"):has-text("Guarantee {{runShort}} {{deviceId}}")' internal: true - notVisible: - - css: '[data-page-header-owner="content"] > .ts-product-shell__body .ts-control-surface > .ts-control-surface__header' + - css: '[data-scene="dashboard-template"] a.ts-resource-card:has-text("Current active team"):has-text("Guarantee {{runShort}} {{deviceId}}")' internal: true chapters: [] overlays: [] @@ -168,4 +182,4 @@ runtime: continueOnFailure: false training: {} visualAudit: - enabled: false + enabled: true diff --git a/guarantees/team/scenes/view-public-team-profile.scene.yaml b/guarantees/team/scenes/view-public-team-profile.scene.yaml new file mode 100644 index 00000000..d082aafc --- /dev/null +++ b/guarantees/team/scenes/view-public-team-profile.scene.yaml @@ -0,0 +1,100 @@ +schemaVersion: treeseed.scene/v1 +id: team.team.view-public-team-profile.021 +title: View Public Team Profile +description: Anonymous public-knowledge and redaction journey for the active run-owned team. +audience: [operator, evaluator] +journey: + kind: service + proves: [team.public-profile] + minimumSteps: 3 + requiresInteractiveAction: true + consumesState: + - key: team.updated + kind: marker +mode: { test: true, demo: true, training: true } +target: + app: market + environment: local + baseUrl: auto + browser: chromium + viewport: { width: 1600, height: 900 } +devices: + defaultProfile: desktop_chromium + profiles: + - id: desktop_chromium + title: Desktop Chromium + orientation: landscape + viewport: { width: 1600, height: 900 } + video: { width: 1600, height: 900 } + output: { width: 1920, height: 1080 } + deviceScaleFactor: 1 + isMobile: false + hasTouch: false + - id: tablet_chromium + title: Tablet Chromium + orientation: portrait + viewport: { width: 820, height: 1180 } + video: { width: 820, height: 1180 } + output: { width: 820, height: 1180 } + deviceScaleFactor: 2 + isMobile: true + hasTouch: true + - id: mobile_chromium + title: Mobile Chromium + orientation: portrait + viewport: { width: 390, height: 844 } + video: { width: 390, height: 844 } + output: { width: 390, height: 844 } + deviceScaleFactor: 2 + isMobile: true + hasTouch: true +setup: + dev: { required: true, reuseExisting: true } + auth: { role: anonymous, required: false } +artifacts: { trace: true, video: true, screenshots: true, console: true, network: true, timeline: true, appLogs: true } +workflow: + - id: open-public-profile + title: Open the anonymous team knowledge profile + action: { goto: "/t/gt-{{runShort}}-{{deviceId}}" } + expect: + urlIncludes: /t/gt- + text: Verified {{runShort}} {{deviceId}} + visible: + - { scene: knowledge.profile } + - { scene: knowledge.identity } + - { scene: knowledge.collection } + - { scene: knowledge.activity } + - id: follow-sign-in + title: Exercise the public sign-in action + action: + click: { role: link, name: Sign in } + expect: { urlIncludes: /auth/sign-in, text: Sign in } + - id: prove-redaction + title: Prove private operations remain absent while public knowledge sections render + action: { goto: "/t/gt-{{runShort}}-{{deviceId}}" } + expect: + text: Published knowledge + notText: "@treeseed.local" + notVisible: + - { scene: team.navigation } + - { role: link, name: Manage members } + - { role: link, name: View projects } +chapters: [] +overlays: [] +diagrams: [] +render: + remotion: + composition: treeseed-training-default + output: { format: mp4, fps: 30, resolution: { width: 1920, height: 1080 } } + capture: + viewport: { width: 1600, height: 900 } + video: { width: 1600, height: 900 } + evidenceFit: fixed-browser +runtime: + mode: training + timeouts: { sceneSeconds: 300, chapterSeconds: 120, stepSeconds: 60 } + checkpoints: { enabled: true, defaultResumable: true, everyStep: true } + progress: { heartbeatSeconds: 15 } + failure: { continueOnFailure: false } +training: {} +visualAudit: { enabled: true } diff --git a/guarantees/team/scenes/view-team-overview.scene.yaml b/guarantees/team/scenes/view-team-overview.scene.yaml new file mode 100644 index 00000000..2b66aa8d --- /dev/null +++ b/guarantees/team/scenes/view-team-overview.scene.yaml @@ -0,0 +1,206 @@ +schemaVersion: treeseed.scene/v1 +id: team.team.view-team-overview.015 +title: View Team Overview +description: Acceptance scene for guarantee.team.team.view-team-overview.015. +audience: + - operator + - evaluator +journey: + kind: service + proves: + - team.collection + - team.operational-overview + - team.public-profile + minimumSteps: 4 + requiresInteractiveAction: true + consumesState: + - key: auth.primary-session + kind: browser-storage + - key: team.updated + kind: marker +mode: + test: true + demo: true + training: true +target: + app: market + environment: local + baseUrl: auto + browser: chromium + viewport: + width: 1600 + height: 900 +devices: + defaultProfile: desktop_chromium + profiles: + - id: desktop_chromium + title: Desktop Chromium + orientation: landscape + viewport: + width: 1600 + height: 900 + video: + width: 1600 + height: 900 + output: + width: 1920 + height: 1080 + deviceScaleFactor: 1 + isMobile: false + hasTouch: false + - id: tablet_chromium + title: Tablet Chromium + orientation: portrait + viewport: + width: 820 + height: 1180 + video: + width: 820 + height: 1180 + output: + width: 820 + height: 1180 + deviceScaleFactor: 2 + isMobile: true + hasTouch: true + - id: mobile_chromium + title: Mobile Chromium + orientation: portrait + viewport: + width: 390 + height: 844 + video: + width: 390 + height: 844 + output: + width: 390 + height: 844 + deviceScaleFactor: 2 + isMobile: true + hasTouch: true +setup: + dev: + required: true + reuseExisting: true + auth: + role: owner + required: true +artifacts: + trace: true + video: true + screenshots: true + console: true + network: true + timeline: true + appLogs: true +workflow: + - id: open-team-collection + title: Open the team collection without changing active context + action: + goto: /app/teams + expect: + urlIncludes: /app/teams + visible: + - scene: team.collection + - css: '[data-team-name="gt-{{runShort}}-{{deviceId}}"]' + internal: true + - id: open-operational-overview + title: Open the authenticated operational overview + action: + click: + css: '[data-team-name="gt-{{runShort}}-{{deviceId}}"] a[href]:has-text("Overview")' + internal: true + expect: + urlIncludes: /app/teams/ + text: Operational overview + visible: + - scene: team.overview + - scene: team.navigation + - css: '[data-scene="team.navigation"] a[aria-current="page"]' + internal: true + - css: '.ts-disclosure-list' + internal: true + - scene: team.overview.content-activity + - css: '[data-testid="project-activity-chart"]' + internal: true + - id: inspect-domain-summaries + title: Inspect bounded operational summaries and canonical links + action: + click: + role: link + name: View projects + expect: + urlIncludes: /app/projects + - id: return-and-inspect-navigation + title: Return through the shared team navigation + action: + goto: /app/teams/gt-{{runShort}}-{{deviceId}} + expect: + visible: + - scene: team.navigation + - scene: team.overview.audit + - css: '.ts-activity-feed__item' + internal: true + - css: '.ts-activity-feed__actor-link[href^="/u/"]' + internal: true + - id: open-public-profile-with-team-context + title: Open the public profile through access-checked team navigation + action: + click: + role: link + name: Public profile + expect: + urlIncludes: /t/gt- + visible: + - scene: knowledge.profile + - scene: team.navigation + - css: '[data-scene="team.navigation"] a[aria-current="page"]' + internal: true + text: Lifecycle + - id: return-to-members + title: Use the authorized member-management tab + action: + click: + role: link + name: Members + expect: + urlIncludes: /members + visible: + - scene: team.navigation +chapters: [] +overlays: [] +diagrams: [] +render: + remotion: + composition: treeseed-training-default + output: + format: mp4 + fps: 30 + resolution: + width: 1920 + height: 1080 + capture: + viewport: + width: 1600 + height: 900 + video: + width: 1600 + height: 900 + evidenceFit: fixed-browser +runtime: + mode: training + timeouts: + sceneSeconds: 300 + chapterSeconds: 120 + stepSeconds: 60 + checkpoints: + enabled: true + defaultResumable: true + everyStep: true + progress: + heartbeatSeconds: 15 + failure: + continueOnFailure: false +training: {} +visualAudit: + enabled: true diff --git a/guarantees/team/scenes/view-team-profile.scene.yaml b/guarantees/team/scenes/view-team-profile.scene.yaml deleted file mode 100644 index 17afac03..00000000 --- a/guarantees/team/scenes/view-team-profile.scene.yaml +++ /dev/null @@ -1,148 +0,0 @@ -schemaVersion: treeseed.scene/v1 -id: team.team.view-team-profile.015 -title: View Team Profile -description: Acceptance scene for guarantee.team.team.view-team-profile.015. -audience: - - operator - - evaluator -journey: - kind: service - proves: - - View Team Profile opens the public identity-only @treeseed/admin profile. - - View Team Profile does not expose project, capacity, catalog, or knowledge distribution links. - - View Team Profile records reviewable evidence for the visible result before activation. - minimumSteps: 3 - requiresInteractiveAction: true - consumesState: - - key: team.updated - kind: marker -mode: - test: true - demo: true - training: true -target: - app: market - environment: local - baseUrl: auto - browser: chromium - viewport: - width: 1600 - height: 900 -devices: - defaultProfile: desktop_chromium - profiles: - - id: desktop_chromium - title: Desktop Chromium - orientation: landscape - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - output: - width: 1920 - height: 1080 - deviceScaleFactor: 1 - isMobile: false - hasTouch: false - - id: mobile_chromium - title: Mobile Chromium - orientation: portrait - viewport: - width: 390 - height: 844 - video: - width: 390 - height: 844 - output: - width: 390 - height: 844 - deviceScaleFactor: 2 - isMobile: true - hasTouch: true -setup: - dev: - required: true - reuseExisting: true -artifacts: - trace: true - video: true - screenshots: true - console: true - network: true - timeline: true - appLogs: true -workflow: - - id: open-entry-route - title: Open View Team Profile - action: - goto: /t/gt-{{runShort}}-{{deviceId}} - expect: - urlIncludes: /t/gt- - text: Verified {{runShort}} {{deviceId}} - visible: - - css: 'main' - internal: true - - id: exercise-anonymous-account-boundary - title: Follow the sign-in action from the anonymous profile - action: - click: - role: link - name: Sign in - expect: - urlIncludes: /auth/sign-in - text: Sign in - - id: verify-private-links-redacted - title: Return anonymously and verify private team aggregates remain absent - action: - goto: /t/gt-{{runShort}}-{{deviceId}} - expect: - text: Public identity verified by a complete team settings service journey. - notText: Projects - notVisible: - - role: link - name: Manage members - - id: verify-private-email-redacted - title: Verify private contact data remains absent - action: - goto: /t/gt-{{runShort}}-{{deviceId}} - expect: - notText: "@treeseed.local" -chapters: [] -overlays: [] -diagrams: [] -render: - remotion: - composition: treeseed-training-default - output: - format: mp4 - fps: 30 - resolution: - width: 1920 - height: 1080 - capture: - viewport: - width: 1600 - height: 900 - video: - width: 1600 - height: 900 - evidenceFit: fixed-browser -runtime: - mode: training - timeouts: - sceneSeconds: 300 - chapterSeconds: 120 - stepSeconds: 60 - checkpoints: - enabled: true - defaultResumable: true - everyStep: true - progress: - heartbeatSeconds: 15 - failure: - continueOnFailure: false -training: {} -visualAudit: - enabled: false diff --git a/guarantees/team/team-management.ui-feature.yaml b/guarantees/team/team-management.ui-feature.yaml new file mode 100644 index 00000000..96a70cf5 --- /dev/null +++ b/guarantees/team/team-management.ui-feature.yaml @@ -0,0 +1,158 @@ +schemaVersion: treeseed.ui-feature/v1 +id: admin.team-management +ownerPackage: "@treeseed/admin" +routes: + - /app/teams + - /app/teams/active + - /app/teams/new + - /app/teams/[teamId] + - /app/teams/[teamId]/edit + - /app/teams/[teamId]/members + - /app/teams/[teamId]/delete + - /team-invites/[token]/accept + - /t/[name] +devices: + - desktop_chromium + - tablet_chromium + - mobile_chromium +states: + - loading + - empty + - unavailable + - forbidden + - validation + - conflict + - success + - archived + - destructive +capabilities: + - id: team.collection + routes: [/app/teams] + actions: [open-overview, open-settings, open-members, open-lifecycle] + states: [loading, empty, unavailable, active, archived, forbidden] + actors: + allowed: [team_owner, project_lead, contributor, reviewer, viewer] + forbidden: [anonymous_user, non_member] + guaranteeIds: [guarantee.team.team.view-team-overview.015] + - id: team.create + routes: [/app/teams/new] + actions: [validate, create] + states: [validation, conflict, success, unavailable] + actors: + allowed: [verified_user] + forbidden: [anonymous_user, unverified_user, service_principal] + guaranteeIds: [guarantee.team.team.create-team.012] + - id: team.active-selection + routes: [/app/teams, /app/teams/active, /app] + actions: [set-active, clear-invalid-preference] + states: [success, forbidden, unavailable] + actors: + allowed: [team_member] + forbidden: [anonymous_user, non_member] + guaranteeIds: [guarantee.team.team.switch-active-team.013] + - id: team.identity-settings + routes: ["/app/teams/[teamId]/edit"] + actions: [preview, validate, update] + states: [validation, conflict, success, archived, forbidden, unavailable] + actors: + allowed: [team_owner, project_lead] + forbidden: [contributor, viewer, non_member, anonymous_user] + guaranteeIds: [guarantee.team.team.edit-team-settings.014] + - id: team.operational-overview + routes: ["/app/teams/[teamId]"] + actions: [inspect-summary, inspect-content-activity, follow-domain-link, inspect-audit] + states: [active, archived, forbidden, unavailable, not-found] + actors: + allowed: [team_member] + forbidden: [anonymous_user, non_member] + guaranteeIds: [guarantee.team.team.view-team-overview.015] + - id: team.public-profile + routes: ["/t/[name]"] + actions: [view-public-identity, browse-public-knowledge, inspect-public-activity, use-authorized-team-navigation] + states: [active, authenticated-member, empty, not-found] + actors: + allowed: [anonymous_user, team_member] + forbidden: [none] + guaranteeIds: [guarantee.team.team.view-team-overview.015, guarantee.team.team.view-public-team-profile.021] + - id: team.member-directory + routes: ["/app/teams/[teamId]/members"] + actions: [list-members, search-members, inspect-role] + states: [empty, success, archived, forbidden, unavailable] + actors: + allowed: [team_member] + forbidden: [non_member, anonymous_user] + guaranteeIds: [guarantee.team.membership.invite-team-members.017] + - id: team.invitations + routes: ["/app/teams/[teamId]/members"] + actions: [validate, create, list, resend, revoke] + states: [empty, validation, conflict, success, archived, forbidden, unavailable] + actors: + allowed: [team_owner, project_lead] + forbidden: [contributor, viewer, non_member, anonymous_user] + guaranteeIds: [guarantee.team.membership.invite-team-members.017] + - id: team.invitation-consent + routes: ["/team-invites/[token]/accept"] + actions: [preview, sign-in, register, switch-account, accept, select-active] + states: [valid, expired, revoked, accepted, invalid, email-mismatch, success] + actors: + allowed: [invited_user] + forbidden: [mismatched_user] + guaranteeIds: [guarantee.team.membership.accept-team-invitation.018] + - id: team.member-roles + routes: ["/app/teams/[teamId]/members"] + actions: [change-non-owner-role] + states: [validation, conflict, success, last-owner, forbidden] + actors: + allowed: [team_owner, project_lead] + forbidden: [contributor, viewer, non_member, anonymous_user] + guaranteeIds: [guarantee.team.membership.change-member-role.019] + - id: team.ownership + routes: ["/app/teams/[teamId]/members"] + actions: [grant-owner, remove-owner, transfer-owner] + states: [validation, conflict, success, last-owner, forbidden] + actors: + allowed: [team_owner] + forbidden: [project_lead, contributor, viewer, non_member, anonymous_user] + guaranteeIds: [guarantee.team.membership.change-member-role.019] + - id: team.member-removal + routes: ["/app/teams/[teamId]/members"] + actions: [inspect-blockers, confirm-remove] + states: [blocked, confirmation, success, lost-access, forbidden] + actors: + allowed: [team_owner, project_lead] + forbidden: [contributor, viewer, non_member, anonymous_user] + guaranteeIds: [guarantee.team.membership.remove-team-member.020] + - id: team.member-leave + routes: ["/app/teams/[teamId]/members"] + actions: [self-leave] + states: [confirmation, success, lost-access, last-owner, forbidden] + actors: + allowed: [current_member] + forbidden: [last_owner, non_member, anonymous_user] + guaranteeIds: [guarantee.team.membership.remove-team-member.020] + - id: team.lifecycle + routes: ["/app/teams/[teamId]/delete"] + actions: [inspect-blockers, archive, inspect-restore-countdown, restore, reauthenticate, delete-permanently] + states: [blocked, active, archived, restore-window, validation, success, forbidden, unavailable] + actors: + allowed: [team_owner] + forbidden: [project_lead, contributor, viewer, non_member, anonymous_user] + guaranteeIds: [guarantee.team.team.delete-team.016] +requiredGuarantees: + - guarantee.team.team.create-team.012 + - guarantee.team.team.switch-active-team.013 + - guarantee.team.team.edit-team-settings.014 + - guarantee.team.team.view-team-overview.015 + - guarantee.team.team.delete-team.016 + - guarantee.team.membership.invite-team-members.017 + - guarantee.team.membership.accept-team-invitation.018 + - guarantee.team.membership.change-member-role.019 + - guarantee.team.membership.remove-team-member.020 + - guarantee.team.team.view-public-team-profile.021 +requirements: + accessibility: true + console: true + network: true + visual: true + durableState: true + cleanup: true diff --git a/guarantees/team/team/create-team.guarantee.yaml b/guarantees/team/team/create-team.guarantee.yaml index 9a1192f5..07258c4b 100644 --- a/guarantees/team/team/create-team.guarantee.yaml +++ b/guarantees/team/team/create-team.guarantee.yaml @@ -17,10 +17,10 @@ actors: - verified_user forbidden: - anonymous_user - - unauthorized_user devices: required: - desktop_chromium + - tablet_chromium - mobile_chromium gates: - core @@ -30,6 +30,9 @@ preconditions: - integrated_treeseed_project notes: - "Journey dependencies must be satisfied: 4" +uiFeature: + contract: ../team-management.ui-feature.yaml + capabilities: [team.create] scene: required: true manifest: ../scenes/create-team.scene.yaml @@ -49,18 +52,19 @@ scene: api: required: true verifierRefs: - - api.team.create + - api.team.create.correlated content: required: false verifierRefs: [] audit: required: true - verifierRefs: [api.team.lifecycle.audit] + verifierRefs: [api.team.create.correlated] negativeCases: - - id: non-member-denied - actor: non_member - verifierRefs: - - api.team.members.nonmember + - id: anonymous-denied + actor: anonymous_user + sceneManifest: ../scenes/negative/anonymous-team-access.scene.yaml + executionKey: admin.team.negative.anonymous-access + verifierRefs: [api.team.create.anonymous-denied] evidence: required: - playwright_trace diff --git a/guarantees/team/team/delete-team.guarantee.yaml b/guarantees/team/team/delete-team.guarantee.yaml index 090940cd..cdeadb56 100644 --- a/guarantees/team/team/delete-team.guarantee.yaml +++ b/guarantees/team/team/delete-team.guarantee.yaml @@ -5,20 +5,19 @@ type: team subtype: team journey: Delete Team ownerPackage: "@treeseed/admin" -summary: Delete or archive a team only after checking projects hosts capacity and content ownership; likely requires explicit retention and transfer rules. +summary: Archive and restore a team within its recovery window, or immediately delete it after blocker checks and explicit reauthentication. status: active dependencies: journeys: [] guarantees: - guarantee.team.membership.remove-team-member.020 - - guarantee.team.team.view-team-profile.015 + - guarantee.team.team.view-public-team-profile.021 actors: allowed: - team_admin - team_owner forbidden: - - anonymous_user - - unauthorized_user + - project_lead devices: required: - desktop_chromium @@ -31,6 +30,9 @@ preconditions: - integrated_treeseed_project notes: - Membership lifecycle and public profile verification must finish before deletion. +uiFeature: + contract: ../team-management.ui-feature.yaml + capabilities: [team.lifecycle] scene: required: true manifest: ../scenes/delete-team.scene.yaml @@ -50,18 +52,18 @@ scene: api: required: true verifierRefs: - - api.team.deletion-blockers + - api.team.delete.correlated content: required: false verifierRefs: [] audit: required: true - verifierRefs: [api.team.lifecycle.audit] + verifierRefs: [api.team.delete.correlated] negativeCases: - - id: non-member-denied - actor: non_member - verifierRefs: - - api.team.members.nonmember + - id: project-lead-denied + actor: project_lead + sceneManifest: ../scenes/negative/lifecycle-project-lead.scene.yaml + verifierRefs: [api.team.lifecycle.project-lead-denied] evidence: required: - playwright_trace @@ -70,7 +72,7 @@ evidence: optional: - mailpit_message notes: - - Delete or archive a team only after checking projects hosts capacity and content ownership; likely requires explicit retention and transfer rules. + - Archiving is reversible during the displayed recovery window; permanent deletion is separately available without an archive delay and requires blocker checks, the exact team name, and the current password. surface: admin-ui run: timeoutSeconds: 300 diff --git a/guarantees/team/team/edit-team-settings.guarantee.yaml b/guarantees/team/team/edit-team-settings.guarantee.yaml index ed95c2bb..ef8968b5 100644 --- a/guarantees/team/team/edit-team-settings.guarantee.yaml +++ b/guarantees/team/team/edit-team-settings.guarantee.yaml @@ -17,11 +17,11 @@ actors: - team_admin - team_owner forbidden: - - anonymous_user - - unauthorized_user + - contributor devices: required: - desktop_chromium + - tablet_chromium - mobile_chromium gates: - core @@ -31,6 +31,9 @@ preconditions: - integrated_treeseed_project notes: - "Journey dependencies must be satisfied: 12" +uiFeature: + contract: ../team-management.ui-feature.yaml + capabilities: [team.identity-settings] scene: required: true manifest: ../scenes/edit-team-settings.scene.yaml @@ -50,18 +53,18 @@ scene: api: required: true verifierRefs: - - api.team.update + - api.team.update.correlated content: required: false verifierRefs: [] audit: required: true - verifierRefs: [api.team.lifecycle.audit] + verifierRefs: [api.team.update.correlated] negativeCases: - - id: non-member-denied - actor: non_member - verifierRefs: - - api.team.members.nonmember + - id: contributor-denied + actor: contributor + sceneManifest: ../scenes/negative/edit-contributor.scene.yaml + verifierRefs: [api.team.update.contributor-denied] evidence: required: - playwright_trace diff --git a/guarantees/team/team/switch-active-team.guarantee.yaml b/guarantees/team/team/switch-active-team.guarantee.yaml index 2e36cc69..b4492a3b 100644 --- a/guarantees/team/team/switch-active-team.guarantee.yaml +++ b/guarantees/team/team/switch-active-team.guarantee.yaml @@ -18,10 +18,10 @@ actors: - team_owner forbidden: - anonymous_user - - unauthorized_user devices: required: - desktop_chromium + - tablet_chromium - mobile_chromium gates: - core @@ -31,6 +31,9 @@ preconditions: - integrated_treeseed_project notes: - "Journey dependencies must be satisfied: 12" +uiFeature: + contract: ../team-management.ui-feature.yaml + capabilities: [team.active-selection] scene: required: true manifest: ../scenes/switch-active-team.scene.yaml @@ -50,7 +53,7 @@ scene: api: required: true verifierRefs: - - api.team.list.owner + - api.team.active.correlated content: required: false verifierRefs: [] @@ -58,10 +61,11 @@ audit: required: false verifierRefs: [] negativeCases: - - id: non-member-denied - actor: non_member - verifierRefs: - - api.team.members.nonmember + - id: anonymous-denied + actor: anonymous_user + sceneManifest: ../scenes/negative/anonymous-team-access.scene.yaml + executionKey: admin.team.negative.anonymous-access + verifierRefs: [] evidence: required: - playwright_trace diff --git a/guarantees/team/team/team-management-production-readiness.guarantee.yaml b/guarantees/team/team/team-management-production-readiness.guarantee.yaml new file mode 100644 index 00000000..cfcd8202 --- /dev/null +++ b/guarantees/team/team/team-management-production-readiness.guarantee.yaml @@ -0,0 +1,51 @@ +schemaVersion: treeseed.guarantee/v1 +id: guarantee.team.team.team-management-production-readiness.022 +type: team +subtype: team +journey: Team Management Production Readiness +ownerPackage: "@treeseed/admin" +surface: scene +summary: Fail-closed aggregate proving every team UI capability, actor boundary, device, durable postcondition, audit event, and cleanup contract. +status: active +dependencies: + journeys: [12, 13, 14, 15, 16, 17, 18, 19, 20] + guarantees: + - guarantee.team.team.view-public-team-profile.021 +actors: + allowed: [release_operator] + forbidden: [] +devices: + required: [desktop_chromium, mobile_chromium] +gates: [core, release] +preconditions: + fixtures: [integrated_treeseed_project] + notes: + - Every required feature guarantee must be active and pass against the same current source closure. +uiFeature: + contract: ../team-management.ui-feature.yaml + capabilities: [] +api: + required: true + verifierRefs: + - admin.team.production-readiness + - admin.team.ui-contracts + - api.team.lifecycle-contracts + - sdk.team.ui-evidence-trust +content: + required: false + verifierRefs: [] +audit: + required: false + verifierRefs: [] +negativeCases: + - id: stale-or-mismatched-evidence-denied + verifierRefs: [sdk.team.ui-evidence-trust] + notes: + - Device mismatch, source drift, blocked requirements, and copied aggregate status must fail closed. +evidence: + required: [execution_graph, api_verification_log, cleanup_report] +notes: + - Fails closed unless every required team guarantee, feature contract, current-source verifier, and cleanup check passes. +run: + timeoutSeconds: 900 + requiredForRelease: true diff --git a/guarantees/team/team/view-public-team-profile.guarantee.yaml b/guarantees/team/team/view-public-team-profile.guarantee.yaml new file mode 100644 index 00000000..db9bf8ff --- /dev/null +++ b/guarantees/team/team/view-public-team-profile.guarantee.yaml @@ -0,0 +1,57 @@ +schemaVersion: treeseed.guarantee/v1 +id: guarantee.team.team.view-public-team-profile.021 +type: team +subtype: team +journey: View Public Team Profile +ownerPackage: "@treeseed/admin" +surface: admin-ui +summary: Expose active team identity and explicitly public reusable knowledge anonymously for public teams and to authenticated members for private teams, while redacting private membership and operational context. +status: active +dependencies: + journeys: [14] + guarantees: [guarantee.team.team.edit-team-settings.014] +actors: + allowed: [anonymous_user, team_member] + forbidden: [] +devices: + required: [desktop_chromium, tablet_chromium, mobile_chromium] +gates: [core, release] +preconditions: + fixtures: [integrated_treeseed_project] + notes: [The owning team identity must already exist.] +uiFeature: + contract: ../team-management.ui-feature.yaml + capabilities: [team.public-profile] +scene: + required: true + manifest: ../scenes/view-public-team-profile.scene.yaml + executionKey: admin.team.public-profile + mode: { acceptance: true, demo: true, training: true } + entryRoute: /t/[name] + componentContract: anonymous knowledge profile + expectedEvidence: [playwright_trace, scene_video, screenshot_on_failure, console_log, network_log] +api: + required: true + verifierRefs: [api.team.public-profile.correlated] +content: + required: false + verifierRefs: [] +audit: + required: false + verifierRefs: [] +negativeCases: + - id: archived-not-found + actor: anonymous_user + verifierRefs: [api.team.public-profile.archived-not-found] + - id: private-anonymous-not-found + actor: anonymous_user + verifierRefs: [api.team.public-profile.private-member-access] +evidence: + required: [playwright_trace, scene_video, api_verification_log] +notes: + - This supplemental guarantee intentionally has no CSV journey index. + - Public projects, templates, knowledge packs, and their publication trail are explicit public projections, never private operational aggregates. + - Private active profiles remain hidden anonymously but are available to authenticated members, including after archive and restore. +run: + timeoutSeconds: 300 + requiredForRelease: true diff --git a/guarantees/team/team/view-team-overview.guarantee.yaml b/guarantees/team/team/view-team-overview.guarantee.yaml new file mode 100644 index 00000000..2f913230 --- /dev/null +++ b/guarantees/team/team/view-team-overview.guarantee.yaml @@ -0,0 +1,86 @@ +schemaVersion: treeseed.guarantee/v1 +id: guarantee.team.team.view-team-overview.015 +journeyIndex: 15 +type: team +subtype: team +journey: View Team Overview +ownerPackage: "@treeseed/admin" +summary: Display the authenticated operational team overview and preserve access-checked team navigation when a member opens the public profile. +status: active +dependencies: + journeys: + - 14 + guarantees: + - guarantee.team.team.edit-team-settings.014 +actors: + allowed: + - team_member + forbidden: + - anonymous_user + - non_member +devices: + required: + - desktop_chromium + - tablet_chromium + - mobile_chromium +gates: + - core + - release +preconditions: + fixtures: + - integrated_treeseed_project + notes: + - "Journey dependencies must be satisfied: 12" +scene: + required: true + manifest: ../scenes/view-team-overview.scene.yaml + executionKey: admin.team.overview + mode: + acceptance: true + demo: true + training: true + entryRoute: /app/teams/[teamId] + componentContract: authenticated operational team overview + expectedEvidence: + - playwright_trace + - scene_video + - screenshot_on_failure + - console_log + - network_log +api: + required: true + verifierRefs: + - api.team.overview.correlated +content: + required: false + verifierRefs: [] +audit: + required: false + verifierRefs: [] +negativeCases: + - id: anonymous-denied + actor: anonymous_user + sceneManifest: ../scenes/negative/anonymous-team-access.scene.yaml + executionKey: admin.team.negative.anonymous-access + verifierRefs: [api.team.overview.anonymous-denied] + - id: non-member-denied + actor: non_member + sceneManifest: ../scenes/negative/overview-nonmember.scene.yaml + executionKey: admin.team.negative.overview-nonmember + verifierRefs: [api.team.overview.nonmember-denied] +evidence: + required: + - playwright_trace + - scene_video + - api_verification_log + optional: + - mailpit_message +notes: + - Public identity is covered separately by guarantee.team.team.view-public-team-profile.021. +uiFeature: + contract: ../team-management.ui-feature.yaml + capabilities: [team.collection, team.operational-overview, team.public-profile] +surface: admin-ui +run: + timeoutSeconds: 300 + requiredForRelease: true diff --git a/guarantees/team/team/view-team-profile.guarantee.yaml b/guarantees/team/team/view-team-profile.guarantee.yaml deleted file mode 100644 index deee8fce..00000000 --- a/guarantees/team/team/view-team-profile.guarantee.yaml +++ /dev/null @@ -1,75 +0,0 @@ -schemaVersion: treeseed.guarantee/v1 -id: guarantee.team.team.view-team-profile.015 -journeyIndex: 15 -type: team -subtype: team -journey: View Team Profile -ownerPackage: "@treeseed/admin" -summary: Display public team identity and profile metadata without project, capacity, catalog, or operational details. -status: active -dependencies: - journeys: - - 14 - guarantees: - - guarantee.team.team.edit-team-settings.014 -actors: - allowed: - - anonymous_user - forbidden: - - none -devices: - required: - - desktop_chromium - - mobile_chromium -gates: - - core - - release -preconditions: - fixtures: - - integrated_treeseed_project - notes: - - "Journey dependencies must be satisfied: 12" -scene: - required: true - manifest: ../scenes/view-team-profile.scene.yaml - executionKey: admin.team.public-profile - mode: - acceptance: true - demo: true - training: true - entryRoute: /t/[name] - componentContract: public team identity profile - expectedEvidence: - - playwright_trace - - scene_video - - screenshot_on_failure - - console_log - - network_log -api: - required: true - verifierRefs: - - api.team.profile -content: - required: false - verifierRefs: [] -audit: - required: false - verifierRefs: [] -negativeCases: - - id: non-member-denied - actor: non_member - verifierRefs: - - api.team.members.nonmember -evidence: - required: - - playwright_trace - - scene_video - - api_verification_log - optional: - - mailpit_message -notes: - - Public team profiles are identity-only during the redesign foundation phase. -surface: admin-ui -run: - timeoutSeconds: 300 - requiredForRelease: true diff --git a/guarantees/user/account/scenes/view-user-profile.scene.yaml b/guarantees/user/account/scenes/view-user-profile.scene.yaml index 44f0f808..69fe6672 100644 --- a/guarantees/user/account/scenes/view-user-profile.scene.yaml +++ b/guarantees/user/account/scenes/view-user-profile.scene.yaml @@ -8,12 +8,14 @@ audience: journey: kind: service proves: - - View User Profile opens the public identity-only @treeseed/admin profile. - - View User Profile does not expose project, catalog, or knowledge distribution links. + - View User Profile opens the public @treeseed/admin knowledge profile. + - View User Profile separates explicitly attributed public work from private membership context. - View User Profile records reviewable evidence for the visible result before activation. minimumSteps: 3 requiresInteractiveAction: true consumesState: + - key: auth.primary-session + kind: browser-storage - key: account.profile-updated kind: marker mode: @@ -65,6 +67,9 @@ setup: dev: required: true reuseExisting: true + auth: + role: owner + required: true artifacts: trace: true video: true @@ -80,9 +85,12 @@ workflow: goto: /u/g-{{runShort}}-{{deviceId}} expect: urlIncludes: /u/g- - text: Public TreeSeed account identity. + text: Public contributions visible: - - scene: profile-template + - scene: knowledge.profile + - scene: knowledge.identity + - scene: knowledge.activity + - scene: account.navigation - id: verify-private-data-redacted title: Verify private identity data is redacted action: @@ -95,27 +103,21 @@ workflow: goto: /u/g-{{runShort}}-{{deviceId}} expect: notText: Memberships - - id: verify-projects-redacted - title: Verify projects are not published - action: - goto: /u/g-{{runShort}}-{{deviceId}} - expect: - notText: Projects - id: verify-roles-redacted title: Verify roles are not published action: goto: /u/g-{{runShort}}-{{deviceId}} expect: notText: Roles - - id: leave-public-profile - title: Follow the public manager link + - id: open-account-management + title: Open account management through the canonical profile tabs action: click: role: link - name: Manager + name: Identity expect: - urlIncludes: /auth/sign-in - text: Sign in + urlIncludes: /app/account + text: Account identity chapters: [] overlays: [] diagrams: [] diff --git a/guarantees/user/account/view-user-profile.guarantee.yaml b/guarantees/user/account/view-user-profile.guarantee.yaml index 084c0f81..b7b935da 100644 --- a/guarantees/user/account/view-user-profile.guarantee.yaml +++ b/guarantees/user/account/view-user-profile.guarantee.yaml @@ -5,7 +5,7 @@ type: user subtype: account journey: View User Profile ownerPackage: "@treeseed/admin" -summary: Show public user identity and profile metadata without project, catalog, or knowledge distribution details. +summary: Show public user identity, expertise, and explicitly attributed reusable knowledge, with canonical account tabs only for the owning signed-in user. status: active dependencies: journeys: @@ -29,7 +29,8 @@ preconditions: fixtures: - integrated_treeseed_project notes: - - The profile scene follows the authenticated account page's canonical public-profile link. + - The authenticated owning user sees canonical account-management tabs above the profile. + - Anonymous redaction remains covered by the public API verifier. - "Journey dependencies must be satisfied: 1" scene: required: true @@ -40,7 +41,7 @@ scene: demo: true training: true entryRoute: /u/[username] - componentContract: public identity profile + componentContract: public knowledge profile expectedEvidence: - playwright_trace - scene_video @@ -50,7 +51,7 @@ scene: api: required: true verifierRefs: - - api.auth.me.site-admin + - api.auth.public-knowledge-profile content: required: false verifierRefs: [] @@ -58,10 +59,10 @@ audit: required: false verifierRefs: [] negativeCases: - - id: anonymous-denied + - id: private-context-redacted actor: anonymous_user verifierRefs: - - api.auth.me.requires-user + - api.auth.public-knowledge-profile evidence: required: - playwright_trace @@ -70,7 +71,7 @@ evidence: optional: - mailpit_message notes: - - Public user profiles are identity-only during the redesign foundation phase. + - Public activity is based only on explicit public attribution; team membership never implies authorship. surface: admin-ui run: timeoutSeconds: 300 diff --git a/guarantees/user/auth/forgot-reset-password.guarantee.yaml b/guarantees/user/auth/forgot-reset-password.guarantee.yaml index 61b3f235..d054b65c 100644 --- a/guarantees/user/auth/forgot-reset-password.guarantee.yaml +++ b/guarantees/user/auth/forgot-reset-password.guarantee.yaml @@ -21,6 +21,7 @@ actors: devices: required: - desktop_chromium + - tablet_chromium - mobile_chromium optional: - mobile_webkit diff --git a/guarantees/user/auth/register-user.guarantee.yaml b/guarantees/user/auth/register-user.guarantee.yaml index 5c93d3e5..e6b3e964 100644 --- a/guarantees/user/auth/register-user.guarantee.yaml +++ b/guarantees/user/auth/register-user.guarantee.yaml @@ -19,6 +19,7 @@ actors: devices: required: - desktop_chromium + - tablet_chromium - mobile_chromium optional: - mobile_webkit diff --git a/guarantees/user/auth/scenes/forgot-reset-password.scene.yaml b/guarantees/user/auth/scenes/forgot-reset-password.scene.yaml index 934aef02..d4ce315b 100644 --- a/guarantees/user/auth/scenes/forgot-reset-password.scene.yaml +++ b/guarantees/user/auth/scenes/forgot-reset-password.scene.yaml @@ -64,6 +64,21 @@ devices: deviceScaleFactor: 2 isMobile: true hasTouch: true + - id: tablet_chromium + title: Tablet Chromium + orientation: portrait + viewport: + width: 820 + height: 1180 + video: + width: 820 + height: 1180 + output: + width: 820 + height: 1180 + deviceScaleFactor: 2 + isMobile: true + hasTouch: true - id: mobile_webkit title: Mobile WebKit orientation: portrait diff --git a/guarantees/user/auth/scenes/register-user.scene.yaml b/guarantees/user/auth/scenes/register-user.scene.yaml index 349a64a7..8cbd6ddd 100644 --- a/guarantees/user/auth/scenes/register-user.scene.yaml +++ b/guarantees/user/auth/scenes/register-user.scene.yaml @@ -63,6 +63,21 @@ devices: deviceScaleFactor: 2 isMobile: true hasTouch: true + - id: tablet_chromium + title: Tablet Chromium + orientation: portrait + viewport: + width: 820 + height: 1180 + video: + width: 820 + height: 1180 + output: + width: 820 + height: 1180 + deviceScaleFactor: 2 + isMobile: true + hasTouch: true - id: mobile_webkit title: Mobile WebKit orientation: portrait diff --git a/guarantees/user/auth/scenes/user-login.scene.yaml b/guarantees/user/auth/scenes/user-login.scene.yaml index ccc519a9..17416149 100644 --- a/guarantees/user/auth/scenes/user-login.scene.yaml +++ b/guarantees/user/auth/scenes/user-login.scene.yaml @@ -64,6 +64,21 @@ devices: deviceScaleFactor: 2 isMobile: true hasTouch: true + - id: tablet_chromium + title: Tablet Chromium + orientation: portrait + viewport: + width: 820 + height: 1180 + video: + width: 820 + height: 1180 + output: + width: 820 + height: 1180 + deviceScaleFactor: 2 + isMobile: true + hasTouch: true - id: mobile_webkit title: Mobile WebKit orientation: portrait diff --git a/guarantees/user/auth/user-login.guarantee.yaml b/guarantees/user/auth/user-login.guarantee.yaml index 0fbeb468..1bc9dd54 100644 --- a/guarantees/user/auth/user-login.guarantee.yaml +++ b/guarantees/user/auth/user-login.guarantee.yaml @@ -21,6 +21,7 @@ actors: devices: required: - desktop_chromium + - tablet_chromium - mobile_chromium optional: - mobile_webkit diff --git a/guarantees/user/auth/verify-email.guarantee.yaml b/guarantees/user/auth/verify-email.guarantee.yaml index 48931284..c0984d9f 100644 --- a/guarantees/user/auth/verify-email.guarantee.yaml +++ b/guarantees/user/auth/verify-email.guarantee.yaml @@ -21,6 +21,7 @@ actors: devices: required: - desktop_chromium + - tablet_chromium - mobile_chromium optional: - mobile_webkit diff --git a/guarantees/verifiers/ui.verifiers.yaml b/guarantees/verifiers/ui.verifiers.yaml index 4c47b28b..8a1921a1 100644 --- a/guarantees/verifiers/ui.verifiers.yaml +++ b/guarantees/verifiers/ui.verifiers.yaml @@ -7,12 +7,6 @@ verifiers: testFile: tests/integration/api/treedx/repositories/seeds-and-treedx.test.ts testName: owns web auth lifecycle and acceptance session seeding in the API description: Web identity lifecycle records canonical dotted audit events and durable session evidence. - api.team.lifecycle.audit: - kind: vitestCase - ownerPackage: "@treeseed/api" - testFile: tests/integration/api/governance/policy/teams-and-governance.test.ts - testName: manages team profiles, invites, member roles, and guarded deletion - description: Team identity, invitation, membership, and deletion mutations record canonical dotted audit events. api.auth.signup.mailpit: kind: apiAcceptanceCase caseId: auth.web.sign-up.sends-confirmation-email @@ -43,6 +37,12 @@ verifiers: caseId: auth.profile.update.team-owner ownerPackage: "@treeseed/api" description: Authenticated users can update profile details. + api.auth.public-knowledge-profile: + kind: vitestCase + ownerPackage: "@treeseed/api" + testFile: tests/integration/api/profiles/public-knowledge-profiles.test.ts + testName: publishes explicit knowledge while redacting memberships and private work + description: Public user and team profiles expose only explicitly public knowledge and attribution without leaking memberships or private work. api.auth.account-preferences: kind: apiAcceptanceCase caseId: auth.account-preferences.team-owner @@ -74,48 +74,147 @@ verifiers: caseId: auth.account-blockers.team-viewer ownerPackage: "@treeseed/api" description: Authenticated users can inspect account deletion blockers. - api.team.list.owner: - kind: apiAcceptanceCase - caseId: teams.list.team-owner + api.team.create.correlated: + kind: nodeScript + ownerPackage: "@treeseed/api" + cwd: packages/api + command: scripts/guarantees/verify-team-run-state.ts + args: [create] + description: The UI-created run team exists with owner membership and its correlated team.created event. + api.team.active.correlated: + kind: nodeScript + ownerPackage: "@treeseed/api" + cwd: packages/api + command: scripts/guarantees/verify-team-run-state.ts + args: [active] + description: The exact UI-selected run team remains active and accessible. + api.team.update.correlated: + kind: nodeScript + ownerPackage: "@treeseed/api" + cwd: packages/api + command: scripts/guarantees/verify-team-run-state.ts + args: [update] + description: The UI-updated run team identity and team.updated event refer to the same record. + api.team.overview.correlated: + kind: nodeScript + ownerPackage: "@treeseed/api" + cwd: packages/api + command: scripts/guarantees/verify-team-run-state.ts + args: [overview] + description: Operational overview state resolves for the exact UI-created run team. + api.team.public-profile.correlated: + kind: nodeScript + ownerPackage: "@treeseed/api" + cwd: packages/api + command: scripts/guarantees/verify-team-run-state.ts + args: [public-profile] + description: The exact run-created team profile exposes its public knowledge projection without private membership or operational fields. + api.team.invite.correlated: + kind: nodeScript + ownerPackage: "@treeseed/api" + cwd: packages/api + command: scripts/guarantees/verify-team-run-state.ts + args: [invite] + description: The exact UI invitation remains pending and correlated create/resend/revoke audit events exist. + api.team.accept.correlated: + kind: nodeScript + ownerPackage: "@treeseed/api" + cwd: packages/api + command: scripts/guarantees/verify-team-run-state.ts + args: [accept] + description: The invited recipient became a member only after explicit UI acceptance. + api.team.role.correlated: + kind: nodeScript + ownerPackage: "@treeseed/api" + cwd: packages/api + command: scripts/guarantees/verify-team-run-state.ts + args: [role] + description: The exact UI-created membership has its selected role and correlated audit event. + api.team.remove.correlated: + kind: nodeScript + ownerPackage: "@treeseed/api" + cwd: packages/api + command: scripts/guarantees/verify-team-run-state.ts + args: [remove] + description: The exact UI-created membership is absent and its correlated removal event exists. + api.team.delete.correlated: + kind: nodeScript + ownerPackage: "@treeseed/api" + cwd: packages/api + command: scripts/guarantees/verify-team-run-state.ts + args: [delete] + description: The UI-deleted run team and owned records are absent while a non-sensitive deletion tombstone remains. + admin.team.production-readiness: + kind: nodeScript + ownerPackage: "@treeseed/api" + cwd: packages/api + command: scripts/guarantees/verify-team-run-state.ts + args: [cleanup] + description: Every run-owned team is gone after the complete UI lifecycle. + admin.team.ui-contracts: + kind: vitestCase + ownerPackage: "@treeseed/admin" + testFile: tests/contract/team-management/team-management-architecture.test.ts + description: Admin route, interaction ownership, progressive-enhancement, failure-state, consent, and lifecycle contracts are complete. + api.team.lifecycle-contracts: + kind: vitestCase ownerPackage: "@treeseed/api" - description: Team owner can list teams for active-team selection. - api.team.create: + testFile: tests/integration/api/teams/lifecycle + description: Invitation consent, lifecycle, blocker, cleanup, and transactional last-owner contracts pass. + sdk.team.ui-evidence-trust: + kind: vitestCase + ownerPackage: "@treeseed/sdk" + testFile: tests/unit/guarantees/trust/ui-evidence-trust.test.ts + description: Exact device, per-node status, source closure, release fail-closed, and UI feature-contract evidence rules pass. + api.team.create.anonymous-denied: kind: apiAcceptanceCase - caseId: teams.create.team-owner + caseId: teams.create.anonymous-denied ownerPackage: "@treeseed/api" - description: Authenticated user can create a team. - api.team.update: + api.team.update.contributor-denied: kind: apiAcceptanceCase - caseId: teams.update.team-owner + caseId: teams.update.contributor-denied ownerPackage: "@treeseed/api" - description: Team owner can update team identity settings. - api.team.invite.mailpit: + api.team.overview.anonymous-denied: kind: apiAcceptanceCase - caseId: teams.invite.team-owner + caseId: teams.overview.anonymous-denied ownerPackage: "@treeseed/api" - description: Team invitation emits an email whose acceptance link uses the configured web origin. - api.team.members.nonmember: + api.team.overview.nonmember-denied: kind: apiAcceptanceCase - caseId: team-role-matrix.team-members.nonMember + caseId: teams.overview.nonmember-denied ownerPackage: "@treeseed/api" - description: Non-members cannot inspect team membership. - api.team.member.role: + api.team.invite.contributor-denied: kind: apiAcceptanceCase - caseId: teams.member-role.team-owner + caseId: teams.invite.contributor-denied ownerPackage: "@treeseed/api" - description: Team owner can change a member role. - api.team.member.remove: + api.team.invitation.mismatch-denied: + kind: vitestCase + ownerPackage: "@treeseed/api" + testFile: tests/integration/api/teams/lifecycle/invitation-consent.test.ts + testName: rejects invitation acceptance by a verified mismatched user + api.team.invitation.terminal-states: + kind: vitestCase + ownerPackage: "@treeseed/api" + testFile: tests/integration/api/teams/lifecycle/invitation-consent.test.ts + testName: preserves explicit expired revoked accepted and replay states + api.team.role.contributor-denied: kind: apiAcceptanceCase - caseId: teams.member-remove.team-owner + caseId: teams.role.contributor-denied ownerPackage: "@treeseed/api" - description: Team owner can remove a member. - api.team.deletion-blockers: + api.team.remove.contributor-denied: kind: apiAcceptanceCase - caseId: teams.deletion-blockers.team-owner + caseId: teams.remove.contributor-denied ownerPackage: "@treeseed/api" - description: Team owner can inspect team deletion blockers. - api.team.profile: + api.team.lifecycle.project-lead-denied: kind: apiAcceptanceCase - caseId: teams.profile.by-name + caseId: teams.lifecycle.project-lead-denied + ownerPackage: "@treeseed/api" + api.team.public-profile.archived-not-found: + kind: vitestCase + ownerPackage: "@treeseed/api" + testFile: tests/integration/api/teams/lifecycle/team-lifecycle.test.ts + testName: hides archived and deleted teams from anonymous profiles + api.team.public-profile.private-member-access: + kind: vitestCase ownerPackage: "@treeseed/api" - description: Public team identity can be loaded by name. + testFile: tests/integration/api/teams/lifecycle/team-lifecycle.test.ts + testName: hides private active profiles anonymously and restores member access after archival diff --git a/package-lock.json b/package-lock.json index 06d049f3..b88c14a3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,9 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#077c280609472193a6f47a9f6b7551283e730442", - "@treeseed/sdk": "github:treeseed-ai/sdk#794a1e08f806ee2a54567cfd5a2b7cfaed20eeb1", - "@treeseed/ui": "github:treeseed-ai/ui#2315c1b9d52719307f2c30072e364c5020dc3152", + "@treeseed/core": "github:treeseed-ai/core#95a4ac840472233b1ad3a513def1b97e07652776", + "@treeseed/sdk": "github:treeseed-ai/sdk#062bdabb6038a98c56f90e3bbf774817f27db2f7", + "@treeseed/ui": "github:treeseed-ai/ui#8f850b33e8b0a64c047cd787c87dd1e12e8a3e5b", "react": "^19.2.5", "react-dom": "^19.2.6" }, @@ -6932,7 +6932,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.staging.20260716T185112Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#077c280609472193a6f47a9f6b7551283e730442", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#95a4ac840472233b1ad3a513def1b97e07652776", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6943,8 +6943,8 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#794a1e08f806ee2a54567cfd5a2b7cfaed20eeb1", - "@treeseed/ui": "github:treeseed-ai/ui#2315c1b9d52719307f2c30072e364c5020dc3152", + "@treeseed/sdk": "github:treeseed-ai/sdk#062bdabb6038a98c56f90e3bbf774817f27db2f7", + "@treeseed/ui": "github:treeseed-ai/ui#8f850b33e8b0a64c047cd787c87dd1e12e8a3e5b", "astro": "^5.6.1", "esbuild": "^0.28.0", "katex": "^0.16.22", @@ -8948,7 +8948,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.staging.20260716T185056Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#794a1e08f806ee2a54567cfd5a2b7cfaed20eeb1", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#062bdabb6038a98c56f90e3bbf774817f27db2f7", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", @@ -9645,7 +9645,7 @@ }, "node_modules/@treeseed/ui": { "version": "0.12.18-dev.staging.20260716T185026Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#2315c1b9d52719307f2c30072e364c5020dc3152", + "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#8f850b33e8b0a64c047cd787c87dd1e12e8a3e5b", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", diff --git a/package.json b/package.json index 0dad7027..665de736 100644 --- a/package.json +++ b/package.json @@ -49,9 +49,9 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#077c280609472193a6f47a9f6b7551283e730442", - "@treeseed/sdk": "github:treeseed-ai/sdk#794a1e08f806ee2a54567cfd5a2b7cfaed20eeb1", - "@treeseed/ui": "github:treeseed-ai/ui#2315c1b9d52719307f2c30072e364c5020dc3152", + "@treeseed/core": "github:treeseed-ai/core#95a4ac840472233b1ad3a513def1b97e07652776", + "@treeseed/sdk": "github:treeseed-ai/sdk#062bdabb6038a98c56f90e3bbf774817f27db2f7", + "@treeseed/ui": "github:treeseed-ai/ui#8f850b33e8b0a64c047cd787c87dd1e12e8a3e5b", "react": "^19.2.5", "react-dom": "^19.2.6" }, diff --git a/src/components/account/AccountNavigation.astro b/src/components/account/AccountNavigation.astro new file mode 100644 index 00000000..49c1b03a --- /dev/null +++ b/src/components/account/AccountNavigation.astro @@ -0,0 +1,18 @@ +--- +import SurfaceTabs from '@treeseed/ui/components/astro/shell/navigation/SurfaceTabs.astro'; +import { ACCOUNT_SECTIONS } from '../../lib/accounts/navigation'; + +interface Props { + profileHref: string; +} + +const { profileHref } = Astro.props as Props; +const items = [ + ...ACCOUNT_SECTIONS, + { id: 'public-profile', label: 'Public profile', href: profileHref }, +]; +--- + +
+ +
diff --git a/src/components/team/TeamAccessDetails.astro b/src/components/team/TeamAccessDetails.astro new file mode 100644 index 00000000..a665e0e6 --- /dev/null +++ b/src/components/team/TeamAccessDetails.astro @@ -0,0 +1,22 @@ +--- +import DisclosureList from '@treeseed/ui/components/astro/data/DisclosureList.astro'; +import { capabilityDisplay, roleDisplay } from '../../lib/teams/access-display'; + +interface Props { + role: string; + capabilities?: string[]; + open?: boolean; +} + +const { role, capabilities = [], open = false } = Astro.props as Props; +const display = roleDisplay(role); +const items = capabilities.map((capability) => capabilityDisplay(capability)); +--- + + diff --git a/src/components/team/TeamNavigation.astro b/src/components/team/TeamNavigation.astro new file mode 100644 index 00000000..fc852440 --- /dev/null +++ b/src/components/team/TeamNavigation.astro @@ -0,0 +1,28 @@ +--- +import SurfaceTabs from '@treeseed/ui/components/astro/shell/navigation/SurfaceTabs.astro'; + +interface Props { + team: { id: string; name: string; status?: string }; + currentPath: string; + canManage?: boolean; + isOwner?: boolean; +} + +const { team, currentPath, canManage = false, isOwner = false } = Astro.props as Props; +const root = `/app/teams/${encodeURIComponent(team.id)}`; +const items = [ + { id: 'all-teams', label: 'All teams', href: '/app/teams', visible: true }, + { id: 'overview', label: 'Overview', href: root, visible: true }, + { id: 'members', label: 'Members', href: `${root}/members`, visible: true }, + { id: 'settings', label: 'Settings', href: `${root}/edit`, visible: canManage }, + { id: 'lifecycle', label: 'Lifecycle', href: `${root}/delete`, visible: isOwner }, + { id: 'public-profile', label: 'Public profile', href: `/t/${encodeURIComponent(team.name)}`, visible: team.status !== 'archived' }, +]; +const normalizedPath = currentPath.replace(/\/+$/u, ''); +const visibleItems = items.filter((item) => item.visible); +const current = visibleItems.find((item) => normalizedPath === item.href)?.id ?? 'overview'; +--- + +
+ +
diff --git a/src/layouts/AppLayout.astro b/src/layouts/AppLayout.astro index 605b8b28..31031b0f 100644 --- a/src/layouts/AppLayout.astro +++ b/src/layouts/AppLayout.astro @@ -5,6 +5,7 @@ import '@treeseed/ui/styles/ui.css'; import '@treeseed/ui/styles/forms.css'; import '@treeseed/ui/styles/app-shell.css'; import '@treeseed/ui/styles/app-controls.css'; +import '@treeseed/ui/styles/charts.css'; import '@treeseed/ui/styles/account/forms.css'; import '@treeseed/ui/styles/auth.css'; import ProductShell from '@treeseed/ui/components/astro/shell/layout/ProductShell.astro'; @@ -20,6 +21,10 @@ interface TeamEntry { name: string; slug?: string; displayName?: string | null; + allowedActions?: { + edit?: boolean; + viewOverview?: boolean; + }; } interface Props { @@ -56,7 +61,7 @@ const themeConfig = { schemeNames: Object.fromEntries(personalThemes.map((theme) => [theme.schemeId, theme.name])), }; const csrfToken = ensureCsrfToken(Astro); -const teamOptions = teams.map((team) => ({ +const teamOptions = teams.filter((team: TeamEntry & { status?: string }) => (team.status ?? 'active') === 'active').map((team) => ({ id: team.id, label: team.displayName ?? team.name ?? team.slug ?? team.id, })); @@ -83,8 +88,8 @@ const teamOptions = teams.map((team) => ({ siteItems={[{ label: 'Home', href: '/' }]} quickActions={[ activeTeam - ? { label: 'Manage team', href: `/app/teams/${encodeURIComponent(activeTeam.id)}/edit`, variant: 'primary' as const, icon: 'team-settings' as const } - : { label: 'Create team', href: '/app/teams/new', variant: 'primary' as const, icon: 'create' as const }, + ? { label: 'Team overview', href: `/app/teams/${encodeURIComponent(activeTeam.id)}`, variant: 'primary' as const, icon: 'teams' as const } + : { label: 'Manage teams', href: '/app/teams', variant: 'primary' as const, icon: 'teams' as const }, ]} accountActions={[ { label: 'Account', href: '/app/account', variant: 'secondary' as const, icon: 'account' as const }, @@ -94,7 +99,8 @@ const teamOptions = teams.map((team) => ({
Active team
{teams.length > 0 ? ( - + +
+
+ + +
{operationalEntries.map(([key, item]) => ( null) : null, api.accountPreferences().catch(() => ({ timeZone: 'UTC', realTimeUpdates: true, realTimePollingIntervalSeconds: 5 as const })), team ? api.getTeamAccessSummary(team.id).catch(() => null) : null]); +const payload = record(detail); const run = record(payload.run); const events = items(payload.events); const csrfToken = ensureCsrfToken(Astro); +const monitor = team ? await loadAgentLabFrame(api, team, preferences, { date: Astro.url.searchParams.get('date'), workday: runId }) : null; +const canManage = Boolean((access?.roles ?? access?.access?.roles ?? []).some((role: string) => ['team_owner', 'project_lead'].includes(role))); +if (team && !run.id) Astro.response.status = 404; +const transitions: Record = { queued: ['running', 'cancelled', 'failed'], running: ['completed', 'degraded', 'cancelled', 'failed'] }; +--- + +
+ {monitor ? : null} + {!team ? : !run.id ? : + +
Technical identifiers
{dateValue(run.startedAt, run.createdAt) ?

Started

: null}
+ {canManage ? (transitions[String(run.status)] ?? []).map((status) =>
) :

Your role can inspect this run but cannot transition it.

}
+ {events.length ?
    {events.map((event) =>
  1. {text(event.type, event.eventType, 'Event')} — {text(event.message, event.summary, 'Recorded state change')} {dateValue(event.createdAt) ? : null}
  2. )}
:

No workday events were returned.

}
+
} +
+
diff --git a/src/pages/app/work/agents.astro b/src/pages/app/work/agents.astro new file mode 100644 index 00000000..3899c543 --- /dev/null +++ b/src/pages/app/work/agents.astro @@ -0,0 +1,5 @@ +--- +import AgentLabEntityPage from '../../../components/agent-lab/AgentLabEntityPage.astro'; import { loadAgentLabEntityPage } from '../../../view-models/agent-lab/entity-page.ts'; +if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); const frame = await loadAgentLabEntityPage(Astro, 'agents'); +--- + diff --git a/src/pages/app/work/artifacts.astro b/src/pages/app/work/artifacts.astro new file mode 100644 index 00000000..d7fd4c49 --- /dev/null +++ b/src/pages/app/work/artifacts.astro @@ -0,0 +1,5 @@ +--- +import AgentLabEntityPage from '../../../components/agent-lab/AgentLabEntityPage.astro'; import { loadAgentLabEntityPage } from '../../../view-models/agent-lab/entity-page.ts'; +if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); const frame = await loadAgentLabEntityPage(Astro, 'artifacts'); +--- + diff --git a/src/pages/app/work/assignments.astro b/src/pages/app/work/assignments.astro new file mode 100644 index 00000000..268528d0 --- /dev/null +++ b/src/pages/app/work/assignments.astro @@ -0,0 +1,5 @@ +--- +import AgentLabEntityPage from '../../../components/agent-lab/AgentLabEntityPage.astro'; import { loadAgentLabEntityPage } from '../../../view-models/agent-lab/entity-page.ts'; +if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); const frame = await loadAgentLabEntityPage(Astro, 'assignments'); +--- + diff --git a/src/pages/app/work/build.astro b/src/pages/app/work/build.astro new file mode 100644 index 00000000..3573fe33 --- /dev/null +++ b/src/pages/app/work/build.astro @@ -0,0 +1,7 @@ +--- +import AgentLabCommandPage from '../../../components/agent-lab/AgentLabCommandPage.astro'; +import { loadAgentLabCommandPage } from '../../../view-models/agent-lab/command-page.ts'; +if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); +const frame = await loadAgentLabCommandPage(Astro, 'build'); +--- + diff --git a/src/pages/app/work/decisions.astro b/src/pages/app/work/decisions.astro new file mode 100644 index 00000000..919faaf5 --- /dev/null +++ b/src/pages/app/work/decisions.astro @@ -0,0 +1,7 @@ +--- +import AgentLabCommandPage from '../../../components/agent-lab/AgentLabCommandPage.astro'; +import { loadAgentLabCommandPage } from '../../../view-models/agent-lab/command-page.ts'; +if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); +const frame = await loadAgentLabCommandPage(Astro, 'decisions'); +--- + diff --git a/src/pages/app/work/direction.astro b/src/pages/app/work/direction.astro new file mode 100644 index 00000000..f6a1abf8 --- /dev/null +++ b/src/pages/app/work/direction.astro @@ -0,0 +1,7 @@ +--- +import AgentLabCommandPage from '../../../components/agent-lab/AgentLabCommandPage.astro'; +import { loadAgentLabCommandPage } from '../../../view-models/agent-lab/command-page.ts'; +if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); +const frame = await loadAgentLabCommandPage(Astro, 'direction'); +--- + diff --git a/src/pages/app/work/events.astro b/src/pages/app/work/events.astro new file mode 100644 index 00000000..264355c9 --- /dev/null +++ b/src/pages/app/work/events.astro @@ -0,0 +1,5 @@ +--- +import AgentLabEntityPage from '../../../components/agent-lab/AgentLabEntityPage.astro'; import { loadAgentLabEntityPage } from '../../../view-models/agent-lab/entity-page.ts'; +if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); const frame = await loadAgentLabEntityPage(Astro, 'events'); +--- + diff --git a/src/pages/app/work/executions.astro b/src/pages/app/work/executions.astro new file mode 100644 index 00000000..1ebec5c1 --- /dev/null +++ b/src/pages/app/work/executions.astro @@ -0,0 +1,5 @@ +--- +import AgentLabEntityPage from '../../../components/agent-lab/AgentLabEntityPage.astro'; import { loadAgentLabEntityPage } from '../../../view-models/agent-lab/entity-page.ts'; +if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); const frame = await loadAgentLabEntityPage(Astro, 'executions'); +--- + diff --git a/src/pages/app/work/find.astro b/src/pages/app/work/find.astro new file mode 100644 index 00000000..b64048c6 --- /dev/null +++ b/src/pages/app/work/find.astro @@ -0,0 +1,7 @@ +--- +import AgentLabCommandPage from '../../../components/agent-lab/AgentLabCommandPage.astro'; +import { loadAgentLabCommandPage } from '../../../view-models/agent-lab/command-page.ts'; +if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); +const frame = await loadAgentLabCommandPage(Astro, 'find'); +--- + diff --git a/src/pages/app/work/inbox.astro b/src/pages/app/work/inbox.astro new file mode 100644 index 00000000..e4111990 --- /dev/null +++ b/src/pages/app/work/inbox.astro @@ -0,0 +1,7 @@ +--- +import AgentLabCommandPage from '../../../components/agent-lab/AgentLabCommandPage.astro'; +import { loadAgentLabCommandPage } from '../../../view-models/agent-lab/command-page.ts'; +if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); +const frame = await loadAgentLabCommandPage(Astro, 'inbox'); +--- + diff --git a/src/pages/app/work/index.astro b/src/pages/app/work/index.astro new file mode 100644 index 00000000..fdb4981b --- /dev/null +++ b/src/pages/app/work/index.astro @@ -0,0 +1,51 @@ +--- +import { MetricHistoryDashboard } from '@treeseed/ui/components/react/OperationsMonitor'; +import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; +import AgentLabChrome from '../../../components/agent-lab/AgentLabChrome.astro'; +import TreeseedAppLayout from '../../../layouts/AppLayout.astro'; +import { ensureCsrfToken } from '../../../lib/auth/support/csrf.ts'; +import { ApiClientFacade } from '../../../lib/market/api-client.ts'; +import { loadAppContext } from '../../../view-models/app-access.ts'; +import { agentLabMetricDestinations, loadAgentLabFrame } from '../../../view-models/agent-lab/agent-lab-frame.ts'; + +if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); +const app = await loadAppContext(Astro); +const api = new ApiClientFacade(Astro); +const preferences = await api.accountPreferences().catch(() => ({ timeZone: 'UTC', realTimeUpdates: true, realTimePollingIntervalSeconds: 5 as const })); +const selection = { date: Astro.url.searchParams.get('date'), workday: Astro.url.searchParams.get('workday') }; +const [frame, access] = await Promise.all([ + app.activeTeam ? loadAgentLabFrame(api, app.activeTeam, preferences, selection) : null, + app.activeTeam ? api.getTeamAccessSummary(app.activeTeam.id).catch(() => null) : null, +]); +const canManage = Boolean((access?.roles ?? access?.access?.roles ?? []).some((role: string) => ['team_owner', 'project_lead'].includes(role))); +const labels: Record = { agents: 'Agents', workdays: 'Workdays', systemEvents: 'System events', assignments: 'Assignments', executions: 'Executions', artifacts: 'Artifacts', passed: 'Passed', failed: 'Failed', running: 'Running' }; +const selected = new URLSearchParams(); +if (frame?.overview.workdayContext.selectedDate) selected.set('date', frame.overview.workdayContext.selectedDate); +if (frame?.overview.workdayContext.selectedWorkdayId) selected.set('workday', frame.overview.workdayContext.selectedWorkdayId); +const metrics = frame?.overview.metrics.map((metric) => { + const destination = agentLabMetricDestinations[metric.key as keyof typeof agentLabMetricDestinations]; + return { ...metric, label: labels[metric.key] ?? metric.key, href: `${destination}${destination.includes('?') ? '&' : '?'}${selected}`, tone: metric.key === 'failed' && metric.value ? 'danger' as const : metric.key === 'running' && metric.value ? 'positive' as const : 'default' as const }; +}) ?? []; +const csrfToken = ensureCsrfToken(Astro); +--- + + +
+ {frame ? <> + + + : } +
+
diff --git a/src/pages/app/work/results.astro b/src/pages/app/work/results.astro new file mode 100644 index 00000000..97508c84 --- /dev/null +++ b/src/pages/app/work/results.astro @@ -0,0 +1,7 @@ +--- +import AgentLabCommandPage from '../../../components/agent-lab/AgentLabCommandPage.astro'; +import { loadAgentLabCommandPage } from '../../../view-models/agent-lab/command-page.ts'; +if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); +const frame = await loadAgentLabCommandPage(Astro, 'results'); +--- + diff --git a/src/pages/app/work/workdays.astro b/src/pages/app/work/workdays.astro new file mode 100644 index 00000000..cd0e86c8 --- /dev/null +++ b/src/pages/app/work/workdays.astro @@ -0,0 +1,35 @@ +--- +import Button from '@treeseed/ui/components/astro/forms/actions/Button.astro'; +import EntityCollection from '@treeseed/ui/components/astro/data/entities/EntityCollection.astro'; +import OperationsDisplayContainer from '@treeseed/ui/components/astro/operating/navigation/OperationsDisplayContainer.astro'; +import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; +import AgentLabChrome from '../../../components/agent-lab/AgentLabChrome.astro'; +import TreeseedAppLayout from '../../../layouts/AppLayout.astro'; +import { ensureCsrfToken } from '../../../lib/auth/support/csrf.ts'; +import { ApiClientFacade } from '../../../lib/market/api-client.ts'; +import { loadAgentLabEntityPage } from '../../../view-models/agent-lab/entity-page.ts'; + +if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); +const frame = await loadAgentLabEntityPage(Astro, 'workdays'); +const api = new ApiClientFacade(Astro); +const access = frame.app.activeTeam ? await api.getTeamAccessSummary(frame.app.activeTeam.id).catch(() => null) : null; +const canManage = Boolean((access?.roles ?? access?.access?.roles ?? []).some((role: string) => ['team_owner', 'project_lead'].includes(role))); +const csrfToken = ensureCsrfToken(Astro); +const action = frame.app.activeTeam ? `/v1/teams/${encodeURIComponent(frame.app.activeTeam.id)}/workday-runs` : ''; +--- + + +
+ {frame.monitor ? : null} + {!frame.app.activeTeam ? : + {canManage ?
Open a new workday
+ + + + + +
: null} + +
} +
+
diff --git a/src/routes.ts b/src/routes.ts index edf545f7..c00de79f 100644 --- a/src/routes.ts +++ b/src/routes.ts @@ -57,11 +57,35 @@ export const ADMIN_ROUTES: readonly SiteRouteContribution[] = validateRouteCapab adminRoute('/app/services/[connectionId]', 'pages/app/services/[connectionId].astro', { id: 'admin.services.detail', description: 'Provider connection, capabilities, encrypted credentials, activity, and settings.', guarantees: ['guarantee.service.connection.edit-service.024', 'guarantee.service.connection.disconnect-service.025'], knowledgePageIds: ['services.connection'] }), adminRoute('/app/feedback', 'pages/app/feedback/index.astro', { id: 'admin.feedback.collection', description: 'Platform-administrator feedback search, triage, and privacy-safe export.', accessPolicy: ['platform_admin'], guarantees: ['guarantee.admin.feedback.manage-feedback.030'], knowledgePageIds: ['feedback.administration'] }), adminRoute('/app/feedback/[feedbackId]', 'pages/app/feedback/[feedbackId].astro', { id: 'admin.feedback.detail', description: 'Private feedback context, attachment, timeline, and resolution workflow.', accessPolicy: ['platform_admin'], guarantees: ['guarantee.admin.feedback.manage-feedback.030'], knowledgePageIds: ['feedback.triage'] }), - adminRoute('/app/projects', 'pages/app/domain-overview.astro', { id: 'admin.domain.projects', description: 'Bounded active-team project domain landing page.', guarantees: ['guarantee.team.team.view-team-overview.015'] }), + adminRoute('/app/focus', 'pages/app/focus/index.astro', { id: 'admin.focus.overview', description: 'Stable team research and governance snapshot.', guarantees: ['guarantee.work.focus.enter-focus-mode.031'] }), + adminRoute('/app/focus/questions', 'pages/app/focus/questions.astro', { id: 'admin.focus.questions', description: 'Evidence-centered question queue and answer controls.', guarantees: ['guarantee.work.focus.review-governance.032'] }), + adminRoute('/app/focus/proposals', 'pages/app/focus/proposals/index.astro', { id: 'admin.focus.proposals', description: 'Governance proposal pipeline and creation surface.', guarantees: ['guarantee.work.focus.review-governance.032'] }), + adminRoute('/app/focus/proposals/[proposalId]', 'pages/app/focus/proposals/[proposalId].astro', { id: 'admin.focus.proposal', description: 'Single-proposal deliberation chamber and authorized governance controls.', guarantees: ['guarantee.work.focus.review-governance.032'] }), + adminRoute('/app/focus/decisions', 'pages/app/focus/decisions.astro', { id: 'admin.focus.decisions', description: 'Decision record with planning and execution consequences.', guarantees: ['guarantee.work.focus.review-governance.032'] }), + adminRoute('/app/command', 'pages/app/command/index.astro', { id: 'admin.command.overview', description: 'Situational command overview and live agent activity timeline.', guarantees: ['guarantee.work.command.monitor-team-operations.033'] }), + adminRoute('/app/command/agents', 'pages/app/command/agents/index.astro', { id: 'admin.command.agents', description: 'Portfolio agent roster grouped by project and activity.', guarantees: ['guarantee.work.command.monitor-team-operations.033'] }), + adminRoute('/app/command/assignments/[assignmentId]', 'pages/app/command/assignments/[assignmentId].astro', { id: 'admin.command.assignment', description: 'Durable assignment evidence and existing recovery controls.', guarantees: ['guarantee.work.command.inspect-assignment.034'] }), + adminRoute('/app/projects', 'pages/app/projects/index.astro', { id: 'admin.domain.projects', description: 'Active-team project command portfolio.', guarantees: ['guarantee.team.team.view-team-overview.015'] }), + adminRoute('/app/projects/[projectId]', 'pages/app/projects/[projectId]/index.astro', { id: 'admin.projects.command', description: 'Project command overview across approvals, releases, capacity, agents, and repository state.', guarantees: ['guarantee.work.command.monitor-team-operations.033'] }), + adminRoute('/app/projects/[projectId]/agents', 'pages/app/projects/[projectId]/agents/index.astro', { id: 'admin.projects.agents', description: 'Project agent roster and recent activity.', guarantees: ['guarantee.work.command.monitor-team-operations.033'] }), + adminRoute('/app/projects/[projectId]/agents/[agentId]', 'pages/app/projects/[projectId]/agents/[agentId].astro', { id: 'admin.projects.agent-studio', description: 'Read-only Agent Studio with execution and TreeDX trace evidence.', guarantees: ['guarantee.work.command.inspect-assignment.034'] }), adminRoute('/app/projects/[projectId]/books', 'pages/app/projects/[projectId]/books/index.astro', { id: 'admin.knowledge.project-books', description: 'Project-scoped repository-native book management.', guarantees: ['guarantee.project.book.create-book.065', 'guarantee.project.book.edit-book.066', 'guarantee.project.book.delete-book.067', 'guarantee.project.book.search-books.068'], knowledgePageIds: ['knowledge.authoring'] }), adminRoute('/app/projects/[projectId]/workflows', 'pages/app/projects/[projectId]/workflows.astro', { id: 'admin.projects.workflows', description: 'Project repository binding, remote workflow operation, secret, and variable administration.', guarantees: [], knowledgePageIds: ['services.workflow-execution', 'services.workflow-configuration'] }), - adminRoute('/app/capacity', 'pages/app/domain-overview.astro', { id: 'admin.domain.capacity', description: 'Bounded active-team capacity domain landing page.', guarantees: ['guarantee.team.team.view-team-overview.015'] }), - adminRoute('/app/work', 'pages/app/domain-overview.astro', { id: 'admin.domain.work', description: 'Bounded active-team work domain landing page.', guarantees: [] }), + adminRoute('/app/capacity', 'pages/app/capacity/index.astro', { id: 'admin.domain.capacity', description: 'Provider availability, reservations, usage, routing, and ledger.', guarantees: ['guarantee.work.command.monitor-team-operations.033'] }), + adminRoute('/app/work', 'pages/app/work/index.astro', { id: 'admin.agent-lab.monitor', description: 'Team Agent Lab monitoring foundation and workday control.', guarantees: ['guarantee.work.command.monitor-team-operations.033', 'guarantee.work.agent-lab.monitor-agent-lab.035'] }), + adminRoute('/app/work/inbox', 'pages/app/work/inbox.astro', { id: 'admin.agent-lab.inbox', description: 'Agent Lab proposals and operational errors.' }), + adminRoute('/app/work/decisions', 'pages/app/work/decisions.astro', { id: 'admin.agent-lab.decisions', description: 'Agent Lab proposals, decisions, assignments, and outcomes.' }), + adminRoute('/app/work/build', 'pages/app/work/build.astro', { id: 'admin.agent-lab.build', description: 'Agent design and simulation entry surface.' }), + adminRoute('/app/work/direction', 'pages/app/work/direction.astro', { id: 'admin.agent-lab.direction', description: 'Assignment and execution direction timeline.' }), + adminRoute('/app/work/results', 'pages/app/work/results.astro', { id: 'admin.agent-lab.results', description: 'Agent artifacts, summaries, and reports.' }), + adminRoute('/app/work/find', 'pages/app/work/find.astro', { id: 'admin.agent-lab.find', description: 'Cross-entity Agent Lab search.' }), + adminRoute('/app/work/agents', 'pages/app/work/agents.astro', { id: 'admin.agent-lab.agents', description: 'Configured and active Agent Lab agent summaries.', guarantees: ['guarantee.work.agent-lab.monitor-agent-lab.035'] }), + adminRoute('/app/work/workdays', 'pages/app/work/workdays.astro', { id: 'admin.agent-lab.workdays', description: 'Operating-day workday summaries.', guarantees: ['guarantee.work.agent-lab.monitor-agent-lab.035'] }), + adminRoute('/app/work/events', 'pages/app/work/events.astro', { id: 'admin.agent-lab.events', description: 'Durable Agent Lab system-event summaries.', guarantees: ['guarantee.work.agent-lab.monitor-agent-lab.035'] }), + adminRoute('/app/work/assignments', 'pages/app/work/assignments.astro', { id: 'admin.agent-lab.assignments', description: 'Operating-day assignment summaries.', guarantees: ['guarantee.work.agent-lab.monitor-agent-lab.035'] }), + adminRoute('/app/work/executions', 'pages/app/work/executions.astro', { id: 'admin.agent-lab.executions', description: 'Native execution-attempt summaries.', guarantees: ['guarantee.work.agent-lab.monitor-agent-lab.035'] }), + adminRoute('/app/work/artifacts', 'pages/app/work/artifacts.astro', { id: 'admin.agent-lab.artifacts', description: 'Durable Agent Lab artifact summaries.', guarantees: ['guarantee.work.agent-lab.monitor-agent-lab.035'] }), + adminRoute('/app/work/[runId]', 'pages/app/work/[runId].astro', { id: 'admin.work.detail', description: 'Live workday control or historical race replay.', guarantees: ['guarantee.work.command.monitor-team-operations.033', 'guarantee.work.agent-lab.monitor-agent-lab.035'] }), adminRoute('/app/knowledge', 'pages/app/knowledge/index.astro', { id: 'admin.knowledge.workbench', description: 'Active-team repository-native book authoring, review, linking, and pack workbench.', guarantees: ['guarantee.project.book.create-book.065', 'guarantee.project.book.edit-book.066', 'guarantee.project.book.delete-book.067', 'guarantee.project.book.search-books.068', 'guarantee.project.knowledge.create-book-page.069', 'guarantee.project.book.download-book.070', 'guarantee.project.knowledge.edit-book-page.071', 'guarantee.project.knowledge.delete-book-page.072', 'guarantee.project.library.download-library.073', 'guarantee.project.library.rebuild-library-index.090', 'guarantee.project.knowledge.review-backlinks.091'], knowledgePageIds: ['knowledge.authoring'] }), adminRoute('/app/knowledge/packs/[buildId]/download', 'pages/app/knowledge/packs/[buildId]/download.ts', { id: 'admin.knowledge.pack-download', description: 'Authorized no-store knowledge-pack artifact download.', responseKind: 'data', archetype: 'action', navigation: 'hidden', guarantees: ['guarantee.project.book.download-book.070', 'guarantee.project.library.download-library.073'] }), adminRoute('/app/market', 'pages/app/domain-overview.astro', { id: 'admin.domain.market', description: 'Bounded active-team catalog and billing domain landing page.', guarantees: ['guarantee.team.team.view-team-overview.015'] }), diff --git a/src/view-models/account-settings.ts b/src/view-models/account-settings.ts index 3582fce0..6c0026aa 100644 --- a/src/view-models/account-settings.ts +++ b/src/view-models/account-settings.ts @@ -29,7 +29,7 @@ export async function loadAccountFrame(context: APIContext, section: typeof ACCO return { app, api, - preferences: await api.accountPreferences().catch(() => ({ timeZone: 'UTC' })), + preferences: await api.accountPreferences().catch(() => ({ timeZone: 'UTC', realTimeUpdates: true, realTimePollingIntervalSeconds: 5 as const })), csrfToken: ensureCsrfToken(context), sections: ACCOUNT_SECTIONS.map((entry) => ({ ...entry, current: entry.id === section })), }; @@ -144,8 +144,12 @@ export async function handleAppearanceRequest(context: APIContext, api: ReturnTy if (intent === 'create-theme') await api.createPersonalTheme(themeDraft(form)); else if (intent === 'update-theme') await api.updatePersonalTheme(String(form.get('themeId') ?? ''), themeDraft(form)); else if (intent === 'delete-theme') await api.deletePersonalTheme(String(form.get('themeId') ?? '')); + else if (intent === 'realtime') await api.updateAccountPreferences({ + realTimeUpdates: String(form.get('realTimeUpdates') ?? 'true') === 'true', + realTimePollingIntervalSeconds: Number(form.get('realTimePollingIntervalSeconds') ?? 5) as 2 | 5 | 15 | 30, + }); else throw new Error('Unknown appearance action.'); - return respond(context, '/app/account/appearance', { ok: true, code: intent === 'delete-theme' ? 'theme_deleted' : 'theme_saved', message: intent === 'delete-theme' ? 'Theme deleted.' : 'Theme saved.' }); + return respond(context, '/app/account/appearance', { ok: true, code: intent === 'delete-theme' ? 'theme_deleted' : intent === 'realtime' ? 'realtime_saved' : 'theme_saved', message: intent === 'delete-theme' ? 'Theme deleted.' : intent === 'realtime' ? 'Real-time experience saved.' : 'Theme saved.' }); } catch (error) { return respond(context, '/app/account/appearance', failure(error)); } } diff --git a/src/view-models/agent-lab/agent-lab-frame.ts b/src/view-models/agent-lab/agent-lab-frame.ts new file mode 100644 index 00000000..156cb2dc --- /dev/null +++ b/src/view-models/agent-lab/agent-lab-frame.ts @@ -0,0 +1,38 @@ +import { agentLabMetricKeys, type AgentLabActivityInterval, type AgentLabDelta, type AgentLabMetricPoint, type AgentLabOverview } from '@treeseed/sdk/agent-capacity'; +import type { AccountPreferences } from '@treeseed/sdk/account-contracts'; +import type { ApiClientFacade } from '../../lib/market/api-client.ts'; + +export const agentLabMetricDestinations = { + agents: '/app/work/agents', workdays: '/app/work/workdays', systemEvents: '/app/work/events', + assignments: '/app/work/assignments', executions: '/app/work/executions', artifacts: '/app/work/artifacts', + passed: '/app/work/executions?status=succeeded', failed: '/app/work/executions?status=failed', running: '/app/work/executions?status=running', +}; + +function fallbackOverview(team: { id: string; name?: string; slug?: string }, timeZone: string): AgentLabOverview { + const now = new Date(); const start = new Date(now); start.setUTCHours(0, 0, 0, 0); const end = new Date(start); end.setUTCDate(end.getUTCDate() + 1); + return { revision: 'server-snapshot-unavailable', generatedAt: now.toISOString(), timeZone, operatingDay: { start: start.toISOString(), end: end.toISOString() }, + team: { id: team.id, name: team.name ?? team.slug ?? 'Active team' }, connectivity: 'degraded', activeWorkdays: 0, activeProviders: 0, executionProviders: [], + workdayContext: { selectedDate: now.toISOString().slice(0, 10), selectedWorkdayId: null, latestWorkdayId: null, workdays: [] }, metricTargets: {}, targetRevision: null, + metrics: agentLabMetricKeys.map((key) => ({ key, value: 0, secondary: 'Unavailable', semantic: key === 'agents' ? 'configured' : ['workdays', 'systemEvents'].includes(key) ? 'exact-total' : key === 'running' ? 'instantaneous' : 'cumulative', observedAt: now.toISOString() })) }; +} + +export async function loadAgentLabFrame(api: ApiClientFacade, team: { id: string; name?: string; slug?: string }, preferences: AccountPreferences, selection: { date?: string | null; workday?: string | null } = {}) { + const base = `/v1/teams/${encodeURIComponent(team.id)}/agent-lab`; + const query = new URLSearchParams(); if (selection.date) query.set('date', selection.date); if (selection.workday) query.set('workday', selection.workday); + const suffix = query.size ? `?${query}` : ''; + const [overview, activity, series, allocation] = await Promise.all([ + api.request('GET', `${base}/overview${suffix}`).catch(() => fallbackOverview(team, preferences.timeZone)), + api.request('GET', `${base}/activity${suffix}`).catch(() => ({ revision: 'unavailable', generatedAt: new Date().toISOString(), cursor: null, upserts: [], removedIds: [] })), + api.request('GET', `${base}/metric-series${suffix}`).catch(() => ({ revision: 'unavailable', generatedAt: new Date().toISOString(), cursor: null, upserts: [], removedIds: [] })), + api.request('GET', `${base}/allocation${suffix}`).catch(() => ({ revision: 'unavailable', generatedAt: new Date().toISOString(), canManage: false, activeAllocationSetId: null, credits: { budget: null, requested: 0, reserved: 0, committed: 0, reported: 0, spent: 0, remaining: null, overrun: 0 }, projects: [], agentClasses: [] })), + ]); + return { + overview: overview as AgentLabOverview, + activity: activity as AgentLabDelta, + series: series as AgentLabDelta, + allocation, + endpoints: { overview: `${base}/overview${suffix}`, activity: `${base}/activity${suffix}`, metricSeries: `${base}/metric-series${suffix}`, allocation: `${base}/allocation${suffix}` }, + targetEndpoint: `${base}/targets`, + preference: { enabled: preferences.realTimeUpdates, intervalSeconds: preferences.realTimePollingIntervalSeconds }, + }; +} diff --git a/src/view-models/agent-lab/command-page.ts b/src/view-models/agent-lab/command-page.ts new file mode 100644 index 00000000..2e3d5e3a --- /dev/null +++ b/src/view-models/agent-lab/command-page.ts @@ -0,0 +1,26 @@ +import type { CommandCollectionPage } from '@treeseed/ui/components/react/CommandCenter'; +import type { APIContext } from 'astro'; +import { ApiClientFacade } from '../../lib/market/api-client.ts'; +import { loadAppContext } from '../app-access.ts'; +import { loadAgentLabFrame } from './agent-lab-frame.ts'; + +export type AgentLabCommandSurface = CommandCollectionPage['surface']; +const copy: Record = { + inbox: { title: 'Operational Inbox', description: 'Governance and failures that can change what the team does next.' }, + decisions: { title: 'Decision Chamber', description: 'Open proposals beside the durable decisions and work they authorize.' }, + build: { title: 'Agent Systems Foundry', description: 'Inspect repository-defined agents, their contracts, and production simulations.' }, + direction: { title: 'Execution Direction', description: 'Follow work from assignment intake through execution-provider evidence and outcomes.' }, + results: { title: 'Result Intelligence', description: 'Research outcomes, generated content, changed files, costs, and recovery evidence.' }, + find: { title: 'Relationship Search', description: 'Search operational records and follow how governance, agents, work, and evidence connect.' }, +}; +function fallback(surface: AgentLabCommandSurface): CommandCollectionPage { return { revision: 'unavailable', generatedAt: new Date().toISOString(), surface, ...copy[surface], unreadCount: 0, items: [], secondaryItems: [], metrics: [], relations: [], page: { hasMore: false, nextCursor: null, total: 0 } }; } +export async function loadAgentLabCommandPage(context: APIContext, surface: AgentLabCommandSurface) { + const app = await loadAppContext(context); const api = new ApiClientFacade(context); + const preferences = await api.accountPreferences().catch(() => ({ timeZone: 'UTC', realTimeUpdates: true, realTimePollingIntervalSeconds: 5 as const })); + if (!app.activeTeam) return { app, preferences, frame: null, surface: fallback(surface), endpoints: null, query: '' }; + const date = context.url.searchParams.get('date'); const workday = context.url.searchParams.get('workday'); const query = context.url.searchParams.get('q') ?? ''; + const selection = new URLSearchParams(); if (date) selection.set('date', date); if (workday) selection.set('workday', workday); if (query) selection.set('q', query); + const base = `/v1/teams/${encodeURIComponent(app.activeTeam.id)}/agent-lab`; const collection = `${base}/surfaces/${surface}${selection.size ? `?${selection}` : ''}`; + const [frame, initial] = await Promise.all([loadAgentLabFrame(api, app.activeTeam, preferences, { date, workday }), api.request('GET', collection).catch(() => fallback(surface))]); + return { app, preferences, frame, surface: initial as CommandCollectionPage, query, endpoints: { collection, detailBase: `${base}/details`, state: `${base}/view-state`, actions: `${base}/surfaces/${surface}`, simulations: `${base}/simulations` } }; +} diff --git a/src/view-models/agent-lab/entity-page.ts b/src/view-models/agent-lab/entity-page.ts new file mode 100644 index 00000000..1b8ebb1e --- /dev/null +++ b/src/view-models/agent-lab/entity-page.ts @@ -0,0 +1,24 @@ +import type { AgentLabEntityKind, AgentLabEntitySummary } from '@treeseed/sdk/agent-capacity'; +import type { APIContext } from 'astro'; +import { ApiClientFacade } from '../../lib/market/api-client.ts'; +import { loadAppContext } from '../app-access.ts'; +import { loadAgentLabFrame } from './agent-lab-frame.ts'; + +export async function loadAgentLabEntityPage(context: APIContext, kind: AgentLabEntityKind) { + const app = await loadAppContext(context); const api = new ApiClientFacade(context); + const preferences = await api.accountPreferences().catch(() => ({ timeZone: 'UTC', realTimeUpdates: true, realTimePollingIntervalSeconds: 5 as const })); + if (!app.activeTeam) return { app, preferences, monitor: null, items: [] as AgentLabEntitySummary[], total: 0, query: '', status: '', nextHref: null }; + const query = context.url.searchParams.get('q') ?? ''; const status = context.url.searchParams.get('status') ?? ''; const cursor = context.url.searchParams.get('cursor') ?? ''; + const date = context.url.searchParams.get('date'); const workday = context.url.searchParams.get('workday'); + const params = new URLSearchParams({ kind, limit: '25' }); if (query) params.set('q', query); if (status) params.set('status', status); if (cursor) params.set('cursor', cursor); + if (date) params.set('date', date); if (workday) params.set('workday', workday); + const [monitor, page] = await Promise.all([ + loadAgentLabFrame(api, app.activeTeam, preferences, { date, workday }), + api.request('GET', `/v1/teams/${encodeURIComponent(app.activeTeam.id)}/agent-lab/entities?${params}`).catch(() => ({ items: [], total: 0 })), + ]); + const payload = page as { items?: AgentLabEntitySummary[]; total?: number; page?: { nextCursor?: string | null } }; + const next = new URLSearchParams(); if (query) next.set('q', query); if (status) next.set('status', status); if (date) next.set('date', date); if (workday) next.set('workday', workday); + if (payload.page?.nextCursor) next.set('cursor', payload.page.nextCursor); + return { app, preferences, monitor, items: payload.items ?? [], total: Number(payload.total ?? 0), query, status, + nextHref: payload.page?.nextCursor ? `${context.url.pathname}?${next}` : null }; +} diff --git a/src/view-models/command/activity-intervals.ts b/src/view-models/command/activity-intervals.ts new file mode 100644 index 00000000..07d7b840 --- /dev/null +++ b/src/view-models/command/activity-intervals.ts @@ -0,0 +1,84 @@ +import { dateValue, record, text, type JsonRecord } from '../../lib/operations/records.ts'; + +export type ActivityKind = 'acting' | 'reviewing' | 'estimating' | 'planning' | 'reporting'; + +export interface ActivityInterval { + id: string; + assignmentId: string; + agentId: string; + agentLabel: string; + projectId: string; + activity: ActivityKind; + status: string; + start: number; + end: number; + ongoing: boolean; + lane: number; +} + +const activityPriority: Record = { + acting: 5, reviewing: 4, estimating: 3, planning: 2, reporting: 1, +}; + +export function activityKind(run: JsonRecord): ActivityKind { + const value = `${run.mode ?? ''} ${run.handler ?? ''} ${record(run.agent).mode ?? ''}`.toLowerCase(); + if (value.includes('review')) return 'reviewing'; + if (value.includes('estimat')) return 'estimating'; + if (value.includes('report') || value.includes('summar')) return 'reporting'; + if (value.includes('act') || value.includes('execut')) return 'acting'; + return 'planning'; +} + +export function projectActivityIntervals(runs: JsonRecord[], now = Date.now()): ActivityInterval[] { + const projected = runs.flatMap((run): ActivityInterval[] => { + const timing = record(run.timing); + const assignment = record(run.assignment); + const agent = record(run.agent); + const startedAt = dateValue(timing.startedAt, run.startedAt, timing.createdAt, run.createdAt); + if (!startedAt) return []; + const finishedAt = dateValue(timing.finishedAt, timing.completedAt, timing.failedAt, run.finishedAt); + const start = Date.parse(startedAt); + const ongoing = !finishedAt && ['running', 'active', 'leased', 'queued'].includes(String(run.status ?? '')); + const end = finishedAt ? Date.parse(finishedAt) : now; + if (!Number.isFinite(start) || !Number.isFinite(end) || end < start) return []; + return [{ + id: String(run.id ?? `${assignment.id}:${start}`), + assignmentId: text(assignment.id, run.assignmentId), + agentId: text(agent.agentId, agent.id, run.agentId, 'unknown-agent'), + agentLabel: text(agent.displayName, agent.className, agent.agentId, run.agentId, 'Unknown agent'), + projectId: text(assignment.projectId, run.projectId), + activity: activityKind(run), status: String(run.status ?? 'unknown'), start, end, ongoing, lane: 0, + }]; + }); + const byAgent = new Map(); + for (const interval of projected) byAgent.set(interval.agentId, [...(byAgent.get(interval.agentId) ?? []), interval]); + for (const intervals of byAgent.values()) { + const laneEnds: number[] = []; + for (const interval of intervals.sort((left, right) => left.start - right.start || left.id.localeCompare(right.id))) { + let lane = laneEnds.findIndex((end) => end <= interval.start); + if (lane < 0) lane = laneEnds.length; + interval.lane = lane; + laneEnds[lane] = interval.end; + } + } + return projected; +} + +export function visibleActivity(intervals: ActivityInterval[], rangeStart: number, rangeEnd: number) { + const visible = intervals.filter((entry) => entry.start < rangeEnd && entry.end > rangeStart); + const agents = [...new Set(visible.map((entry) => entry.agentId))]; + agents.sort((left, right) => { + const leftRuns = visible.filter((entry) => entry.agentId === left); + const rightRuns = visible.filter((entry) => entry.agentId === right); + const leftActive = Math.max(0, ...leftRuns.filter((entry) => entry.ongoing).map((entry) => activityPriority[entry.activity])); + const rightActive = Math.max(0, ...rightRuns.filter((entry) => entry.ongoing).map((entry) => activityPriority[entry.activity])); + const leftRecent = Math.max(...leftRuns.map((entry) => entry.end)); + const rightRecent = Math.max(...rightRuns.map((entry) => entry.end)); + return rightActive - leftActive || rightRecent - leftRecent || left.localeCompare(right); + }); + return { intervals: visible, agents }; +} + +export function mergeActivityRuns(previous: JsonRecord[], incoming: JsonRecord[]) { + return [...new Map([...previous, ...incoming].map((run) => [String(run.id), run])).values()]; +} diff --git a/src/view-models/command/command-state.ts b/src/view-models/command/command-state.ts new file mode 100644 index 00000000..c6301de6 --- /dev/null +++ b/src/view-models/command/command-state.ts @@ -0,0 +1,59 @@ +import type { ApiClientFacade } from '../../lib/market/api-client.ts'; +import { items, record, type JsonRecord } from '../../lib/operations/records.ts'; + +export interface CommandSnapshot { + workdays: JsonRecord[]; + assignments: JsonRecord[]; + executions: JsonRecord[]; + providers: JsonRecord[]; + approvals: JsonRecord[]; + projects: JsonRecord[]; + inbox: JsonRecord[]; + reservations: JsonRecord[]; + ledger: JsonRecord[]; + decisions: JsonRecord[]; + unavailable: string[]; +} + +async function capture(label: string, operation: Promise, unavailable: string[]): Promise { + try { return await operation; } + catch { unavailable.push(label); return null; } +} + +export async function loadCommandSnapshot(api: ApiClientFacade, teamId: string): Promise { + const unavailable: string[] = []; + const base = `/v1/teams/${encodeURIComponent(teamId)}`; + const [workdays, assignments, executions, providers, approvals, projects, inbox, decisions] = await Promise.all([ + capture('workdays', api.request('GET', `${base}/workday-runs?limit=100`), unavailable), + capture('assignments', api.request('GET', `${base}/capacity/assignments?limit=200`), unavailable), + capture('executions', api.request('GET', `${base}/capacity/execution-runs?projection=activity&limit=200`), unavailable), + capture('providers', api.request('GET', `${base}/capacity/availability-sessions?limit=100`), unavailable), + capture('approvals', api.listApprovalRequestsForTeam(teamId, { limit: 100 }), unavailable), + capture('projects', api.listTeamProjects(teamId), unavailable), + capture('inbox', api.listPersistedTeamInboxItems(teamId), unavailable), + capture('decisions', api.listCommonsDecisions({ teamId, limit: 100 }), unavailable), + ]); + const projectItems = items(projects); + const evidence = await Promise.all(projectItems.map(async (project) => { + const projectId = encodeURIComponent(String(project.id)); + const [reservations, ledger] = await Promise.all([ + capture(`reservations:${project.id}`, api.request('GET', `${base}/capacity/reservations?projectId=${projectId}&limit=100`), unavailable), + capture(`ledger:${project.id}`, api.request('GET', `${base}/capacity/ledger?projectId=${projectId}&limit=100`), unavailable), + ]); + return { reservations: items(reservations), ledger: items(ledger) }; + })); + return { + workdays: items(workdays), assignments: items(assignments), executions: items(executions), + providers: items(providers), approvals: items(approvals), projects: projectItems, + inbox: items(inbox), unavailable, + reservations: evidence.flatMap((entry) => entry.reservations), ledger: evidence.flatMap((entry) => entry.ledger), decisions: items(decisions), + }; +} + +export function activeWorkday(snapshot: CommandSnapshot): JsonRecord | null { + return snapshot.workdays.find((run) => String(run.status) === 'running') ?? null; +} + +export function projectMap(snapshot: CommandSnapshot) { + return new Map(snapshot.projects.map((project) => [String(project.id), record(project)])); +} diff --git a/src/view-models/command/situations.ts b/src/view-models/command/situations.ts new file mode 100644 index 00000000..d3abfb65 --- /dev/null +++ b/src/view-models/command/situations.ts @@ -0,0 +1,103 @@ +import { dateValue, record, statusTone, text, type JsonRecord } from '../../lib/operations/records.ts'; +import type { CommandSnapshot } from './command-state.ts'; + +export interface CommandSituation { + id: string; + title: string; + description: string; + status: string; + tone: ReturnType; + timestamp: string | null; + href: string; + actionLabel: string; + evidence: string; + inferred: boolean; + priority: number; +} + +function situation(input: CommandSituation) { return input; } + +export function deriveCommandSituations(snapshot: CommandSnapshot, now = Date.now()): CommandSituation[] { + const values: CommandSituation[] = []; + for (const run of snapshot.workdays) { + const status = String(run.status ?? ''); + if (!['failed', 'degraded'].includes(status)) continue; + values.push(situation({ id: `workday:${run.id}`, title: `Workday ${status}`, + description: text(record(run.error).message, record(run.summary).message, 'The workday ended without a clean completion and needs review.'), + status, tone: statusTone(status), timestamp: dateValue(run.completedAt, run.updatedAt), href: `/app/work/${encodeURIComponent(String(run.id))}`, + actionLabel: 'Inspect workday', evidence: 'Durable workday status', inferred: false, priority: 100 })); + } + for (const execution of snapshot.executions) { + if (String(execution.status) !== 'failed') continue; + const agent = record(execution.agent); const assignment = record(execution.assignment); + values.push(situation({ id: `execution:${execution.id}`, title: `${text(agent.className, agent.agentId, 'Agent')} execution failed`, + description: text(assignment.lifecycleReason, 'A failed execution has trace evidence available for recovery planning.'), + status: 'failed', tone: 'danger', timestamp: dateValue(record(execution.timing).failedAt, record(execution.timing).finishedAt), + href: `/app/command/assignments/${encodeURIComponent(String(assignment.id ?? ''))}`, actionLabel: 'Inspect evidence', + evidence: 'Execution-run activity projection', inferred: false, priority: 95 })); + } + for (const assignment of snapshot.assignments) { + const lease = dateValue(assignment.leaseExpiresAt, assignment.lease_expires_at); + const leaseState = String(assignment.leaseState ?? assignment.lease_state ?? ''); + if (!lease || !['leased', 'active'].includes(leaseState)) continue; + const remaining = Date.parse(lease) - now; + if (remaining > 5 * 60_000) continue; + values.push(situation({ id: `lease:${assignment.id}`, title: remaining <= 0 ? 'Assignment lease expired' : 'Assignment lease nearing expiry', + description: `${text(assignment.agentId, assignment.agent_id, 'An agent')} may require recovery if the provider does not renew its lease.`, + status: remaining <= 0 ? 'expired' : 'urgent', tone: remaining <= 0 ? 'danger' : 'warning', timestamp: lease, + href: `/app/command/assignments/${encodeURIComponent(String(assignment.id))}`, actionLabel: 'Inspect assignment', + evidence: 'Lease expiration', inferred: true, priority: remaining <= 0 ? 92 : 82 })); + } + for (const approval of snapshot.approvals) { + const status = String(approval.status ?? approval.state ?? 'pending'); + if (!['pending', 'waiting_for_approval', 'under_review', 'approval_required'].includes(status)) continue; + const projectId = text(approval.projectId, approval.project_id); + values.push(situation({ id: `approval:${approval.id}`, title: text(approval.title, 'Decision awaiting review'), + description: text(approval.description, approval.summary, 'Work is waiting for an authorized judgment.'), status, tone: 'warning', + timestamp: dateValue(approval.createdAt, approval.updatedAt), href: projectId ? `/app/projects/${encodeURIComponent(projectId)}` : '/app/focus/proposals', + actionLabel: 'Enter focused review', evidence: 'Approval request', inferred: false, priority: 85 })); + } + const liveProviders = snapshot.providers.filter((provider) => ['active', 'open', 'ready'].includes(String(provider.status ?? ''))); + if (snapshot.providers.length > 0 && liveProviders.length === 0) values.push(situation({ id: 'providers:none', title: 'No provider capacity is available', + description: 'Configured provider sessions are present, but none currently report an available state.', status: 'blocked', tone: 'danger', + timestamp: snapshot.providers.map((provider) => dateValue(provider.updatedAt, provider.lastCheckInAt)).filter(Boolean).sort().at(-1) ?? null, + href: '/app/capacity', actionLabel: 'Inspect capacity', evidence: 'Provider availability sessions', inferred: true, priority: 90 })); + for (const reservation of snapshot.reservations) { + const overrun = String(reservation.overrunStatus ?? reservation.overrun_status ?? ''); + const pressure = Number(reservation.utilization ?? reservation.utilizationPercent ?? 0); + if (!['requested', 'pending'].includes(overrun) && pressure < 90) continue; + values.push(situation({ id: `budget:${reservation.id}`, title: overrun ? 'Capacity overrun awaiting review' : 'Capacity budget under pressure', + description: text(reservation.reason, 'Committed usage is approaching or exceeds the authorized reservation.'), status: overrun || 'warning', tone: 'warning', + timestamp: dateValue(reservation.updatedAt, reservation.createdAt), href: '/app/capacity', actionLabel: 'Review capacity', + evidence: 'Capacity reservation and usage projection', inferred: !overrun, priority: overrun ? 88 : 72 })); + } + for (const item of snapshot.inbox) { + const kind = `${item.type ?? ''} ${item.category ?? ''} ${item.title ?? ''}`.toLowerCase(); + const status = String(item.status ?? item.severity ?? ''); + if (!kind.includes('guarantee') && !kind.includes('verification')) continue; + if (!['failed', 'error', 'degraded', 'blocking'].some((value) => status.includes(value) || kind.includes(value))) continue; + values.push(situation({ id: `guarantee:${item.id}`, title: text(item.title, 'Verification evidence requires attention'), + description: text(item.summary, item.description, 'A product promise has failing evidence.'), status: status || 'failed', tone: 'danger', + timestamp: dateValue(item.updatedAt, item.createdAt), href: text(item.href, '/app/projects'), actionLabel: 'Inspect evidence', + evidence: 'Persisted operational inbox evidence', inferred: false, priority: 94 })); + } + for (const decision of snapshot.decisions) { + const accepted = ['accepted', 'approved', 'decided'].includes(String(decision.status ?? decision.outcome ?? '')); + if (!accepted || decision.capacityPlanId || decision.capacity_plan_id) continue; + values.push(situation({ id: `decision:${decision.id}`, title: 'Decision ready but not capacity-planned', + description: text(decision.title, decision.summary, 'An authorized decision has no linked capacity plan.'), status: 'planning required', tone: 'warning', + timestamp: dateValue(decision.decidedAt, decision.updatedAt, decision.createdAt), href: '/app/focus/decisions', actionLabel: 'Enter focused review', + evidence: 'Decision planning provenance', inferred: true, priority: 80 })); + } + for (const project of snapshot.projects) { + const state = `${project.status ?? ''} ${project.releaseStatus ?? ''} ${project.forecastStatus ?? ''}`.toLowerCase(); + if (!['at_risk', 'blocked', 'delayed', 'failed'].some((value) => state.includes(value))) continue; + values.push(situation({ id: `project:${project.id}`, title: `${text(project.displayName, project.name, 'Project')} requires attention`, + description: text(project.forecastSummary, project.releaseSummary, project.description, 'Project forecast or release evidence indicates risk.'), status: state || 'at risk', tone: state.includes('failed') ? 'danger' : 'warning', + timestamp: dateValue(project.updatedAt, project.forecastUpdatedAt), href: `/app/projects/${encodeURIComponent(String(project.id))}`, actionLabel: 'Open project', + evidence: 'Project forecast or release projection', inferred: true, priority: 78 })); + } + return [...new Map(values.map((entry) => [entry.id, entry])).values()] + .sort((left, right) => right.priority - left.priority || String(right.timestamp).localeCompare(String(left.timestamp))) + .slice(0, 15); +} diff --git a/src/view-models/focus/focus-state.ts b/src/view-models/focus/focus-state.ts new file mode 100644 index 00000000..b02a44d0 --- /dev/null +++ b/src/view-models/focus/focus-state.ts @@ -0,0 +1,31 @@ +import type { ApiClientFacade } from '../../lib/market/api-client.ts'; +import { items, record, type JsonRecord } from '../../lib/operations/records.ts'; + +export interface FocusSnapshot { + summary: JsonRecord; + questions: JsonRecord[]; + proposals: JsonRecord[]; + decisions: JsonRecord[]; + events: JsonRecord[]; + unavailable: string[]; +} + +async function capture(label: string, operation: Promise, unavailable: string[]): Promise { + try { return await operation; } + catch { unavailable.push(label); return null; } +} + +export async function loadFocusSnapshot(api: ApiClientFacade, teamId: string): Promise { + const unavailable: string[] = []; + const [summary, questions, proposals, decisions, events] = await Promise.all([ + capture('summary', api.getCommonsSummary(), unavailable), + capture('questions', api.listCommonsQuestions({ teamId, limit: 100 }), unavailable), + capture('proposals', api.listCommonsProposals({ teamId, limit: 100 }), unavailable), + capture('decisions', api.listCommonsDecisions({ teamId, limit: 100 }), unavailable), + capture('events', api.listCommonsEvents({ teamId, limit: 100 }), unavailable), + ]); + return { + summary: record(summary), questions: items(questions), proposals: items(proposals), + decisions: items(decisions), events: items(events), unavailable, + }; +} diff --git a/tests/contract/focus-command/agent-lab-monitoring.test.ts b/tests/contract/focus-command/agent-lab-monitoring.test.ts new file mode 100644 index 00000000..876aa7f6 --- /dev/null +++ b/tests/contract/focus-command/agent-lab-monitoring.test.ts @@ -0,0 +1,38 @@ +import { readFileSync } from 'node:fs'; +import { describe, expect, it } from 'vitest'; + +const source = (path: string) => readFileSync(path, 'utf8'); +const secondaryRoutes = ['agents.astro', 'workdays.astro', 'events.astro', 'assignments.astro', 'executions.astro', 'artifacts.astro']; +const navigatorRoutes = ['inbox', 'decisions', 'build', 'direction', 'results', 'find']; + +describe('Agent Lab command header and navigator', () => { + it('uses one shared chrome without conventional page or Command navigation', () => { + const chrome = source('src/components/agent-lab/AgentLabChrome.astro'); + expect(chrome).toContain('AgentLabMonitor'); + expect(chrome).toContain('OperationsNavigator'); + for (const route of navigatorRoutes) expect(chrome).toContain(`/app/work/${route}`); + for (const path of ['src/pages/app/work/index.astro', 'src/pages/app/work/[runId].astro', 'src/components/agent-lab/AgentLabEntityPage.astro']) { + const page = source(path); expect(page).toContain('AgentLabChrome'); expect(page).not.toMatch(/ { + const routes = source('src/routes.ts'); + for (const route of navigatorRoutes) { + expect(routes).toContain(`/app/work/${route}`); + expect(source(`src/pages/app/work/${route}.astro`)).toContain('AgentLabCommandPage'); + } + const page = source('src/components/agent-lab/AgentLabCommandPage.astro'); + expect(page).toContain('CommandWorkspace'); + expect(page).toContain('AgentLabChrome'); + }); + + it('preserves workday scope and keeps realtime ownership in UI', () => { + const chrome = source('src/components/agent-lab/AgentLabChrome.astro'); + expect(chrome).toContain("params.set('date'"); expect(chrome).toContain("params.set('workday'"); + const monitor = source('src/components/agent-lab/AgentLabMonitor.astro'); + expect(monitor).not.toMatch(/setInterval|setTimeout|localStorage|fetch\(/u); + expect(monitor).toContain('initialOverview={frame.overview}'); + }); +}); diff --git a/tests/contract/focus-command/focus-command-architecture.test.ts b/tests/contract/focus-command/focus-command-architecture.test.ts new file mode 100644 index 00000000..d6567156 --- /dev/null +++ b/tests/contract/focus-command/focus-command-architecture.test.ts @@ -0,0 +1,51 @@ +import { readFileSync } from 'node:fs'; +import { describe, expect, it } from 'vitest'; + +const source = (path: string) => readFileSync(path, 'utf8'); + +describe('Focus and Command content architecture', () => { + it('keeps Focus static and Command live', () => { + for (const path of ['src/pages/app/focus/index.astro', 'src/pages/app/focus/questions.astro', 'src/pages/app/focus/proposals/index.astro', 'src/pages/app/focus/proposals/[proposalId].astro', 'src/pages/app/focus/decisions.astro']) { + const page = source(path); + expect(page, path).not.toMatch(/setInterval|setTimeout|client:load|pollInterval|EventSource/u); + expect(page, path).toContain('currentPath="/app/focus"'); + } + const command = source('src/pages/app/command/index.astro'); + expect(command).toContain('LiveAgentActivityGantt'); + expect(command).toContain('@treeseed/ui/components/react/OperationsMonitor'); + }); + + it('preserves shell ownership and highlights Command on operational subpages', () => { + const layout = source('src/layouts/AppLayout.astro'); + expect(layout).toContain("{ label: 'Command', href: '/app/command', icon: 'capacity' }"); + expect(layout).toContain("{ label: 'Focus', href: '/app/focus', icon: 'work' }"); + expect(layout).not.toContain("{ label: 'Capacity'"); + expect(layout).not.toContain("{ label: 'Work'"); + for (const path of ['src/pages/app/work/index.astro', 'src/pages/app/work/[runId].astro', 'src/pages/app/capacity/index.astro']) expect(source(path), path).toContain('currentPath="/app/command"'); + }); + + it('keeps Agent Studio inspection-only and operations bounded to existing routes', () => { + const studio = source('src/pages/app/projects/[projectId]/agents/[agentId].astro'); + expect(studio).toContain('Inspection only'); + expect(studio).not.toMatch(/method="post"|method="POST"|data-ts-method/u); + const assignment = source('src/pages/app/command/assignments/[assignmentId].astro'); + expect(assignment).toContain('/cancel'); + expect(assignment).toContain('/requeue'); + expect(assignment).toContain('data-ts-confirm'); + expect(assignment).toContain('canManage && (cancelEligible || requeueEligible)'); + for (const path of ['src/pages/app/work/index.astro', 'src/pages/app/work/[runId].astro']) expect(source(path), path).toContain('const canManage = Boolean'); + expect(source('src/pages/app/focus/questions.astro')).toContain('canSteward &&'); + expect(source('src/pages/app/focus/proposals/[proposalId].astro')).toContain('canSteward ? { + const commandState = source('src/view-models/command/command-state.ts'); + expect(commandState).toContain('capacity/reservations?projectId='); + expect(commandState).toContain('capacity/ledger?projectId='); + expect(commandState).not.toContain('capacity/reservations?limit='); + expect(commandState).not.toContain('capacity/ledger?limit='); + const capacityPage = source('src/pages/app/capacity/index.astro'); + expect(capacityPage).toContain('/usage?projectId='); + expect(capacityPage).not.toContain('/usage?limit='); + }); +}); diff --git a/tests/contract/package/admin-package.test.ts b/tests/contract/package/admin-package.test.ts index e2b208bc..e73e6f23 100644 --- a/tests/contract/package/admin-package.test.ts +++ b/tests/contract/package/admin-package.test.ts @@ -15,6 +15,9 @@ const EXPECTED_ROUTES = [ '/app/account/appearance', '/app/account/delete', '/app/capacity', + '/app/command', + '/app/command/agents', + '/app/command/assignments/[assignmentId]', '/app/feedback', '/app/feedback/[feedbackId]', '/app/services', @@ -24,10 +27,31 @@ const EXPECTED_ROUTES = [ '/app/knowledge', '/app/knowledge/packs/[buildId]/download', '/app/market', + '/app/focus', + '/app/focus/questions', + '/app/focus/proposals', + '/app/focus/proposals/[proposalId]', + '/app/focus/decisions', '/app/projects', + '/app/projects/[projectId]', + '/app/projects/[projectId]/agents', + '/app/projects/[projectId]/agents/[agentId]', '/app/projects/[projectId]/books', '/app/projects/[projectId]/workflows', '/app/work', + '/app/work/inbox', + '/app/work/decisions', + '/app/work/build', + '/app/work/direction', + '/app/work/results', + '/app/work/find', + '/app/work/agents', + '/app/work/workdays', + '/app/work/events', + '/app/work/assignments', + '/app/work/executions', + '/app/work/artifacts', + '/app/work/[runId]', '/app/teams', '/app/teams/active', '/app/teams/new', @@ -50,7 +74,7 @@ const EXPECTED_ROUTES = [ '/team-invites/[token]/accept', ].sort(); const EXPECTED_SUPPORT_ROUTES = ['/v1/[...all]']; -const DOMAIN_ROUTES = ['/app/capacity', '/app/market', '/app/projects', '/app/work']; +const DOMAIN_ROUTES = ['/app/market']; function filesUnder(root: string): string[] { if (!existsSync(root)) return []; @@ -139,7 +163,7 @@ describe('@treeseed/admin identity and team surface', () => { it('keeps navigation focused on active-team work and identity management', () => { const appLayout = readFileSync('src/layouts/AppLayout.astro', 'utf8'); const publicLayout = readFileSync('src/layouts/PublicLayout.astro', 'utf8'); - for (const target of ['/app/', '/app/account', '/app/teams', '/app/teams/new', '/app/services', '/app/projects', '/app/capacity', '/app/work', '/app/knowledge']) { + for (const target of ['/app/', '/app/account', '/app/teams', '/app/teams/new', '/app/services', '/app/projects', '/app/command', '/app/focus', '/app/knowledge', '/knowledge/market/', '/status/']) { expect(appLayout).toContain(target); } for (const target of ['/market', '/cart', '/seller']) { @@ -154,6 +178,8 @@ describe('@treeseed/admin identity and team surface', () => { for (const icon of ['start', 'teams', 'account', 'sign-out']) { expect(appLayout).toContain(`icon: '${icon}'`); } + expect(appLayout).not.toContain("{ label: 'Capacity'"); + expect(appLayout).not.toContain("{ label: 'Work'"); expect(appLayout).not.toContain("{ label: 'Teams'"); expect(appLayout).toContain(' { expect(appLayout).toContain('contentOwnsPageHeader={contentOwnsPageHeader}'); for (const path of appPages) { const source = readFileSync(path, 'utf8'); - const contentTemplateOwnsHeader = /<(?:DashboardTemplate|PageHeader|SettingsTemplate)\b/u.test(source); + const contentTemplateOwnsHeader = /<(?:AgentLabChrome|DashboardTemplate|PageHeader|SettingsTemplate)\b/u.test(source); expect(source.includes('contentOwnsPageHeader'), path).toBe(contentTemplateOwnsHeader); } }); diff --git a/tests/contract/team-management/team-management-architecture.test.ts b/tests/contract/team-management/team-management-architecture.test.ts index ceec4728..4a57667d 100644 --- a/tests/contract/team-management/team-management-architecture.test.ts +++ b/tests/contract/team-management/team-management-architecture.test.ts @@ -17,6 +17,8 @@ describe('team management architecture audit', () => { '/app/teams/[teamId]/members', '/app/teams/[teamId]/delete', '/app/projects', + '/app/command', + '/app/focus', '/app/services', '/app/capacity', '/app/knowledge', @@ -59,7 +61,7 @@ describe('team management architecture audit', () => { it('keeps overview, settings, membership, consent, and lifecycle responsibilities complete', () => { const overview = source('src/pages/app/teams/[teamId]/index.astro'); - for (const label of ['Members', 'Pending invitations', 'Projects', 'Services', 'Capacity and allocation', 'Knowledge', 'Catalog and billing', 'Project content activity', 'Recent team audit activity']) { + for (const label of ['Members', 'Pending invitations', 'Projects', 'Services', 'Capacity and allocation', 'Knowledge', 'Catalog and billing', 'Project content activity', 'Recent team audit activity', 'Command', 'Focus']) { expect(overview, label).toContain(label); } expect(overview).toContain("import ProjectActivityChart from '@treeseed/ui/components/react/ProjectActivityChart'"); @@ -72,7 +74,7 @@ describe('team management architecture audit', () => { expect(overviewHeader).not.toContain('slot="actions"'); expect(overviewHeader).not.toMatch(/>(?:Settings|Members) = {}) { + return { id, status: end ? 'succeeded' : 'running', agent: { agentId, displayName: agentId }, assignment: { id: `assignment-${id}` }, timing: { startedAt: start, finishedAt: end }, ...extra }; +} + +describe('command activity intervals', () => { + it('classifies configured activity without trusting display labels', () => { + expect(activityKind({ mode: 'acting' })).toBe('acting'); + expect(activityKind({ handler: 'proposal-review' })).toBe('reviewing'); + expect(activityKind({ handler: 'capacity-estimate' })).toBe('estimating'); + expect(activityKind({ handler: 'workday-report' })).toBe('reporting'); + expect(activityKind({ mode: 'unknown' })).toBe('planning'); + }); + + it('extends active runs to now and places overlap in deterministic sub-lanes', () => { + const intervals = projectActivityIntervals([ + run('one', 'architect', '2026-08-03T15:50:00.000Z'), + run('two', 'architect', '2026-08-03T15:55:00.000Z', '2026-08-03T15:58:00.000Z'), + ], now); + expect(intervals.find((entry) => entry.id === 'one')).toMatchObject({ end: now, ongoing: true, lane: 0 }); + expect(intervals.find((entry) => entry.id === 'two')?.lane).toBe(1); + }); + + it('filters by intersection and sorts active agents by activity priority', () => { + const intervals = projectActivityIntervals([ + run('plan', 'planner', '2026-08-03T15:55:00.000Z', undefined, { mode: 'planning' }), + run('act', 'executor', '2026-08-03T15:56:00.000Z', undefined, { mode: 'acting' }), + run('old', 'historian', '2026-08-03T14:00:00.000Z', '2026-08-03T14:05:00.000Z'), + ], now); + const visible = visibleActivity(intervals, now - 15 * 60_000, now); + expect(visible.agents).toEqual(['executor', 'planner']); + expect(visible.intervals.map((entry) => entry.id)).not.toContain('old'); + }); + + it('deduplicates durable IDs while retaining refreshed state', () => { + expect(mergeActivityRuns([{ id: 'one', status: 'running' }], [{ id: 'one', status: 'succeeded' }, { id: 'two' }])).toEqual([{ id: 'one', status: 'succeeded' }, { id: 'two' }]); + }); +}); diff --git a/tests/unit/command/situations.test.ts b/tests/unit/command/situations.test.ts new file mode 100644 index 00000000..e4900744 --- /dev/null +++ b/tests/unit/command/situations.test.ts @@ -0,0 +1,31 @@ +import { describe, expect, it } from 'vitest'; +import type { CommandSnapshot } from '../../../src/view-models/command/command-state.ts'; +import { deriveCommandSituations } from '../../../src/view-models/command/situations.ts'; + +const empty = (): CommandSnapshot => ({ workdays: [], assignments: [], executions: [], providers: [], approvals: [], projects: [], inbox: [], reservations: [], ledger: [], decisions: [], unavailable: [] }); + +describe('command situations', () => { + it('derives supported conditions from attributable records', () => { + const snapshot = empty(); + snapshot.workdays = [{ id: 'w', status: 'degraded' }]; + snapshot.executions = [{ id: 'e', status: 'failed', agent: { agentId: 'a' }, assignment: { id: 'x' }, timing: {} }]; + snapshot.assignments = [{ id: 'x', agentId: 'a', leaseState: 'leased', leaseExpiresAt: '2026-08-03T16:02:00.000Z' }]; + snapshot.providers = [{ id: 'p', status: 'closed' }]; + snapshot.approvals = [{ id: 'a', status: 'pending', title: 'Approve release' }]; + snapshot.reservations = [{ id: 'r', overrunStatus: 'requested' }]; + snapshot.inbox = [{ id: 'g', type: 'guarantee', status: 'failed', title: 'Guarantee failed' }]; + snapshot.decisions = [{ id: 'd', status: 'accepted', title: 'Ship it' }]; + snapshot.projects = [{ id: 'p1', name: 'Market', forecastStatus: 'at_risk' }]; + const derived = deriveCommandSituations(snapshot, Date.parse('2026-08-03T16:00:00.000Z')); + for (const id of ['workday:w', 'execution:e', 'lease:x', 'providers:none', 'approval:a', 'budget:r', 'guarantee:g', 'decision:d', 'project:p1']) expect(derived.map((item) => item.id), id).toContain(id); + expect(derived[0].priority).toBeGreaterThanOrEqual(derived.at(-1)!.priority); + expect(derived.find((item) => item.id === 'lease:x')?.inferred).toBe(true); + }); + + it('resolves unsupported conditions and caps the deck at fifteen', () => { + const snapshot = empty(); + snapshot.workdays = Array.from({ length: 20 }, (_, index) => ({ id: String(index), status: 'failed' })); + expect(deriveCommandSituations(snapshot)).toHaveLength(15); + expect(deriveCommandSituations(empty())).toEqual([]); + }); +}); From 68a750af54e2d1521b0bfd8fea04c52bbb49dea0 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Tue, 4 Aug 2026 15:25:00 -0400 Subject: [PATCH 042/315] build(build): stabilize production Guide evidence planning flow Intent: - Save hint: stabilize production Guide evidence planning flow Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.staging.20260804T171053Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#33d84a8c44016021b07a1f40958c19ca7e5f6bda -> github:treeseed-ai/sdk#a06163cdba88542aa8cb5b267e03b05ae60ba618 - dependencies.@treeseed/core: github:treeseed-ai/core#2d40bf1892052983ae61bab6c158d57a9949be34 -> github:treeseed-ai/core#0e576391e8e1f3d0c8a2fa6944c2090c9d5b4ce7 --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index ba8e2b02..ccd2d3ed 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#2d40bf1892052983ae61bab6c158d57a9949be34", - "@treeseed/sdk": "github:treeseed-ai/sdk#33d84a8c44016021b07a1f40958c19ca7e5f6bda", + "@treeseed/core": "github:treeseed-ai/core#0e576391e8e1f3d0c8a2fa6944c2090c9d5b4ce7", + "@treeseed/sdk": "github:treeseed-ai/sdk#a06163cdba88542aa8cb5b267e03b05ae60ba618", "@treeseed/ui": "github:treeseed-ai/ui#6f00de67d222559172d042bc4fbc66ebcd10b474", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -6932,7 +6932,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.staging.20260804T171000Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#2d40bf1892052983ae61bab6c158d57a9949be34", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#0e576391e8e1f3d0c8a2fa6944c2090c9d5b4ce7", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6943,7 +6943,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#33d84a8c44016021b07a1f40958c19ca7e5f6bda", + "@treeseed/sdk": "github:treeseed-ai/sdk#a06163cdba88542aa8cb5b267e03b05ae60ba618", "@treeseed/ui": "github:treeseed-ai/ui#6f00de67d222559172d042bc4fbc66ebcd10b474", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8948,7 +8948,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.staging.20260804T170912Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#33d84a8c44016021b07a1f40958c19ca7e5f6bda", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#a06163cdba88542aa8cb5b267e03b05ae60ba618", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index d25c5e26..61a340ec 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#2d40bf1892052983ae61bab6c158d57a9949be34", - "@treeseed/sdk": "github:treeseed-ai/sdk#33d84a8c44016021b07a1f40958c19ca7e5f6bda", + "@treeseed/core": "github:treeseed-ai/core#0e576391e8e1f3d0c8a2fa6944c2090c9d5b4ce7", + "@treeseed/sdk": "github:treeseed-ai/sdk#a06163cdba88542aa8cb5b267e03b05ae60ba618", "@treeseed/ui": "github:treeseed-ai/ui#6f00de67d222559172d042bc4fbc66ebcd10b474", "react": "^19.2.5", "react-dom": "^19.2.6" From 81c2f25a9a0625eca23d640608ddce0dd5f64abd Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Tue, 4 Aug 2026 16:32:16 -0400 Subject: [PATCH 043/315] chore(deps): update @treeseed/core and @treeseed/sdk pointers Changes: - Update package.json and package-lock.json Dependency and pointer updates: - @treeseed/sdk: github:treeseed-ai/sdk#a06163cdba88542aa8cb5b267e03b05ae60ba618 -> github:treeseed-ai/sdk#2ab22531cb6e909a173846623f63770025cea64b - @treeseed/core: github:treeseed-ai/core#0e576391e8e1f3d0c8a2fa6944c2090c9d5b4ce7 -> github:treeseed-ai/core#bae09eced04f5231236e5612c69528d0010d4a5b --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index ccd2d3ed..771dded1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#0e576391e8e1f3d0c8a2fa6944c2090c9d5b4ce7", - "@treeseed/sdk": "github:treeseed-ai/sdk#a06163cdba88542aa8cb5b267e03b05ae60ba618", + "@treeseed/core": "github:treeseed-ai/core#bae09eced04f5231236e5612c69528d0010d4a5b", + "@treeseed/sdk": "github:treeseed-ai/sdk#2ab22531cb6e909a173846623f63770025cea64b", "@treeseed/ui": "github:treeseed-ai/ui#6f00de67d222559172d042bc4fbc66ebcd10b474", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -6932,7 +6932,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.staging.20260804T171000Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#0e576391e8e1f3d0c8a2fa6944c2090c9d5b4ce7", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#bae09eced04f5231236e5612c69528d0010d4a5b", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6943,7 +6943,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#a06163cdba88542aa8cb5b267e03b05ae60ba618", + "@treeseed/sdk": "github:treeseed-ai/sdk#2ab22531cb6e909a173846623f63770025cea64b", "@treeseed/ui": "github:treeseed-ai/ui#6f00de67d222559172d042bc4fbc66ebcd10b474", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8948,7 +8948,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.staging.20260804T170912Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#a06163cdba88542aa8cb5b267e03b05ae60ba618", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#2ab22531cb6e909a173846623f63770025cea64b", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index 61a340ec..1389cf01 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#0e576391e8e1f3d0c8a2fa6944c2090c9d5b4ce7", - "@treeseed/sdk": "github:treeseed-ai/sdk#a06163cdba88542aa8cb5b267e03b05ae60ba618", + "@treeseed/core": "github:treeseed-ai/core#bae09eced04f5231236e5612c69528d0010d4a5b", + "@treeseed/sdk": "github:treeseed-ai/sdk#2ab22531cb6e909a173846623f63770025cea64b", "@treeseed/ui": "github:treeseed-ai/ui#6f00de67d222559172d042bc4fbc66ebcd10b474", "react": "^19.2.5", "react-dom": "^19.2.6" From 4212479e13bd1049ac2c5c6776aec7e65deab8ba Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Tue, 4 Aug 2026 17:56:39 -0400 Subject: [PATCH 044/315] chore(deps): update @treeseed/sdk and @treeseed/core dependency pointers Changes: - Update package.json and package-lock.json Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#2ab22531cb6e909a173846623f63770025cea64b -> github:treeseed-ai/sdk#2c354ea8028f607173bc5c7fcc4ef4fae7a0c28a - dependencies.@treeseed/core: github:treeseed-ai/core#bae09eced04f5231236e5612c69528d0010d4a5b -> github:treeseed-ai/core#80beba1d3e9207838a9522fa79fdb219fc99856f --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 771dded1..9da7e092 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#bae09eced04f5231236e5612c69528d0010d4a5b", - "@treeseed/sdk": "github:treeseed-ai/sdk#2ab22531cb6e909a173846623f63770025cea64b", + "@treeseed/core": "github:treeseed-ai/core#80beba1d3e9207838a9522fa79fdb219fc99856f", + "@treeseed/sdk": "github:treeseed-ai/sdk#2c354ea8028f607173bc5c7fcc4ef4fae7a0c28a", "@treeseed/ui": "github:treeseed-ai/ui#6f00de67d222559172d042bc4fbc66ebcd10b474", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -6932,7 +6932,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.staging.20260804T171000Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#bae09eced04f5231236e5612c69528d0010d4a5b", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#80beba1d3e9207838a9522fa79fdb219fc99856f", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6943,7 +6943,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#2ab22531cb6e909a173846623f63770025cea64b", + "@treeseed/sdk": "github:treeseed-ai/sdk#2c354ea8028f607173bc5c7fcc4ef4fae7a0c28a", "@treeseed/ui": "github:treeseed-ai/ui#6f00de67d222559172d042bc4fbc66ebcd10b474", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8948,7 +8948,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.staging.20260804T170912Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#2ab22531cb6e909a173846623f63770025cea64b", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#2c354ea8028f607173bc5c7fcc4ef4fae7a0c28a", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index 1389cf01..495ca570 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#bae09eced04f5231236e5612c69528d0010d4a5b", - "@treeseed/sdk": "github:treeseed-ai/sdk#2ab22531cb6e909a173846623f63770025cea64b", + "@treeseed/core": "github:treeseed-ai/core#80beba1d3e9207838a9522fa79fdb219fc99856f", + "@treeseed/sdk": "github:treeseed-ai/sdk#2c354ea8028f607173bc5c7fcc4ef4fae7a0c28a", "@treeseed/ui": "github:treeseed-ai/ui#6f00de67d222559172d042bc4fbc66ebcd10b474", "react": "^19.2.5", "react-dom": "^19.2.6" From 57ec19875ebe605d0e3d9d8b2281435d0e55926f Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Tue, 4 Aug 2026 19:35:48 -0400 Subject: [PATCH 045/315] ci(build): separate content publication and stabilize agent completion Intent: - Save hint: separate content publication and stabilize agent completion Changes: - Updates 3 files across build: 2, ci: 1. - Touches .github/workflows/verify.yml, package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.staging.20260804T171053Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/ui: github:treeseed-ai/ui#6f00de67d222559172d042bc4fbc66ebcd10b474 -> github:treeseed-ai/ui#e4c7a0896fa6d49b183d2729150eb598084c6c35 - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#2c354ea8028f607173bc5c7fcc4ef4fae7a0c28a -> github:treeseed-ai/sdk#14e1ca53943c5b4158e661ab36b4b60f3c6a7a34 - dependencies.@treeseed/core: github:treeseed-ai/core#80beba1d3e9207838a9522fa79fdb219fc99856f -> github:treeseed-ai/core#0d4e21ea91234db7a7cfe0c318baca520d69c341 --- .github/workflows/verify.yml | 2 ++ package-lock.json | 16 ++++++++-------- package.json | 6 +++--- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/.github/workflows/verify.yml b/.github/workflows/verify.yml index 9c2357d1..a177205d 100644 --- a/.github/workflows/verify.yml +++ b/.github/workflows/verify.yml @@ -4,7 +4,9 @@ on: push: branches: - '**' + paths-ignore: ["docs/src/content/**"] pull_request: + paths-ignore: ["docs/src/content/**"] workflow_dispatch: jobs: diff --git a/package-lock.json b/package-lock.json index 9da7e092..9c74ef31 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,9 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#80beba1d3e9207838a9522fa79fdb219fc99856f", - "@treeseed/sdk": "github:treeseed-ai/sdk#2c354ea8028f607173bc5c7fcc4ef4fae7a0c28a", - "@treeseed/ui": "github:treeseed-ai/ui#6f00de67d222559172d042bc4fbc66ebcd10b474", + "@treeseed/core": "github:treeseed-ai/core#0d4e21ea91234db7a7cfe0c318baca520d69c341", + "@treeseed/sdk": "github:treeseed-ai/sdk#14e1ca53943c5b4158e661ab36b4b60f3c6a7a34", + "@treeseed/ui": "github:treeseed-ai/ui#e4c7a0896fa6d49b183d2729150eb598084c6c35", "react": "^19.2.5", "react-dom": "^19.2.6" }, @@ -6932,7 +6932,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.staging.20260804T171000Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#80beba1d3e9207838a9522fa79fdb219fc99856f", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#0d4e21ea91234db7a7cfe0c318baca520d69c341", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6943,8 +6943,8 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#2c354ea8028f607173bc5c7fcc4ef4fae7a0c28a", - "@treeseed/ui": "github:treeseed-ai/ui#6f00de67d222559172d042bc4fbc66ebcd10b474", + "@treeseed/sdk": "github:treeseed-ai/sdk#14e1ca53943c5b4158e661ab36b4b60f3c6a7a34", + "@treeseed/ui": "github:treeseed-ai/ui#e4c7a0896fa6d49b183d2729150eb598084c6c35", "astro": "^5.6.1", "esbuild": "^0.28.0", "katex": "^0.16.22", @@ -8948,7 +8948,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.staging.20260804T170912Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#2c354ea8028f607173bc5c7fcc4ef4fae7a0c28a", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#14e1ca53943c5b4158e661ab36b4b60f3c6a7a34", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", @@ -9645,7 +9645,7 @@ }, "node_modules/@treeseed/ui": { "version": "0.12.18-dev.staging.20260804T170811Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#6f00de67d222559172d042bc4fbc66ebcd10b474", + "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#e4c7a0896fa6d49b183d2729150eb598084c6c35", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", diff --git a/package.json b/package.json index 495ca570..4b81e519 100644 --- a/package.json +++ b/package.json @@ -49,9 +49,9 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#80beba1d3e9207838a9522fa79fdb219fc99856f", - "@treeseed/sdk": "github:treeseed-ai/sdk#2c354ea8028f607173bc5c7fcc4ef4fae7a0c28a", - "@treeseed/ui": "github:treeseed-ai/ui#6f00de67d222559172d042bc4fbc66ebcd10b474", + "@treeseed/core": "github:treeseed-ai/core#0d4e21ea91234db7a7cfe0c318baca520d69c341", + "@treeseed/sdk": "github:treeseed-ai/sdk#14e1ca53943c5b4158e661ab36b4b60f3c6a7a34", + "@treeseed/ui": "github:treeseed-ai/ui#e4c7a0896fa6d49b183d2729150eb598084c6c35", "react": "^19.2.5", "react-dom": "^19.2.6" }, From a7cf6ec7971a290ab76aa26a44bdf44695fda1a5 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Tue, 4 Aug 2026 20:19:44 -0400 Subject: [PATCH 046/315] build(admin): update core and sdk dependency pointers Intent: - Enforce proposal evidence contracts Changes: - Update package.json and package-lock.json Dependency and pointer updates: - @treeseed/sdk: github:treeseed-ai/sdk#14e1ca53943c5b4158e661ab36b4b60f3c6a7a34 -> github:treeseed-ai/sdk#7a2d6c421e1d894d15c508a21184d6893b9ba17e - @treeseed/core: github:treeseed-ai/core#0d4e21ea91234db7a7cfe0c318baca520d69c341 -> github:treeseed-ai/core#5afb928d1f345e4d3d36482bf54ffd75eabe22f6 --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9c74ef31..c14b71dd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#0d4e21ea91234db7a7cfe0c318baca520d69c341", - "@treeseed/sdk": "github:treeseed-ai/sdk#14e1ca53943c5b4158e661ab36b4b60f3c6a7a34", + "@treeseed/core": "github:treeseed-ai/core#5afb928d1f345e4d3d36482bf54ffd75eabe22f6", + "@treeseed/sdk": "github:treeseed-ai/sdk#7a2d6c421e1d894d15c508a21184d6893b9ba17e", "@treeseed/ui": "github:treeseed-ai/ui#e4c7a0896fa6d49b183d2729150eb598084c6c35", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -6932,7 +6932,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.staging.20260804T171000Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#0d4e21ea91234db7a7cfe0c318baca520d69c341", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#5afb928d1f345e4d3d36482bf54ffd75eabe22f6", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6943,7 +6943,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#14e1ca53943c5b4158e661ab36b4b60f3c6a7a34", + "@treeseed/sdk": "github:treeseed-ai/sdk#7a2d6c421e1d894d15c508a21184d6893b9ba17e", "@treeseed/ui": "github:treeseed-ai/ui#e4c7a0896fa6d49b183d2729150eb598084c6c35", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8948,7 +8948,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.staging.20260804T170912Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#14e1ca53943c5b4158e661ab36b4b60f3c6a7a34", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#7a2d6c421e1d894d15c508a21184d6893b9ba17e", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index 4b81e519..71120635 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#0d4e21ea91234db7a7cfe0c318baca520d69c341", - "@treeseed/sdk": "github:treeseed-ai/sdk#14e1ca53943c5b4158e661ab36b4b60f3c6a7a34", + "@treeseed/core": "github:treeseed-ai/core#5afb928d1f345e4d3d36482bf54ffd75eabe22f6", + "@treeseed/sdk": "github:treeseed-ai/sdk#7a2d6c421e1d894d15c508a21184d6893b9ba17e", "@treeseed/ui": "github:treeseed-ai/ui#e4c7a0896fa6d49b183d2729150eb598084c6c35", "react": "^19.2.5", "react-dom": "^19.2.6" From 3f971173717e2a10816401346d9156779e9bae90 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Wed, 5 Aug 2026 03:59:16 -0400 Subject: [PATCH 047/315] build(build): modernize TreeDX performance and production monitoring Intent: - Save hint: modernize TreeDX performance and production monitoring Changes: - Updates 4 files across build: 2, source: 1, tests: 1. - Touches package-lock.json, package.json, src/middleware.ts, tests/contract/public-profiles/public-knowledge-profiles.test.ts. - Plans package version/tag 0.12.59-dev.treedx-perf.20260805T075847Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#14e1ca53943c5b4158e661ab36b4b60f3c6a7a34 -> github:treeseed-ai/sdk#c45edd1983938b429f4bbec1c974523327faad74 - dependencies.@treeseed/core: github:treeseed-ai/core#0d4e21ea91234db7a7cfe0c318baca520d69c341 -> github:treeseed-ai/core#d8377422beb43ab74c332c0a8c03a59ffaaa6cfb --- package-lock.json | 18 +++++++++--------- package.json | 6 +++--- src/middleware.ts | 2 -- .../public-knowledge-profiles.test.ts | 7 +++++++ 4 files changed, 19 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9c74ef31..6add4ca4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,17 +1,17 @@ { "name": "@treeseed/admin", - "version": "0.12.59-dev.staging.20260804T171053Z", + "version": "0.12.59-dev.treedx-perf.20260805T075847Z", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@treeseed/admin", - "version": "0.12.59-dev.staging.20260804T171053Z", + "version": "0.12.59-dev.treedx-perf.20260805T075847Z", "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#0d4e21ea91234db7a7cfe0c318baca520d69c341", - "@treeseed/sdk": "github:treeseed-ai/sdk#14e1ca53943c5b4158e661ab36b4b60f3c6a7a34", + "@treeseed/core": "github:treeseed-ai/core#d8377422beb43ab74c332c0a8c03a59ffaaa6cfb", + "@treeseed/sdk": "github:treeseed-ai/sdk#c45edd1983938b429f4bbec1c974523327faad74", "@treeseed/ui": "github:treeseed-ai/ui#e4c7a0896fa6d49b183d2729150eb598084c6c35", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -6931,8 +6931,8 @@ } }, "node_modules/@treeseed/core": { - "version": "0.12.60-dev.staging.20260804T171000Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#0d4e21ea91234db7a7cfe0c318baca520d69c341", + "version": "0.12.60-dev.treedx-perf.20260805T075816Z", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#d8377422beb43ab74c332c0a8c03a59ffaaa6cfb", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6943,7 +6943,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#14e1ca53943c5b4158e661ab36b4b60f3c6a7a34", + "@treeseed/sdk": "github:treeseed-ai/sdk#c45edd1983938b429f4bbec1c974523327faad74", "@treeseed/ui": "github:treeseed-ai/ui#e4c7a0896fa6d49b183d2729150eb598084c6c35", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8947,8 +8947,8 @@ } }, "node_modules/@treeseed/sdk": { - "version": "0.12.63-dev.staging.20260804T170912Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#14e1ca53943c5b4158e661ab36b4b60f3c6a7a34", + "version": "0.12.63-dev.treedx-perf.20260805T073639Z", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#c45edd1983938b429f4bbec1c974523327faad74", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index 4b81e519..68431a00 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@treeseed/admin", - "version": "0.12.59-dev.staging.20260804T171053Z", + "version": "0.12.59-dev.treedx-perf.20260805T075847Z", "description": "Treeseed administration portal framework built on @treeseed/core and @treeseed/ui.", "license": "AGPL-3.0-only", "repository": { @@ -49,8 +49,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#0d4e21ea91234db7a7cfe0c318baca520d69c341", - "@treeseed/sdk": "github:treeseed-ai/sdk#14e1ca53943c5b4158e661ab36b4b60f3c6a7a34", + "@treeseed/core": "github:treeseed-ai/core#d8377422beb43ab74c332c0a8c03a59ffaaa6cfb", + "@treeseed/sdk": "github:treeseed-ai/sdk#c45edd1983938b429f4bbec1c974523327faad74", "@treeseed/ui": "github:treeseed-ai/ui#e4c7a0896fa6d49b183d2729150eb598084c6c35", "react": "^19.2.5", "react-dom": "^19.2.6" diff --git a/src/middleware.ts b/src/middleware.ts index 521fd73e..e5f16d6f 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -3,7 +3,6 @@ import { resolveEditorialPreview } from '@treeseed/core/middleware/editorial-pre import { getSiteAuthConfig, localAuthCanonicalRedirectUrl } from './lib/auth/configuration/config'; import { apiAccessTokenFromCookies, clearApiAccessTokenCookie, resolveApiBaseUrl } from './lib/market/api-client'; import { ensureLocalCloudflareRuntime } from './lib/runtime/local-cloudflare'; -import { ensureCsrfToken } from './lib/auth/support/csrf'; import { authenticatedAuthRedirect } from './lib/auth/support/access-policy'; const DEV_RESET_COOKIE = 'ts_market_dev_reset'; @@ -126,7 +125,6 @@ async function loadApiBackedWebSession(context: any) { export const onRequest = defineMiddleware(async (context, next) => { await ensureLocalCloudflareRuntime(context.locals); - ensureCsrfToken(context); const config = getSiteAuthConfig(context); const resetCookieBoundary = applyLocalDevResetCookieBoundary(context); const canonicalLocalUrl = localAuthCanonicalRedirectUrl(context.url, config.siteBaseUrl); diff --git a/tests/contract/public-profiles/public-knowledge-profiles.test.ts b/tests/contract/public-profiles/public-knowledge-profiles.test.ts index a0c64014..e192c0d7 100644 --- a/tests/contract/public-profiles/public-knowledge-profiles.test.ts +++ b/tests/contract/public-profiles/public-knowledge-profiles.test.ts @@ -54,6 +54,13 @@ describe('public knowledge profile composition', () => { expect(layout).toContain('showFooter={!profilePage}'); }); + it('keeps anonymous public responses eligible for shared edge caching', () => { + const middleware = source('src/middleware.ts'); + expect(middleware).not.toContain("import { ensureCsrfToken }"); + expect(middleware).not.toContain('ensureCsrfToken(context)'); + expect(source('src/layouts/AppLayout.astro')).toContain('ensureCsrfToken(Astro)'); + }); + it('shows canonical management tabs only for the owning account or a team member', () => { const user = source('src/pages/u/[username].astro'); const team = source('src/pages/t/[name].astro'); From 0ee38a9e504d0bbda799f4e3842a5f8ca44d762f Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Wed, 5 Aug 2026 07:55:24 -0400 Subject: [PATCH 048/315] build(ui): sync package dependency references Changes: - Updates 20 files across ui: 14, source: 4, build: 2. - Touches package-lock.json, package.json, src/components/agent-lab/AgentLabCommandPage.astro, src/components/agent-lab/AgentLabEntityPage.astro, src/layouts/AppLayout.astro, src/pages/app/command/agents/index.astro, .... - Plans package version/tag 0.12.59-dev.staging.20260804T171053Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/ui: github:treeseed-ai/ui#e4c7a0896fa6d49b183d2729150eb598084c6c35 -> github:treeseed-ai/ui#15fffd6d8ef3aefe8d15f337838242f07c1d83af - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#7a2d6c421e1d894d15c508a21184d6893b9ba17e -> github:treeseed-ai/sdk#6f73e58d221f70f2067f52e3f35bfb6f7c19e2b5 - dependencies.@treeseed/core: github:treeseed-ai/core#5afb928d1f345e4d3d36482bf54ffd75eabe22f6 -> github:treeseed-ai/core#68273002ed5b87ab0d1b0cc74af1149adc05aa9d --- package-lock.json | 16 ++--- package.json | 6 +- .../agent-lab/AgentLabCommandPage.astro | 2 +- .../agent-lab/AgentLabEntityPage.astro | 2 +- src/layouts/AppLayout.astro | 3 +- src/pages/app/command/agents/index.astro | 20 +----- .../command/assignments/[assignmentId].astro | 35 ++--------- src/pages/app/command/index.astro | 40 +----------- src/pages/app/focus/decisions.astro | 25 +------- src/pages/app/focus/index.astro | 50 +-------------- .../app/focus/proposals/[proposalId].astro | 62 +------------------ src/pages/app/focus/proposals/index.astro | 37 +---------- src/pages/app/focus/questions.astro | 38 +----------- src/pages/app/index.astro | 5 +- src/pages/app/teams/[teamId]/index.astro | 3 +- src/pages/app/work/[runId].astro | 2 +- src/pages/app/work/index.astro | 2 +- src/pages/app/work/workdays.astro | 2 +- src/view-models/agent-lab/agent-lab-frame.ts | 2 +- src/view-models/agent-lab/command-page.ts | 2 +- 20 files changed, 37 insertions(+), 317 deletions(-) diff --git a/package-lock.json b/package-lock.json index c14b71dd..679e6b5c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,9 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#5afb928d1f345e4d3d36482bf54ffd75eabe22f6", - "@treeseed/sdk": "github:treeseed-ai/sdk#7a2d6c421e1d894d15c508a21184d6893b9ba17e", - "@treeseed/ui": "github:treeseed-ai/ui#e4c7a0896fa6d49b183d2729150eb598084c6c35", + "@treeseed/core": "github:treeseed-ai/core#68273002ed5b87ab0d1b0cc74af1149adc05aa9d", + "@treeseed/sdk": "github:treeseed-ai/sdk#6f73e58d221f70f2067f52e3f35bfb6f7c19e2b5", + "@treeseed/ui": "github:treeseed-ai/ui#15fffd6d8ef3aefe8d15f337838242f07c1d83af", "react": "^19.2.5", "react-dom": "^19.2.6" }, @@ -6932,7 +6932,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.staging.20260804T171000Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#5afb928d1f345e4d3d36482bf54ffd75eabe22f6", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#68273002ed5b87ab0d1b0cc74af1149adc05aa9d", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6943,8 +6943,8 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#7a2d6c421e1d894d15c508a21184d6893b9ba17e", - "@treeseed/ui": "github:treeseed-ai/ui#e4c7a0896fa6d49b183d2729150eb598084c6c35", + "@treeseed/sdk": "github:treeseed-ai/sdk#6f73e58d221f70f2067f52e3f35bfb6f7c19e2b5", + "@treeseed/ui": "github:treeseed-ai/ui#15fffd6d8ef3aefe8d15f337838242f07c1d83af", "astro": "^5.6.1", "esbuild": "^0.28.0", "katex": "^0.16.22", @@ -8948,7 +8948,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.staging.20260804T170912Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#7a2d6c421e1d894d15c508a21184d6893b9ba17e", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#6f73e58d221f70f2067f52e3f35bfb6f7c19e2b5", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", @@ -9645,7 +9645,7 @@ }, "node_modules/@treeseed/ui": { "version": "0.12.18-dev.staging.20260804T170811Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#e4c7a0896fa6d49b183d2729150eb598084c6c35", + "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#15fffd6d8ef3aefe8d15f337838242f07c1d83af", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", diff --git a/package.json b/package.json index 71120635..6fd90f9e 100644 --- a/package.json +++ b/package.json @@ -49,9 +49,9 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#5afb928d1f345e4d3d36482bf54ffd75eabe22f6", - "@treeseed/sdk": "github:treeseed-ai/sdk#7a2d6c421e1d894d15c508a21184d6893b9ba17e", - "@treeseed/ui": "github:treeseed-ai/ui#e4c7a0896fa6d49b183d2729150eb598084c6c35", + "@treeseed/core": "github:treeseed-ai/core#68273002ed5b87ab0d1b0cc74af1149adc05aa9d", + "@treeseed/sdk": "github:treeseed-ai/sdk#6f73e58d221f70f2067f52e3f35bfb6f7c19e2b5", + "@treeseed/ui": "github:treeseed-ai/ui#15fffd6d8ef3aefe8d15f337838242f07c1d83af", "react": "^19.2.5", "react-dom": "^19.2.6" }, diff --git a/src/components/agent-lab/AgentLabCommandPage.astro b/src/components/agent-lab/AgentLabCommandPage.astro index cc76da00..4aecbefd 100644 --- a/src/components/agent-lab/AgentLabCommandPage.astro +++ b/src/components/agent-lab/AgentLabCommandPage.astro @@ -7,7 +7,7 @@ import AgentLabChrome from './AgentLabChrome.astro'; interface Props extends Awaited> { current: AgentLabCommandSurface } const { app, preferences, frame, surface, endpoints, query, current } = Astro.props as Props; --- - +
{frame && endpoints ? <> : }
diff --git a/src/components/agent-lab/AgentLabEntityPage.astro b/src/components/agent-lab/AgentLabEntityPage.astro index d78dae94..7ebc6ca2 100644 --- a/src/components/agent-lab/AgentLabEntityPage.astro +++ b/src/components/agent-lab/AgentLabEntityPage.astro @@ -8,7 +8,7 @@ import type { loadAgentLabEntityPage } from '../../view-models/agent-lab/entity- interface Props { frame: Awaited>; label: string; description: string; } const { frame, label, description } = Astro.props as Props; --- - +
{frame.monitor ? : null} {!frame.app.activeTeam ? : diff --git a/src/layouts/AppLayout.astro b/src/layouts/AppLayout.astro index cd86b334..fcb3b4a7 100644 --- a/src/layouts/AppLayout.astro +++ b/src/layouts/AppLayout.astro @@ -109,8 +109,7 @@ const feedbackContext = principal ? { }} navItems={[ { label: 'Start', href: '/app/', icon: 'start' }, - { label: 'Command', href: '/app/command', icon: 'capacity' }, - { label: 'Focus', href: '/app/focus', icon: 'work' }, + { label: 'Agent Lab', href: '/app/work', icon: 'capacity' }, ...(canReadFeedback ? [{ label: 'Feedback', href: '/app/feedback', icon: 'feedback' as const }] : []), { label: 'Projects', href: '/app/projects', icon: 'projects' }, { label: 'Services', href: '/app/services', icon: 'services' }, diff --git a/src/pages/app/command/agents/index.astro b/src/pages/app/command/agents/index.astro index feb50ce1..deab696c 100644 --- a/src/pages/app/command/agents/index.astro +++ b/src/pages/app/command/agents/index.astro @@ -1,21 +1,3 @@ --- -import Button from '@treeseed/ui/components/astro/forms/actions/Button.astro'; -import PageHeader from '@treeseed/ui/components/astro/layout/PageHeader.astro'; -import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; -import Panel from '@treeseed/ui/components/astro/surface/Panel.astro'; -import ResourceCard from '@treeseed/ui/components/astro/surface/ResourceCard.astro'; -import ModeNavigation from '../../../../components/modes/ModeNavigation.astro'; -import TreeseedAppLayout from '../../../../layouts/AppLayout.astro'; -import { ApiClientFacade } from '../../../../lib/market/api-client.ts'; -import { items, statusTone, text } from '../../../../lib/operations/records.ts'; -import { loadAppContext } from '../../../../view-models/app-access.ts'; - -if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); -const context = await loadAppContext(Astro); const api = new ApiClientFacade(Astro); const projects = context.activeTeam ? items(await api.listTeamProjects(context.activeTeam.id).catch(() => [])) : []; -const rosters = await Promise.all(projects.slice(0, 30).map(async (project) => ({ project, classes: items(await api.request('GET', `/v1/projects/${encodeURIComponent(String(project.id))}/agent-classes?limit=100`).catch(() => null)), runs: items(await api.request('GET', `/v1/projects/${encodeURIComponent(String(project.id))}/agent-mode-runs?projection=activity&limit=100`).catch(() => null)) }))); +return Astro.redirect(`/app/work/build${Astro.url.search}`, 308); --- - -
- {!context.activeTeam ? : !rosters.length ? : rosters.map(({ project, classes, runs }) =>
{classes.map((agent) => { const recent = runs.find((run) => String(run.agentClassId ?? run.agent_class_id) === String(agent.id)); return ; })}
)} -
-
diff --git a/src/pages/app/command/assignments/[assignmentId].astro b/src/pages/app/command/assignments/[assignmentId].astro index 6a7a17e8..ff73f9e5 100644 --- a/src/pages/app/command/assignments/[assignmentId].astro +++ b/src/pages/app/command/assignments/[assignmentId].astro @@ -1,33 +1,6 @@ --- -import Button from '@treeseed/ui/components/astro/forms/actions/Button.astro'; -import KeyValueList from '@treeseed/ui/components/astro/data/KeyValueList.astro'; -import Timestamp from '@treeseed/ui/components/astro/data/Timestamp.astro'; -import PageHeader from '@treeseed/ui/components/astro/layout/PageHeader.astro'; -import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; -import Panel from '@treeseed/ui/components/astro/surface/Panel.astro'; -import ModeNavigation from '../../../../components/modes/ModeNavigation.astro'; -import TreeseedAppLayout from '../../../../layouts/AppLayout.astro'; -import { ensureCsrfToken } from '../../../../lib/auth/support/csrf.ts'; -import { ApiClientFacade } from '../../../../lib/market/api-client.ts'; -import { dateValue, items, record, safeReturnTo, text } from '../../../../lib/operations/records.ts'; -import { loadAppContext } from '../../../../view-models/app-access.ts'; - -if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); -const assignmentId = String(Astro.params.assignmentId ?? ''); const context = await loadAppContext(Astro); const api = new ApiClientFacade(Astro); const team = context.activeTeam; -const base = team ? `/v1/teams/${encodeURIComponent(team.id)}/capacity/assignments/${encodeURIComponent(assignmentId)}` : ''; -const [assignmentData, explanationData, runsData, preferences, access] = await Promise.all([team ? api.request('GET', base).catch(() => null) : null, team ? api.request('GET', `${base}/explanation`).catch(() => null) : null, team ? api.request('GET', `/v1/teams/${encodeURIComponent(team.id)}/capacity/execution-runs?assignmentId=${encodeURIComponent(assignmentId)}&limit=100`).catch(() => null) : null, api.accountPreferences().catch(() => ({ timeZone: 'UTC' })), team ? api.getTeamAccessSummary(team.id).catch(() => null) : null]); -const assignment = record(assignmentData); const explanation = record(explanationData); const runs = items(runsData); const csrfToken = ensureCsrfToken(Astro); const returnTo = safeReturnTo(Astro.url.searchParams.get('returnTo'), '/app/command'); -if (team && !assignment.id) Astro.response.status = 404; -const cancelEligible = ['queued', 'leased', 'assigned', 'active'].includes(String(assignment.status ?? assignment.leaseState ?? '')); -const requeueEligible = ['failed', 'cancelled', 'expired', 'returned'].includes(String(assignment.status ?? assignment.leaseState ?? '')); -const canManage = Boolean((access?.roles ?? access?.access?.roles ?? []).some((role: string) => ['team_owner', 'project_lead'].includes(role))); +const encoded = Buffer.from(String(Astro.params.assignmentId ?? '')).toString('base64url'); +const query = new URLSearchParams(Astro.url.searchParams); +query.append('inspect', `assignment~${encoded}`); +return Astro.redirect(`/app/work/direction?${query}`, 308); --- - -
{assignment.projectId || assignment.project_id ? : null} - {!team ? : !assignment.id ? : <> -
{dateValue(assignment.leaseExpiresAt, assignment.lease_expires_at) ?

Lease expires

: null}
{JSON.stringify(explanation, null, 2)}
- {runs.map((run) =>
{text(run.mode, run.handler, 'Mode run')} · {String(run.status ?? 'unknown')}{run.id ? : null}
)}
- {canManage && (cancelEligible || requeueEligible) ? {cancelEligible ?
: null}{requeueEligible ?
: null}
: null} - } -
-
diff --git a/src/pages/app/command/index.astro b/src/pages/app/command/index.astro index f3285afe..84b322bd 100644 --- a/src/pages/app/command/index.astro +++ b/src/pages/app/command/index.astro @@ -1,41 +1,3 @@ --- -import Button from '@treeseed/ui/components/astro/forms/actions/Button.astro'; -import MetricCard from '@treeseed/ui/components/astro/data/metrics/MetricCard.astro'; -import MetricGrid from '@treeseed/ui/components/astro/data/metrics/MetricGrid.astro'; -import PageHeader from '@treeseed/ui/components/astro/layout/PageHeader.astro'; -import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; -import Panel from '@treeseed/ui/components/astro/surface/Panel.astro'; -import ResourceCard from '@treeseed/ui/components/astro/surface/ResourceCard.astro'; -import { LiveAgentActivityGantt } from '@treeseed/ui/components/react/OperationsMonitor'; -import SituationDeck from '../../../components/command/SituationDeck.astro'; -import ModeNavigation from '../../../components/modes/ModeNavigation.astro'; -import TreeseedAppLayout from '../../../layouts/AppLayout.astro'; -import { ApiClientFacade } from '../../../lib/market/api-client.ts'; -import { statusTone, text } from '../../../lib/operations/records.ts'; -import { loadAppContext } from '../../../view-models/app-access.ts'; -import { activeWorkday, loadCommandSnapshot } from '../../../view-models/command/command-state.ts'; -import { deriveCommandSituations } from '../../../view-models/command/situations.ts'; -import { loadAgentLabFrame } from '../../../view-models/agent-lab/agent-lab-frame.ts'; - -if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); -const context = await loadAppContext(Astro); const api = new ApiClientFacade(Astro); -const [snapshot, preferences] = await Promise.all([context.activeTeam ? loadCommandSnapshot(api, context.activeTeam.id) : null, api.accountPreferences().catch(() => ({ timeZone: 'UTC', realTimeUpdates: true, realTimePollingIntervalSeconds: 5 as const }))]); -const monitor = context.activeTeam ? await loadAgentLabFrame(api, context.activeTeam, preferences) : null; -const workday = snapshot ? activeWorkday(snapshot) : null; const situations = snapshot ? deriveCommandSituations(snapshot) : []; -const activeAssignments = snapshot?.assignments.filter((item) => ['queued', 'leased', 'running', 'active'].includes(String(item.status ?? item.leaseState ?? ''))) ?? []; +return Astro.redirect(`/app/work/direction${Astro.url.search}`, 308); --- - -
- - - {!context.activeTeam ? : snapshot ? <> - ['active', 'open', 'ready'].includes(String(item.status))).length} description="Reporting current availability" href="/app/capacity" /> - - - {monitor ? 0} start={monitor.overview.operatingDay.start} end={monitor.overview.operatingDay.end} timeZone={preferences.timeZone} /> : null} - -
{activeAssignments.slice(0, 5).map((item) => )}
- {snapshot.unavailable.length ?

Some live sources are unavailable: {snapshot.unavailable.join(', ')}. The server snapshot remains visible.

: null} - : null} -
-
diff --git a/src/pages/app/focus/decisions.astro b/src/pages/app/focus/decisions.astro index c3e6f2ac..448b27d3 100644 --- a/src/pages/app/focus/decisions.astro +++ b/src/pages/app/focus/decisions.astro @@ -1,26 +1,3 @@ --- -import Button from '@treeseed/ui/components/astro/forms/actions/Button.astro'; -import Timestamp from '@treeseed/ui/components/astro/data/Timestamp.astro'; -import PageHeader from '@treeseed/ui/components/astro/layout/PageHeader.astro'; -import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; -import ResourceCard from '@treeseed/ui/components/astro/surface/ResourceCard.astro'; -import ModeNavigation from '../../../components/modes/ModeNavigation.astro'; -import TreeseedAppLayout from '../../../layouts/AppLayout.astro'; -import { ApiClientFacade } from '../../../lib/market/api-client.ts'; -import { dateValue, statusTone, text } from '../../../lib/operations/records.ts'; -import { loadAppContext } from '../../../view-models/app-access.ts'; -import { loadFocusSnapshot } from '../../../view-models/focus/focus-state.ts'; - -if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); -const context = await loadAppContext(Astro); const api = new ApiClientFacade(Astro); -const [snapshot, preferences] = await Promise.all([context.activeTeam ? loadFocusSnapshot(api, context.activeTeam.id) : null, api.accountPreferences().catch(() => ({ timeZone: 'UTC' }))]); +return Astro.redirect(`/app/work/decisions${Astro.url.search}`, 308); --- - -
- - - {!context.activeTeam ? : !snapshot?.decisions.length ? :
- {snapshot.decisions.map((decision) =>
{dateValue(decision.decidedAt, decision.createdAt) ?

Recorded

: null}
)} -
} -
-
diff --git a/src/pages/app/focus/index.astro b/src/pages/app/focus/index.astro index 97dc02e2..751e8672 100644 --- a/src/pages/app/focus/index.astro +++ b/src/pages/app/focus/index.astro @@ -1,51 +1,3 @@ --- -import Button from '@treeseed/ui/components/astro/forms/actions/Button.astro'; -import MetricCard from '@treeseed/ui/components/astro/data/metrics/MetricCard.astro'; -import MetricGrid from '@treeseed/ui/components/astro/data/metrics/MetricGrid.astro'; -import PageHeader from '@treeseed/ui/components/astro/layout/PageHeader.astro'; -import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; -import Panel from '@treeseed/ui/components/astro/surface/Panel.astro'; -import ResourceCard from '@treeseed/ui/components/astro/surface/ResourceCard.astro'; -import ModeNavigation from '../../../components/modes/ModeNavigation.astro'; -import TreeseedAppLayout from '../../../layouts/AppLayout.astro'; -import { ApiClientFacade } from '../../../lib/market/api-client.ts'; -import { text, statusTone } from '../../../lib/operations/records.ts'; -import { loadAppContext } from '../../../view-models/app-access.ts'; -import { loadFocusSnapshot } from '../../../view-models/focus/focus-state.ts'; - -if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); -const context = await loadAppContext(Astro); -const api = new ApiClientFacade(Astro); -const snapshot = context.activeTeam ? await loadFocusSnapshot(api, context.activeTeam.id) : null; -const openQuestions = snapshot?.questions.filter((item) => ['open', 'pending', 'unanswered'].includes(String(item.status ?? 'open'))) ?? []; -const pendingProposals = snapshot?.proposals.filter((item) => !['approved', 'rejected', 'withdrawn', 'decided'].includes(String(item.status ?? ''))) ?? []; +return Astro.redirect(`/app/work/inbox${Astro.url.search}`, 308); --- - -
- - - - - {!context.activeTeam ? : snapshot ? <> - - - - - - -
- - {openQuestions.slice(0, 5).map((item) => )} - {!openQuestions.length ?

No open questions in this snapshot.

: null} -
- - {pendingProposals.slice(0, 5).map((item) => )} - {!pendingProposals.length ?

No proposals currently require judgment.

: null} -
-
- -
-
- : null} -
-
diff --git a/src/pages/app/focus/proposals/[proposalId].astro b/src/pages/app/focus/proposals/[proposalId].astro index d9427356..1061a0fc 100644 --- a/src/pages/app/focus/proposals/[proposalId].astro +++ b/src/pages/app/focus/proposals/[proposalId].astro @@ -1,61 +1,5 @@ --- -import Button from '@treeseed/ui/components/astro/forms/actions/Button.astro'; -import KeyValueList from '@treeseed/ui/components/astro/data/KeyValueList.astro'; -import Timestamp from '@treeseed/ui/components/astro/data/Timestamp.astro'; -import CommonsDecisionTimeline from '@treeseed/ui/components/astro/governance/CommonsDecisionTimeline.astro'; -import CommonsProposalPipeline from '@treeseed/ui/components/astro/governance/CommonsProposalPipeline.astro'; -import PageHeader from '@treeseed/ui/components/astro/layout/PageHeader.astro'; -import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; -import Panel from '@treeseed/ui/components/astro/surface/Panel.astro'; -import ModeNavigation from '../../../../components/modes/ModeNavigation.astro'; -import TreeseedAppLayout from '../../../../layouts/AppLayout.astro'; -import { ensureCsrfToken } from '../../../../lib/auth/support/csrf.ts'; -import { ApiClientFacade } from '../../../../lib/market/api-client.ts'; -import { dateValue, items, record, safeReturnTo, text } from '../../../../lib/operations/records.ts'; -import { loadAppContext } from '../../../../view-models/app-access.ts'; - -if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); -const proposalId = String(Astro.params.proposalId ?? ''); const context = await loadAppContext(Astro); const api = new ApiClientFacade(Astro); -const [detail, events, preferences, commonsSummary] = await Promise.all([api.getCommonsProposal(proposalId).catch(() => null), api.request('GET', `/v1/commons/proposals/${encodeURIComponent(proposalId)}/events?limit=100`).catch(() => null), api.accountPreferences().catch(() => ({ timeZone: 'UTC' })), api.getCommonsSummary().catch(() => null)]); -const payload = record(detail); const proposal = record(payload.proposal ?? payload); const governanceEvents = items(events); const csrfToken = ensureCsrfToken(Astro); -const commonsTeamId = text(record(record(commonsSummary).team).id); const access = commonsTeamId ? await api.getTeamAccessSummary(commonsTeamId).catch(() => null) : null; -const canSteward = Boolean((api.currentPrincipal?.roles ?? []).some((role: string) => ['seed_admin', 'platform_admin'].includes(role)) || (access?.roles ?? access?.access?.roles ?? []).some((role: string) => ['team_owner', 'project_lead'].includes(role))); -if (!proposal.id) Astro.response.status = 404; -const returnTo = safeReturnTo(Astro.url.searchParams.get('returnTo'), '/app/focus/proposals'); +const encoded = Buffer.from(String(Astro.params.proposalId ?? '')).toString('base64url'); +const query = new URLSearchParams(Astro.url.searchParams); query.append('inspect', `proposal~${encoded}`); +return Astro.redirect(`/app/work/inbox?${query}`, 308); --- - -
- - - - - - {!proposal.id ? : <> -
- -

{text(proposal.body, proposal.rationale, proposal.summary, 'No rationale supplied.')}

- - {dateValue(proposal.updatedAt, proposal.createdAt) ?

Snapshot at

: null} -
- -
-
- {canSteward ? -
-
-
-
-
- -
-
: } - - {items(payload.objections).map((entry) =>

Objection: {text(entry.body, entry.summary)}

)} - {items(payload.alternatives).map((entry) =>

Alternative: {text(entry.body, entry.summary)}

)} - {!items(payload.objections).length && !items(payload.alternatives).length ?

No structured objections or alternatives were returned.

: null} -
-
- - } -
-
diff --git a/src/pages/app/focus/proposals/index.astro b/src/pages/app/focus/proposals/index.astro index 0f41ed18..3337fac2 100644 --- a/src/pages/app/focus/proposals/index.astro +++ b/src/pages/app/focus/proposals/index.astro @@ -1,37 +1,4 @@ --- -import Button from '@treeseed/ui/components/astro/forms/actions/Button.astro'; -import CommonsProposalCard from '@treeseed/ui/components/astro/governance/CommonsProposalCard.astro'; -import PageHeader from '@treeseed/ui/components/astro/layout/PageHeader.astro'; -import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; -import Panel from '@treeseed/ui/components/astro/surface/Panel.astro'; -import ModeNavigation from '../../../../components/modes/ModeNavigation.astro'; -import TreeseedAppLayout from '../../../../layouts/AppLayout.astro'; -import { ensureCsrfToken } from '../../../../lib/auth/support/csrf.ts'; -import { ApiClientFacade } from '../../../../lib/market/api-client.ts'; -import { loadAppContext } from '../../../../view-models/app-access.ts'; -import { loadFocusSnapshot } from '../../../../view-models/focus/focus-state.ts'; - -if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); -const context = await loadAppContext(Astro); const api = new ApiClientFacade(Astro); -const snapshot = context.activeTeam ? await loadFocusSnapshot(api, context.activeTeam.id) : null; const csrfToken = ensureCsrfToken(Astro); -const stages = ['draft', 'review', 'voting', 'decided']; -const stageFor = (status: unknown) => ['approved', 'rejected', 'implemented', 'decided'].includes(String(status)) ? 'decided' : ['under_review', 'review'].includes(String(status)) ? 'review' : String(status) === 'voting' ? 'voting' : 'draft'; +const query = new URLSearchParams(Astro.url.searchParams); query.set('kind', 'proposal'); +return Astro.redirect(`/app/work/inbox?${query}`, 308); --- - -
- - - {!context.activeTeam ? : <> - -
- - -
-
-
{stages.map((stage) => - {snapshot?.proposals.filter((item) => stageFor(item.status) === stage).map((proposal) => )} - {!snapshot?.proposals.some((item) => stageFor(item.status) === stage) ?

No proposals in this stage.

: null} -
)}
- } -
-
diff --git a/src/pages/app/focus/questions.astro b/src/pages/app/focus/questions.astro index e7087c48..5002b76c 100644 --- a/src/pages/app/focus/questions.astro +++ b/src/pages/app/focus/questions.astro @@ -1,38 +1,4 @@ --- -import Button from '@treeseed/ui/components/astro/forms/actions/Button.astro'; -import Timestamp from '@treeseed/ui/components/astro/data/Timestamp.astro'; -import PageHeader from '@treeseed/ui/components/astro/layout/PageHeader.astro'; -import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; -import Panel from '@treeseed/ui/components/astro/surface/Panel.astro'; -import ModeNavigation from '../../../components/modes/ModeNavigation.astro'; -import TreeseedAppLayout from '../../../layouts/AppLayout.astro'; -import { ensureCsrfToken } from '../../../lib/auth/support/csrf.ts'; -import { ApiClientFacade } from '../../../lib/market/api-client.ts'; -import { dateValue, record, text } from '../../../lib/operations/records.ts'; -import { loadAppContext } from '../../../view-models/app-access.ts'; -import { loadFocusSnapshot } from '../../../view-models/focus/focus-state.ts'; - -if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); -const context = await loadAppContext(Astro); const api = new ApiClientFacade(Astro); -const [snapshot, preferences] = await Promise.all([context.activeTeam ? loadFocusSnapshot(api, context.activeTeam.id) : null, api.accountPreferences().catch(() => ({ timeZone: 'UTC' }))]); -const commonsTeamId = text(record(snapshot?.summary.team).id); const access = commonsTeamId ? await api.getTeamAccessSummary(commonsTeamId).catch(() => null) : null; -const canSteward = Boolean((api.currentPrincipal?.roles ?? []).some((role: string) => ['seed_admin', 'platform_admin'].includes(role)) || (access?.roles ?? access?.access?.roles ?? []).some((role: string) => ['team_owner', 'project_lead'].includes(role))); -const selected = Astro.url.searchParams.get('question'); const csrfToken = ensureCsrfToken(Astro); -const questions = [...(snapshot?.questions ?? [])].sort((a, b) => String(b.updatedAt ?? b.createdAt).localeCompare(String(a.updatedAt ?? a.createdAt))); +const query = new URLSearchParams(Astro.url.searchParams); query.set('kind', 'question'); +return Astro.redirect(`/app/work/inbox?${query}`, 308); --- - -
- - - {!context.activeTeam ? : !questions.length ? :
- {questions.map((question) => -

Evidence policy: {text(question.answerPolicy, question.answer_policy, 'Use attributable evidence and state remaining uncertainty.')}

-

Affected work: {text(question.projectId, question.objectiveId, 'No affected work recorded.')}

- {dateValue(question.updatedAt, question.createdAt) ?

Evidence state at

: null} - {canSteward && (selected === String(question.id) || !['answered', 'closed'].includes(String(question.status))) ?
- -
: null} -
)} -
} -
-
diff --git a/src/pages/app/index.astro b/src/pages/app/index.astro index cf5fe799..a8821192 100644 --- a/src/pages/app/index.astro +++ b/src/pages/app/index.astro @@ -36,10 +36,9 @@ const workday = command ? activeWorkday(command) : null; const situations = comm {!context.activeTeam ? : <>
- - +
- + {situations.slice(0, 5).map((item) => )}{!situations.length ?

No current evidence indicates an operational condition requiring intervention.

: null}
}
diff --git a/src/pages/app/teams/[teamId]/index.astro b/src/pages/app/teams/[teamId]/index.astro index 2eb9242a..3a2d08a4 100644 --- a/src/pages/app/teams/[teamId]/index.astro +++ b/src/pages/app/teams/[teamId]/index.astro @@ -97,8 +97,7 @@ const roleLabel = summary?.access?.roles?.map((role: string) => roleDisplay(role
- - +
{operationalEntries.map(([key, item]) => ( diff --git a/src/pages/app/work/[runId].astro b/src/pages/app/work/[runId].astro index 073e3dd0..11cd1fb6 100644 --- a/src/pages/app/work/[runId].astro +++ b/src/pages/app/work/[runId].astro @@ -23,7 +23,7 @@ const canManage = Boolean((access?.roles ?? access?.access?.roles ?? []).some((r if (team && !run.id) Astro.response.status = 404; const transitions: Record = { queued: ['running', 'cancelled', 'failed'], running: ['completed', 'degraded', 'cancelled', 'failed'] }; --- - +
{monitor ? : null} {!team ? : !run.id ? : diff --git a/src/pages/app/work/index.astro b/src/pages/app/work/index.astro index fdb4981b..b2ab1407 100644 --- a/src/pages/app/work/index.astro +++ b/src/pages/app/work/index.astro @@ -29,7 +29,7 @@ const metrics = frame?.overview.metrics.map((metric) => { const csrfToken = ensureCsrfToken(Astro); --- - +
{frame ? <> diff --git a/src/pages/app/work/workdays.astro b/src/pages/app/work/workdays.astro index cd0e86c8..299c1d1b 100644 --- a/src/pages/app/work/workdays.astro +++ b/src/pages/app/work/workdays.astro @@ -18,7 +18,7 @@ const csrfToken = ensureCsrfToken(Astro); const action = frame.app.activeTeam ? `/v1/teams/${encodeURIComponent(frame.app.activeTeam.id)}/workday-runs` : ''; --- - +
{frame.monitor ? : null} {!frame.app.activeTeam ? : diff --git a/src/view-models/agent-lab/agent-lab-frame.ts b/src/view-models/agent-lab/agent-lab-frame.ts index 156cb2dc..444a2684 100644 --- a/src/view-models/agent-lab/agent-lab-frame.ts +++ b/src/view-models/agent-lab/agent-lab-frame.ts @@ -24,7 +24,7 @@ export async function loadAgentLabFrame(api: ApiClientFacade, team: { id: string api.request('GET', `${base}/overview${suffix}`).catch(() => fallbackOverview(team, preferences.timeZone)), api.request('GET', `${base}/activity${suffix}`).catch(() => ({ revision: 'unavailable', generatedAt: new Date().toISOString(), cursor: null, upserts: [], removedIds: [] })), api.request('GET', `${base}/metric-series${suffix}`).catch(() => ({ revision: 'unavailable', generatedAt: new Date().toISOString(), cursor: null, upserts: [], removedIds: [] })), - api.request('GET', `${base}/allocation${suffix}`).catch(() => ({ revision: 'unavailable', generatedAt: new Date().toISOString(), canManage: false, activeAllocationSetId: null, credits: { budget: null, requested: 0, reserved: 0, committed: 0, reported: 0, spent: 0, remaining: null, overrun: 0 }, projects: [], agentClasses: [] })), + api.request('GET', `${base}/allocation${suffix}`).catch(() => ({ revision: 'unavailable', generatedAt: new Date().toISOString(), canManage: false, activeAllocationSetId: null, time: { availableSeconds: null, requestedSeconds: 0, reservedSeconds: 0, activeSeconds: 0, elapsedSeconds: 0, releasedSeconds: 0, remainingSeconds: null, overrunSeconds: 0 }, projects: [], agentClasses: [], workdayTime: [] })), ]); return { overview: overview as AgentLabOverview, diff --git a/src/view-models/agent-lab/command-page.ts b/src/view-models/agent-lab/command-page.ts index 2e3d5e3a..40232e47 100644 --- a/src/view-models/agent-lab/command-page.ts +++ b/src/view-models/agent-lab/command-page.ts @@ -22,5 +22,5 @@ export async function loadAgentLabCommandPage(context: APIContext, surface: Agen const selection = new URLSearchParams(); if (date) selection.set('date', date); if (workday) selection.set('workday', workday); if (query) selection.set('q', query); const base = `/v1/teams/${encodeURIComponent(app.activeTeam.id)}/agent-lab`; const collection = `${base}/surfaces/${surface}${selection.size ? `?${selection}` : ''}`; const [frame, initial] = await Promise.all([loadAgentLabFrame(api, app.activeTeam, preferences, { date, workday }), api.request('GET', collection).catch(() => fallback(surface))]); - return { app, preferences, frame, surface: initial as CommandCollectionPage, query, endpoints: { collection, detailBase: `${base}/details`, state: `${base}/view-state`, actions: `${base}/surfaces/${surface}`, simulations: `${base}/simulations` } }; + return { app, preferences, frame, surface: initial as CommandCollectionPage, query, endpoints: { collection, detailBase: `${base}/details`, state: `${base}/view-state`, actions: `${base}/surfaces/${surface}`, simulations: `${base}/simulations`, draft: `${base}/surfaces/build/draft`, authoringBundle: `${base}/surfaces/build/authoring-bundle` } }; } From b239fbe81fc313db6f957fc3d2416304dcda636f Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Wed, 5 Aug 2026 10:33:23 -0400 Subject: [PATCH 049/315] build(build): fix Agent Lab allocation controls and checkpoint Intent: - Save hint: fix Agent Lab allocation controls and checkpoint coordinated workday scene Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.staging.20260804T171053Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/ui: github:treeseed-ai/ui#15fffd6d8ef3aefe8d15f337838242f07c1d83af -> github:treeseed-ai/ui#fa8472dba378d424571e7d1d0d363b927deb19f0 - dependencies.@treeseed/core: github:treeseed-ai/core#68273002ed5b87ab0d1b0cc74af1149adc05aa9d -> github:treeseed-ai/core#4c464b4cb35f39ac2bd5100695f7a98d2a3fbe0e --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 679e6b5c..f02970fb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,9 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#68273002ed5b87ab0d1b0cc74af1149adc05aa9d", + "@treeseed/core": "github:treeseed-ai/core#4c464b4cb35f39ac2bd5100695f7a98d2a3fbe0e", "@treeseed/sdk": "github:treeseed-ai/sdk#6f73e58d221f70f2067f52e3f35bfb6f7c19e2b5", - "@treeseed/ui": "github:treeseed-ai/ui#15fffd6d8ef3aefe8d15f337838242f07c1d83af", + "@treeseed/ui": "github:treeseed-ai/ui#fa8472dba378d424571e7d1d0d363b927deb19f0", "react": "^19.2.5", "react-dom": "^19.2.6" }, @@ -6932,7 +6932,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.staging.20260804T171000Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#68273002ed5b87ab0d1b0cc74af1149adc05aa9d", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#4c464b4cb35f39ac2bd5100695f7a98d2a3fbe0e", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6944,7 +6944,7 @@ "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", "@treeseed/sdk": "github:treeseed-ai/sdk#6f73e58d221f70f2067f52e3f35bfb6f7c19e2b5", - "@treeseed/ui": "github:treeseed-ai/ui#15fffd6d8ef3aefe8d15f337838242f07c1d83af", + "@treeseed/ui": "github:treeseed-ai/ui#fa8472dba378d424571e7d1d0d363b927deb19f0", "astro": "^5.6.1", "esbuild": "^0.28.0", "katex": "^0.16.22", @@ -9645,7 +9645,7 @@ }, "node_modules/@treeseed/ui": { "version": "0.12.18-dev.staging.20260804T170811Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#15fffd6d8ef3aefe8d15f337838242f07c1d83af", + "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#fa8472dba378d424571e7d1d0d363b927deb19f0", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", diff --git a/package.json b/package.json index 6fd90f9e..d008e898 100644 --- a/package.json +++ b/package.json @@ -49,9 +49,9 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#68273002ed5b87ab0d1b0cc74af1149adc05aa9d", + "@treeseed/core": "github:treeseed-ai/core#4c464b4cb35f39ac2bd5100695f7a98d2a3fbe0e", "@treeseed/sdk": "github:treeseed-ai/sdk#6f73e58d221f70f2067f52e3f35bfb6f7c19e2b5", - "@treeseed/ui": "github:treeseed-ai/ui#15fffd6d8ef3aefe8d15f337838242f07c1d83af", + "@treeseed/ui": "github:treeseed-ai/ui#fa8472dba378d424571e7d1d0d363b927deb19f0", "react": "^19.2.5", "react-dom": "^19.2.6" }, From a04cd26cf5a8ab7f3e8a1b9d0ea0e665f3248497 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Wed, 5 Aug 2026 11:02:33 -0400 Subject: [PATCH 050/315] build(build): publish Admin dist without deleting live routes Intent: - Save hint: publish Admin dist without deleting live routes Changes: - Updates 1 file across build: 1. - Touches scripts/build-dist.ts. - Plans package version/tag 0.12.59-dev.staging.20260804T171053Z for @treeseed/admin. --- scripts/build-dist.ts | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/scripts/build-dist.ts b/scripts/build-dist.ts index 27b03097..65598d63 100644 --- a/scripts/build-dist.ts +++ b/scripts/build-dist.ts @@ -1,6 +1,6 @@ #!/usr/bin/env node -import { cpSync, existsSync, mkdirSync, readFileSync, readdirSync, rmSync, statSync, symlinkSync, unlinkSync, writeFileSync } from 'node:fs'; +import { cpSync, existsSync, mkdirSync, readFileSync, readdirSync, renameSync, rmSync, statSync, symlinkSync, unlinkSync, writeFileSync } from 'node:fs'; import { spawnSync } from 'node:child_process'; import { dirname, extname, relative, resolve } from 'node:path'; import { createRequire } from 'node:module'; @@ -9,7 +9,9 @@ import { build } from 'esbuild'; const packageRoot = resolve(new URL('..', import.meta.url).pathname); const requireFromPackage = createRequire(resolve(packageRoot, 'package.json')); const srcRoot = resolve(packageRoot, 'src'); -const distRoot = resolve(packageRoot, 'dist'); +const liveDistRoot = resolve(packageRoot, 'dist'); +const buildRoot = resolve(packageRoot, '.local', 'build-dist', String(process.pid)); +const distRoot = resolve(buildRoot, 'dist'); const buildLockRoot = resolve(packageRoot, '.treeseed-build-dist.lock'); const workspaceCoreDistRoot = resolve(packageRoot, '..', 'core', 'dist'); const workspaceSdkDistRoot = resolve(packageRoot, '..', 'sdk', 'dist'); @@ -216,6 +218,7 @@ function writeDeclarationTsconfig() { compilerOptions: { ...baseCompilerOptions, ignoreDeprecations: baseCompilerOptions.ignoreDeprecations ?? ignoreDeprecationsForInstalledTypescript(), + outDir: relativePathForTsconfig(distRoot), paths: mergedPaths, }, include: baseConfig.include ?? ['src/**/*'], @@ -223,6 +226,24 @@ function writeDeclarationTsconfig() { return tsconfigPath; } +function publishCompletedBuild() { + const stagedFiles = walkFiles(distRoot); + const expected = new Set(stagedFiles.map((filePath) => relative(distRoot, filePath))); + mkdirSync(liveDistRoot, { recursive: true }); + for (const stagedFile of stagedFiles) { + const outputFile = resolve(liveDistRoot, relative(distRoot, stagedFile)); + ensureDir(outputFile); + try { + renameSync(stagedFile, outputFile); + } catch { + cpSync(stagedFile, outputFile); + } + } + for (const liveFile of walkFiles(liveDistRoot)) { + if (!expected.has(relative(liveDistRoot, liveFile))) rmSync(liveFile, { force: true }); + } +} + function emitDeclarations() { const tsconfigPath = writeDeclarationTsconfig(); let localTsc = null; @@ -252,7 +273,7 @@ async function main() { const releaseBuildLock = await acquireBuildLock(); try { ensureWorkspaceRuntimePackageLinks(); - rmSync(distRoot, { recursive: true, force: true }); + rmSync(buildRoot, { recursive: true, force: true }); mkdirSync(distRoot, { recursive: true }); for (const filePath of walkFiles(srcRoot)) { @@ -275,7 +296,9 @@ async function main() { writeDeclaration('middleware.d.ts', "export declare const onRequest: any;\n"); writeDeclaration('lib/market/catalog.d.ts', "export declare function createMarketTemplateCatalogProvider(...args: any[]): any;\n"); writeDeclaration('lib/market/store.d.ts', "export declare function resolveApiStore(...args: any[]): any;\n"); + publishCompletedBuild(); } finally { + rmSync(buildRoot, { recursive: true, force: true }); releaseBuildLock(); } } From 94ef066df415344ec0b19117218dad1698d04be9 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Wed, 5 Aug 2026 11:50:52 -0400 Subject: [PATCH 051/315] build(build): add glossy allocation and expandable Agent Lab monitors Intent: - Save hint: add glossy allocation and expandable Agent Lab monitors Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.staging.20260804T171053Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/ui: github:treeseed-ai/ui#fa8472dba378d424571e7d1d0d363b927deb19f0 -> github:treeseed-ai/ui#90b67266d9164adc1fe1c654f4b0a55fa72d0a79 - dependencies.@treeseed/core: github:treeseed-ai/core#4c464b4cb35f39ac2bd5100695f7a98d2a3fbe0e -> github:treeseed-ai/core#edf1c3bde466a3d31d2cd34fc9427a14b5f1b873 --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index f02970fb..a8818921 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,9 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#4c464b4cb35f39ac2bd5100695f7a98d2a3fbe0e", + "@treeseed/core": "github:treeseed-ai/core#edf1c3bde466a3d31d2cd34fc9427a14b5f1b873", "@treeseed/sdk": "github:treeseed-ai/sdk#6f73e58d221f70f2067f52e3f35bfb6f7c19e2b5", - "@treeseed/ui": "github:treeseed-ai/ui#fa8472dba378d424571e7d1d0d363b927deb19f0", + "@treeseed/ui": "github:treeseed-ai/ui#90b67266d9164adc1fe1c654f4b0a55fa72d0a79", "react": "^19.2.5", "react-dom": "^19.2.6" }, @@ -6932,7 +6932,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.staging.20260804T171000Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#4c464b4cb35f39ac2bd5100695f7a98d2a3fbe0e", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#edf1c3bde466a3d31d2cd34fc9427a14b5f1b873", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6944,7 +6944,7 @@ "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", "@treeseed/sdk": "github:treeseed-ai/sdk#6f73e58d221f70f2067f52e3f35bfb6f7c19e2b5", - "@treeseed/ui": "github:treeseed-ai/ui#fa8472dba378d424571e7d1d0d363b927deb19f0", + "@treeseed/ui": "github:treeseed-ai/ui#90b67266d9164adc1fe1c654f4b0a55fa72d0a79", "astro": "^5.6.1", "esbuild": "^0.28.0", "katex": "^0.16.22", @@ -9645,7 +9645,7 @@ }, "node_modules/@treeseed/ui": { "version": "0.12.18-dev.staging.20260804T170811Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#fa8472dba378d424571e7d1d0d363b927deb19f0", + "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#90b67266d9164adc1fe1c654f4b0a55fa72d0a79", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", diff --git a/package.json b/package.json index d008e898..a0b8e3b7 100644 --- a/package.json +++ b/package.json @@ -49,9 +49,9 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#4c464b4cb35f39ac2bd5100695f7a98d2a3fbe0e", + "@treeseed/core": "github:treeseed-ai/core#edf1c3bde466a3d31d2cd34fc9427a14b5f1b873", "@treeseed/sdk": "github:treeseed-ai/sdk#6f73e58d221f70f2067f52e3f35bfb6f7c19e2b5", - "@treeseed/ui": "github:treeseed-ai/ui#fa8472dba378d424571e7d1d0d363b927deb19f0", + "@treeseed/ui": "github:treeseed-ai/ui#90b67266d9164adc1fe1c654f4b0a55fa72d0a79", "react": "^19.2.5", "react-dom": "^19.2.6" }, From 9ab06429caacd9ae2e21556acc6534a4fd3bf91d Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Wed, 5 Aug 2026 12:26:57 -0400 Subject: [PATCH 052/315] build(build): refine Agent Lab monitor expansion and metric scaling Intent: - Save hint: refine Agent Lab monitor expansion and metric scaling Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.staging.20260804T171053Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/ui: github:treeseed-ai/ui#90b67266d9164adc1fe1c654f4b0a55fa72d0a79 -> github:treeseed-ai/ui#f6e288766bc68543f7dee46cdd36114dc5349bc9 - dependencies.@treeseed/core: github:treeseed-ai/core#edf1c3bde466a3d31d2cd34fc9427a14b5f1b873 -> github:treeseed-ai/core#1678ab6ffc542c6b23a575e328c00e13bf8d85ba --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index a8818921..10169dda 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,9 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#edf1c3bde466a3d31d2cd34fc9427a14b5f1b873", + "@treeseed/core": "github:treeseed-ai/core#1678ab6ffc542c6b23a575e328c00e13bf8d85ba", "@treeseed/sdk": "github:treeseed-ai/sdk#6f73e58d221f70f2067f52e3f35bfb6f7c19e2b5", - "@treeseed/ui": "github:treeseed-ai/ui#90b67266d9164adc1fe1c654f4b0a55fa72d0a79", + "@treeseed/ui": "github:treeseed-ai/ui#f6e288766bc68543f7dee46cdd36114dc5349bc9", "react": "^19.2.5", "react-dom": "^19.2.6" }, @@ -6932,7 +6932,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.staging.20260804T171000Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#edf1c3bde466a3d31d2cd34fc9427a14b5f1b873", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#1678ab6ffc542c6b23a575e328c00e13bf8d85ba", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6944,7 +6944,7 @@ "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", "@treeseed/sdk": "github:treeseed-ai/sdk#6f73e58d221f70f2067f52e3f35bfb6f7c19e2b5", - "@treeseed/ui": "github:treeseed-ai/ui#90b67266d9164adc1fe1c654f4b0a55fa72d0a79", + "@treeseed/ui": "github:treeseed-ai/ui#f6e288766bc68543f7dee46cdd36114dc5349bc9", "astro": "^5.6.1", "esbuild": "^0.28.0", "katex": "^0.16.22", @@ -9645,7 +9645,7 @@ }, "node_modules/@treeseed/ui": { "version": "0.12.18-dev.staging.20260804T170811Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#90b67266d9164adc1fe1c654f4b0a55fa72d0a79", + "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#f6e288766bc68543f7dee46cdd36114dc5349bc9", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", diff --git a/package.json b/package.json index a0b8e3b7..60bbe930 100644 --- a/package.json +++ b/package.json @@ -49,9 +49,9 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#edf1c3bde466a3d31d2cd34fc9427a14b5f1b873", + "@treeseed/core": "github:treeseed-ai/core#1678ab6ffc542c6b23a575e328c00e13bf8d85ba", "@treeseed/sdk": "github:treeseed-ai/sdk#6f73e58d221f70f2067f52e3f35bfb6f7c19e2b5", - "@treeseed/ui": "github:treeseed-ai/ui#90b67266d9164adc1fe1c654f4b0a55fa72d0a79", + "@treeseed/ui": "github:treeseed-ai/ui#f6e288766bc68543f7dee46cdd36114dc5349bc9", "react": "^19.2.5", "react-dom": "^19.2.6" }, From 8566bf19bf1a09237e2588263ab4ebaf853a64d8 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Wed, 5 Aug 2026 14:01:30 -0400 Subject: [PATCH 053/315] build(ui): fix CI gates and prepare TreeDX performance work for staging Intent: - Save hint: fix CI gates and prepare TreeDX performance work for staging Changes: - Updates 12 files across ui: 7, build: 2, tests: 2, source: 1. - Touches package-lock.json, package.json, src/pages/app/domain-overview.astro -> src/pages/app/market.astro, src/pages/app/work/agents.astro, src/pages/app/work/artifacts.astro, src/pages/app/work/assignments.astro, .... - Plans package version/tag 0.12.59-dev.treedx-perf.20260805T075847Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#c45edd1983938b429f4bbec1c974523327faad74 -> github:treeseed-ai/sdk#b963e17efb46a5f02f0906aa8e54efadaf076974 - dependencies.@treeseed/core: github:treeseed-ai/core#d8377422beb43ab74c332c0a8c03a59ffaaa6cfb -> github:treeseed-ai/core#d2e5c1af24ff7953bef36ec55f448aab4581f554 --- package-lock.json | 10 +++++----- package.json | 4 ++-- .../{domain-overview.astro => market.astro} | 0 src/pages/app/work/agents.astro | 5 ----- src/pages/app/work/artifacts.astro | 5 ----- src/pages/app/work/assignments.astro | 5 ----- src/pages/app/work/entity-overview.astro | 18 ++++++++++++++++++ src/pages/app/work/events.astro | 5 ----- src/pages/app/work/executions.astro | 5 ----- src/routes.ts | 12 ++++++------ tests/contract/package/admin-package.test.ts | 5 +++-- .../team-management-architecture.test.ts | 2 +- 12 files changed, 35 insertions(+), 41 deletions(-) rename src/pages/app/{domain-overview.astro => market.astro} (100%) delete mode 100644 src/pages/app/work/agents.astro delete mode 100644 src/pages/app/work/artifacts.astro delete mode 100644 src/pages/app/work/assignments.astro create mode 100644 src/pages/app/work/entity-overview.astro delete mode 100644 src/pages/app/work/events.astro delete mode 100644 src/pages/app/work/executions.astro diff --git a/package-lock.json b/package-lock.json index 6add4ca4..7579ddc8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#d8377422beb43ab74c332c0a8c03a59ffaaa6cfb", - "@treeseed/sdk": "github:treeseed-ai/sdk#c45edd1983938b429f4bbec1c974523327faad74", + "@treeseed/core": "github:treeseed-ai/core#d2e5c1af24ff7953bef36ec55f448aab4581f554", + "@treeseed/sdk": "github:treeseed-ai/sdk#b963e17efb46a5f02f0906aa8e54efadaf076974", "@treeseed/ui": "github:treeseed-ai/ui#e4c7a0896fa6d49b183d2729150eb598084c6c35", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -6932,7 +6932,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.treedx-perf.20260805T075816Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#d8377422beb43ab74c332c0a8c03a59ffaaa6cfb", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#d2e5c1af24ff7953bef36ec55f448aab4581f554", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6943,7 +6943,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#c45edd1983938b429f4bbec1c974523327faad74", + "@treeseed/sdk": "github:treeseed-ai/sdk#b963e17efb46a5f02f0906aa8e54efadaf076974", "@treeseed/ui": "github:treeseed-ai/ui#e4c7a0896fa6d49b183d2729150eb598084c6c35", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8948,7 +8948,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.treedx-perf.20260805T073639Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#c45edd1983938b429f4bbec1c974523327faad74", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#b963e17efb46a5f02f0906aa8e54efadaf076974", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index 68431a00..1781f46d 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#d8377422beb43ab74c332c0a8c03a59ffaaa6cfb", - "@treeseed/sdk": "github:treeseed-ai/sdk#c45edd1983938b429f4bbec1c974523327faad74", + "@treeseed/core": "github:treeseed-ai/core#d2e5c1af24ff7953bef36ec55f448aab4581f554", + "@treeseed/sdk": "github:treeseed-ai/sdk#b963e17efb46a5f02f0906aa8e54efadaf076974", "@treeseed/ui": "github:treeseed-ai/ui#e4c7a0896fa6d49b183d2729150eb598084c6c35", "react": "^19.2.5", "react-dom": "^19.2.6" diff --git a/src/pages/app/domain-overview.astro b/src/pages/app/market.astro similarity index 100% rename from src/pages/app/domain-overview.astro rename to src/pages/app/market.astro diff --git a/src/pages/app/work/agents.astro b/src/pages/app/work/agents.astro deleted file mode 100644 index 3899c543..00000000 --- a/src/pages/app/work/agents.astro +++ /dev/null @@ -1,5 +0,0 @@ ---- -import AgentLabEntityPage from '../../../components/agent-lab/AgentLabEntityPage.astro'; import { loadAgentLabEntityPage } from '../../../view-models/agent-lab/entity-page.ts'; -if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); const frame = await loadAgentLabEntityPage(Astro, 'agents'); ---- - diff --git a/src/pages/app/work/artifacts.astro b/src/pages/app/work/artifacts.astro deleted file mode 100644 index d7fd4c49..00000000 --- a/src/pages/app/work/artifacts.astro +++ /dev/null @@ -1,5 +0,0 @@ ---- -import AgentLabEntityPage from '../../../components/agent-lab/AgentLabEntityPage.astro'; import { loadAgentLabEntityPage } from '../../../view-models/agent-lab/entity-page.ts'; -if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); const frame = await loadAgentLabEntityPage(Astro, 'artifacts'); ---- - diff --git a/src/pages/app/work/assignments.astro b/src/pages/app/work/assignments.astro deleted file mode 100644 index 268528d0..00000000 --- a/src/pages/app/work/assignments.astro +++ /dev/null @@ -1,5 +0,0 @@ ---- -import AgentLabEntityPage from '../../../components/agent-lab/AgentLabEntityPage.astro'; import { loadAgentLabEntityPage } from '../../../view-models/agent-lab/entity-page.ts'; -if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); const frame = await loadAgentLabEntityPage(Astro, 'assignments'); ---- - diff --git a/src/pages/app/work/entity-overview.astro b/src/pages/app/work/entity-overview.astro new file mode 100644 index 00000000..24918187 --- /dev/null +++ b/src/pages/app/work/entity-overview.astro @@ -0,0 +1,18 @@ +--- +import type { AgentLabEntityKind } from '@treeseed/sdk/agent-capacity'; +import AgentLabEntityPage from '../../../components/agent-lab/AgentLabEntityPage.astro'; +import { loadAgentLabEntityPage } from '../../../view-models/agent-lab/entity-page.ts'; + +if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); +const entities: Record = { + agents: { kind: 'agents', label: 'Agents', description: 'Configured agent classes and their current operating state.' }, + artifacts: { kind: 'artifacts', label: 'Artifacts', description: 'Unique content and evidence generated by team agents.' }, + assignments: { kind: 'assignments', label: 'Assignments', description: 'Work allocated to agents across every activity profile.' }, + events: { kind: 'events', label: 'System Events', description: 'Durable control-plane and runtime transitions from the team’s operating day.' }, + executions: { kind: 'executions', label: 'Executions', description: 'Native execution-provider attempts, outcomes, and live state.' }, +}; +const entity = entities[Astro.url.pathname.split('/').at(-1) ?? '']; +if (!entity) Astro.response.status = 404; +const frame = entity ? await loadAgentLabEntityPage(Astro, entity.kind) : null; +--- +{entity && frame ? :

Agent Lab resource not found.

} diff --git a/src/pages/app/work/events.astro b/src/pages/app/work/events.astro deleted file mode 100644 index 264355c9..00000000 --- a/src/pages/app/work/events.astro +++ /dev/null @@ -1,5 +0,0 @@ ---- -import AgentLabEntityPage from '../../../components/agent-lab/AgentLabEntityPage.astro'; import { loadAgentLabEntityPage } from '../../../view-models/agent-lab/entity-page.ts'; -if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); const frame = await loadAgentLabEntityPage(Astro, 'events'); ---- - diff --git a/src/pages/app/work/executions.astro b/src/pages/app/work/executions.astro deleted file mode 100644 index 1ebec5c1..00000000 --- a/src/pages/app/work/executions.astro +++ /dev/null @@ -1,5 +0,0 @@ ---- -import AgentLabEntityPage from '../../../components/agent-lab/AgentLabEntityPage.astro'; import { loadAgentLabEntityPage } from '../../../view-models/agent-lab/entity-page.ts'; -if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); const frame = await loadAgentLabEntityPage(Astro, 'executions'); ---- - diff --git a/src/routes.ts b/src/routes.ts index c00de79f..b0772d10 100644 --- a/src/routes.ts +++ b/src/routes.ts @@ -79,16 +79,16 @@ export const ADMIN_ROUTES: readonly SiteRouteContribution[] = validateRouteCapab adminRoute('/app/work/direction', 'pages/app/work/direction.astro', { id: 'admin.agent-lab.direction', description: 'Assignment and execution direction timeline.' }), adminRoute('/app/work/results', 'pages/app/work/results.astro', { id: 'admin.agent-lab.results', description: 'Agent artifacts, summaries, and reports.' }), adminRoute('/app/work/find', 'pages/app/work/find.astro', { id: 'admin.agent-lab.find', description: 'Cross-entity Agent Lab search.' }), - adminRoute('/app/work/agents', 'pages/app/work/agents.astro', { id: 'admin.agent-lab.agents', description: 'Configured and active Agent Lab agent summaries.', guarantees: ['guarantee.work.agent-lab.monitor-agent-lab.035'] }), + adminRoute('/app/work/agents', 'pages/app/work/entity-overview.astro', { id: 'admin.agent-lab.agents', description: 'Configured and active Agent Lab agent summaries.', guarantees: ['guarantee.work.agent-lab.monitor-agent-lab.035'] }), adminRoute('/app/work/workdays', 'pages/app/work/workdays.astro', { id: 'admin.agent-lab.workdays', description: 'Operating-day workday summaries.', guarantees: ['guarantee.work.agent-lab.monitor-agent-lab.035'] }), - adminRoute('/app/work/events', 'pages/app/work/events.astro', { id: 'admin.agent-lab.events', description: 'Durable Agent Lab system-event summaries.', guarantees: ['guarantee.work.agent-lab.monitor-agent-lab.035'] }), - adminRoute('/app/work/assignments', 'pages/app/work/assignments.astro', { id: 'admin.agent-lab.assignments', description: 'Operating-day assignment summaries.', guarantees: ['guarantee.work.agent-lab.monitor-agent-lab.035'] }), - adminRoute('/app/work/executions', 'pages/app/work/executions.astro', { id: 'admin.agent-lab.executions', description: 'Native execution-attempt summaries.', guarantees: ['guarantee.work.agent-lab.monitor-agent-lab.035'] }), - adminRoute('/app/work/artifacts', 'pages/app/work/artifacts.astro', { id: 'admin.agent-lab.artifacts', description: 'Durable Agent Lab artifact summaries.', guarantees: ['guarantee.work.agent-lab.monitor-agent-lab.035'] }), + adminRoute('/app/work/events', 'pages/app/work/entity-overview.astro', { id: 'admin.agent-lab.events', description: 'Durable Agent Lab system-event summaries.', guarantees: ['guarantee.work.agent-lab.monitor-agent-lab.035'] }), + adminRoute('/app/work/assignments', 'pages/app/work/entity-overview.astro', { id: 'admin.agent-lab.assignments', description: 'Operating-day assignment summaries.', guarantees: ['guarantee.work.agent-lab.monitor-agent-lab.035'] }), + adminRoute('/app/work/executions', 'pages/app/work/entity-overview.astro', { id: 'admin.agent-lab.executions', description: 'Native execution-attempt summaries.', guarantees: ['guarantee.work.agent-lab.monitor-agent-lab.035'] }), + adminRoute('/app/work/artifacts', 'pages/app/work/entity-overview.astro', { id: 'admin.agent-lab.artifacts', description: 'Durable Agent Lab artifact summaries.', guarantees: ['guarantee.work.agent-lab.monitor-agent-lab.035'] }), adminRoute('/app/work/[runId]', 'pages/app/work/[runId].astro', { id: 'admin.work.detail', description: 'Live workday control or historical race replay.', guarantees: ['guarantee.work.command.monitor-team-operations.033', 'guarantee.work.agent-lab.monitor-agent-lab.035'] }), adminRoute('/app/knowledge', 'pages/app/knowledge/index.astro', { id: 'admin.knowledge.workbench', description: 'Active-team repository-native book authoring, review, linking, and pack workbench.', guarantees: ['guarantee.project.book.create-book.065', 'guarantee.project.book.edit-book.066', 'guarantee.project.book.delete-book.067', 'guarantee.project.book.search-books.068', 'guarantee.project.knowledge.create-book-page.069', 'guarantee.project.book.download-book.070', 'guarantee.project.knowledge.edit-book-page.071', 'guarantee.project.knowledge.delete-book-page.072', 'guarantee.project.library.download-library.073', 'guarantee.project.library.rebuild-library-index.090', 'guarantee.project.knowledge.review-backlinks.091'], knowledgePageIds: ['knowledge.authoring'] }), adminRoute('/app/knowledge/packs/[buildId]/download', 'pages/app/knowledge/packs/[buildId]/download.ts', { id: 'admin.knowledge.pack-download', description: 'Authorized no-store knowledge-pack artifact download.', responseKind: 'data', archetype: 'action', navigation: 'hidden', guarantees: ['guarantee.project.book.download-book.070', 'guarantee.project.library.download-library.073'] }), - adminRoute('/app/market', 'pages/app/domain-overview.astro', { id: 'admin.domain.market', description: 'Bounded active-team catalog and billing domain landing page.', guarantees: ['guarantee.team.team.view-team-overview.015'] }), + adminRoute('/app/market', 'pages/app/market.astro', { id: 'admin.domain.market', description: 'Bounded active-team catalog and billing domain landing page.', guarantees: ['guarantee.team.team.view-team-overview.015'] }), adminRoute('/auth/register', 'pages/auth/register.astro', { id: 'admin.auth.register', description: 'Credential registration with username/email availability and immutable username disclosure.', guarantees: ['guarantee.user.auth.register-user.001'] }), adminRoute('/auth/check-email', 'pages/auth/check-email.astro', { id: 'admin.auth.check-email', description: 'Hidden verification/reset check-inbox continuation.', archetype: 'message', template: 'MessageTemplate' }), adminRoute('/auth/confirm-email', 'pages/auth/confirm-email.astro', { diff --git a/tests/contract/package/admin-package.test.ts b/tests/contract/package/admin-package.test.ts index e73e6f23..813729cc 100644 --- a/tests/contract/package/admin-package.test.ts +++ b/tests/contract/package/admin-package.test.ts @@ -112,8 +112,9 @@ describe('@treeseed/admin identity and team surface', () => { it('registers exactly the retained routes and resources', () => { const pageFiles = filesUnder('src/pages').filter((path) => /\.(astro|ts)$/u.test(path)); const expectedPageRoutes = [ - ...EXPECTED_ROUTES.filter((route) => !DOMAIN_ROUTES.includes(route)), - '/app/domain-overview', + ...EXPECTED_ROUTES.filter((route) => !DOMAIN_ROUTES.includes(route) && !['/app/work/agents', '/app/work/artifacts', '/app/work/assignments', '/app/work/events', '/app/work/executions'].includes(route)), + '/app/market', + '/app/work/entity-overview', ...EXPECTED_SUPPORT_ROUTES, ].sort(); expect(ADMIN_ROUTES.map((route) => route.pattern).sort()).toEqual(EXPECTED_ROUTES); diff --git a/tests/contract/team-management/team-management-architecture.test.ts b/tests/contract/team-management/team-management-architecture.test.ts index 4a57667d..aa8a9051 100644 --- a/tests/contract/team-management/team-management-architecture.test.ts +++ b/tests/contract/team-management/team-management-architecture.test.ts @@ -73,7 +73,7 @@ describe('team management architecture audit', () => { const overviewHeader = overview.slice(overview.indexOf('(?:Settings|Members) Date: Wed, 5 Aug 2026 14:03:42 -0400 Subject: [PATCH 054/315] test(tests): fix CI gates and prepare TreeDX performance work Intent: - Save hint: fix CI gates and prepare TreeDX performance work for staging Changes: - Updates 1 file across tests: 1. - Touches tests/contract/focus-command/agent-lab-monitoring.test.ts. - Plans package version/tag 0.12.59-dev.treedx-perf.20260805T075847Z for @treeseed/admin. --- .../focus-command/agent-lab-monitoring.test.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/tests/contract/focus-command/agent-lab-monitoring.test.ts b/tests/contract/focus-command/agent-lab-monitoring.test.ts index 876aa7f6..7aa1e268 100644 --- a/tests/contract/focus-command/agent-lab-monitoring.test.ts +++ b/tests/contract/focus-command/agent-lab-monitoring.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from 'node:fs'; import { describe, expect, it } from 'vitest'; const source = (path: string) => readFileSync(path, 'utf8'); -const secondaryRoutes = ['agents.astro', 'workdays.astro', 'events.astro', 'assignments.astro', 'executions.astro', 'artifacts.astro']; +const entityRoutes = ['agents', 'events', 'assignments', 'executions', 'artifacts']; const navigatorRoutes = ['inbox', 'decisions', 'build', 'direction', 'results', 'find']; describe('Agent Lab command header and navigator', () => { @@ -14,7 +14,15 @@ describe('Agent Lab command header and navigator', () => { for (const path of ['src/pages/app/work/index.astro', 'src/pages/app/work/[runId].astro', 'src/components/agent-lab/AgentLabEntityPage.astro']) { const page = source(path); expect(page).toContain('AgentLabChrome'); expect(page).not.toMatch(/ { From 71c12190d6af1d89eee9bb83e252d18e6b78a1d9 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Wed, 5 Aug 2026 14:42:14 -0400 Subject: [PATCH 055/315] build(build): unify Agent Lab monitor dock background Intent: - Save hint: unify Agent Lab monitor dock background Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.staging.20260804T171053Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/ui: github:treeseed-ai/ui#f6e288766bc68543f7dee46cdd36114dc5349bc9 -> github:treeseed-ai/ui#2ee40891453e39d5cf6e932c29a8fd72f63c8c7e - dependencies.@treeseed/core: github:treeseed-ai/core#1678ab6ffc542c6b23a575e328c00e13bf8d85ba -> github:treeseed-ai/core#22cc15d2be97abb13b19e2cd03397fafec51333b --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 10169dda..b32c9b1b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,9 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#1678ab6ffc542c6b23a575e328c00e13bf8d85ba", + "@treeseed/core": "github:treeseed-ai/core#22cc15d2be97abb13b19e2cd03397fafec51333b", "@treeseed/sdk": "github:treeseed-ai/sdk#6f73e58d221f70f2067f52e3f35bfb6f7c19e2b5", - "@treeseed/ui": "github:treeseed-ai/ui#f6e288766bc68543f7dee46cdd36114dc5349bc9", + "@treeseed/ui": "github:treeseed-ai/ui#2ee40891453e39d5cf6e932c29a8fd72f63c8c7e", "react": "^19.2.5", "react-dom": "^19.2.6" }, @@ -6932,7 +6932,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.staging.20260804T171000Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#1678ab6ffc542c6b23a575e328c00e13bf8d85ba", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#22cc15d2be97abb13b19e2cd03397fafec51333b", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6944,7 +6944,7 @@ "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", "@treeseed/sdk": "github:treeseed-ai/sdk#6f73e58d221f70f2067f52e3f35bfb6f7c19e2b5", - "@treeseed/ui": "github:treeseed-ai/ui#f6e288766bc68543f7dee46cdd36114dc5349bc9", + "@treeseed/ui": "github:treeseed-ai/ui#2ee40891453e39d5cf6e932c29a8fd72f63c8c7e", "astro": "^5.6.1", "esbuild": "^0.28.0", "katex": "^0.16.22", @@ -9645,7 +9645,7 @@ }, "node_modules/@treeseed/ui": { "version": "0.12.18-dev.staging.20260804T170811Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#f6e288766bc68543f7dee46cdd36114dc5349bc9", + "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#2ee40891453e39d5cf6e932c29a8fd72f63c8c7e", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", diff --git a/package.json b/package.json index 60bbe930..4fe65b1c 100644 --- a/package.json +++ b/package.json @@ -49,9 +49,9 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#1678ab6ffc542c6b23a575e328c00e13bf8d85ba", + "@treeseed/core": "github:treeseed-ai/core#22cc15d2be97abb13b19e2cd03397fafec51333b", "@treeseed/sdk": "github:treeseed-ai/sdk#6f73e58d221f70f2067f52e3f35bfb6f7c19e2b5", - "@treeseed/ui": "github:treeseed-ai/ui#f6e288766bc68543f7dee46cdd36114dc5349bc9", + "@treeseed/ui": "github:treeseed-ai/ui#2ee40891453e39d5cf6e932c29a8fd72f63c8c7e", "react": "^19.2.5", "react-dom": "^19.2.6" }, From 4d05fe3a6ada218cfe2e83af5666b06b4223cd5b Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Wed, 5 Aug 2026 14:58:29 -0400 Subject: [PATCH 056/315] build(tests): repair standalone CI dependency closure and branch Intent: - Save hint: repair standalone CI dependency closure and branch inspection Changes: - Updates 5 files across tests: 3, build: 2. - Touches package-lock.json, package.json, tests/contract/contextual-help/contextual-help-architecture.test.ts, tests/contract/knowledge-management/knowledge-management-architecture.test.ts, tests/contract/service-management/service-management-architecture.test.ts. - Plans package version/tag 0.12.59-dev.treedx-perf.20260805T075847Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#b963e17efb46a5f02f0906aa8e54efadaf076974 -> github:treeseed-ai/sdk#77917b6c8e3b6b06fae1689e38ce508895faff16 - dependencies.@treeseed/core: github:treeseed-ai/core#d2e5c1af24ff7953bef36ec55f448aab4581f554 -> github:treeseed-ai/core#6748b7204c243455796ba26857fc8da2ddae67f5 --- package-lock.json | 10 +++++----- package.json | 4 ++-- .../contextual-help-architecture.test.ts | 18 ++++++++++-------- .../knowledge-management-architecture.test.ts | 11 ++++++----- .../service-management-architecture.test.ts | 5 +++-- 5 files changed, 26 insertions(+), 22 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7579ddc8..0dd558c9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#d2e5c1af24ff7953bef36ec55f448aab4581f554", - "@treeseed/sdk": "github:treeseed-ai/sdk#b963e17efb46a5f02f0906aa8e54efadaf076974", + "@treeseed/core": "github:treeseed-ai/core#6748b7204c243455796ba26857fc8da2ddae67f5", + "@treeseed/sdk": "github:treeseed-ai/sdk#77917b6c8e3b6b06fae1689e38ce508895faff16", "@treeseed/ui": "github:treeseed-ai/ui#e4c7a0896fa6d49b183d2729150eb598084c6c35", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -6932,7 +6932,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.treedx-perf.20260805T075816Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#d2e5c1af24ff7953bef36ec55f448aab4581f554", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#6748b7204c243455796ba26857fc8da2ddae67f5", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6943,7 +6943,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#b963e17efb46a5f02f0906aa8e54efadaf076974", + "@treeseed/sdk": "github:treeseed-ai/sdk#77917b6c8e3b6b06fae1689e38ce508895faff16", "@treeseed/ui": "github:treeseed-ai/ui#e4c7a0896fa6d49b183d2729150eb598084c6c35", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8948,7 +8948,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.treedx-perf.20260805T073639Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#b963e17efb46a5f02f0906aa8e54efadaf076974", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#77917b6c8e3b6b06fae1689e38ce508895faff16", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index 1781f46d..a3a3f2fa 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#d2e5c1af24ff7953bef36ec55f448aab4581f554", - "@treeseed/sdk": "github:treeseed-ai/sdk#b963e17efb46a5f02f0906aa8e54efadaf076974", + "@treeseed/core": "github:treeseed-ai/core#6748b7204c243455796ba26857fc8da2ddae67f5", + "@treeseed/sdk": "github:treeseed-ai/sdk#77917b6c8e3b6b06fae1689e38ce508895faff16", "@treeseed/ui": "github:treeseed-ai/ui#e4c7a0896fa6d49b183d2729150eb598084c6c35", "react": "^19.2.5", "react-dom": "^19.2.6" diff --git a/tests/contract/contextual-help/contextual-help-architecture.test.ts b/tests/contract/contextual-help/contextual-help-architecture.test.ts index e4f81997..c4ae022a 100644 --- a/tests/contract/contextual-help/contextual-help-architecture.test.ts +++ b/tests/contract/contextual-help/contextual-help-architecture.test.ts @@ -5,6 +5,7 @@ import { describe, expect, it } from 'vitest'; const root = resolve(import.meta.dirname, '../../..'); const read = (path: string) => readFileSync(resolve(root, path), 'utf8'); +const readDependency = (name: string, path: string) => readFileSync(resolve(root, 'node_modules', name, path), 'utf8'); const pages = loadKnowledgeCatalog(resolve(root, 'docs/src/content/knowledge'), '@treeseed/admin'); const pageIds = new Set(pages.map((page) => page.id)); @@ -28,11 +29,12 @@ describe('Admin contextual help architecture', () => { it('resolves every local help trigger to the canonical Markdown catalog', () => { const sources = [ - '../ui/src/astro/account/AccountDeletionPanel.astro', - '../ui/src/astro/account/AccountIdentitySettings.astro', - '../ui/src/astro/account/AccountTimeZoneSettings.astro', - '../ui/src/astro/account/NotificationPreferencePanel.astro', - '../ui/src/astro/account/PersonalThemeManager.astro', + 'AccountDeletionPanel.astro', + 'AccountIdentitySettings.astro', + 'AccountTimeZoneSettings.astro', + 'NotificationPreferencePanel.astro', + 'PersonalThemeManager.astro', + ].map((path) => readDependency('@treeseed/ui', `dist/astro/account/${path}`)).concat([ 'src/pages/app/teams/index.astro', 'src/pages/app/teams/new.astro', 'src/pages/app/teams/[teamId]/index.astro', @@ -43,7 +45,7 @@ describe('Admin contextual help architecture', () => { 'src/pages/app/services/new.astro', 'src/pages/app/services/[connectionId].astro', 'src/pages/app/services/vault.astro', - ].map(read).join('\n'); + ].map(read)).join('\n'); const literalIds = [...sources.matchAll(/knowledgePageId="([^"]+)"/gu)].map((match) => match[1]); expect(literalIds.length).toBeGreaterThan(20); for (const id of literalIds) expect(pageIds.has(id), `${id} must be published`).toBe(true); @@ -60,9 +62,9 @@ describe('Admin contextual help architecture', () => { }); it('has one shared dialog transport and no legacy help implementation', () => { - const uiPackage = read('../ui/package.json'); + const uiPackage = readDependency('@treeseed/ui', 'package.json'); const helpContext = read('src/lib/help/context.ts'); - const providerContracts = read('../sdk/src/secrets-capability/service-provider-contracts.ts'); + const providerContracts = readDependency('@treeseed/sdk', 'dist/secrets-capability/service-provider-contracts.js'); for (const legacy of ['HelpDrawer', 'HelpPopover', 'ContextualHelpPanel', 'ContentFieldHelp']) { expect(uiPackage).not.toContain(legacy); } diff --git a/tests/contract/knowledge-management/knowledge-management-architecture.test.ts b/tests/contract/knowledge-management/knowledge-management-architecture.test.ts index e9e8db24..1ec8a411 100644 --- a/tests/contract/knowledge-management/knowledge-management-architecture.test.ts +++ b/tests/contract/knowledge-management/knowledge-management-architecture.test.ts @@ -4,6 +4,7 @@ import { describe, expect, it } from 'vitest'; const root = resolve(import.meta.dirname, '../../..'); const source = (path: string) => readFileSync(resolve(root, path), 'utf8'); +const dependencySource = (name: string, path: string) => readFileSync(resolve(root, 'node_modules', name, path), 'utf8'); describe('knowledge management architecture', () => { it('composes the workbench exclusively from shared UI knowledge primitives', () => { @@ -35,24 +36,24 @@ describe('knowledge management architecture', () => { expect(page).toContain('!canManageBooks ? null'); expect(page).toContain("(canReview || canPublish) && Astro.url.searchParams.get('view') === 'reviews'"); expect(page).toContain("canBuildPacks && Astro.url.searchParams.get('view') === 'packs'"); - const form = source('../ui/src/astro/knowledge/KnowledgeAuthoringForm.astro'); + const form = dependencySource('@treeseed/ui', 'dist/astro/knowledge/KnowledgeAuthoringForm.astro'); expect(form).not.toContain('name="status"'); expect(form).toContain('data-scene="knowledge.editor.form"'); - const reviews = source('../ui/src/astro/knowledge/KnowledgeReviewCollection.astro'); + const reviews = dependencySource('@treeseed/ui', 'dist/astro/knowledge/KnowledgeReviewCollection.astro'); expect(reviews).toContain('knowledge.review.decision'); expect(reviews).toContain('data-review-paths'); expect(reviews).toContain('data-review-decision'); expect(reviews).toContain('knowledge.review.editorial'); expect(form).toContain('name="audiencesPrimary"'); expect(form).toContain('name="contextDigest"'); - expect(source('../ui/src/astro/knowledge/KnowledgePackWorkbench.astro')).toContain('knowledge.pack.build'); - const lifecycle = source('../ui/src/astro/knowledge/KnowledgeLifecyclePanel.astro'); + expect(dependencySource('@treeseed/ui', 'dist/astro/knowledge/KnowledgePackWorkbench.astro')).toContain('knowledge.pack.build'); + const lifecycle = dependencySource('@treeseed/ui', 'dist/astro/knowledge/KnowledgeLifecyclePanel.astro'); expect(lifecycle).toContain('href: item.resolutionHref'); expect(lifecycle).toContain('disabled={dependencyItems.length > 0}'); }); it('uses one canonical reader and knowledge-backed contextual help', () => { - expect(source('../core/src/pages/t/[teamSlug]/books/[bookSlug]/[...pageSlug].astro')).toContain('StarlightPage'); + expect(dependencySource('@treeseed/core', 'dist/pages/t/[teamSlug]/books/[bookSlug]/[...pageSlug].astro')).toContain('StarlightPage'); expect(source('src/lib/help/context.ts')).toContain('/v1/knowledge/pages/'); expect(source('src/lib/help/context.ts')).not.toContain('/v1/help/'); }); diff --git a/tests/contract/service-management/service-management-architecture.test.ts b/tests/contract/service-management/service-management-architecture.test.ts index 1c664506..3c1393ab 100644 --- a/tests/contract/service-management/service-management-architecture.test.ts +++ b/tests/contract/service-management/service-management-architecture.test.ts @@ -4,6 +4,7 @@ import { describe, expect, it } from 'vitest'; const root = resolve(import.meta.dirname, '../../..'); const read = (path: string) => readFileSync(resolve(root, path), 'utf8'); +const readDependency = (name: string, path: string) => readFileSync(resolve(root, 'node_modules', name, path), 'utf8'); describe('service management architecture', () => { it('owns one provider-first route family with no legacy host route', () => { @@ -73,8 +74,8 @@ describe('service management architecture', () => { }); it('does not expose the removed shared-passphrase or hardcoded host permission components', () => { - const layout = read('../ui/src/astro/layouts/AppLayout.astro'); - const uiPackage = read('../ui/package.json'); + const layout = readDependency('@treeseed/ui', 'dist/astro/layouts/AppLayout.astro'); + const uiPackage = readDependency('@treeseed/ui', 'package.json'); expect(layout).not.toContain('SensitiveDataUnlock'); expect(uiPackage).not.toContain('SensitiveDataUnlock'); expect(uiPackage).not.toContain('HostCredentialPermissionNote'); From 7153718b7ab679596d5ddd6d076dcf56a7188ae3 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Wed, 5 Aug 2026 15:14:38 -0400 Subject: [PATCH 057/315] build(build): add scoped content workspace appearance palettes Intent: - Save hint: add scoped content workspace appearance palettes Changes: - Updates 7 files across build: 2, ui: 2, config: 1, docs: 1, source: 1. - Touches docs/src/content/knowledge/treeseed-accounts-and-identity/appearance.md, guarantees/user/account/manage-appearance.guarantee.yaml, package-lock.json, package.json, src/layouts/AppLayout.astro, src/lib/auth/accounts/appearance.ts, .... - Plans package version/tag 0.12.59-dev.staging.20260804T171053Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/ui: github:treeseed-ai/ui#2ee40891453e39d5cf6e932c29a8fd72f63c8c7e -> github:treeseed-ai/ui#a54379ece03509225fc0bca226fbb191038b98da - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#6f73e58d221f70f2067f52e3f35bfb6f7c19e2b5 -> github:treeseed-ai/sdk#db7f2383023b337a4586dae62c12f130039b1d53 - dependencies.@treeseed/core: github:treeseed-ai/core#22cc15d2be97abb13b19e2cd03397fafec51333b -> github:treeseed-ai/core#d8b6bf8509625ce2aa59939aa1710b6cacea5e33 --- .../appearance.md | 4 ++++ .../account/manage-appearance.guarantee.yaml | 5 +++-- package-lock.json | 16 +++++++-------- package.json | 6 +++--- src/layouts/AppLayout.astro | 8 +++++++- src/lib/auth/accounts/appearance.ts | 20 ++++++++++--------- src/pages/app/account/appearance.astro | 2 +- 7 files changed, 37 insertions(+), 24 deletions(-) diff --git a/docs/src/content/knowledge/treeseed-accounts-and-identity/appearance.md b/docs/src/content/knowledge/treeseed-accounts-and-identity/appearance.md index a14308d1..92f1645e 100644 --- a/docs/src/content/knowledge/treeseed-accounts-and-identity/appearance.md +++ b/docs/src/content/knowledge/treeseed-accounts-and-identity/appearance.md @@ -43,4 +43,8 @@ Built-in themes are maintained by TreeSeed. Personal themes let you derive a reu Creating or editing a personal theme does not activate it automatically. Choose the active theme from the application header. +The same selector can enable **Content theme overlay**. It gives the application content workspace an independent scheme and mode while leaving the header, team navigation, documentation, feedback, help, and account controls on the normal application appearance. Choose **Match application** to follow the shell's light or dark mode, or select a fixed or system-driven content mode. + +The overlay does not make interface elements translucent. Workspace backgrounds blend toward the selected scheme while text, focus indicators, actions, and status colors remain fully opaque and contrast-safe. Content command overlays use the workspace palette too. + On the appearance page, changing the active theme reloads the page once so the editor and application shell use the same saved palette. Check both light and dark palettes for readable contrast before relying on a custom theme. diff --git a/guarantees/user/account/manage-appearance.guarantee.yaml b/guarantees/user/account/manage-appearance.guarantee.yaml index d581b24d..8e012748 100644 --- a/guarantees/user/account/manage-appearance.guarantee.yaml +++ b/guarantees/user/account/manage-appearance.guarantee.yaml @@ -5,7 +5,7 @@ type: user subtype: account journey: Manage Appearance ownerPackage: "@treeseed/admin" -summary: Set theme and interface preferences for the admin shell; should use reusable UI/theme tokens and persist per user where available. +summary: Set persistent application and independently scoped content-workspace appearance preferences with reusable accessible UI theme tokens. status: active dependencies: journeys: @@ -70,7 +70,8 @@ evidence: optional: - mailpit_message notes: - - Set theme and interface preferences for the admin shell; should use reusable UI/theme tokens and persist per user where available. + - Application appearance and the optional content workspace scheme and mode persist per user. + - The content workspace palette applies to ControlSurface and content overlays without changing persistent shell utilities or fading readable tokens. surface: admin-ui run: timeoutSeconds: 300 diff --git a/package-lock.json b/package-lock.json index b32c9b1b..8316e257 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,9 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#22cc15d2be97abb13b19e2cd03397fafec51333b", - "@treeseed/sdk": "github:treeseed-ai/sdk#6f73e58d221f70f2067f52e3f35bfb6f7c19e2b5", - "@treeseed/ui": "github:treeseed-ai/ui#2ee40891453e39d5cf6e932c29a8fd72f63c8c7e", + "@treeseed/core": "github:treeseed-ai/core#d8b6bf8509625ce2aa59939aa1710b6cacea5e33", + "@treeseed/sdk": "github:treeseed-ai/sdk#db7f2383023b337a4586dae62c12f130039b1d53", + "@treeseed/ui": "github:treeseed-ai/ui#a54379ece03509225fc0bca226fbb191038b98da", "react": "^19.2.5", "react-dom": "^19.2.6" }, @@ -6932,7 +6932,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.staging.20260804T171000Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#22cc15d2be97abb13b19e2cd03397fafec51333b", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#d8b6bf8509625ce2aa59939aa1710b6cacea5e33", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6943,8 +6943,8 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#6f73e58d221f70f2067f52e3f35bfb6f7c19e2b5", - "@treeseed/ui": "github:treeseed-ai/ui#2ee40891453e39d5cf6e932c29a8fd72f63c8c7e", + "@treeseed/sdk": "github:treeseed-ai/sdk#db7f2383023b337a4586dae62c12f130039b1d53", + "@treeseed/ui": "github:treeseed-ai/ui#a54379ece03509225fc0bca226fbb191038b98da", "astro": "^5.6.1", "esbuild": "^0.28.0", "katex": "^0.16.22", @@ -8948,7 +8948,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.staging.20260804T170912Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#6f73e58d221f70f2067f52e3f35bfb6f7c19e2b5", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#db7f2383023b337a4586dae62c12f130039b1d53", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", @@ -9645,7 +9645,7 @@ }, "node_modules/@treeseed/ui": { "version": "0.12.18-dev.staging.20260804T170811Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#2ee40891453e39d5cf6e932c29a8fd72f63c8c7e", + "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#a54379ece03509225fc0bca226fbb191038b98da", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", diff --git a/package.json b/package.json index 4fe65b1c..4b12a507 100644 --- a/package.json +++ b/package.json @@ -49,9 +49,9 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#22cc15d2be97abb13b19e2cd03397fafec51333b", - "@treeseed/sdk": "github:treeseed-ai/sdk#6f73e58d221f70f2067f52e3f35bfb6f7c19e2b5", - "@treeseed/ui": "github:treeseed-ai/ui#2ee40891453e39d5cf6e932c29a8fd72f63c8c7e", + "@treeseed/core": "github:treeseed-ai/core#d8b6bf8509625ce2aa59939aa1710b6cacea5e33", + "@treeseed/sdk": "github:treeseed-ai/sdk#db7f2383023b337a4586dae62c12f130039b1d53", + "@treeseed/ui": "github:treeseed-ai/ui#a54379ece03509225fc0bca226fbb191038b98da", "react": "^19.2.5", "react-dom": "^19.2.6" }, diff --git a/src/layouts/AppLayout.astro b/src/layouts/AppLayout.astro index fcb3b4a7..7dad2791 100644 --- a/src/layouts/AppLayout.astro +++ b/src/layouts/AppLayout.astro @@ -182,7 +182,13 @@ const feedbackContext = principal ? { init: { method: 'PATCH', headers: { accept: 'application/json', 'content-type': 'application/json', 'x-treeseed-csrf': document.cookie.split('; ').find((entry) => entry.startsWith('ts_csrf='))?.split('=').slice(1).join('=') || '' }, - body: JSON.stringify({ colorScheme: detail.scheme, themeMode: detail.mode }), + body: JSON.stringify({ + colorScheme: detail.scheme, + themeMode: detail.mode, + contentThemeOverlayEnabled: detail.workspace?.enabled === true, + contentThemeOverlayScheme: detail.workspace?.scheme, + contentThemeOverlayMode: detail.workspace?.mode, + }), keepalive: true, }, }).then((response) => { diff --git a/src/lib/auth/accounts/appearance.ts b/src/lib/auth/accounts/appearance.ts index acca6278..1f4ee715 100644 --- a/src/lib/auth/accounts/appearance.ts +++ b/src/lib/auth/accounts/appearance.ts @@ -1,5 +1,7 @@ import { + normalizeAppearancePreference, normalizeThemePreference, + type AppearancePreference, type ThemePreference, } from '@treeseed/ui/theme'; import type { APIContext } from 'astro'; @@ -54,17 +56,17 @@ export function setAnonymousThemeCookies( context.cookies.set(THEME_MODE_COOKIE, preference.mode, options); } -function appearanceFromPrincipal(context: Pick): ThemePreference | null { +function appearanceFromPrincipal(context: Pick): AppearancePreference | null { const principal = context.locals.auth?.principal; const appearance = principal?.metadata?.appearance; if (!appearance || typeof appearance !== 'object') return null; - return normalizeThemePreference(appearance); + return normalizeAppearancePreference(appearance); } -export function themePreferenceFromPrincipal(principal: { metadata?: Record | null } | null | undefined): ThemePreference | null { +export function themePreferenceFromPrincipal(principal: { metadata?: Record | null } | null | undefined): AppearancePreference | null { const appearance = principal?.metadata?.appearance; if (!appearance || typeof appearance !== 'object') return null; - return normalizeThemePreference(appearance); + return normalizeAppearancePreference(appearance); } export function setPrincipalThemeCookies( @@ -77,19 +79,19 @@ export function setPrincipalThemeCookies( return preference; } -export async function resolveAuthenticatedThemePreference(context: AppearanceContext): Promise { - return appearanceFromPrincipal(context) ?? resolveAnonymousThemePreference(context); +export async function resolveAuthenticatedThemePreference(context: AppearanceContext): Promise { + return appearanceFromPrincipal(context) ?? normalizeAppearancePreference(resolveAnonymousThemePreference(context)); } export async function resolveUserThemePreference( context: AppearanceContext, userId: string, -): Promise { +): Promise { const principal = context.locals.auth?.principal; if (principal?.id === userId) { - return appearanceFromPrincipal(context) ?? resolveAnonymousThemePreference(context); + return appearanceFromPrincipal(context) ?? normalizeAppearancePreference(resolveAnonymousThemePreference(context)); } - return resolveAnonymousThemePreference(context); + return normalizeAppearancePreference(resolveAnonymousThemePreference(context)); } export async function setUserThemeCookies( diff --git a/src/pages/app/account/appearance.astro b/src/pages/app/account/appearance.astro index 28b878fd..fd1c27af 100644 --- a/src/pages/app/account/appearance.astro +++ b/src/pages/app/account/appearance.astro @@ -16,6 +16,6 @@ const [themes, appearance] = await Promise.all([frame.api.personalThemes(), reso - + From 1fa434def13756c8e201971ec760437fd3d3c71f Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Wed, 5 Aug 2026 16:11:18 -0400 Subject: [PATCH 058/315] build(build): publish verified CI recovery chain Intent: - Save hint: publish verified CI recovery chain Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.treedx-perf.20260805T075847Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#77917b6c8e3b6b06fae1689e38ce508895faff16 -> github:treeseed-ai/sdk#8961c5ad8ffac14af1bedb7cc30bb62f2990d35c - dependencies.@treeseed/core: github:treeseed-ai/core#95afe8a48fab55bc1e5b8c4cb5c7b8e338d21624 -> github:treeseed-ai/core#42e778c80191e6f1733278a3b40bf2639fad5275 --- package-lock.json | 131 +++++++++++++++++++++++++++++++++++++++++++--- package.json | 4 +- 2 files changed, 127 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0dd558c9..70245e93 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#6748b7204c243455796ba26857fc8da2ddae67f5", - "@treeseed/sdk": "github:treeseed-ai/sdk#77917b6c8e3b6b06fae1689e38ce508895faff16", + "@treeseed/core": "github:treeseed-ai/core#42e778c80191e6f1733278a3b40bf2639fad5275", + "@treeseed/sdk": "github:treeseed-ai/sdk#8961c5ad8ffac14af1bedb7cc30bb62f2990d35c", "@treeseed/ui": "github:treeseed-ai/ui#e4c7a0896fa6d49b183d2729150eb598084c6c35", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -6932,7 +6932,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.treedx-perf.20260805T075816Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#6748b7204c243455796ba26857fc8da2ddae67f5", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#42e778c80191e6f1733278a3b40bf2639fad5275", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6943,7 +6943,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#77917b6c8e3b6b06fae1689e38ce508895faff16", + "@treeseed/sdk": "github:treeseed-ai/sdk#8961c5ad8ffac14af1bedb7cc30bb62f2990d35c", "@treeseed/ui": "github:treeseed-ai/ui#e4c7a0896fa6d49b183d2729150eb598084c6c35", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8948,7 +8948,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.treedx-perf.20260805T073639Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#77917b6c8e3b6b06fae1689e38ce508895faff16", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#8961c5ad8ffac14af1bedb7cc30bb62f2990d35c", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", @@ -8962,7 +8962,8 @@ "github-slugger": "^2.0.0", "hono": "^4.8.2", "ink": "^7.0.0", - "libsodium-wrappers": "^0.7.15", + "libsodium-wrappers": "0.7.15", + "libsodium-wrappers-sumo": "0.7.15", "mdast-util-to-string": "^4.0.0", "minisearch": "^7.2.0", "octokit": "^5.0.3", @@ -21956,6 +21957,124 @@ "type": "github", "url": "https://github.com/sponsors/wooorm" } + }, + "node_modules/libsodium-wrappers-sumo": { + "version": "0.7.15", + "resolved": "https://registry.npmjs.org/libsodium-wrappers-sumo/-/libsodium-wrappers-sumo-0.7.15.tgz", + "integrity": "sha512-aSWY8wKDZh5TC7rMvEdTHoyppVq/1dTSAeAR7H6pzd6QRT3vQWcT5pGwCotLcpPEOLXX6VvqihSPkpEhYAjANA==", + "license": "ISC", + "dependencies": { + "libsodium-sumo": "^0.7.15" + } + }, + "node_modules/libsodium-sumo": { + "version": "0.7.15", + "resolved": "https://registry.npmjs.org/libsodium-sumo/-/libsodium-sumo-0.7.15.tgz", + "integrity": "sha512-5tPmqPmq8T8Nikpm1Nqj0hBHvsLFCXvdhBFV7SGOitQPZAA6jso8XoL0r4L7vmfKXr486fiQInvErHtEvizFMw==", + "license": "ISC" + }, + "node_modules/@astrojs/cloudflare": { + "version": "12.6.13", + "resolved": "https://registry.npmjs.org/@astrojs/cloudflare/-/cloudflare-12.6.13.tgz", + "integrity": "sha512-oKaCyiovyQr183r9U93787Ju1zwk+rRMgPnLTwCLckHmOUK7sltA1Gp4LSGt8oNMgqQS6jR7uRdfQ/NPul37QA==", + "license": "MIT", + "dependencies": { + "@astrojs/internal-helpers": "0.7.6", + "@astrojs/underscore-redirects": "1.0.0", + "@cloudflare/workers-types": "^4.20260116.0", + "tinyglobby": "^0.2.15", + "vite": "^6.4.1", + "wrangler": "4.59.2" + }, + "peerDependencies": { + "astro": "^5.7.0" + } + }, + "node_modules/@astrojs/mdx": { + "version": "4.3.14", + "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-4.3.14.tgz", + "integrity": "sha512-FBrqJQORVm+rkRa2TS5CjU9PBA6hkhrwLVBSS9A77gN2+iehvjq1w6yya/d0YKC7osiVorKkr3Qd9wNbl0ZkGA==", + "license": "MIT", + "dependencies": { + "@astrojs/markdown-remark": "6.3.11", + "@mdx-js/mdx": "^3.1.1", + "acorn": "^8.15.0", + "es-module-lexer": "^1.7.0", + "estree-util-visit": "^2.0.0", + "hast-util-to-html": "^9.0.5", + "piccolore": "^0.1.3", + "rehype-raw": "^7.0.0", + "remark-gfm": "^4.0.1", + "remark-smartypants": "^3.0.2", + "source-map": "^0.7.6", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.3" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + }, + "peerDependencies": { + "astro": "^5.0.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/@astrojs/starlight": { + "version": "0.37.6", + "resolved": "https://registry.npmjs.org/@astrojs/starlight/-/starlight-0.37.6.tgz", + "integrity": "sha512-wQrKwH431q+8FsLBnNQeG+R36TMtEGxTQ2AuiVpcx9APcazvL3n7wVW8mMmYyxX0POjTnxlcWPkdMGR3Yj1L+w==", + "license": "MIT", + "dependencies": { + "@astrojs/markdown-remark": "^6.3.1", + "@astrojs/mdx": "^4.2.3", + "@astrojs/sitemap": "^3.3.0", + "@pagefind/default-ui": "^1.3.0", + "@types/hast": "^3.0.4", + "@types/js-yaml": "^4.0.9", + "@types/mdast": "^4.0.4", + "astro-expressive-code": "^0.41.1", + "bcp-47": "^2.1.0", + "hast-util-from-html": "^2.0.1", + "hast-util-select": "^6.0.2", + "hast-util-to-string": "^3.0.0", + "hastscript": "^9.0.0", + "i18next": "^23.11.5", + "js-yaml": "^4.1.0", + "klona": "^2.0.6", + "magic-string": "^0.30.17", + "mdast-util-directive": "^3.0.0", + "mdast-util-to-markdown": "^2.1.0", + "mdast-util-to-string": "^4.0.0", + "pagefind": "^1.3.0", + "rehype": "^13.0.1", + "rehype-format": "^5.0.0", + "remark-directive": "^3.0.0", + "ultrahtml": "^1.6.0", + "unified": "^11.0.5", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.2" + }, + "peerDependencies": { + "astro": "^5.5.0" + } } } } diff --git a/package.json b/package.json index a3a3f2fa..976a081e 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#6748b7204c243455796ba26857fc8da2ddae67f5", - "@treeseed/sdk": "github:treeseed-ai/sdk#77917b6c8e3b6b06fae1689e38ce508895faff16", + "@treeseed/core": "github:treeseed-ai/core#42e778c80191e6f1733278a3b40bf2639fad5275", + "@treeseed/sdk": "github:treeseed-ai/sdk#8961c5ad8ffac14af1bedb7cc30bb62f2990d35c", "@treeseed/ui": "github:treeseed-ai/ui#e4c7a0896fa6d49b183d2729150eb598084c6c35", "react": "^19.2.5", "react-dom": "^19.2.6" From cfc2d9a14c4908ab4529e990870548df2fa43f54 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Wed, 5 Aug 2026 16:19:00 -0400 Subject: [PATCH 059/315] build(build): reconcile exact and clean package lock metadata Intent: - Save hint: reconcile exact and clean package lock metadata Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.treedx-perf.20260805T075847Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#8961c5ad8ffac14af1bedb7cc30bb62f2990d35c -> github:treeseed-ai/sdk#06e805d2c8f92aa697dcf1a2dedbe78551b70684 - dependencies.@treeseed/core: github:treeseed-ai/core#42e778c80191e6f1733278a3b40bf2639fad5275 -> github:treeseed-ai/core#e8e3dcb1533ddd5c542e21814d673777936e272e --- package-lock.json | 24 ++++++++++++------------ package.json | 4 ++-- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index 70245e93..06c47c7b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#42e778c80191e6f1733278a3b40bf2639fad5275", - "@treeseed/sdk": "github:treeseed-ai/sdk#8961c5ad8ffac14af1bedb7cc30bb62f2990d35c", + "@treeseed/core": "github:treeseed-ai/core#e8e3dcb1533ddd5c542e21814d673777936e272e", + "@treeseed/sdk": "github:treeseed-ai/sdk#06e805d2c8f92aa697dcf1a2dedbe78551b70684", "@treeseed/ui": "github:treeseed-ai/ui#e4c7a0896fa6d49b183d2729150eb598084c6c35", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -5814,9 +5814,9 @@ } }, "node_modules/@rolldown/pluginutils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", "license": "MIT" }, "node_modules/@rollup/pluginutils": { @@ -6932,7 +6932,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.treedx-perf.20260805T075816Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#42e778c80191e6f1733278a3b40bf2639fad5275", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#e8e3dcb1533ddd5c542e21814d673777936e272e", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6943,7 +6943,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#8961c5ad8ffac14af1bedb7cc30bb62f2990d35c", + "@treeseed/sdk": "github:treeseed-ai/sdk#06e805d2c8f92aa697dcf1a2dedbe78551b70684", "@treeseed/ui": "github:treeseed-ai/ui#e4c7a0896fa6d49b183d2729150eb598084c6c35", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8948,7 +8948,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.treedx-perf.20260805T073639Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#8961c5ad8ffac14af1bedb7cc30bb62f2990d35c", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#06e805d2c8f92aa697dcf1a2dedbe78551b70684", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", @@ -15336,12 +15336,12 @@ "license": "ISC" }, "node_modules/libsodium-wrappers": { - "version": "0.7.16", - "resolved": "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.16.tgz", - "integrity": "sha512-Gtr/WBx4dKjvRL1pvfwZqu7gO6AfrQ0u9vFL+kXihtHf6NfkROR8pjYWn98MFDI3jN19Ii1ZUfPR9afGiPyfHg==", + "version": "0.7.15", + "resolved": "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.15.tgz", + "integrity": "sha512-E4anqJQwcfiC6+Yrl01C1m8p99wEhLmJSs0VQqST66SbQXXBoaJY0pF4BNjRYa/sOQAxx6lXAaAFIlx+15tXJQ==", "license": "ISC", "dependencies": { - "libsodium": "^0.7.16" + "libsodium": "^0.7.15" } }, "node_modules/lightningcss": { diff --git a/package.json b/package.json index 976a081e..9f18373e 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#42e778c80191e6f1733278a3b40bf2639fad5275", - "@treeseed/sdk": "github:treeseed-ai/sdk#8961c5ad8ffac14af1bedb7cc30bb62f2990d35c", + "@treeseed/core": "github:treeseed-ai/core#e8e3dcb1533ddd5c542e21814d673777936e272e", + "@treeseed/sdk": "github:treeseed-ai/sdk#06e805d2c8f92aa697dcf1a2dedbe78551b70684", "@treeseed/ui": "github:treeseed-ai/ui#e4c7a0896fa6d49b183d2729150eb598084c6c35", "react": "^19.2.5", "react-dom": "^19.2.6" From 3c246c63fac4886a0249b8831e235d0f63a7bd4d Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Wed, 5 Aug 2026 16:25:57 -0400 Subject: [PATCH 060/315] build(build): enable authoritative post-publication lock resolution Intent: - Save hint: enable authoritative post-publication lock resolution Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.treedx-perf.20260805T075847Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#06e805d2c8f92aa697dcf1a2dedbe78551b70684 -> github:treeseed-ai/sdk#3ea3cb0b903fa4ca79d1f9474db5faa869450017 - dependencies.@treeseed/core: github:treeseed-ai/core#e8e3dcb1533ddd5c542e21814d673777936e272e -> github:treeseed-ai/core#527eb6787624baf004d055423e862f78bef796c0 --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 06c47c7b..814cbb18 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#e8e3dcb1533ddd5c542e21814d673777936e272e", - "@treeseed/sdk": "github:treeseed-ai/sdk#06e805d2c8f92aa697dcf1a2dedbe78551b70684", + "@treeseed/core": "github:treeseed-ai/core#527eb6787624baf004d055423e862f78bef796c0", + "@treeseed/sdk": "github:treeseed-ai/sdk#3ea3cb0b903fa4ca79d1f9474db5faa869450017", "@treeseed/ui": "github:treeseed-ai/ui#e4c7a0896fa6d49b183d2729150eb598084c6c35", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -6932,7 +6932,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.treedx-perf.20260805T075816Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#e8e3dcb1533ddd5c542e21814d673777936e272e", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#527eb6787624baf004d055423e862f78bef796c0", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6943,7 +6943,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#06e805d2c8f92aa697dcf1a2dedbe78551b70684", + "@treeseed/sdk": "github:treeseed-ai/sdk#3ea3cb0b903fa4ca79d1f9474db5faa869450017", "@treeseed/ui": "github:treeseed-ai/ui#e4c7a0896fa6d49b183d2729150eb598084c6c35", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8948,7 +8948,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.treedx-perf.20260805T073639Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#06e805d2c8f92aa697dcf1a2dedbe78551b70684", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#3ea3cb0b903fa4ca79d1f9474db5faa869450017", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index 9f18373e..60e53df4 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#e8e3dcb1533ddd5c542e21814d673777936e272e", - "@treeseed/sdk": "github:treeseed-ai/sdk#06e805d2c8f92aa697dcf1a2dedbe78551b70684", + "@treeseed/core": "github:treeseed-ai/core#527eb6787624baf004d055423e862f78bef796c0", + "@treeseed/sdk": "github:treeseed-ai/sdk#3ea3cb0b903fa4ca79d1f9474db5faa869450017", "@treeseed/ui": "github:treeseed-ai/ui#e4c7a0896fa6d49b183d2729150eb598084c6c35", "react": "^19.2.5", "react-dom": "^19.2.6" From fe80faf7bfa3088c47ddee1c4c5ee532767d3d1b Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Wed, 5 Aug 2026 16:32:27 -0400 Subject: [PATCH 061/315] build(build): validate every published Git dependency lockfile Intent: - Save hint: validate every published Git dependency lockfile Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.treedx-perf.20260805T075847Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#3ea3cb0b903fa4ca79d1f9474db5faa869450017 -> github:treeseed-ai/sdk#f226f3ee13a0b58a59398223ee7130bceefcaecb - dependencies.@treeseed/core: github:treeseed-ai/core#527eb6787624baf004d055423e862f78bef796c0 -> github:treeseed-ai/core#1eddc90f0a1ab47b24de502a8e0785636fa605ad --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 814cbb18..f8f243ca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#527eb6787624baf004d055423e862f78bef796c0", - "@treeseed/sdk": "github:treeseed-ai/sdk#3ea3cb0b903fa4ca79d1f9474db5faa869450017", + "@treeseed/core": "github:treeseed-ai/core#1eddc90f0a1ab47b24de502a8e0785636fa605ad", + "@treeseed/sdk": "github:treeseed-ai/sdk#f226f3ee13a0b58a59398223ee7130bceefcaecb", "@treeseed/ui": "github:treeseed-ai/ui#e4c7a0896fa6d49b183d2729150eb598084c6c35", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -6932,7 +6932,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.treedx-perf.20260805T075816Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#527eb6787624baf004d055423e862f78bef796c0", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#1eddc90f0a1ab47b24de502a8e0785636fa605ad", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6943,7 +6943,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#3ea3cb0b903fa4ca79d1f9474db5faa869450017", + "@treeseed/sdk": "github:treeseed-ai/sdk#f226f3ee13a0b58a59398223ee7130bceefcaecb", "@treeseed/ui": "github:treeseed-ai/ui#e4c7a0896fa6d49b183d2729150eb598084c6c35", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8948,7 +8948,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.treedx-perf.20260805T073639Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#3ea3cb0b903fa4ca79d1f9474db5faa869450017", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#f226f3ee13a0b58a59398223ee7130bceefcaecb", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index 60e53df4..ffe1a410 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#527eb6787624baf004d055423e862f78bef796c0", - "@treeseed/sdk": "github:treeseed-ai/sdk#3ea3cb0b903fa4ca79d1f9474db5faa869450017", + "@treeseed/core": "github:treeseed-ai/core#1eddc90f0a1ab47b24de502a8e0785636fa605ad", + "@treeseed/sdk": "github:treeseed-ai/sdk#f226f3ee13a0b58a59398223ee7130bceefcaecb", "@treeseed/ui": "github:treeseed-ai/ui#e4c7a0896fa6d49b183d2729150eb598084c6c35", "react": "^19.2.5", "react-dom": "^19.2.6" From 4a0b30ec46d676e219ee480104e90358c0508617 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Wed, 5 Aug 2026 16:52:57 -0400 Subject: [PATCH 062/315] build(build): recognize exact dependency commits on any remote ref Intent: - Save hint: recognize exact dependency commits on any remote ref Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.treedx-perf.20260805T075847Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#f226f3ee13a0b58a59398223ee7130bceefcaecb -> github:treeseed-ai/sdk#4cf080b4d6254e14fa6c839b5d53a33862e4879d - dependencies.@treeseed/core: github:treeseed-ai/core#1eddc90f0a1ab47b24de502a8e0785636fa605ad -> github:treeseed-ai/core#cf88765add975d1633897492d7f49f72506d3514 --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index f8f243ca..7a3b8857 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#1eddc90f0a1ab47b24de502a8e0785636fa605ad", - "@treeseed/sdk": "github:treeseed-ai/sdk#f226f3ee13a0b58a59398223ee7130bceefcaecb", + "@treeseed/core": "github:treeseed-ai/core#cf88765add975d1633897492d7f49f72506d3514", + "@treeseed/sdk": "github:treeseed-ai/sdk#4cf080b4d6254e14fa6c839b5d53a33862e4879d", "@treeseed/ui": "github:treeseed-ai/ui#e4c7a0896fa6d49b183d2729150eb598084c6c35", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -6932,7 +6932,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.treedx-perf.20260805T075816Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#1eddc90f0a1ab47b24de502a8e0785636fa605ad", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#cf88765add975d1633897492d7f49f72506d3514", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6943,7 +6943,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#f226f3ee13a0b58a59398223ee7130bceefcaecb", + "@treeseed/sdk": "github:treeseed-ai/sdk#4cf080b4d6254e14fa6c839b5d53a33862e4879d", "@treeseed/ui": "github:treeseed-ai/ui#e4c7a0896fa6d49b183d2729150eb598084c6c35", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8948,7 +8948,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.treedx-perf.20260805T073639Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#f226f3ee13a0b58a59398223ee7130bceefcaecb", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#4cf080b4d6254e14fa6c839b5d53a33862e4879d", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index ffe1a410..585ee308 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#1eddc90f0a1ab47b24de502a8e0785636fa605ad", - "@treeseed/sdk": "github:treeseed-ai/sdk#f226f3ee13a0b58a59398223ee7130bceefcaecb", + "@treeseed/core": "github:treeseed-ai/core#cf88765add975d1633897492d7f49f72506d3514", + "@treeseed/sdk": "github:treeseed-ai/sdk#4cf080b4d6254e14fa6c839b5d53a33862e4879d", "@treeseed/ui": "github:treeseed-ai/ui#e4c7a0896fa6d49b183d2729150eb598084c6c35", "react": "^19.2.5", "react-dom": "^19.2.6" From 14d0b37ed5e0b3be4de2fe2effb9d499c7edd69e Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Wed, 5 Aug 2026 17:03:52 -0400 Subject: [PATCH 063/315] build(build): recognize remotely reachable dependency ancestors Intent: - Save hint: recognize remotely reachable dependency ancestors Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.treedx-perf.20260805T075847Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#4cf080b4d6254e14fa6c839b5d53a33862e4879d -> github:treeseed-ai/sdk#9f015fbca43a39f1b396591fbe4ede6beab8b089 - dependencies.@treeseed/core: github:treeseed-ai/core#cf88765add975d1633897492d7f49f72506d3514 -> github:treeseed-ai/core#efea426400a83e398a640f435ff8b2ebfe66ae05 --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7a3b8857..c5f20fe2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#cf88765add975d1633897492d7f49f72506d3514", - "@treeseed/sdk": "github:treeseed-ai/sdk#4cf080b4d6254e14fa6c839b5d53a33862e4879d", + "@treeseed/core": "github:treeseed-ai/core#efea426400a83e398a640f435ff8b2ebfe66ae05", + "@treeseed/sdk": "github:treeseed-ai/sdk#9f015fbca43a39f1b396591fbe4ede6beab8b089", "@treeseed/ui": "github:treeseed-ai/ui#e4c7a0896fa6d49b183d2729150eb598084c6c35", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -6932,7 +6932,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.treedx-perf.20260805T075816Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#cf88765add975d1633897492d7f49f72506d3514", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#efea426400a83e398a640f435ff8b2ebfe66ae05", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6943,7 +6943,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#4cf080b4d6254e14fa6c839b5d53a33862e4879d", + "@treeseed/sdk": "github:treeseed-ai/sdk#9f015fbca43a39f1b396591fbe4ede6beab8b089", "@treeseed/ui": "github:treeseed-ai/ui#e4c7a0896fa6d49b183d2729150eb598084c6c35", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8948,7 +8948,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.treedx-perf.20260805T073639Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#4cf080b4d6254e14fa6c839b5d53a33862e4879d", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#9f015fbca43a39f1b396591fbe4ede6beab8b089", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index 585ee308..0c6d52ad 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#cf88765add975d1633897492d7f49f72506d3514", - "@treeseed/sdk": "github:treeseed-ai/sdk#4cf080b4d6254e14fa6c839b5d53a33862e4879d", + "@treeseed/core": "github:treeseed-ai/core#efea426400a83e398a640f435ff8b2ebfe66ae05", + "@treeseed/sdk": "github:treeseed-ai/sdk#9f015fbca43a39f1b396591fbe4ede6beab8b089", "@treeseed/ui": "github:treeseed-ai/ui#e4c7a0896fa6d49b183d2729150eb598084c6c35", "react": "^19.2.5", "react-dom": "^19.2.6" From ab4637007352a90cbbf69d3d2e49c6e8c4c8d256 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Wed, 5 Aug 2026 17:10:18 -0400 Subject: [PATCH 064/315] build(build): verify all published standalone dependency graphs Intent: - Save hint: verify all published standalone dependency graphs Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.treedx-perf.20260805T075847Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/core: github:treeseed-ai/core#efea426400a83e398a640f435ff8b2ebfe66ae05 -> github:treeseed-ai/core#26fc51d7f082e4b7ed3e33158ec3e9ae4847f1f3 --- package-lock.json | 82 +++++++++++++++++++++++++---------------------- package.json | 2 +- 2 files changed, 44 insertions(+), 40 deletions(-) diff --git a/package-lock.json b/package-lock.json index c5f20fe2..2db146e4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#efea426400a83e398a640f435ff8b2ebfe66ae05", + "@treeseed/core": "github:treeseed-ai/core#26fc51d7f082e4b7ed3e33158ec3e9ae4847f1f3", "@treeseed/sdk": "github:treeseed-ai/sdk#9f015fbca43a39f1b396591fbe4ede6beab8b089", "@treeseed/ui": "github:treeseed-ai/ui#e4c7a0896fa6d49b183d2729150eb598084c6c35", "react": "^19.2.5", @@ -1170,9 +1170,9 @@ } }, "node_modules/@cloudflare/workerd-darwin-64": { - "version": "1.20260708.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20260708.1.tgz", - "integrity": "sha512-HXFCvhS1wpg3uXO0CLUwmwC41i2loM5FSK69EUchOBpmYBAXxT1oHLm6EOA5lqhTk5Mu9kjRiQYxa1GwKPwfJg==", + "version": "1.20260801.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20260801.1.tgz", + "integrity": "sha512-wuJWbXpKvncJi1P0GKS+iYpN5tHdb7JPJJ/+6ZQe8zzovHHVMkLJPNBsgWpqeUhpM3g9qTwEKd2rglNKejuh5A==", "cpu": [ "x64" ], @@ -1186,9 +1186,9 @@ } }, "node_modules/@cloudflare/workerd-darwin-arm64": { - "version": "1.20260708.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20260708.1.tgz", - "integrity": "sha512-JVlJaKDoRTVKSroHIlf8g3UCPjKj4iDbMZE2CNYht5qQ+2rL0FAUiVlV82G3BqKnnw9kHYnnsMzC08b9zVtdzA==", + "version": "1.20260801.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20260801.1.tgz", + "integrity": "sha512-kwoZiTpnhNrF3+APx84Q/oAqvJ3sU9yefGagwm/ASaH/2W19x0vghkW/r4qCoHCK0WW7EPugZ+aXjgPMRtlq1Q==", "cpu": [ "arm64" ], @@ -1202,9 +1202,9 @@ } }, "node_modules/@cloudflare/workerd-linux-64": { - "version": "1.20260708.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20260708.1.tgz", - "integrity": "sha512-3daE60YdD7YX0Jtuzc9DE/r/qMkmx8ZvHTkF8Mzmp3F5tbzlV0DAzmu5PFUPF2WuvtKbAhZKbvC2cHmWpQYxnA==", + "version": "1.20260801.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20260801.1.tgz", + "integrity": "sha512-r0vAxCZH+Jih9Unm1yoyiByPNWNgawcKciOHDm5Q37ZVGOkKLsT9AtLe3yLSaul76WrKqtf+JP2n0WW32VBLJg==", "cpu": [ "x64" ], @@ -1218,9 +1218,9 @@ } }, "node_modules/@cloudflare/workerd-linux-arm64": { - "version": "1.20260708.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20260708.1.tgz", - "integrity": "sha512-VLdNYOx5Hj+9C6isy0ACWZsbMtSxex2DIJWEe7cZxUdlphZ58ZT8zxNXK8yunFiowd34hn3VwGMopdvdj8lvmA==", + "version": "1.20260801.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20260801.1.tgz", + "integrity": "sha512-zWgpdZtSozvIgzQNmQiDSF8yEOQJUkRAWNsDXXzAAoy+fCn8YUoSibj3mpFSbZRvbUldeBEaW6SCdC2VEMkhNQ==", "cpu": [ "arm64" ], @@ -1234,9 +1234,9 @@ } }, "node_modules/@cloudflare/workerd-windows-64": { - "version": "1.20260708.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20260708.1.tgz", - "integrity": "sha512-bC/aSAwLy16Vjo24i9XU3aWH+eRgz7NeR5xPKavGbembO18ZywYTQbXh14eXtY6fAqN3RzRG8psijTdhX4xydA==", + "version": "1.20260801.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20260801.1.tgz", + "integrity": "sha512-2oQz+Ksu4ji6e/+ZoYX+tWQEcxAii2p7l+iR8kx48W1llMalaufAsmVxTlk+3/vrM7D3/2c0iK448e0UQTcIMg==", "cpu": [ "x64" ], @@ -6932,7 +6932,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.treedx-perf.20260805T075816Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#efea426400a83e398a640f435ff8b2ebfe66ae05", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#26fc51d7f082e4b7ed3e33158ec3e9ae4847f1f3", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -16995,21 +16995,18 @@ } }, "node_modules/miniflare": { - "version": "4.20260708.1", - "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20260708.1.tgz", - "integrity": "sha512-c94O9zRDISdqO18EHt6l0iF/fWgWt8p18PJvRsA/L/NJZ9Cfke3s/F5Blg1XXF7WDutVRzWVWy8Vy4LaT5ifsA==", + "version": "5.20260801.0-alpha", + "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-5.20260801.0-alpha.tgz", + "integrity": "sha512-AfMrnQbJg81ESsGkGhOkHBtwTqCG+mosR+3GE+qDrhF1I/ieIvgg3ICxNyBvgHBZ3iapy6cysBQHNPykkzrfgw==", "license": "MIT", "dependencies": { "@cspotcode/source-map-support": "0.8.1", - "sharp": "0.34.5", + "sharp": "0.35.2", "undici": "7.28.0", - "workerd": "1.20260708.1", + "workerd": "1.20260801.1", "ws": "8.21.0", "youch": "4.1.0-beta.10" }, - "bin": { - "miniflare": "bootstrap.js" - }, "engines": { "node": ">=22.0.0" } @@ -21523,9 +21520,9 @@ "license": "MIT" }, "node_modules/workerd": { - "version": "1.20260708.1", - "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20260708.1.tgz", - "integrity": "sha512-WAK+Kt/VVCSldH2qSr8lx46XCJ4Q+bdlHNaFqUtOHthBEIB8C1N8HVW+VOLrxDoTCk0NGNv0zajnBeQK4JOB9w==", + "version": "1.20260801.1", + "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20260801.1.tgz", + "integrity": "sha512-/g9JGTyqnHtoIscpBHqKD8swE2V4StBs2i69PmLiOhH45OP95jCFICl4F1hKlgN57rqfni5LiCitttoX5OOkVA==", "hasInstallScript": true, "license": "Apache-2.0", "bin": { @@ -21535,27 +21532,27 @@ "node": ">=16" }, "optionalDependencies": { - "@cloudflare/workerd-darwin-64": "1.20260708.1", - "@cloudflare/workerd-darwin-arm64": "1.20260708.1", - "@cloudflare/workerd-linux-64": "1.20260708.1", - "@cloudflare/workerd-linux-arm64": "1.20260708.1", - "@cloudflare/workerd-windows-64": "1.20260708.1" + "@cloudflare/workerd-darwin-64": "1.20260801.1", + "@cloudflare/workerd-darwin-arm64": "1.20260801.1", + "@cloudflare/workerd-linux-64": "1.20260801.1", + "@cloudflare/workerd-linux-arm64": "1.20260801.1", + "@cloudflare/workerd-windows-64": "1.20260801.1" } }, "node_modules/wrangler": { - "version": "4.110.0", - "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.110.0.tgz", - "integrity": "sha512-xZeXKYi7hxQRF5anL+v77RkufJNpF9f3Eqeyqq2QBsETpLZgh0Agj0jJ6JPtkbgn6ukZdh8OK5egsGPWIditgg==", + "version": "4.119.0", + "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.119.0.tgz", + "integrity": "sha512-ookClf+zly4DTc8pBMNrwGQzZKH8IpIYTXkjDw3XS7ZvBQ5mLYH6eOvfD5BEpk3U63zTbv91WRlo1UeRSKXa0g==", "license": "MIT OR Apache-2.0", "dependencies": { "@cloudflare/kv-asset-handler": "0.5.0", "@cloudflare/unenv-preset": "2.16.1", "blake3-wasm": "2.1.5", "esbuild": "0.28.1", - "miniflare": "4.20260708.1", + "miniflare": "5.20260801.0-alpha", "path-to-regexp": "6.3.0", "unenv": "2.0.0-rc.24", - "workerd": "1.20260708.1" + "workerd": "1.20260801.1" }, "bin": { "cf-wrangler": "bin/cf-wrangler.js", @@ -21569,7 +21566,7 @@ "fsevents": "2.3.3" }, "peerDependencies": { - "@cloudflare/workers-types": "^5.20260708.1" + "@cloudflare/workers-types": "^5.20260801.1" }, "peerDependenciesMeta": { "@cloudflare/workers-types": { @@ -22075,6 +22072,13 @@ "peerDependencies": { "astro": "^5.5.0" } + }, + "node_modules/@cloudflare/workers-types": { + "version": "5.20260804.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-5.20260804.1.tgz", + "integrity": "sha512-B1dwxpN6e5RZXZkE5zpZj+ooNeNZ1mwavLIyHDYe10ojhlGTwDfe8sAl7R1mMXc1cyIsbr+jKVdvmMEyVcdTdg==", + "extraneous": true, + "license": "MIT OR Apache-2.0" } } } diff --git a/package.json b/package.json index 0c6d52ad..e42480d0 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#efea426400a83e398a640f435ff8b2ebfe66ae05", + "@treeseed/core": "github:treeseed-ai/core#26fc51d7f082e4b7ed3e33158ec3e9ae4847f1f3", "@treeseed/sdk": "github:treeseed-ai/sdk#9f015fbca43a39f1b396591fbe4ede6beab8b089", "@treeseed/ui": "github:treeseed-ai/ui#e4c7a0896fa6d49b183d2729150eb598084c6c35", "react": "^19.2.5", From bf3db08a5ce9cd6d49dea71398dbace333ed154d Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Wed, 5 Aug 2026 17:20:37 -0400 Subject: [PATCH 065/315] build(build): validate downstream graphs after core lock resolution Intent: - Save hint: validate downstream graphs after core lock resolution Changes: - Updates 1 file across build: 1. - Touches package-lock.json. - Plans package version/tag 0.12.59-dev.treedx-perf.20260805T075847Z for @treeseed/admin. --- package-lock.json | 4039 +++++++++++++++++++++++++++++---------------- 1 file changed, 2581 insertions(+), 1458 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2db146e4..33aa106a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47,15 +47,15 @@ } }, "node_modules/@astrojs/check": { - "version": "0.9.9", - "resolved": "https://registry.npmjs.org/@astrojs/check/-/check-0.9.9.tgz", - "integrity": "sha512-A5UW8uIuErLWEoRQvzgXpO1gTjUFtK8r7nU2Z7GewAMxUb7bPvpk11qaKKgxqXlHJWlAvaaxy+Xg28A6bmQ1Tg==", + "version": "0.9.10", + "resolved": "https://registry.npmjs.org/@astrojs/check/-/check-0.9.10.tgz", + "integrity": "sha512-zgx/UQMozdjOa3bOxjgeCFdtpE3c9rRX6xHwa+2QXvy8z8Akifu2AtubHyv/zzC2znO8dl8fFWL4K+Ba9kS8HQ==", "license": "MIT", "dependencies": { "@astrojs/language-server": "^2.16.7", "chokidar": "^4.0.3", "kleur": "^4.1.5", - "yargs": "^17.7.2" + "yargs": "^18.0.0" }, "bin": { "astro-check": "bin/astro-check.js" @@ -77,9 +77,9 @@ "license": "MIT" }, "node_modules/@astrojs/language-server": { - "version": "2.16.11", - "resolved": "https://registry.npmjs.org/@astrojs/language-server/-/language-server-2.16.11.tgz", - "integrity": "sha512-sJ/EfnFp0+gurTrkvONtd9qRqmMZLT9bHelfI1SA35CaQVTrRrA74qteOcNT/al1b9Atg3IiH1Jk/qfckyC+fg==", + "version": "2.16.13", + "resolved": "https://registry.npmjs.org/@astrojs/language-server/-/language-server-2.16.13.tgz", + "integrity": "sha512-ekOa+CYprEq5n4EJC1qTIAhLk49HZIUQuFwrEuF+3JK/pdMaYnWoREFUI2A0KEPOJiFA2kamBzKzbYljDvUxLg==", "license": "MIT", "dependencies": { "@astrojs/compiler": "^2.13.1", @@ -863,13 +863,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", - "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.7", - "@babel/types": "^7.29.7", + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -1007,12 +1007,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", - "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", "license": "MIT", "dependencies": { - "@babel/types": "^7.29.7" + "@babel/types": "^7.29.8" }, "bin": { "parser": "bin/babel-parser.js" @@ -1075,17 +1075,17 @@ } }, "node_modules/@babel/traverse": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", - "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.7", + "@babel/generator": "^7.29.8", "@babel/helper-globals": "^7.29.7", - "@babel/parser": "^7.29.7", + "@babel/parser": "^7.29.8", "@babel/template": "^7.29.7", - "@babel/types": "^7.29.7", + "@babel/types": "^7.29.8", "debug": "^4.3.1" }, "engines": { @@ -1093,9 +1093,9 @@ } }, "node_modules/@babel/types": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", - "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.29.7", @@ -1249,6 +1249,13 @@ "node": ">=16" } }, + "node_modules/@cloudflare/workers-types": { + "version": "5.20260804.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-5.20260804.1.tgz", + "integrity": "sha512-B1dwxpN6e5RZXZkE5zpZj+ooNeNZ1mwavLIyHDYe10ojhlGTwDfe8sAl7R1mMXc1cyIsbr+jKVdvmMEyVcdTdg==", + "extraneous": true, + "license": "MIT OR Apache-2.0" + }, "node_modules/@codemirror/autocomplete": { "version": "6.20.3", "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.20.3.tgz", @@ -1324,9 +1331,9 @@ } }, "node_modules/@codemirror/lang-html": { - "version": "6.4.11", - "resolved": "https://registry.npmjs.org/@codemirror/lang-html/-/lang-html-6.4.11.tgz", - "integrity": "sha512-9NsXp7Nwp891pQchI7gPdTwBuSuT3K65NGTHWHNJ55HjYcHLllr0rbIZNdOzas9ztc1EUVBlHou85FFZS4BNnw==", + "version": "6.4.12", + "resolved": "https://registry.npmjs.org/@codemirror/lang-html/-/lang-html-6.4.12.tgz", + "integrity": "sha512-pw2ReWKUqSkbvh76RAT4NYxiogRu+PWkR2ukAwO9uOgrm8uipkzjtKKtNpyeAQwHOqxEeSvAXZ6vr3AfyB9y/w==", "license": "MIT", "dependencies": { "@codemirror/autocomplete": "^6.0.0", @@ -1421,9 +1428,9 @@ } }, "node_modules/@codemirror/lang-markdown": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@codemirror/lang-markdown/-/lang-markdown-6.5.0.tgz", - "integrity": "sha512-0K40bZ35jpHya6FriukbgaleaqzBLZfOh7HuzqbMxBXkbYMJDxfF39c23xOgxFezR+3G+tR2/Mup+Xk865OMvw==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@codemirror/lang-markdown/-/lang-markdown-6.5.2.tgz", + "integrity": "sha512-AwBOdkWYuA//WcM0xO5PfHPUcmz/O2i5o0Nsg1U69SII/loCJlFI1Romd9xp2HYb1kYJRGZotyqRghuHH5n8Kw==", "license": "MIT", "dependencies": { "@codemirror/autocomplete": "^6.7.1", @@ -1652,9 +1659,9 @@ } }, "node_modules/@codemirror/view": { - "version": "6.43.6", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.43.6.tgz", - "integrity": "sha512-EVunGSYN1wz1p75WY1s3Xg7t3i8Yol0kGZGizNdX9BUFgMFILYVe8/u6EVpo7Ff5PwbZuILb4QAq7IZoKzIEQA==", + "version": "6.43.8", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.43.8.tgz", + "integrity": "sha512-qtItTDssZ/5GFfi94hrILu9j/VUeFPDPkhovEfmWFj2ipTxnzPB8DdHgfbb8HYTzLTYhrndKmyQxXUz/PDLenw==", "license": "MIT", "dependencies": { "@codemirror/state": "^6.7.0", @@ -1750,20 +1757,20 @@ "license": "MIT" }, "node_modules/@emnapi/core": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.2.tgz", - "integrity": "sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA==", + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.3.tgz", + "integrity": "sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg==", "license": "MIT", "optional": true, "dependencies": { - "@emnapi/wasi-threads": "1.2.2", + "@emnapi/wasi-threads": "1.2.3", "tslib": "^2.4.0" } }, "node_modules/@emnapi/runtime": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.2.tgz", - "integrity": "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==", + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz", + "integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==", "license": "MIT", "optional": true, "dependencies": { @@ -1771,9 +1778,9 @@ } }, "node_modules/@emnapi/wasi-threads": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", - "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.3.tgz", + "integrity": "sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g==", "license": "MIT", "optional": true, "dependencies": { @@ -2538,12 +2545,12 @@ } }, "node_modules/@hono/node-server": { - "version": "1.19.14", - "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.14.tgz", - "integrity": "sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-2.1.0.tgz", + "integrity": "sha512-XovyyCCnBzW+zKu+z/zq8hwNs4KOR5rEMAOxo2f40Q5xoOI37IMm6MIg2COOUtUApo0i6850MTBKH2u4QLGIqg==", "license": "MIT", "engines": { - "node": ">=18.14.1" + "node": ">=20" }, "peerDependencies": { "hono": "^4" @@ -2602,6 +2609,41 @@ "@img/sharp-libvips-darwin-x64": "1.2.4" } }, + "node_modules/@img/sharp-freebsd-wasm32": { + "version": "0.35.2", + "resolved": "https://registry.npmjs.org/@img/sharp-freebsd-wasm32/-/sharp-freebsd-wasm32-0.35.2.tgz", + "integrity": "sha512-YoAxdnd8hPUkvLHd3bWY+YA8nw3xM/RyRopYucNsWHVSan8NLVM3X2volsfoRDcXdUJPg6tXahSd7HXPK7lRnw==", + "license": "Apache-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "dependencies": { + "@img/sharp-wasm32": "0.35.2" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-freebsd-wasm32/node_modules/@img/sharp-wasm32": { + "version": "0.35.2", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.35.2.tgz", + "integrity": "sha512-Mrv4JQNYVQ94xH+jzZ9r+gowleN8mv2FTgKT+PI6bx5C0G8TdNYndu161pg2i7uoBwxy2ImPMHrJOM2LZef7Bw==", + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.11.1" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, "node_modules/@img/sharp-libvips-darwin-arm64": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", @@ -3005,6 +3047,41 @@ "url": "https://opencollective.com/libvips" } }, + "node_modules/@img/sharp-webcontainers-wasm32": { + "version": "0.35.2", + "resolved": "https://registry.npmjs.org/@img/sharp-webcontainers-wasm32/-/sharp-webcontainers-wasm32-0.35.2.tgz", + "integrity": "sha512-QNV27pxs9wpApEiCfvHM1RDoP1w1+2KrUWWDPEhEwg+latvOrfuhWrHWZKwdSFwU6jh3myjw/yOCRsUIuOft3g==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@img/sharp-wasm32": "0.35.2" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-webcontainers-wasm32/node_modules/@img/sharp-wasm32": { + "version": "0.35.2", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.35.2.tgz", + "integrity": "sha512-Mrv4JQNYVQ94xH+jzZ9r+gowleN8mv2FTgKT+PI6bx5C0G8TdNYndu161pg2i7uoBwxy2ImPMHrJOM2LZef7Bw==", + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.11.1" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, "node_modules/@img/sharp-win32-arm64": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", @@ -3129,259 +3206,489 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@lexical/a11y": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@lexical/a11y/-/a11y-0.48.0.tgz", + "integrity": "sha512-18W4ehyipkUim4YVoDZitoH63Om3j6iCN4c84zdqE9RgkWf/PE4rvI/8BHTm6Ni7NkVE14nimXgkpaP5ok15zA==", + "license": "MIT", + "dependencies": { + "@lexical/extension": "0.48.0", + "@lexical/utils": "0.48.0", + "lexical": "0.48.0" + }, + "peerDependencies": { + "typescript": ">=5.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/@lexical/clipboard": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@lexical/clipboard/-/clipboard-0.35.0.tgz", - "integrity": "sha512-ko7xSIIiayvDiqjNDX6fgH9RlcM6r9vrrvJYTcfGVBor5httx16lhIi0QJZ4+RNPvGtTjyFv4bwRmsixRRwImg==", + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@lexical/clipboard/-/clipboard-0.48.0.tgz", + "integrity": "sha512-xO2trk6+yBl8XXa/VNe20kXczmPxFoWtUHjidbBLEtlGBj+mo63pJj6H5o/WlZsoMKmIOJxwxsn2ejrS8G0/7A==", "license": "MIT", "dependencies": { - "@lexical/html": "0.35.0", - "@lexical/list": "0.35.0", - "@lexical/selection": "0.35.0", - "@lexical/utils": "0.35.0", - "lexical": "0.35.0" + "@lexical/extension": "0.48.0", + "@lexical/html": "0.48.0", + "@lexical/internal": "0.48.0", + "@lexical/list": "0.48.0", + "@lexical/selection": "0.48.0", + "@lexical/utils": "0.48.0", + "@types/trusted-types": "^2.0.7", + "lexical": "0.48.0" + }, + "peerDependencies": { + "typescript": ">=5.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@lexical/code": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@lexical/code/-/code-0.35.0.tgz", - "integrity": "sha512-ox4DZwETQ9IA7+DS6PN8RJNwSAF7RMjL7YTVODIqFZ5tUFIf+5xoCHbz7Fll0Bvixlp12hVH90xnLwTLRGpkKw==", + "node_modules/@lexical/code-core": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@lexical/code-core/-/code-core-0.48.0.tgz", + "integrity": "sha512-+O1Ge06AuSo6+r8R2Xk6SkWG07H5/e4K/Scw9aqCM/BRjITxgvFTHTNvgQbaobCsP0uBJiwW1+ZGeWAWcBCY4w==", "license": "MIT", "dependencies": { - "@lexical/utils": "0.35.0", - "lexical": "0.35.0", - "prismjs": "^1.30.0" + "@lexical/extension": "0.48.0", + "@lexical/html": "0.48.0", + "@lexical/internal": "0.48.0", + "@lexical/utils": "0.48.0", + "lexical": "0.48.0" + }, + "peerDependencies": { + "typescript": ">=5.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@lexical/devtools-core": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@lexical/devtools-core/-/devtools-core-0.35.0.tgz", - "integrity": "sha512-C2wwtsMCR6ZTfO0TqpSM17RLJWyfHmifAfCTjFtOJu15p3M6NO/nHYK5Mt7YMQteuS89mOjB4ng8iwoLEZ6QpQ==", + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@lexical/devtools-core/-/devtools-core-0.48.0.tgz", + "integrity": "sha512-4kvKWW6ebgQnJNLXPLmw7dqgSChvzYIBNYtfuR6c48Sw+V/QXQTWqfIUbCIe5X4uG8EEXd5O/udXaJx7GBuP+w==", "license": "MIT", "dependencies": { - "@lexical/html": "0.35.0", - "@lexical/link": "0.35.0", - "@lexical/mark": "0.35.0", - "@lexical/table": "0.35.0", - "@lexical/utils": "0.35.0", - "lexical": "0.35.0" + "@lexical/html": "0.48.0", + "@lexical/link": "0.48.0", + "@lexical/mark": "0.48.0", + "@lexical/table": "0.48.0", + "@lexical/utils": "0.48.0", + "lexical": "0.48.0" }, "peerDependencies": { - "react": ">=17.x", - "react-dom": ">=17.x" + "react": ">=18.x", + "react-dom": ">=18.x", + "typescript": ">=5.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@lexical/dragon": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@lexical/dragon/-/dragon-0.35.0.tgz", - "integrity": "sha512-SL6mT5pcqrt6hEbJ16vWxip5+r3uvMd0bQV5UUxuk+cxIeuP86iTgRh0HFR7SM2dRTYovL6/tM/O+8QLAUGTIg==", + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@lexical/dragon/-/dragon-0.48.0.tgz", + "integrity": "sha512-uPuu7fVca9vmL/Oz30CRZ7FIPIodwMrTgNsRmV8jE6Qd6a7RNiTW7r3+EhbhIdkLb/sjcWsYyOMyUR1TJAB0wQ==", + "license": "MIT", + "dependencies": { + "@lexical/extension": "0.48.0", + "lexical": "0.48.0" + }, + "peerDependencies": { + "typescript": ">=5.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@lexical/extension": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@lexical/extension/-/extension-0.48.0.tgz", + "integrity": "sha512-4uBObgz84mVbQWiumndmIhkuJL0ojHiMwFSvSUM/FCo1YMVIZvpI56blI0y+2Vix/oLui9EgVQSJjjWV4NAszw==", "license": "MIT", "dependencies": { - "lexical": "0.35.0" + "@lexical/internal": "0.48.0", + "@lexical/utils": "0.48.0", + "@preact/signals-core": "^1.14.1", + "lexical": "0.48.0" + }, + "peerDependencies": { + "typescript": ">=5.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@lexical/hashtag": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@lexical/hashtag/-/hashtag-0.35.0.tgz", - "integrity": "sha512-LYJWzXuO2ZjKsvQwrLkNZiS2TsjwYkKjlDgtugzejquTBQ/o/nfSn/MmVx6EkYLOYizaJemmZbz3IBh+u732FA==", + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@lexical/hashtag/-/hashtag-0.48.0.tgz", + "integrity": "sha512-hPQtdnbVoNAFsmfnCGfgY7mDbvk6mIznlCRmIR7tLeQKXqz/0Tb6eH3W24EESk9hAF8wFUYNKWE1/Kb3Hl2vEQ==", "license": "MIT", "dependencies": { - "@lexical/utils": "0.35.0", - "lexical": "0.35.0" + "@lexical/text": "0.48.0", + "@lexical/utils": "0.48.0", + "lexical": "0.48.0" + }, + "peerDependencies": { + "typescript": ">=5.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@lexical/history": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@lexical/history/-/history-0.35.0.tgz", - "integrity": "sha512-onjDRLLxGbCfHexSxxrQaDaieIHyV28zCDrbxR5dxTfW8F8PxjuNyuaG0z6o468AXYECmclxkP+P4aT6poHEpQ==", + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@lexical/history/-/history-0.48.0.tgz", + "integrity": "sha512-NllvUfO+u3mfi5uC8k2CodwdzeeopFFVtMZ/NMifzFbZFysdWi9m9mqfO46NrEA1rSFOydyefv6oMzC8ULXInA==", "license": "MIT", "dependencies": { - "@lexical/utils": "0.35.0", - "lexical": "0.35.0" + "@lexical/extension": "0.48.0", + "@lexical/utils": "0.48.0", + "lexical": "0.48.0" + }, + "peerDependencies": { + "typescript": ">=5.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@lexical/html": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@lexical/html/-/html-0.35.0.tgz", - "integrity": "sha512-rXGFE5S5rKsg3tVnr1s4iEgOfCApNXGpIFI3T2jGEShaCZ5HLaBY9NVBXnE9Nb49e9bkDkpZ8FZd1qokCbQXbw==", + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@lexical/html/-/html-0.48.0.tgz", + "integrity": "sha512-uBxlgKl4YgSNEgHJSshdBqtGDzruWdx1ewop+u6faT67qHUdP3P0cUXIrG6NToDWvsL6fzCstAbN76PMER1Pnw==", "license": "MIT", "dependencies": { - "@lexical/selection": "0.35.0", - "@lexical/utils": "0.35.0", - "lexical": "0.35.0" + "@lexical/extension": "0.48.0", + "@lexical/internal": "0.48.0", + "@lexical/selection": "0.48.0", + "@lexical/utils": "0.48.0", + "lexical": "0.48.0" + }, + "peerDependencies": { + "typescript": ">=5.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@lexical/internal": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@lexical/internal/-/internal-0.48.0.tgz", + "integrity": "sha512-sRwg53K7N0ZQ7KNAvcCY38LSwGizbXP1zlR1lIojZp0GoqHWNvR+vL49t1wYXu1nXx3Osf4ilHHm+aGcwq5hTw==", + "license": "MIT", + "peerDependencies": { + "typescript": ">=5.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@lexical/link": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@lexical/link/-/link-0.35.0.tgz", - "integrity": "sha512-+0Wx6cBwO8TfdMzpkYFacsmgFh8X1rkiYbq3xoLvk3qV8upYxaMzK1s8Q1cpKmWyI0aZrU6z7fiK4vUqB7+69w==", + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@lexical/link/-/link-0.48.0.tgz", + "integrity": "sha512-E0UDmNLUXs/yMCnnE7hbFO0CvhWghmqa+qqPksFfzLkpMHdPpdS1yg59YEbYoNHLi/DXIu4cFRvpHIEuooxwNg==", "license": "MIT", "dependencies": { - "@lexical/utils": "0.35.0", - "lexical": "0.35.0" + "@lexical/extension": "0.48.0", + "@lexical/html": "0.48.0", + "@lexical/internal": "0.48.0", + "@lexical/utils": "0.48.0", + "lexical": "0.48.0" + }, + "peerDependencies": { + "typescript": ">=5.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@lexical/list": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@lexical/list/-/list-0.35.0.tgz", - "integrity": "sha512-owsmc8iwgExBX8sFe8fKTiwJVhYULt9hD1RZ/HwfaiEtRZZkINijqReOBnW2mJfRxBzhFSWc4NG3ISB+fHYzqw==", + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@lexical/list/-/list-0.48.0.tgz", + "integrity": "sha512-9Qe/Vur44v9F9enj55SUzf79FVsijcGOQug7SpiIU8ekLr7JNzcilKYBYcZ6etGEo7bqQHsYMHXeJcSBbCI2zA==", "license": "MIT", "dependencies": { - "@lexical/selection": "0.35.0", - "@lexical/utils": "0.35.0", - "lexical": "0.35.0" + "@lexical/extension": "0.48.0", + "@lexical/html": "0.48.0", + "@lexical/internal": "0.48.0", + "@lexical/utils": "0.48.0", + "lexical": "0.48.0" + }, + "peerDependencies": { + "typescript": ">=5.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@lexical/mark": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@lexical/mark/-/mark-0.35.0.tgz", - "integrity": "sha512-W0hwMTAVeexvpk9/+J6n1G/sNkpI/Meq1yeDazahFLLAwXLHtvhIAq2P/klgFknDy1hr8X7rcsQuN/bqKcKHYg==", + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@lexical/mark/-/mark-0.48.0.tgz", + "integrity": "sha512-DTtypWvnYSXyNUxEmsUnh4y0xXkmdk8Y72EZl8WDHcCwjqaLJlUakH7p/TuSJczs3uVSaoJzu0yh7oGkP1Vsvw==", "license": "MIT", "dependencies": { - "@lexical/utils": "0.35.0", - "lexical": "0.35.0" + "@lexical/utils": "0.48.0", + "lexical": "0.48.0" + }, + "peerDependencies": { + "typescript": ">=5.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@lexical/markdown": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@lexical/markdown/-/markdown-0.35.0.tgz", - "integrity": "sha512-BlNyXZAt4gWidMw0SRWrhBETY1BpPglFBZI7yzfqukFqgXRh7HUQA28OYeI/nsx9pgNob8TiUduUwShqqvOdEA==", - "license": "MIT", - "dependencies": { - "@lexical/code": "0.35.0", - "@lexical/link": "0.35.0", - "@lexical/list": "0.35.0", - "@lexical/rich-text": "0.35.0", - "@lexical/text": "0.35.0", - "@lexical/utils": "0.35.0", - "lexical": "0.35.0" - } - }, - "node_modules/@lexical/offset": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@lexical/offset/-/offset-0.35.0.tgz", - "integrity": "sha512-DRE4Df6qYf2XiV6foh6KpGNmGAv2ANqt3oVXpyS6W8hTx3+cUuAA1APhCZmLNuU107um4zmHym7taCu6uXW5Yg==", + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@lexical/markdown/-/markdown-0.48.0.tgz", + "integrity": "sha512-1WasBenW4bEsa5xtnycVo8G2hcxIqyYLn3/r98yD2Y+54ZyeFuIQfOeJYhIgCh4YkKpfqyrFwkMQwAOsQDqZjA==", "license": "MIT", "dependencies": { - "lexical": "0.35.0" + "@lexical/code-core": "0.48.0", + "@lexical/internal": "0.48.0", + "@lexical/link": "0.48.0", + "@lexical/list": "0.48.0", + "@lexical/rich-text": "0.48.0", + "@lexical/selection": "0.48.0", + "@lexical/text": "0.48.0", + "@lexical/utils": "0.48.0", + "lexical": "0.48.0" + }, + "peerDependencies": { + "typescript": ">=5.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@lexical/overflow": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@lexical/overflow/-/overflow-0.35.0.tgz", - "integrity": "sha512-B25YvnJQTGlZcrNv7b0PJBLWq3tl8sql497OHfYYLem7EOMPKKDGJScJAKM/91D4H/mMAsx5gnA/XgKobriuTg==", + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@lexical/overflow/-/overflow-0.48.0.tgz", + "integrity": "sha512-1YEvMz2tW3EbwrON9mjrkjMVl/vdTcPYSn9P1j6mf5gj0LOoLDNI4TbvSD4SViy+TDghxNdG8YdCISyU2b4YKA==", "license": "MIT", "dependencies": { - "lexical": "0.35.0" + "lexical": "0.48.0" + }, + "peerDependencies": { + "typescript": ">=5.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@lexical/plain-text": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@lexical/plain-text/-/plain-text-0.35.0.tgz", - "integrity": "sha512-lwBCUNMJf7Gujp2syVWMpKRahfbTv5Wq+H3HK1Q1gKH1P2IytPRxssCHvexw9iGwprSyghkKBlbF3fGpEdIJvQ==", + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@lexical/plain-text/-/plain-text-0.48.0.tgz", + "integrity": "sha512-q4f/4VZKVgCrIW2FhDFR2RII1BU0ljedPgEmJ8XQn1zc+JOFPom8Lp0lV5nyEvZaAJYwM/TfoJ9g2V7ESFKznA==", "license": "MIT", "dependencies": { - "@lexical/clipboard": "0.35.0", - "@lexical/selection": "0.35.0", - "@lexical/utils": "0.35.0", - "lexical": "0.35.0" + "@lexical/clipboard": "0.48.0", + "@lexical/dragon": "0.48.0", + "@lexical/extension": "0.48.0", + "@lexical/selection": "0.48.0", + "@lexical/utils": "0.48.0", + "lexical": "0.48.0" + }, + "peerDependencies": { + "typescript": ">=5.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@lexical/react": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@lexical/react/-/react-0.35.0.tgz", - "integrity": "sha512-uYAZSqumH8tRymMef+A0f2hQvMwplKK9DXamcefnk3vSNDHHqRWQXpiUo6kD+rKWuQmMbVa5RW4xRQebXEW+1A==", - "license": "MIT", - "dependencies": { - "@floating-ui/react": "^0.27.8", - "@lexical/devtools-core": "0.35.0", - "@lexical/dragon": "0.35.0", - "@lexical/hashtag": "0.35.0", - "@lexical/history": "0.35.0", - "@lexical/link": "0.35.0", - "@lexical/list": "0.35.0", - "@lexical/mark": "0.35.0", - "@lexical/markdown": "0.35.0", - "@lexical/overflow": "0.35.0", - "@lexical/plain-text": "0.35.0", - "@lexical/rich-text": "0.35.0", - "@lexical/table": "0.35.0", - "@lexical/text": "0.35.0", - "@lexical/utils": "0.35.0", - "@lexical/yjs": "0.35.0", - "lexical": "0.35.0", - "react-error-boundary": "^3.1.4" + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@lexical/react/-/react-0.48.0.tgz", + "integrity": "sha512-uVh9/QSrbtjLjVbxfJ+sfiMyhUq/rv7H6uBEVDDIw1rkZJSDY1fvf/CX+dyKgwcDFjKQZ8/9i5f9UCVPeQ01hA==", + "license": "MIT", + "dependencies": { + "@floating-ui/react": "^0.27.19", + "@lexical/a11y": "0.48.0", + "@lexical/devtools-core": "0.48.0", + "@lexical/dragon": "0.48.0", + "@lexical/extension": "0.48.0", + "@lexical/hashtag": "0.48.0", + "@lexical/history": "0.48.0", + "@lexical/internal": "0.48.0", + "@lexical/link": "0.48.0", + "@lexical/list": "0.48.0", + "@lexical/mark": "0.48.0", + "@lexical/markdown": "0.48.0", + "@lexical/overflow": "0.48.0", + "@lexical/plain-text": "0.48.0", + "@lexical/rich-text": "0.48.0", + "@lexical/table": "0.48.0", + "@lexical/text": "0.48.0", + "@lexical/utils": "0.48.0", + "@lexical/yjs": "0.48.0", + "lexical": "0.48.0" }, "peerDependencies": { - "react": ">=17.x", - "react-dom": ">=17.x" + "react": ">=18.x", + "react-dom": ">=18.x", + "typescript": ">=5.2", + "yjs": ">=13.5.22" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "yjs": { + "optional": true + } } }, "node_modules/@lexical/rich-text": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@lexical/rich-text/-/rich-text-0.35.0.tgz", - "integrity": "sha512-qEHu8g7vOEzz9GUz1VIUxZBndZRJPh9iJUFI+qTDHj+tQqnd5LCs+G9yz6jgNfiuWWpezTp0i1Vz/udNEuDPKQ==", + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@lexical/rich-text/-/rich-text-0.48.0.tgz", + "integrity": "sha512-QMXFnwCKAQ4yzxvx5FwmANcx3K+NaBkGTxAVD8s8pOKDD/U5rzDS1iIvhH6TLWaFp7VzvLmLB+Sl1Ie/RnkaDQ==", "license": "MIT", "dependencies": { - "@lexical/clipboard": "0.35.0", - "@lexical/selection": "0.35.0", - "@lexical/utils": "0.35.0", - "lexical": "0.35.0" + "@lexical/clipboard": "0.48.0", + "@lexical/dragon": "0.48.0", + "@lexical/extension": "0.48.0", + "@lexical/html": "0.48.0", + "@lexical/selection": "0.48.0", + "@lexical/utils": "0.48.0", + "lexical": "0.48.0" + }, + "peerDependencies": { + "typescript": ">=5.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@lexical/selection": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@lexical/selection/-/selection-0.35.0.tgz", - "integrity": "sha512-mMtDE7Q0nycXdFTTH/+ta6EBrBwxBB4Tg8QwsGntzQ1Cq//d838dpXpFjJOqHEeVHUqXpiuj+cBG8+bvz/rPRw==", + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@lexical/selection/-/selection-0.48.0.tgz", + "integrity": "sha512-Uc0wTrEtHcYK6z/aHHjkgH3vX/R4Bf8mO+qH3VbxfSAKYzNYktM0j+ZGdq5kIEL4frnw/9SulNCXlH7xpjuDgA==", "license": "MIT", "dependencies": { - "lexical": "0.35.0" + "@lexical/internal": "0.48.0", + "lexical": "0.48.0" + }, + "peerDependencies": { + "typescript": ">=5.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@lexical/table": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@lexical/table/-/table-0.35.0.tgz", - "integrity": "sha512-9jlTlkVideBKwsEnEkqkdg7A3mije1SvmfiqoYnkl1kKJCLA5iH90ywx327PU0p+bdnURAytWUeZPXaEuEl2OA==", + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@lexical/table/-/table-0.48.0.tgz", + "integrity": "sha512-t9Mz7q6ODLUz0lG5Xn9EY/5YiVpTHCqlPQP4EtFXlnBQT3DuKeDS3cC0Cn8sGSZc11YY5OLDfWpB64Frs9BL3g==", "license": "MIT", "dependencies": { - "@lexical/clipboard": "0.35.0", - "@lexical/utils": "0.35.0", - "lexical": "0.35.0" + "@lexical/clipboard": "0.48.0", + "@lexical/extension": "0.48.0", + "@lexical/html": "0.48.0", + "@lexical/internal": "0.48.0", + "@lexical/utils": "0.48.0", + "lexical": "0.48.0" + }, + "peerDependencies": { + "typescript": ">=5.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@lexical/text": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@lexical/text/-/text-0.35.0.tgz", - "integrity": "sha512-uaMh46BkysV8hK8wQwp5g/ByZW+2hPDt8ahAErxtf8NuzQem1FHG/f5RTchmFqqUDVHO3qLNTv4AehEGmXv8MA==", + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@lexical/text/-/text-0.48.0.tgz", + "integrity": "sha512-ktTMRbsX4wKxdG2OpZCkrqtt8k9Vg/ZpWdukOQ0r1xPRtCuL1T+q91l7cy2ywIuCfMGYS0aoZGB4LdpUMe/H1g==", "license": "MIT", "dependencies": { - "lexical": "0.35.0" + "@lexical/internal": "0.48.0", + "lexical": "0.48.0" + }, + "peerDependencies": { + "typescript": ">=5.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@lexical/utils": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@lexical/utils/-/utils-0.35.0.tgz", - "integrity": "sha512-2H393EYDnFznYCDFOW3MHiRzwEO5M/UBhtUjvTT+9kc+qhX4U3zc8ixQalo5UmZ5B2nh7L/inXdTFzvSRXtsRA==", + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@lexical/utils/-/utils-0.48.0.tgz", + "integrity": "sha512-W4k4P+y6jmRfna8+ad4X+iMd5h8es5PC3bUw5tbi7MRApxaaFG/0w+uJiZVSwbT2Q6JnA2xhBaqzPgt/Gn6djg==", "license": "MIT", "dependencies": { - "@lexical/list": "0.35.0", - "@lexical/selection": "0.35.0", - "@lexical/table": "0.35.0", - "lexical": "0.35.0" + "@lexical/internal": "0.48.0", + "@lexical/selection": "0.48.0", + "lexical": "0.48.0" + }, + "peerDependencies": { + "typescript": ">=5.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@lexical/yjs": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@lexical/yjs/-/yjs-0.35.0.tgz", - "integrity": "sha512-3DSP7QpmTGYU9bN/yljP0PIao4tNIQtsR4ycauWNSawxs/GQCZtSmAPcLRnCm6qpqsDDjUtKjO/1Ej8FRp0m0w==", + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@lexical/yjs/-/yjs-0.48.0.tgz", + "integrity": "sha512-fFsE8EnPM/2KK9rMJ0z6T+Da5UW5V4P+XiAA03LoHTY5YQ/Oy8Q0i7Wcmocv/B/SpsY2o8g07euZEfudl9MVKA==", "license": "MIT", "dependencies": { - "@lexical/offset": "0.35.0", - "@lexical/selection": "0.35.0", - "lexical": "0.35.0" + "@lexical/internal": "0.48.0", + "@lexical/selection": "0.48.0", + "lexical": "0.48.0" }, "peerDependencies": { + "typescript": ">=5.2", "yjs": ">=13.5.22" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@lezer/common": { @@ -3402,9 +3709,9 @@ } }, "node_modules/@lezer/css": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@lezer/css/-/css-1.3.4.tgz", - "integrity": "sha512-N+tn9tej2hPvyKgHEApMOQfHczDJCwxrRFS3SPn9QjYN+uwHvEDnCgKRrb3mxDYxRS8sKMM8fhC3+lc04Abz5Q==", + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/@lezer/css/-/css-1.3.6.tgz", + "integrity": "sha512-YJE78Wcg+zX8f10hiHWQ4Az48Qr/c13eId0VtRQYLBpxHDmDeSrXIlkbl+fJGW42rWC/uoUco9mhBZeVWP/A1g==", "license": "MIT", "dependencies": { "@lezer/common": "^1.2.0", @@ -3486,9 +3793,9 @@ } }, "node_modules/@lezer/markdown": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@lezer/markdown/-/markdown-1.7.1.tgz", - "integrity": "sha512-MEBZeFSBxgteUjEC3Wxg2Dwld5/JxRKG267L3bMFdibm8KjqSdiJYBeFw1Nt1CM8+zKMpSIEHblY8FD9z38sJQ==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@lezer/markdown/-/markdown-1.7.2.tgz", + "integrity": "sha512-iTkYvoVcKt3WkeL7qUDyXHONZEwLio4wj8KTNi2dnjQEXBZKMV63BpQrPqfsM+OkvuRbiSTAcycYAsQzLhRNoQ==", "license": "MIT", "dependencies": { "@lezer/common": "^1.5.0", @@ -3623,9 +3930,9 @@ } }, "node_modules/@mdxeditor/editor": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@mdxeditor/editor/-/editor-4.0.4.tgz", - "integrity": "sha512-fUUWoIFfHB4g+PHkcpKp5zRfoMmDWrVeSaoB4x81759J2xrWsmYYoCYx0oVLcL6HXat8f/8LprlRmAxpcIPnLQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@mdxeditor/editor/-/editor-4.2.0.tgz", + "integrity": "sha512-S/IPY8AjWTV2v1TGbEy5lsbQ5w+J2M2j2QDeswxP4FpNh2B49OPkpSqHbbX5GbV0YBlhfXJxtzwBJv/sQACufw==", "license": "MIT", "dependencies": { "@codemirror/commands": "^6.2.4", @@ -3634,15 +3941,17 @@ "@codemirror/merge": "^6.4.0", "@codemirror/state": "^6.4.0", "@codemirror/view": "^6.23.0", - "@lexical/clipboard": "^0.35.0", - "@lexical/link": "^0.35.0", - "@lexical/list": "^0.35.0", - "@lexical/markdown": "^0.35.0", - "@lexical/plain-text": "^0.35.0", - "@lexical/react": "^0.35.0", - "@lexical/rich-text": "^0.35.0", - "@lexical/selection": "^0.35.0", - "@lexical/utils": "^0.35.0", + "@lexical/clipboard": "^0.48.0", + "@lexical/extension": "^0.48.0", + "@lexical/history": "^0.48.0", + "@lexical/link": "^0.48.0", + "@lexical/list": "^0.48.0", + "@lexical/markdown": "^0.48.0", + "@lexical/plain-text": "^0.48.0", + "@lexical/react": "^0.48.0", + "@lexical/rich-text": "^0.48.0", + "@lexical/selection": "^0.48.0", + "@lexical/utils": "^0.48.0", "@mdxeditor/gurx": "^1.2.4", "@radix-ui/colors": "^3.0.0", "@radix-ui/react-dialog": "^1.1.11", @@ -3657,8 +3966,8 @@ "cm6-theme-basic-light": "^0.2.0", "codemirror": "^6.0.1", "downshift": "^7.6.0", - "js-yaml": "4.2.0", - "lexical": "^0.35.0", + "js-yaml": "4.3.0", + "lexical": "^0.48.0", "mdast-util-directive": "^3.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-frontmatter": "^2.0.1", @@ -3692,15 +4001,37 @@ "react-dom": ">= 18 || >= 19" } }, - "node_modules/@mdxeditor/gurx": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@mdxeditor/gurx/-/gurx-1.2.4.tgz", - "integrity": "sha512-9ZykIFYhKaXaaSPCs1cuI+FvYDegJjbKwmA4ASE/zY+hJY6EYqvoye4esiO85CjhOw9aoD/izD/CU78/egVqmg==", - "license": "MIT", - "engines": { - "node": ">=16" - }, - "peerDependencies": { + "node_modules/@mdxeditor/editor/node_modules/js-yaml": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", + "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@mdxeditor/gurx": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@mdxeditor/gurx/-/gurx-1.2.4.tgz", + "integrity": "sha512-9ZykIFYhKaXaaSPCs1cuI+FvYDegJjbKwmA4ASE/zY+hJY6EYqvoye4esiO85CjhOw9aoD/izD/CU78/egVqmg==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { "react": ">= 18 || >= 19", "react-dom": ">= 18 || >= 19" } @@ -3745,12 +4076,12 @@ } }, "node_modules/@modelcontextprotocol/sdk": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.29.0.tgz", - "integrity": "sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==", + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.30.0.tgz", + "integrity": "sha512-xKd8OIzlqNzcqcNumGAa6g+PW2kjD5vrpcKOnfldAUPP3j7lnqMPwlTXQm8gF+UwH72z0lqaRbjr9hqGz0eITA==", "license": "MIT", "dependencies": { - "@hono/node-server": "^1.19.9", + "@hono/node-server": "^1.19.9 || ^2.0.5", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", @@ -3846,6 +4177,25 @@ "@module-federation/sdk": "0.22.0" } }, + "node_modules/@napi-rs/lzma-linux-x64-gnu": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", + "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, "node_modules/@napi-rs/wasm-runtime": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.7.tgz", @@ -3894,34 +4244,64 @@ } }, "node_modules/@octokit/app": { - "version": "16.1.2", - "resolved": "https://registry.npmjs.org/@octokit/app/-/app-16.1.2.tgz", - "integrity": "sha512-8j7sEpUYVj18dxvh0KWj6W/l6uAiVRBl1JBDVRqH1VHKAO/G5eRVl4yEoYACjakWers1DjUkcCHyJNQK47JqyQ==", + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@octokit/app/-/app-16.1.4.tgz", + "integrity": "sha512-g70WONQyGoBgqIJtv4O0MUEfOF1iJpTfFt3qAW7HaiwiJ6k607xg/gBezCa4tuq6BpO6qXn7qvq8v9tjWtgGQg==", "license": "MIT", "dependencies": { - "@octokit/auth-app": "^8.1.2", - "@octokit/auth-unauthenticated": "^7.0.3", - "@octokit/core": "^7.0.6", - "@octokit/oauth-app": "^8.0.3", - "@octokit/plugin-paginate-rest": "^14.0.0", - "@octokit/types": "^16.0.0", + "@octokit/auth-app": "^8.3.0", + "@octokit/auth-unauthenticated": "^7.0.4", + "@octokit/core": "^7.0.7", + "@octokit/oauth-app": "^8.0.4", + "@octokit/plugin-paginate-rest": "^15.0.0", + "@octokit/types": "^17.0.0", "@octokit/webhooks": "^14.0.0" }, "engines": { "node": ">= 20" } }, + "node_modules/@octokit/app/node_modules/@octokit/openapi-types": { + "version": "28.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-28.0.0.tgz", + "integrity": "sha512-0rFyLuyHvIj6uuZWuDslxkowFYdPXoNIkeAv4b27dzm2Tf4vGWXnPsMcxs7d65kLdMERgP3wc1AEPlqMz8e1cQ==", + "license": "MIT" + }, + "node_modules/@octokit/app/node_modules/@octokit/plugin-paginate-rest": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-15.0.0.tgz", + "integrity": "sha512-lw9A9YL5s4VPj+VEx8uMxaxQm2YTgrPDkrLEuZuu18R8TK3oPcXF4K6t52nx6xn1RcogZC9i188sAr/4XYJaQQ==", + "license": "MIT", + "dependencies": { + "@octokit/types": "^17.0.0" + }, + "engines": { + "node": ">= 20" + }, + "peerDependencies": { + "@octokit/core": ">=6" + } + }, + "node_modules/@octokit/app/node_modules/@octokit/types": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-17.0.0.tgz", + "integrity": "sha512-ByP1v7YL5SMveFPP7+sj0/ZuWCOOg/Chs4NafOMpq6WNIM/hdGY0S7C0TCGDBWu1aGmOxmUIhMx3cO+IdwYZ1Q==", + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^28.0.0" + } + }, "node_modules/@octokit/auth-app": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-app/-/auth-app-8.2.0.tgz", - "integrity": "sha512-vVjdtQQwomrZ4V46B9LaCsxsySxGoHsyw6IYBov/TqJVROrlYdyNgw5q6tQbB7KZt53v1l1W53RiqTvpzL907g==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-app/-/auth-app-8.3.0.tgz", + "integrity": "sha512-/UaKmJCsOc5XBZwhnFiGNdLH/FkDF8lYtBn1QlKxtX7IpgaRB/XOXjixFtERAknyUZHxp3oDuoiG0En4VptJSg==", "license": "MIT", "dependencies": { - "@octokit/auth-oauth-app": "^9.0.3", - "@octokit/auth-oauth-user": "^6.0.2", - "@octokit/request": "^10.0.6", - "@octokit/request-error": "^7.0.2", - "@octokit/types": "^16.0.0", + "@octokit/auth-oauth-app": "^9.0.4", + "@octokit/auth-oauth-user": "^6.0.3", + "@octokit/request": "^10.0.13", + "@octokit/request-error": "^7.1.1", + "@octokit/types": "^17.0.0", "toad-cache": "^3.7.0", "universal-github-app-jwt": "^2.2.0", "universal-user-agent": "^7.0.0" @@ -3930,53 +4310,113 @@ "node": ">= 20" } }, + "node_modules/@octokit/auth-app/node_modules/@octokit/openapi-types": { + "version": "28.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-28.0.0.tgz", + "integrity": "sha512-0rFyLuyHvIj6uuZWuDslxkowFYdPXoNIkeAv4b27dzm2Tf4vGWXnPsMcxs7d65kLdMERgP3wc1AEPlqMz8e1cQ==", + "license": "MIT" + }, + "node_modules/@octokit/auth-app/node_modules/@octokit/types": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-17.0.0.tgz", + "integrity": "sha512-ByP1v7YL5SMveFPP7+sj0/ZuWCOOg/Chs4NafOMpq6WNIM/hdGY0S7C0TCGDBWu1aGmOxmUIhMx3cO+IdwYZ1Q==", + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^28.0.0" + } + }, "node_modules/@octokit/auth-oauth-app": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-app/-/auth-oauth-app-9.0.3.tgz", - "integrity": "sha512-+yoFQquaF8OxJSxTb7rnytBIC2ZLbLqA/yb71I4ZXT9+Slw4TziV9j/kyGhUFRRTF2+7WlnIWsePZCWHs+OGjg==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-app/-/auth-oauth-app-9.0.4.tgz", + "integrity": "sha512-Pe3du5LrC6dlv10b0RbarBlJtIT1Urq8BFoQklK8WmBw8YKnGgrANn7cQmHiA1v8AVihgi7YutV8MncP57I4og==", "license": "MIT", "dependencies": { - "@octokit/auth-oauth-device": "^8.0.3", - "@octokit/auth-oauth-user": "^6.0.2", - "@octokit/request": "^10.0.6", - "@octokit/types": "^16.0.0", + "@octokit/auth-oauth-device": "^8.0.4", + "@octokit/auth-oauth-user": "^6.0.3", + "@octokit/request": "^10.0.13", + "@octokit/types": "^17.0.0", "universal-user-agent": "^7.0.0" }, "engines": { "node": ">= 20" } }, + "node_modules/@octokit/auth-oauth-app/node_modules/@octokit/openapi-types": { + "version": "28.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-28.0.0.tgz", + "integrity": "sha512-0rFyLuyHvIj6uuZWuDslxkowFYdPXoNIkeAv4b27dzm2Tf4vGWXnPsMcxs7d65kLdMERgP3wc1AEPlqMz8e1cQ==", + "license": "MIT" + }, + "node_modules/@octokit/auth-oauth-app/node_modules/@octokit/types": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-17.0.0.tgz", + "integrity": "sha512-ByP1v7YL5SMveFPP7+sj0/ZuWCOOg/Chs4NafOMpq6WNIM/hdGY0S7C0TCGDBWu1aGmOxmUIhMx3cO+IdwYZ1Q==", + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^28.0.0" + } + }, "node_modules/@octokit/auth-oauth-device": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-device/-/auth-oauth-device-8.0.3.tgz", - "integrity": "sha512-zh2W0mKKMh/VWZhSqlaCzY7qFyrgd9oTWmTmHaXnHNeQRCZr/CXy2jCgHo4e4dJVTiuxP5dLa0YM5p5QVhJHbw==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-device/-/auth-oauth-device-8.0.4.tgz", + "integrity": "sha512-M/+34rmkxMvUnnTo/uqNeVRCXJoJ+5N34eNTbL1KMtIyJpedCTsu/iFL1cWdL+w5hQMlYt6xzXoyux2gn0OVnw==", "license": "MIT", "dependencies": { - "@octokit/oauth-methods": "^6.0.2", - "@octokit/request": "^10.0.6", - "@octokit/types": "^16.0.0", + "@octokit/oauth-methods": "^6.0.3", + "@octokit/request": "^10.0.13", + "@octokit/types": "^17.0.0", "universal-user-agent": "^7.0.0" }, "engines": { "node": ">= 20" } }, + "node_modules/@octokit/auth-oauth-device/node_modules/@octokit/openapi-types": { + "version": "28.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-28.0.0.tgz", + "integrity": "sha512-0rFyLuyHvIj6uuZWuDslxkowFYdPXoNIkeAv4b27dzm2Tf4vGWXnPsMcxs7d65kLdMERgP3wc1AEPlqMz8e1cQ==", + "license": "MIT" + }, + "node_modules/@octokit/auth-oauth-device/node_modules/@octokit/types": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-17.0.0.tgz", + "integrity": "sha512-ByP1v7YL5SMveFPP7+sj0/ZuWCOOg/Chs4NafOMpq6WNIM/hdGY0S7C0TCGDBWu1aGmOxmUIhMx3cO+IdwYZ1Q==", + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^28.0.0" + } + }, "node_modules/@octokit/auth-oauth-user": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-user/-/auth-oauth-user-6.0.2.tgz", - "integrity": "sha512-qLoPPc6E6GJoz3XeDG/pnDhJpTkODTGG4kY0/Py154i/I003O9NazkrwJwRuzgCalhzyIeWQ+6MDvkUmKXjg/A==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-user/-/auth-oauth-user-6.0.3.tgz", + "integrity": "sha512-t4OKUhrI5britmpRiSzPAz1TJPyUN/Hw1HEE3Hz/uElxcmnf/YCRSKtFRNc5gy4yJFTlXgk34H1lvxiotQJQvQ==", "license": "MIT", "dependencies": { - "@octokit/auth-oauth-device": "^8.0.3", - "@octokit/oauth-methods": "^6.0.2", - "@octokit/request": "^10.0.6", - "@octokit/types": "^16.0.0", + "@octokit/auth-oauth-device": "^8.0.4", + "@octokit/oauth-methods": "^6.0.3", + "@octokit/request": "^10.0.13", + "@octokit/types": "^17.0.0", "universal-user-agent": "^7.0.0" }, "engines": { "node": ">= 20" } }, + "node_modules/@octokit/auth-oauth-user/node_modules/@octokit/openapi-types": { + "version": "28.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-28.0.0.tgz", + "integrity": "sha512-0rFyLuyHvIj6uuZWuDslxkowFYdPXoNIkeAv4b27dzm2Tf4vGWXnPsMcxs7d65kLdMERgP3wc1AEPlqMz8e1cQ==", + "license": "MIT" + }, + "node_modules/@octokit/auth-oauth-user/node_modules/@octokit/types": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-17.0.0.tgz", + "integrity": "sha512-ByP1v7YL5SMveFPP7+sj0/ZuWCOOg/Chs4NafOMpq6WNIM/hdGY0S7C0TCGDBWu1aGmOxmUIhMx3cO+IdwYZ1Q==", + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^28.0.0" + } + }, "node_modules/@octokit/auth-token": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-6.0.0.tgz", @@ -3987,29 +4427,44 @@ } }, "node_modules/@octokit/auth-unauthenticated": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@octokit/auth-unauthenticated/-/auth-unauthenticated-7.0.3.tgz", - "integrity": "sha512-8Jb1mtUdmBHL7lGmop9mU9ArMRUTRhg8vp0T1VtZ4yd9vEm3zcLwmjQkhNEduKawOOORie61xhtYIhTDN+ZQ3g==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@octokit/auth-unauthenticated/-/auth-unauthenticated-7.0.4.tgz", + "integrity": "sha512-j4zgVdP8C8C53PNsj4LLI+WFtoykaQARwwrIBILTdxwZ2Ljaa9YUxb1yQ7/seGVnmWPdC3OBefX3LLbh28gKtw==", "license": "MIT", "dependencies": { - "@octokit/request-error": "^7.0.2", - "@octokit/types": "^16.0.0" + "@octokit/request-error": "^7.1.1", + "@octokit/types": "^17.0.0" }, "engines": { "node": ">= 20" } }, + "node_modules/@octokit/auth-unauthenticated/node_modules/@octokit/openapi-types": { + "version": "28.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-28.0.0.tgz", + "integrity": "sha512-0rFyLuyHvIj6uuZWuDslxkowFYdPXoNIkeAv4b27dzm2Tf4vGWXnPsMcxs7d65kLdMERgP3wc1AEPlqMz8e1cQ==", + "license": "MIT" + }, + "node_modules/@octokit/auth-unauthenticated/node_modules/@octokit/types": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-17.0.0.tgz", + "integrity": "sha512-ByP1v7YL5SMveFPP7+sj0/ZuWCOOg/Chs4NafOMpq6WNIM/hdGY0S7C0TCGDBWu1aGmOxmUIhMx3cO+IdwYZ1Q==", + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^28.0.0" + } + }, "node_modules/@octokit/core": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-7.0.6.tgz", - "integrity": "sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-7.0.7.tgz", + "integrity": "sha512-DcB0M3KFgr9ECI328lhBMVsyFT2DnmNucSBTqEN3exyNKUzkkpUSCHmTRcunF41Eou2TIQKW4seewri8ON9bSA==", "license": "MIT", "dependencies": { "@octokit/auth-token": "^6.0.0", - "@octokit/graphql": "^9.0.3", - "@octokit/request": "^10.0.6", - "@octokit/request-error": "^7.0.2", - "@octokit/types": "^16.0.0", + "@octokit/graphql": "^9.0.4", + "@octokit/request": "^10.0.13", + "@octokit/request-error": "^7.1.1", + "@octokit/types": "^17.0.0", "before-after-hook": "^4.0.0", "universal-user-agent": "^7.0.0" }, @@ -4017,45 +4472,90 @@ "node": ">= 20" } }, + "node_modules/@octokit/core/node_modules/@octokit/openapi-types": { + "version": "28.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-28.0.0.tgz", + "integrity": "sha512-0rFyLuyHvIj6uuZWuDslxkowFYdPXoNIkeAv4b27dzm2Tf4vGWXnPsMcxs7d65kLdMERgP3wc1AEPlqMz8e1cQ==", + "license": "MIT" + }, + "node_modules/@octokit/core/node_modules/@octokit/types": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-17.0.0.tgz", + "integrity": "sha512-ByP1v7YL5SMveFPP7+sj0/ZuWCOOg/Chs4NafOMpq6WNIM/hdGY0S7C0TCGDBWu1aGmOxmUIhMx3cO+IdwYZ1Q==", + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^28.0.0" + } + }, "node_modules/@octokit/endpoint": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.3.tgz", - "integrity": "sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag==", + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.4.tgz", + "integrity": "sha512-f1cOWoHPmxryJFknxbtDdjODWfV8A9tc8Aae6ermXPNgHFZ/x91AtHIz4gicEjL8hkJiip+u21QHJORfBv/qiA==", "license": "MIT", "dependencies": { - "@octokit/types": "^16.0.0", + "@octokit/types": "^17.0.0", "universal-user-agent": "^7.0.2" }, "engines": { "node": ">= 20" } }, + "node_modules/@octokit/endpoint/node_modules/@octokit/openapi-types": { + "version": "28.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-28.0.0.tgz", + "integrity": "sha512-0rFyLuyHvIj6uuZWuDslxkowFYdPXoNIkeAv4b27dzm2Tf4vGWXnPsMcxs7d65kLdMERgP3wc1AEPlqMz8e1cQ==", + "license": "MIT" + }, + "node_modules/@octokit/endpoint/node_modules/@octokit/types": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-17.0.0.tgz", + "integrity": "sha512-ByP1v7YL5SMveFPP7+sj0/ZuWCOOg/Chs4NafOMpq6WNIM/hdGY0S7C0TCGDBWu1aGmOxmUIhMx3cO+IdwYZ1Q==", + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^28.0.0" + } + }, "node_modules/@octokit/graphql": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-9.0.3.tgz", - "integrity": "sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-9.0.4.tgz", + "integrity": "sha512-5s15CCiY8XXQ+FG+b1YQcl6Z2FA++nwAz/tg2VUrTmnMncP+2nnGUEYANImdnxsA2Fnq+Mbl7hDjUTw7cFAwcg==", "license": "MIT", "dependencies": { - "@octokit/request": "^10.0.6", - "@octokit/types": "^16.0.0", + "@octokit/request": "^10.0.13", + "@octokit/types": "^17.0.0", "universal-user-agent": "^7.0.0" }, "engines": { "node": ">= 20" } }, + "node_modules/@octokit/graphql/node_modules/@octokit/openapi-types": { + "version": "28.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-28.0.0.tgz", + "integrity": "sha512-0rFyLuyHvIj6uuZWuDslxkowFYdPXoNIkeAv4b27dzm2Tf4vGWXnPsMcxs7d65kLdMERgP3wc1AEPlqMz8e1cQ==", + "license": "MIT" + }, + "node_modules/@octokit/graphql/node_modules/@octokit/types": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-17.0.0.tgz", + "integrity": "sha512-ByP1v7YL5SMveFPP7+sj0/ZuWCOOg/Chs4NafOMpq6WNIM/hdGY0S7C0TCGDBWu1aGmOxmUIhMx3cO+IdwYZ1Q==", + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^28.0.0" + } + }, "node_modules/@octokit/oauth-app": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/@octokit/oauth-app/-/oauth-app-8.0.3.tgz", - "integrity": "sha512-jnAjvTsPepyUaMu9e69hYBuozEPgYqP4Z3UnpmvoIzHDpf8EXDGvTY1l1jK0RsZ194oRd+k6Hm13oRU8EoDFwg==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@octokit/oauth-app/-/oauth-app-8.0.4.tgz", + "integrity": "sha512-Ji5JpRwAJcbOJkO4ij0tW6+GrQ8efpICnAca3o5xI8/HUNjqJu3hhG4cCZdXAHMKaOaQTFX0Yl+cpu61Rsx94A==", "license": "MIT", "dependencies": { - "@octokit/auth-oauth-app": "^9.0.2", - "@octokit/auth-oauth-user": "^6.0.1", - "@octokit/auth-unauthenticated": "^7.0.2", - "@octokit/core": "^7.0.5", + "@octokit/auth-oauth-app": "^9.0.4", + "@octokit/auth-oauth-user": "^6.0.3", + "@octokit/auth-unauthenticated": "^7.0.4", + "@octokit/core": "^7.0.7", "@octokit/oauth-authorization-url": "^8.0.0", - "@octokit/oauth-methods": "^6.0.1", + "@octokit/oauth-methods": "^6.0.3", "@types/aws-lambda": "^8.10.83", "universal-user-agent": "^7.0.0" }, @@ -4073,20 +4573,35 @@ } }, "node_modules/@octokit/oauth-methods": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@octokit/oauth-methods/-/oauth-methods-6.0.2.tgz", - "integrity": "sha512-HiNOO3MqLxlt5Da5bZbLV8Zarnphi4y9XehrbaFMkcoJ+FL7sMxH/UlUsCVxpddVu4qvNDrBdaTVE2o4ITK8ng==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@octokit/oauth-methods/-/oauth-methods-6.0.3.tgz", + "integrity": "sha512-t7MBs34Ja16BBZlOSAFslFh4wBMuofD83wVLG9zIuuEGMv/U12XAJ8ESOifgEcC1ptjhNA3sorLA9BCtVfgPuw==", "license": "MIT", "dependencies": { "@octokit/oauth-authorization-url": "^8.0.0", - "@octokit/request": "^10.0.6", - "@octokit/request-error": "^7.0.2", - "@octokit/types": "^16.0.0" + "@octokit/request": "^10.0.13", + "@octokit/request-error": "^7.1.1", + "@octokit/types": "^17.0.0" }, "engines": { "node": ">= 20" } }, + "node_modules/@octokit/oauth-methods/node_modules/@octokit/openapi-types": { + "version": "28.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-28.0.0.tgz", + "integrity": "sha512-0rFyLuyHvIj6uuZWuDslxkowFYdPXoNIkeAv4b27dzm2Tf4vGWXnPsMcxs7d65kLdMERgP3wc1AEPlqMz8e1cQ==", + "license": "MIT" + }, + "node_modules/@octokit/oauth-methods/node_modules/@octokit/types": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-17.0.0.tgz", + "integrity": "sha512-ByP1v7YL5SMveFPP7+sj0/ZuWCOOg/Chs4NafOMpq6WNIM/hdGY0S7C0TCGDBWu1aGmOxmUIhMx3cO+IdwYZ1Q==", + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^28.0.0" + } + }, "node_modules/@octokit/openapi-types": { "version": "27.0.0", "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-27.0.0.tgz", @@ -4142,13 +4657,13 @@ } }, "node_modules/@octokit/plugin-retry": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-8.1.0.tgz", - "integrity": "sha512-O1FZgXeiGb2sowEr/hYTr6YunGdSAFWnr2fyW39Ah85H8O33ELASQxcvOFF5LE6Tjekcyu2ms4qAzJVhSaJxTw==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-8.1.1.tgz", + "integrity": "sha512-VCVvZ/R1+u3WuiBWpNavZ0mY4aaJNAsENrpBP9aLSR2QyOpQgd7DhM5j4AW7z4MQpnJYgwBPf0XqPQoNBRdQwg==", "license": "MIT", "dependencies": { - "@octokit/request-error": "^7.0.2", - "@octokit/types": "^16.0.0", + "@octokit/request-error": "^7.1.1", + "@octokit/types": "^17.0.0", "bottleneck": "^2.15.3" }, "engines": { @@ -4158,13 +4673,28 @@ "@octokit/core": ">=7" } }, + "node_modules/@octokit/plugin-retry/node_modules/@octokit/openapi-types": { + "version": "28.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-28.0.0.tgz", + "integrity": "sha512-0rFyLuyHvIj6uuZWuDslxkowFYdPXoNIkeAv4b27dzm2Tf4vGWXnPsMcxs7d65kLdMERgP3wc1AEPlqMz8e1cQ==", + "license": "MIT" + }, + "node_modules/@octokit/plugin-retry/node_modules/@octokit/types": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-17.0.0.tgz", + "integrity": "sha512-ByP1v7YL5SMveFPP7+sj0/ZuWCOOg/Chs4NafOMpq6WNIM/hdGY0S7C0TCGDBWu1aGmOxmUIhMx3cO+IdwYZ1Q==", + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^28.0.0" + } + }, "node_modules/@octokit/plugin-throttling": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-11.0.3.tgz", - "integrity": "sha512-34eE0RkFCKycLl2D2kq7W+LovheM/ex3AwZCYN8udpi6bxsyjZidb2McXs69hZhLmJlDqTSP8cH+jSRpiaijBg==", + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-11.0.5.tgz", + "integrity": "sha512-LIdrkrUv+DWbKeg/49rGuFJ3SU0d3hUS+B4MhNZLepBoNUFXms8Ic9edJjrlx+zycqJHjrMRudVpVb/bAXM2Lw==", "license": "MIT", "dependencies": { - "@octokit/types": "^16.0.0", + "@octokit/types": "^17.0.0", "bottleneck": "^2.15.3" }, "engines": { @@ -4174,15 +4704,30 @@ "@octokit/core": "^7.0.0" } }, + "node_modules/@octokit/plugin-throttling/node_modules/@octokit/openapi-types": { + "version": "28.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-28.0.0.tgz", + "integrity": "sha512-0rFyLuyHvIj6uuZWuDslxkowFYdPXoNIkeAv4b27dzm2Tf4vGWXnPsMcxs7d65kLdMERgP3wc1AEPlqMz8e1cQ==", + "license": "MIT" + }, + "node_modules/@octokit/plugin-throttling/node_modules/@octokit/types": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-17.0.0.tgz", + "integrity": "sha512-ByP1v7YL5SMveFPP7+sj0/ZuWCOOg/Chs4NafOMpq6WNIM/hdGY0S7C0TCGDBWu1aGmOxmUIhMx3cO+IdwYZ1Q==", + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^28.0.0" + } + }, "node_modules/@octokit/request": { - "version": "10.0.11", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.11.tgz", - "integrity": "sha512-+s7HUxjfFqOMS9VlIwDffq0MikjSAK0gSpG73W+meAvVAvX4MBrHYTK5Bj3Uot55qFT4gzUtfzE4mGWY4Br8/Q==", + "version": "10.0.13", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.13.tgz", + "integrity": "sha512-v2269YxL9Yf+x3d+gRI63FP0vFQEiWgLyBzxe/Y+0yFDg2B/Tzf5dhh9VNfccVAQnfcfwQWyk/y6Bn7rUXXs7A==", "license": "MIT", "dependencies": { "@octokit/endpoint": "^11.0.3", - "@octokit/request-error": "^7.0.2", - "@octokit/types": "^16.0.0", + "@octokit/request-error": "^7.1.1", + "@octokit/types": "^17.0.0", "content-type": "^2.0.0", "json-with-bigint": "^3.5.3", "universal-user-agent": "^7.0.2" @@ -4192,17 +4737,47 @@ } }, "node_modules/@octokit/request-error": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.1.0.tgz", - "integrity": "sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.1.1.tgz", + "integrity": "sha512-+eaY7G2VVpSf2pc5Gn1+mph837V/d/TYTJAgWL9Tb0ogGYcpN3IlAVFgjL+Vv93F/sevrxkvsYCedtpLdcFLzA==", "license": "MIT", "dependencies": { - "@octokit/types": "^16.0.0" + "@octokit/types": "^17.0.0" }, "engines": { "node": ">= 20" } }, + "node_modules/@octokit/request-error/node_modules/@octokit/openapi-types": { + "version": "28.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-28.0.0.tgz", + "integrity": "sha512-0rFyLuyHvIj6uuZWuDslxkowFYdPXoNIkeAv4b27dzm2Tf4vGWXnPsMcxs7d65kLdMERgP3wc1AEPlqMz8e1cQ==", + "license": "MIT" + }, + "node_modules/@octokit/request-error/node_modules/@octokit/types": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-17.0.0.tgz", + "integrity": "sha512-ByP1v7YL5SMveFPP7+sj0/ZuWCOOg/Chs4NafOMpq6WNIM/hdGY0S7C0TCGDBWu1aGmOxmUIhMx3cO+IdwYZ1Q==", + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^28.0.0" + } + }, + "node_modules/@octokit/request/node_modules/@octokit/openapi-types": { + "version": "28.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-28.0.0.tgz", + "integrity": "sha512-0rFyLuyHvIj6uuZWuDslxkowFYdPXoNIkeAv4b27dzm2Tf4vGWXnPsMcxs7d65kLdMERgP3wc1AEPlqMz8e1cQ==", + "license": "MIT" + }, + "node_modules/@octokit/request/node_modules/@octokit/types": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-17.0.0.tgz", + "integrity": "sha512-ByP1v7YL5SMveFPP7+sj0/ZuWCOOg/Chs4NafOMpq6WNIM/hdGY0S7C0TCGDBWu1aGmOxmUIhMx3cO+IdwYZ1Q==", + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^28.0.0" + } + }, "node_modules/@octokit/types": { "version": "16.0.0", "resolved": "https://registry.npmjs.org/@octokit/types/-/types-16.0.0.tgz", @@ -4242,9 +4817,9 @@ "license": "MIT" }, "node_modules/@oxc-project/types": { - "version": "0.139.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.139.0.tgz", - "integrity": "sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==", + "version": "0.143.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.143.0.tgz", + "integrity": "sha512-u6JZdLBTLotrNC9Vd6vPssINdzcCzleKAH6EJKImQb7GtYvX5keN2dxkoK44stCc4tffE6QQRtZTXVSzsLUlWA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/Boshen" @@ -4385,6 +4960,16 @@ "integrity": "sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==", "license": "MIT" }, + "node_modules/@preact/signals-core": { + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/@preact/signals-core/-/signals-core-1.14.4.tgz", + "integrity": "sha512-HNB6HYeYKhQbJ1aKl+YRjrS4+QWHLKX6qKoUsfS/m0vqzsVaEBiZiaKbG/e+NKk2ch5ALQr/ihWaMHxiCuuWHA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, "node_modules/@radix-ui/colors": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@radix-ui/colors/-/colors-3.0.0.tgz", @@ -4392,24 +4977,24 @@ "license": "MIT" }, "node_modules/@radix-ui/number": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.2.tgz", - "integrity": "sha512-ceTwaxc4I5IOi97DgCotl3pqiyRGvffcc0oOsE2dQYaJOFIDsDt4VWG6xEbg1QePv9QWausCEIppud/tJ1wNig==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.3.tgz", + "integrity": "sha512-Road2bidD0uu/1BGDOWNdPI06g0lIRy6IF9GZcIrDK2KGItfor8IQwQa+yM2ERgHM1MmHxaxpTzk0/Jp42lNfA==", "license": "MIT" }, "node_modules/@radix-ui/primitive": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.5.tgz", - "integrity": "sha512-d86WIWFYNtGA0H/d8exstrTRTp7eWJYlYJbtNofxr/3ljupZYn6EFDG/Qgu/0Kc8v7yMUxySagqJsL1+PdYjWg==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.7.tgz", + "integrity": "sha512-rqWnm76nYT8HoNNqEjpgJ7Pw/DrBj5iBTrmEPo6HTX5+VJyBNOqTdv4g89G63HuR5g0AaENoAcH7Is5fF2kZ8Q==", "license": "MIT" }, "node_modules/@radix-ui/react-arrow": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.11.tgz", - "integrity": "sha512-Kdil9BB1rIFC/khmf4hC35bn8701AJcizTU7G7cUbEbk5XqqbjDuHW60uUfKqO5WojjZcbAW51Q7P0hRmMLw8A==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.15.tgz", + "integrity": "sha512-v4zggRcjadnI+ClKDuijlQEW4tw3NoaeHc/PwpKnLoLLKNUG4InLegkstooLcRIUWCs+8L22dGURCVuFfOKfnA==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.7" + "@radix-ui/react-primitive": "2.1.10" }, "peerDependencies": { "@types/react": "*", @@ -4427,15 +5012,15 @@ } }, "node_modules/@radix-ui/react-collection": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.12.tgz", - "integrity": "sha512-nb67INpE0IahJKN7EYPp9m9YGwYeKlnzxT3MwXVkgCskaSJia97kG4T0ywpjNUSSnoJk/uvk12V8vbrEHEj+/Q==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.15.tgz", + "integrity": "sha512-9W+B9NPF0NaaPh/1NJd3+KqsnlLqU9H7T2rvww+fp+T/evVXdNAyYcnfRQZFOjkR1ajQp3yORlqnI8soawLvNA==", "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.2.0", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-slot": "1.3.0" + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-slot": "1.3.3" }, "peerDependencies": { "@types/react": "*", @@ -4453,9 +5038,9 @@ } }, "node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.3.tgz", - "integrity": "sha512-rYOP8OMnuuPMQF1uhPVlGNcCDlkokKqGFE3JcxFViIkAXP7EvFWUliJAstrapypaBLJNHbZL6jGhbVDGTwmVhA==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.5.tgz", + "integrity": "sha512-+48PbAAbq3didjJxa+OaWY2ZwgAKsNiRGyeHKszblZMQ+kcpd9pAaT11cMkGEie0vsOi3QdeTE6d5Fe3Gn61kA==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -4468,9 +5053,9 @@ } }, "node_modules/@radix-ui/react-context": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.2.0.tgz", - "integrity": "sha512-fOE+JtN9rygNZkCnHRBEP0TAvLldlhyOxMsbwFvTP4nAs+nBmfnna+o/Zski2wkmY1YMrFC0aSzsHoLY47iLrg==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.2.2.tgz", + "integrity": "sha512-RHCUGwKHDr0hDGg4X7ma4JG4/+12qxw8rkh5QKdDldlCvtja6nUx1Ef/8HVrJze81lEsgLQlqjzjGNHantgnQA==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -4483,23 +5068,24 @@ } }, "node_modules/@radix-ui/react-dialog": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.19.tgz", - "integrity": "sha512-+HhbN2+YtkRgVirjZ2afMeutQRuGOrdkWR5+EFC58SJojGmtyNQwYzgi6tHBpOxvFHefMtPeHdgtjz0BOGxFQg==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.5", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.2.0", - "@radix-ui/react-dismissable-layer": "1.1.15", - "@radix-ui/react-focus-guards": "1.1.4", - "@radix-ui/react-focus-scope": "1.1.12", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-portal": "1.1.13", - "@radix-ui/react-presence": "1.1.7", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-slot": "1.3.0", - "@radix-ui/react-use-controllable-state": "1.2.3", + "version": "1.1.23", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.23.tgz", + "integrity": "sha512-Ksw4WeROkO4rC9k/onilX/Ao2Cr1ku1unMNH+XSCcP4jSXYu7HDsg9n4ojMjVb22XpYjAQ9qfrFlVbru1vXDUA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-focus-guards": "1.1.6", + "@radix-ui/react-focus-scope": "1.1.16", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-slot": "1.3.3", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-layout-effect": "1.1.4", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.7.2" }, @@ -4519,9 +5105,9 @@ } }, "node_modules/@radix-ui/react-direction": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.2.tgz", - "integrity": "sha512-C3vFhbyi4SW3PmbAi6Awpu4OzJtd0MxGurvSsYtr7p7nM8RNB3VAF3CUmnp2j50knpkrRcB7+ycVXzgLgF6yNA==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.4.tgz", + "integrity": "sha512-5pzg4FGQNpExhnhT2zlrP1wZFaYCd1K0nYWoFAdcYoYK868IEigqMX3B3f8yIoRlAhAeDWciLI6ZdCKHF9P4Vg==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -4534,16 +5120,16 @@ } }, "node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.15.tgz", - "integrity": "sha512-b0XaRlzn2QKuo10XyNgi2DAJDf5XC9d1nD3FJcuvCjbR7+4Ad28zmZsLsqx+hvDEzMnRuZaZxZm9gYObV6RmRA==", + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.19.tgz", + "integrity": "sha512-8g4pfOL9HoKKLWGiypT+dphVqjFfmcXO5GBnhsG6zI+lxAx/8feQpr+1LSN8Re3hiZ+XkLNS4O9ztK11/LzQ6w==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.5", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-effect-event": "0.0.3" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-effect-event": "0.0.5" }, "peerDependencies": { "@types/react": "*", @@ -4561,9 +5147,9 @@ } }, "node_modules/@radix-ui/react-focus-guards": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.4.tgz", - "integrity": "sha512-cot/aB/mOm0IYVYTTmQcEEK1M48lZWi8FlYe5nDPQQ8NYZUlXEFgncJ9p2Kzer3RKSrY7cTTpEMLZKNo9QoP5Q==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.6.tgz", + "integrity": "sha512-RNOJjfZMTyBM6xYmV3IVGXkPjIhcBAuv48POevAXwrGJhkWZ9p1rFoIS1JFooPuT193AZmRsCPhpoVJxx6OPoQ==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -4576,14 +5162,14 @@ } }, "node_modules/@radix-ui/react-focus-scope": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.12.tgz", - "integrity": "sha512-jjk/lqTeNL0azUx5ZYzVrl4NgaDIrdzTNE4mABV9yBFI7FQqN7pIgzV1bTleUezP2QiTGA1BFTqY8MegDgWX9A==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.16.tgz", + "integrity": "sha512-wmRZ2WWLvmt6KHy2rNPOdPUjwq5xOHY02+m+udwJTn0aNIox/rkskAvJTyTLGhPK6KgrUjlJUJpgmx/+wFiFIQ==", "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-use-callback-ref": "1.1.2" + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -4610,12 +5196,12 @@ } }, "node_modules/@radix-ui/react-id": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.2.tgz", - "integrity": "sha512-orBC88futVpqCmhX1p4cvquNHsELQ+w+vBJnuj3ftETI5bJb0bZn3Tqu3SWN2IOcPycTnMGnhwoermvISt72sA==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.4.tgz", + "integrity": "sha512-TMQp2llA+RYn7JcjnrMnz7wN4pcVttPZnRZo52PLQsoLVKzNlVwUeHmfePgTgRluXFvlD3GD5g5MOVVTJCO0qA==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.2" + "@radix-ui/react-use-layout-effect": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -4628,24 +5214,24 @@ } }, "node_modules/@radix-ui/react-popover": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.19.tgz", - "integrity": "sha512-jkrTdQVxnIB8fpn0NyyxW9CTB5aCXZZelVz5z+Xmii6g5WxMqS3fInNslZ63puP39+Puu4jYohUK31y3dT87gQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.5", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.2.0", - "@radix-ui/react-dismissable-layer": "1.1.15", - "@radix-ui/react-focus-guards": "1.1.4", - "@radix-ui/react-focus-scope": "1.1.12", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-popper": "1.3.3", - "@radix-ui/react-portal": "1.1.13", - "@radix-ui/react-presence": "1.1.7", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-slot": "1.3.0", - "@radix-ui/react-use-controllable-state": "1.2.3", + "version": "1.1.23", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.23.tgz", + "integrity": "sha512-mw58MrBlyHWFisTOYignD0vf/3gdcgAR+9of1s9G/38CbFiUwH1nCDkc0AUM9IrXFgN5Ue8n45j9WCgyM1sbiQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-focus-guards": "1.1.6", + "@radix-ui/react-focus-scope": "1.1.16", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-popper": "1.3.7", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-slot": "1.3.3", + "@radix-ui/react-use-controllable-state": "1.2.6", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.7.2" }, @@ -4665,21 +5251,21 @@ } }, "node_modules/@radix-ui/react-popper": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.3.3.tgz", - "integrity": "sha512-mS7dGpyjv6b+gsDjLF7e0ia1W4Im1B1hSCy2yuXlHuvnZxHKagfDaobt/KAKt27EpZMit2pss8eJBVyVjEWM+g==", + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.3.7.tgz", + "integrity": "sha512-UsJrrd7w4wuKKTdvd/DNERVlwSlUcyXzjhyDwBk+3aPOsCjOY6ZSbxuw8E6lZTjjfP8Cpd0J8VVkrYUWyGYXyg==", "license": "MIT", "dependencies": { "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.1.11", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.2.0", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-layout-effect": "1.1.2", - "@radix-ui/react-use-rect": "1.1.2", - "@radix-ui/react-use-size": "1.1.2", - "@radix-ui/rect": "1.1.2" + "@radix-ui/react-arrow": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-layout-effect": "1.1.4", + "@radix-ui/react-use-rect": "1.1.4", + "@radix-ui/react-use-size": "1.1.4", + "@radix-ui/rect": "1.1.3" }, "peerDependencies": { "@types/react": "*", @@ -4697,13 +5283,13 @@ } }, "node_modules/@radix-ui/react-portal": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.13.tgz", - "integrity": "sha512-z3oXfmaHLJTF1wktbjgD6cn9jiEbq3WSondB10LIuIt2m2Ym4iJlrW04/euMwENDdWDdE7z+OuY7Qyp1YpRSwA==", + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.17.tgz", + "integrity": "sha512-vKQLcWypUnwZVvfV7UkGahH2g6ySe8M8R+zYBwPrv5byZ9QAW6cQVvNKo7GgmD+p8aYb6D9JBuvy8/WhOno2wQ==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-use-layout-effect": "1.1.2" + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-layout-effect": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -4721,12 +5307,12 @@ } }, "node_modules/@radix-ui/react-presence": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.7.tgz", - "integrity": "sha512-zBZ4QM5XG3JRanDmqXYf3MD6th4AFXFmgU6KNMFzUaV6F3uw9I5/zjMUvFriSEn5ewo1nxuibvyxJdmLlDcslA==", + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.10.tgz", + "integrity": "sha512-3wyzCQ6+ubRA+D4uv9m95JYLXxmOHp05qjrkjeA7uKHHtjpPggQzc6DAb0URl7j67oR0K2foO4ip27TiX037Bw==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.2" + "@radix-ui/react-use-layout-effect": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -4744,12 +5330,12 @@ } }, "node_modules/@radix-ui/react-primitive": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.7.tgz", - "integrity": "sha512-bC3NiwsprbxKjuon9l7X6BUTw7FPVzEYaL92MPEY5SCd/9hUTPXVFtVwRix7778wtRsVao+zE062gL79FZleeQ==", + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.10.tgz", + "integrity": "sha512-MucOnzh6hR5mid6VpkbglRAMYMjKLqRnGBbjXkzjK52fuQDd1qbkx78a5P40mkcnVXJdEVxm26E9OPAiUq7nBg==", "license": "MIT", "dependencies": { - "@radix-ui/react-slot": "1.3.0" + "@radix-ui/react-slot": "1.3.3" }, "peerDependencies": { "@types/react": "*", @@ -4767,22 +5353,22 @@ } }, "node_modules/@radix-ui/react-roving-focus": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.15.tgz", - "integrity": "sha512-40svmmugfM3mUN7VUDGVE1tQGOhyi8enlGD0CNJEcMM36C1f71PKM21DFgNHUfem0XnA+d8H8oN3Z9ZpJjSslg==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.5", - "@radix-ui/react-collection": "1.1.12", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.2.0", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-controllable-state": "1.2.3", - "@radix-ui/react-use-is-hydrated": "0.1.1", - "@radix-ui/react-use-layout-effect": "1.1.2" + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.19.tgz", + "integrity": "sha512-V9jI6hDjT7l3jsCQD9bLNvDLM3tH/gdbOTp7Tefp3hbbgCGQoK7tUvrWiRlcoBHIZ809ElXwNQwVo0B98LuTXQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-is-hydrated": "0.1.3", + "@radix-ui/react-use-layout-effect": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -4800,31 +5386,31 @@ } }, "node_modules/@radix-ui/react-select": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.3.3.tgz", - "integrity": "sha512-L5RQTXz6Anxsf9CCv+pTgiAsUpyVj7rJxsGtmhFaEOJ++cVfXucv4qWfsIO0AIB4NAhi3yovWGVMKKS1Xf1Wrg==", - "license": "MIT", - "dependencies": { - "@radix-ui/number": "1.1.2", - "@radix-ui/primitive": "1.1.5", - "@radix-ui/react-collection": "1.1.12", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.2.0", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.15", - "@radix-ui/react-focus-guards": "1.1.4", - "@radix-ui/react-focus-scope": "1.1.12", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-popper": "1.3.3", - "@radix-ui/react-portal": "1.1.13", - "@radix-ui/react-presence": "1.1.7", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-slot": "1.3.0", - "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-controllable-state": "1.2.3", - "@radix-ui/react-use-layout-effect": "1.1.2", - "@radix-ui/react-use-previous": "1.1.2", - "@radix-ui/react-visually-hidden": "1.2.7", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.3.7.tgz", + "integrity": "sha512-WFGImkmbzcfxeIwq/+4HvRN0pizBwbwQUED4I13ezQsDdfl38ZntN6TmR8XaSzPBqoCToe8rF75j6NPNDSzhbg==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.3", + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-focus-guards": "1.1.6", + "@radix-ui/react-focus-scope": "1.1.16", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-popper": "1.3.7", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-slot": "1.3.3", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-layout-effect": "1.1.4", + "@radix-ui/react-use-previous": "1.1.4", + "@radix-ui/react-visually-hidden": "1.2.11", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.7.2" }, @@ -4844,12 +5430,12 @@ } }, "node_modules/@radix-ui/react-separator": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.11.tgz", - "integrity": "sha512-jRhe86+8PF7VZ1u14eOWVOuh2BuAhALg/FT1VcMC4OHedMTRUazDnDlKTt+yxo5cRNKHMfmvZ4sSQtWDeMV4CQ==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.15.tgz", + "integrity": "sha512-jOLO4lssEzWpoDu7G+Ze4VjwMRUBt291pnZD0gmalREZipnTX3wadQo7Fy48GCTfe14/YRN6rw/rOJqrE85Wxw==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.7" + "@radix-ui/react-primitive": "2.1.10" }, "peerDependencies": { "@types/react": "*", @@ -4867,12 +5453,12 @@ } }, "node_modules/@radix-ui/react-slot": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.3.0.tgz", - "integrity": "sha512-MojKku4U/miO8Av4Dkb+ctMAQx7JmY96LmtDQlAarCRtd7rN52QCSzBF+XAvr5S6coSVj9HEPBgHAHKEJVk/WA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.3.3.tgz", + "integrity": "sha512-qx7oqnYbxnK9kYI9m317qmFmEgo6ywqWvbTogdj7cL9p3/yx4M48p7Rnw5z3H890cL/ow/EeWJsuTykeZVXP5Q==", "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.3" + "@radix-ui/react-compose-refs": "1.1.5" }, "peerDependencies": { "@types/react": "*", @@ -4885,14 +5471,14 @@ } }, "node_modules/@radix-ui/react-toggle": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.14.tgz", - "integrity": "sha512-QI/hB65XKWACA66P64A+aHxtLUgHJeJLkaQa+awUNXT6T3swndtY5DojeHA+vldrTspMTtFBd7HfZ9QGbM1Qrw==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.18.tgz", + "integrity": "sha512-7lonPlKfSacd20GlOBx2ltuVKz9oqWYZz+oMQyOltw6t1y2nyftj2ZmwwUHYn49kqfDWcp8dNZm5NgV+5Z+mug==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.5", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-use-controllable-state": "1.2.3" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6" }, "peerDependencies": { "@types/react": "*", @@ -4910,18 +5496,18 @@ } }, "node_modules/@radix-ui/react-toggle-group": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.15.tgz", - "integrity": "sha512-gIC5Q+Xljg7lmUdzSuDoy0t97yZn1sZl00Ra37ZvKrYdWnQLU6sWLd09yG8cIB9jUAlQfHgJ2ACAG00MFwsqSQ==", + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.19.tgz", + "integrity": "sha512-OtnwuSVjd1Ofi+AdnvhsjQdyuhCDwYs1w9RyB5BN/OavXOVQo42SYqQjwUnbPnaiPFBpQ9aX70dWeee+v2oBLA==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.5", - "@radix-ui/react-context": "1.2.0", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-roving-focus": "1.1.15", - "@radix-ui/react-toggle": "1.1.14", - "@radix-ui/react-use-controllable-state": "1.2.3" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-roving-focus": "1.1.19", + "@radix-ui/react-toggle": "1.1.18", + "@radix-ui/react-use-controllable-state": "1.2.6" }, "peerDependencies": { "@types/react": "*", @@ -4939,18 +5525,18 @@ } }, "node_modules/@radix-ui/react-toolbar": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toolbar/-/react-toolbar-1.1.15.tgz", - "integrity": "sha512-t/iEuVjUnXXtrsGK40AA43uIx37sn3AqZ7oAVnPICK6lFJP6dzMzWR3U9b6eCfFjb6wtSEqkJ9Rn9xDjiOx20g==", + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toolbar/-/react-toolbar-1.1.19.tgz", + "integrity": "sha512-Ph0IvtYw4VB12ZnZg+YtrGs8yJQsnizwo/zu0R4Y/nWugtJzA7Pg1eWeuDR9+LSqn+xjamss+UOSOJJJ4gx8jw==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.5", - "@radix-ui/react-context": "1.2.0", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-roving-focus": "1.1.15", - "@radix-ui/react-separator": "1.1.11", - "@radix-ui/react-toggle-group": "1.1.15" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-roving-focus": "1.1.19", + "@radix-ui/react-separator": "1.1.15", + "@radix-ui/react-toggle-group": "1.1.19" }, "peerDependencies": { "@types/react": "*", @@ -4968,23 +5554,24 @@ } }, "node_modules/@radix-ui/react-tooltip": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.12.tgz", - "integrity": "sha512-U3HoftgWnmla78vzQbLvKKb7bUYJxoiiqYFzp1wu/TBMyDqMZSuCl3aRICsD6EfVEwcJD2mumGDGUXLFVqQHKA==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.5", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.2.0", - "@radix-ui/react-dismissable-layer": "1.1.15", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-popper": "1.3.3", - "@radix-ui/react-portal": "1.1.13", - "@radix-ui/react-presence": "1.1.7", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-slot": "1.3.0", - "@radix-ui/react-use-controllable-state": "1.2.3", - "@radix-ui/react-visually-hidden": "1.2.7" + "version": "1.2.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.16.tgz", + "integrity": "sha512-6EamKFRRnlpdadndbZ6LMwycfwkwPte1B42hs6QA0gYhjaOKqW4PZ4pjaW9UrlDX5eVt/OjncE7BFTPL5nmZhg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-popper": "1.3.7", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-slot": "1.3.3", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-layout-effect": "1.1.4", + "@radix-ui/react-visually-hidden": "1.2.11" }, "peerDependencies": { "@types/react": "*", @@ -5002,9 +5589,9 @@ } }, "node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.2.tgz", - "integrity": "sha512-xCso9j1/u8sEgP1RNHjFrXJLApL8LiqOkI1R4ywuN00rxWdYg4oQXuwKLS3i0j5NWLromUD27/4nlxj2UFVvIw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.4.tgz", + "integrity": "sha512-R6OUY2e2fA6Yn6s+VSx5KBV6Nx8LQEhu+cz7LCej18rQ1HLyg9PSC9jP/ZNx0o6FAIK9c0F1kHylzSxKsdlkrQ==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -5017,13 +5604,14 @@ } }, "node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.3.tgz", - "integrity": "sha512-PLzC90MS+ReootmjC597dvopoelpZ8Q61HJkDXZSExitIq7PL55vHNnesAHwguHK0aPfBnpdNzQtv1uliaqQrA==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.6.tgz", + "integrity": "sha512-uEQJGT97ZA/TgP/Hydw47lHu+/vQj6z/0jA+WeTbK1o9Rx45GImjpD0tc3W5ad3D6XTSR6e1yEO0FvGq6WQfVQ==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-effect-event": "0.0.3", - "@radix-ui/react-use-layout-effect": "1.1.2" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-use-effect-event": "0.0.5", + "@radix-ui/react-use-layout-effect": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -5036,12 +5624,12 @@ } }, "node_modules/@radix-ui/react-use-effect-event": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.3.tgz", - "integrity": "sha512-6c8ZqvPTWILEKnyVkP53EGRCcpnJiKTC21sS/6R1GF5xKyHJJWQEPfkqlcgUkdRQivd6tb23abUwe4ngWmY0JA==", + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.5.tgz", + "integrity": "sha512-7cshFL8HGS/7HEiHH+9kL9HBwp2sa9yX18Knwek6KYWmXwM7pegMgta2AXMQKI+rq3JnfSj9x8wYqFMTdG1Jgg==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.2" + "@radix-ui/react-use-layout-effect": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -5054,9 +5642,9 @@ } }, "node_modules/@radix-ui/react-use-is-hydrated": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.1.tgz", - "integrity": "sha512-qwOiz4Tjo8CNnrOLAYUMXeZwDzXgXpvK4TKQPmWLECM9XoWvA6+0Z2/7Ag3A4ivjS4ovbLJPbskkxioFyBhr8A==", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.3.tgz", + "integrity": "sha512-umO/aJ+82CpOnhDZUTbILCQf7kU/g0iv+oGs/Q8jw7IkhWBzaEP4sA268PhFAJTFetbwp3ICc6ktpI4TqtxcIw==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -5069,9 +5657,9 @@ } }, "node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.2.tgz", - "integrity": "sha512-jrBWOxZITuGcnjRCM2t2U5ZPkCLxD+Ym6DjfssS5haTj2iiak/DOb64JeN6OdLfLgptb6/e2kKR+ZuTrGoZTPA==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.4.tgz", + "integrity": "sha512-K20DkRkUwDnxEYMBPcg3Y6voLkEy5p5QQmszZgLngKKiC7dzBR/aEuK3w1qlx2JWDUNH6FluahYdgR3BP+QbYw==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -5084,9 +5672,9 @@ } }, "node_modules/@radix-ui/react-use-previous": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.2.tgz", - "integrity": "sha512-IGBQPtRFdhN6MQ8dbegVmBq1LVZluya3F1jWY+puIcQC3MHctRwTDSBWCkL/3ZcnMJLTMJ++Z+ktmvg0F89iCw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.4.tgz", + "integrity": "sha512-XoSLhbRbqxFtgJoi2fNHA3C6pDlY34x508vUpUGoFZfvePfHXHbE1lC4FYFMnJWgiCRroSTw6fOsXQoVS9RwZg==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -5099,12 +5687,12 @@ } }, "node_modules/@radix-ui/react-use-rect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.2.tgz", - "integrity": "sha512-d8a+bBY/FxikNPlgJJoaBHZX+zKVbWHYJGTLnLvveQgFSTntkGdEKv3JDtHrMS0DNYpllz2nRsTLGLKYttbpmw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.4.tgz", + "integrity": "sha512-cSOCh6JlkmfjLyNcLiu2nB4v+nm+dkZ+Q5KHWk/soo4U7ZLiEQFKHK9/YmtBHjfCEaU43IBKQOc4/uJmCaiCTQ==", "license": "MIT", "dependencies": { - "@radix-ui/rect": "1.1.2" + "@radix-ui/rect": "1.1.3" }, "peerDependencies": { "@types/react": "*", @@ -5117,12 +5705,12 @@ } }, "node_modules/@radix-ui/react-use-size": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.2.tgz", - "integrity": "sha512-giWQp+4mxjBPt4KZ0MmyuykFNWfbDxKt4x+fPkRYmgRFJSbCZFzUglvMb/Kjn38tm10YP4ufiQZDx3zna4LU6w==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.4.tgz", + "integrity": "sha512-D3anSY15EJoxrihpsXI6SMrmmonnQtR2ni7arO+Lfdg3O95b9hNXxONk8jA5C8ANdF/h5HMAxejgs8PWJ6rlhw==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.2" + "@radix-ui/react-use-layout-effect": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -5135,12 +5723,12 @@ } }, "node_modules/@radix-ui/react-visually-hidden": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.7.tgz", - "integrity": "sha512-1wNZBggTDK3GRuuQ6nP4k2yi7a6l7I5qbMPbZcRsrGsGVead/f/d5FhEzUvqFs0bcrDLx7n1zKQ3JvLR6whaaw==", + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.11.tgz", + "integrity": "sha512-NFS86RYYZb4/exihaESBGOpMJFz8MGLAfu3mOBSGByVnVPC9JPASfYubxd/8KbkQK0sYAv8lVQDEQukDX/qXvQ==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.7" + "@radix-ui/react-primitive": "2.1.10" }, "peerDependencies": { "@types/react": "*", @@ -5158,9 +5746,9 @@ } }, "node_modules/@radix-ui/rect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.2.tgz", - "integrity": "sha512-xnXE7wG13PI+cxieVssYXlQJuYVRhH9NBoxt3KNwzghDIA69GMm7d4wXRouHIYjE+KvS6U/MsMO73NdS2MH9ZA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.3.tgz", + "integrity": "sha512-JtyZR+mqgBibTo8xea3B6ZRmzZiM/YeVBtUkas6zMuXjAlfIFIW2FgqeM9eLyvEaYX66vr6DJMK+4U6LV0KhNw==", "license": "MIT" }, "node_modules/@react-email/render": { @@ -5515,9 +6103,9 @@ "license": "Unlicense" }, "node_modules/@rolldown/binding-android-arm64": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.5.tgz", - "integrity": "sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.3.tgz", + "integrity": "sha512-zrJtHDcaZJ1Fp7xf4hNl+7seH9Cn/N5TwLYkhgXREtBwAd/jaqW3uqeHxpDugJLVICWg4eW44kOQEGJ1r6jCGw==", "cpu": [ "arm64" ], @@ -5531,9 +6119,9 @@ } }, "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.5.tgz", - "integrity": "sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.3.tgz", + "integrity": "sha512-ieIiibVCp0tX7TLu2cafoNPv8wJyYi01ekXpbf8q2j7F4rGAhhXb/eQh7ge9DRBY78GwmRQtvjZDux7EDbA8kA==", "cpu": [ "arm64" ], @@ -5547,9 +6135,9 @@ } }, "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.5.tgz", - "integrity": "sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.3.tgz", + "integrity": "sha512-Zh9tCon19eDXJoihx0rqKhMUlMYqzwj3aPsSuHmI4RWZh62dWUL+DJN4C5YQya5TcQBJU/Fe8+rY0jhXTQITqA==", "cpu": [ "x64" ], @@ -5563,9 +6151,9 @@ } }, "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.5.tgz", - "integrity": "sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.3.tgz", + "integrity": "sha512-nGbJWewA1wrXXZiQhjAT5rhibGfns5ZNkDVqxsO6zJ3f3YvpoDNNmGMSbbhLuXKjNScaBJVOAboztAWVespQMg==", "cpu": [ "x64" ], @@ -5579,9 +6167,9 @@ } }, "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.5.tgz", - "integrity": "sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.3.tgz", + "integrity": "sha512-QNniJr5Kml0kDEB98jiDOJjXNroxIIi0IXIbdYzY26Xt1pVbeP62+KnoIZLwirOymX/0jDk/2gI/bNUv7A7OIw==", "cpu": [ "arm" ], @@ -5595,9 +6183,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.5.tgz", - "integrity": "sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.3.tgz", + "integrity": "sha512-TkqEAcmmvH3I/q4114NB4RVt6241Dao48pF45uLcFGrwAaIn0iITgTAKP/dLjbN0R4buJjGb91+UHSoFmpgIWw==", "cpu": [ "arm64" ], @@ -5614,9 +6202,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.5.tgz", - "integrity": "sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.3.tgz", + "integrity": "sha512-NHqjnxpsndf4MPymxteFAWHHfkTL8HjWh1KB7z23ofZ6QO2euONuxDXjat69dKZRALnGypg8k8SsK8vZJoXv1Q==", "cpu": [ "arm64" ], @@ -5633,9 +6221,9 @@ } }, "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.5.tgz", - "integrity": "sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.3.tgz", + "integrity": "sha512-6tbrbwfz5GB9DQ4Jwo6hy9v+vR31xZlvzZ6n5Xut6Hhx5PvrA9q/HsK8KMaYQp063iqZGXwNvZtYNLD7EM/x0w==", "cpu": [ "ppc64" ], @@ -5652,9 +6240,9 @@ } }, "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.5.tgz", - "integrity": "sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.3.tgz", + "integrity": "sha512-oyuXxXmoZHjXC917IAPFAAv4wWAa0cM9afk8nx1+9/jNNOX1uPf8yDA6p7G0RypOfw/X0PQt5IfoquY1um+zSg==", "cpu": [ "s390x" ], @@ -5671,9 +6259,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.5.tgz", - "integrity": "sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.3.tgz", + "integrity": "sha512-TytMwF2KVGqP2tgd0I1OY0PAv78dZRAYcF5ssDzjM34SUXCED3uXvSd5+lHoC0bTD6eEdFz7LdQNCO1y0oVk9w==", "cpu": [ "x64" ], @@ -5690,9 +6278,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.5.tgz", - "integrity": "sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.3.tgz", + "integrity": "sha512-/E9m3qstrJFVPoULV25mVQblSNExY2+kBsYe4sy0Tn0yOOgJ8wZbZt3KnRbF/XeU2Gl1STKUQnDNTqhIE5MD4A==", "cpu": [ "x64" ], @@ -5709,9 +6297,9 @@ } }, "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.5.tgz", - "integrity": "sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.3.tgz", + "integrity": "sha512-Kr0OcsoQI816i6HOl3vFHpd1K0eZyh76zgfj4c1nTyaTsd5r2Mj1lwM4R90y/qaCfmTn9eHy0SKwi98eitRxug==", "cpu": [ "arm64" ], @@ -5724,67 +6312,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@rolldown/binding-wasm32-wasi": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.5.tgz", - "integrity": "sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==", - "cpu": [ - "wasm32" - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "1.11.1", - "@emnapi/runtime": "1.11.1", - "@napi-rs/wasm-runtime": "^1.1.6" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@emnapi/core": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", - "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.2.2", - "tslib": "^2.4.0" - } - }, - "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@emnapi/runtime": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", - "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", - "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==", - "license": "MIT", - "optional": true, - "dependencies": { - "@tybys/wasm-util": "^0.10.3" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "peerDependencies": { - "@emnapi/core": "^1.7.1", - "@emnapi/runtime": "^1.7.1" - } - }, "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.5.tgz", - "integrity": "sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.3.tgz", + "integrity": "sha512-hOtMwTqnME+/gJcH/PCZ0wn0zPUjiWOgkHpxbSJpfGKMezHltx1S7/k1SitzVa7Ww2cqrDDaFbZEhcJZO8o+Jw==", "cpu": [ "arm64" ], @@ -5798,9 +6329,9 @@ } }, "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.5.tgz", - "integrity": "sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.3.tgz", + "integrity": "sha512-ekcqMMkI2PlhYnfzQnB/cEdYUVVJViWvoUyLrbzgDoi3Snfc1mVBwdnc306ufA5ejy8JSPjT2RlW1nQSjW7efg==", "cpu": [ "x64" ], @@ -5814,9 +6345,9 @@ } }, "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.27", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", - "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", "license": "MIT" }, "node_modules/@rollup/pluginutils": { @@ -5842,9 +6373,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.2.tgz", - "integrity": "sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.4.tgz", + "integrity": "sha512-RrPokAb7dmbxFoeO3TloqHyOjgye8RkBhSqmp4aJMIex4c9r46ZstPnleDQOq1t46VOVjwIuwNogIqbodV1Vvg==", "cpu": [ "arm" ], @@ -5855,9 +6386,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.2.tgz", - "integrity": "sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.4.tgz", + "integrity": "sha512-JKuJc+pnpks2pjy7L/N3v/cAkZxYlnmuZoD840ldbMI5KDbC4iO9NKwPKYdjYFCMAIIlBzYSFHxIJVYzRo2/8A==", "cpu": [ "arm64" ], @@ -5868,9 +6399,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.2.tgz", - "integrity": "sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.4.tgz", + "integrity": "sha512-krw5uS2STmvJ02x0uTXHbqQNuz+9eZ1iw+qXk9dmW2gvV4jV7O2hEoOnuhFrpOPiel1mBFtqbxYZZtC46hXLOw==", "cpu": [ "arm64" ], @@ -5881,9 +6412,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.2.tgz", - "integrity": "sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.4.tgz", + "integrity": "sha512-wsTxtgApb4PrOsNJIm0FZ1h3WvCC+k9uxLJ4ad75hgoS4NiRes2SoJFlDAyMwiUY8IssDqGcHbXuN0sx1tfF1A==", "cpu": [ "x64" ], @@ -5894,9 +6425,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.2.tgz", - "integrity": "sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.4.tgz", + "integrity": "sha512-GUOnQlyZe3yAXhWOtOMsn5Qkrv5E5mZXa0thbARWi5Ei2szlVXJFQhddZ4HbAzh8q92w5twp+CQvs/eFanz9YQ==", "cpu": [ "arm64" ], @@ -5907,9 +6438,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.2.tgz", - "integrity": "sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.4.tgz", + "integrity": "sha512-/Y7f3QuxjzPKsjA/rfEDa3+0vXqyjmJ50Ln8dPpCmWkKTrUoWHG1cWhTqaAMLob2m2nESWuC7yGrREz019Ztqg==", "cpu": [ "x64" ], @@ -5920,9 +6451,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.2.tgz", - "integrity": "sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.4.tgz", + "integrity": "sha512-81wiiX3v7aqy+T+bT61TJ78yJjRquqFFTTbAPt08imfQQzkPIW8t6aJbkTagtCCrXMNc9D66+geqlK7ydLPNqA==", "cpu": [ "arm" ], @@ -5936,9 +6467,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.2.tgz", - "integrity": "sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.4.tgz", + "integrity": "sha512-9kmDIvNZqdoHOBZgNtpTBeLWYO/LVipM3H/j62P8848/l/VPEQL6N3uxU9pvP1oZAsXyC2MEnFP3ovRjo7WYNQ==", "cpu": [ "arm" ], @@ -5952,9 +6483,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.2.tgz", - "integrity": "sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.4.tgz", + "integrity": "sha512-CcnXHWnXg69g+DX5VWL3FHts3qMRN2uVEHX+BZvGLdd07/gXkn3ePjYtO1LDJvxkGKVHMclKBRa1QUTH+6toYQ==", "cpu": [ "arm64" ], @@ -5968,9 +6499,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.2.tgz", - "integrity": "sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.4.tgz", + "integrity": "sha512-iFOibiHnTRuhrWLlRsOQFdZJJIa7S8OwkneJr4ocALP16u5yk6lWLINFwhHaEqBFMsKDUZofLkGos7+CPzGB3g==", "cpu": [ "arm64" ], @@ -5984,9 +6515,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.2.tgz", - "integrity": "sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.4.tgz", + "integrity": "sha512-XnWYMI7euHlb5a871xPja+Gm7DRCFU+FGRrtS2sMq9N8FvqtpagUy6gD4YOemC5MRk9xbh8+jYMEJbigFQwsgA==", "cpu": [ "loong64" ], @@ -6000,9 +6531,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.2.tgz", - "integrity": "sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.4.tgz", + "integrity": "sha512-qGDAlO0U8xedCcsdRm9oaoQY8DAx/QT7uIxJWhCdx0ceIWX783UC9QSYkdpzAe29wNiVfp24+bZdQmn49o45SQ==", "cpu": [ "loong64" ], @@ -6016,9 +6547,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.2.tgz", - "integrity": "sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.4.tgz", + "integrity": "sha512-ru4H6ezD7ysA5EiEK6qkkaEb4modH8CTej6kUy/gQi20u3kB3G7Zn8snXXkeJSCOFKG/rbPPtM/+9Wgas1961w==", "cpu": [ "ppc64" ], @@ -6032,9 +6563,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.2.tgz", - "integrity": "sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.4.tgz", + "integrity": "sha512-2W4MO5WQVJnbJaZdvDb9rhBDuFU1nKIepPFpJUBsTh2k1YY2g+ODViaWuyOAjQ5cOP7NvrvLzt3wvHOoiAvc7w==", "cpu": [ "ppc64" ], @@ -6048,9 +6579,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.2.tgz", - "integrity": "sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.4.tgz", + "integrity": "sha512-+fxjfuoAmVMCYV5QyjoIpu0cp5DOiOTeqYFk1AVaxGr+/ravWLX89XfQmptsoWcaVy/TGf2hexzbUOrCQIL1CQ==", "cpu": [ "riscv64" ], @@ -6064,9 +6595,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.2.tgz", - "integrity": "sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.4.tgz", + "integrity": "sha512-jTn8JfHGL4djjFxPuM06LmNUJDsst2jeVlsd9OmIH6zc5sC9K6rIuO4YajXatLUpBmBKl6b35ro1QZocLi+tcA==", "cpu": [ "riscv64" ], @@ -6080,9 +6611,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.2.tgz", - "integrity": "sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.4.tgz", + "integrity": "sha512-oCJCJL4pXsoDcP2QZ+JVlPTIRc6266zsIaeJJsWImmF7HO0W8nb6HuSgZlMWxJwaPf8ehbSw8yo0EUw925hKsA==", "cpu": [ "s390x" ], @@ -6096,9 +6627,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.2.tgz", - "integrity": "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.4.tgz", + "integrity": "sha512-W69hukhZ3KKNRCaMIEzKvcFye42hh0FE1+YoYaf5+Ikacuftoco6yO/xouz0hc5d5W/s3yBro5jRiuEE/Q5vUw==", "cpu": [ "x64" ], @@ -6112,9 +6643,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.2.tgz", - "integrity": "sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.4.tgz", + "integrity": "sha512-qiXbGG2jkjXhzXpsFZSR2Xpb8DN/UaxYsbb/STbuR/6fpaDgRmmaq1B/LmtF2wQFOFOSsK2jdE0RZ3a0zHn4QA==", "cpu": [ "x64" ], @@ -6128,9 +6659,9 @@ ] }, "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.2.tgz", - "integrity": "sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.4.tgz", + "integrity": "sha512-nWeM//hxv8mIo6jD7Hu4o48DVmV9pbV6gsKaWU+4NFyqHoPKwrkRiZGLKUhOBk8qNmDmpwFtPKg80Bo/Tn4xiQ==", "cpu": [ "x64" ], @@ -6141,9 +6672,9 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.2.tgz", - "integrity": "sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.4.tgz", + "integrity": "sha512-s62SQ/vgsRSvMwDkOEfTqfgASF0f26ZNaQuTA6Aok5lrikf89yI2W0gFHvZb2Jpgc6N8JnOKZgCK2iciO3CsxQ==", "cpu": [ "arm64" ], @@ -6154,9 +6685,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.2.tgz", - "integrity": "sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.4.tgz", + "integrity": "sha512-J6wGf8TVGbXJq+HH+ttTvrcfNKPbuZecV6KT1B8I18BC5IURUh5kl4Yl5OEP5eFIUoI5BWxCsyYMhFsDx8kekw==", "cpu": [ "arm64" ], @@ -6167,9 +6698,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.2.tgz", - "integrity": "sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.4.tgz", + "integrity": "sha512-zmfrQd/0wu6oJs8Vq8KwY/YtsKSsLtKe/HwAP4Wqy8LhWjeT55fHRAkOhYQ12wI3ayS4Tt12d5CDRD7N96SAYQ==", "cpu": [ "ia32" ], @@ -6180,9 +6711,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.2.tgz", - "integrity": "sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.4.tgz", + "integrity": "sha512-qPzHqdj9rfUD+w79dtE07zi/kFwKyCJqplp5K5ygeLTp7jLpAoc16OAH39HSmRC9UpozaecsleI8uAdEj6v2yw==", "cpu": [ "x64" ], @@ -6193,9 +6724,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.2.tgz", - "integrity": "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.4.tgz", + "integrity": "sha512-zD6NdeWEByGE9QF9vCrlJ5YQB4oq9q91kPZS37Jwj5hOkvR1lTBSpsKhKDw4IJtbQ35LsTS1HD9DZYGKIshU1Q==", "cpu": [ "x64" ], @@ -6413,13 +6944,13 @@ } }, "node_modules/@secretlint/core": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@secretlint/core/-/core-13.0.2.tgz", - "integrity": "sha512-15vg+zCmjQuDFVoOPNt0TyEu0Z95eir2MO19++wG82yM/vbPtFu/m9qd6oh54ZOBXgMcchdGDTxMwJNDnCLxcA==", + "version": "13.0.4", + "resolved": "https://registry.npmjs.org/@secretlint/core/-/core-13.0.4.tgz", + "integrity": "sha512-Wv49KcI5XX6xjLR1wxyjORA15PtMb5ar/M27ShimVudaSi6iAM04QCA5Ozx+uEahfHNefUUKbjKGpy/9pxuW7g==", "license": "MIT", "dependencies": { - "@secretlint/profiler": "13.0.2", - "@secretlint/types": "13.0.2", + "@secretlint/profiler": "13.0.4", + "@secretlint/types": "13.0.4", "debug": "^4.4.3", "structured-source": "^4.0.0" }, @@ -6428,24 +6959,24 @@ } }, "node_modules/@secretlint/profiler": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@secretlint/profiler/-/profiler-13.0.2.tgz", - "integrity": "sha512-vGaLZCoi9KewOF+sM0iIEBviWaH9mls1HmQFBgEPq4fnvmVO4PfKIkVr4CcAFm3Msg4NjzFE2RBAGwRR+5HEmQ==", + "version": "13.0.4", + "resolved": "https://registry.npmjs.org/@secretlint/profiler/-/profiler-13.0.4.tgz", + "integrity": "sha512-T2hSyZmJrQbGAe+Vl9AGNlMnoB0MP6m2BLh7EH80QcesvNM2t0pCzdiBvQ/yCe76w6/gZNpHlrSVayUeT43qVw==", "license": "MIT" }, "node_modules/@secretlint/secretlint-rule-preset-recommend": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@secretlint/secretlint-rule-preset-recommend/-/secretlint-rule-preset-recommend-13.0.2.tgz", - "integrity": "sha512-D03Kw51qOgffj9zNlJFZUarVmP8zGcCZNi7A14+vZtHskbbBPEsS/f09idb48rrlMSaRMBN29IkqfbmPyL9xtw==", + "version": "13.0.4", + "resolved": "https://registry.npmjs.org/@secretlint/secretlint-rule-preset-recommend/-/secretlint-rule-preset-recommend-13.0.4.tgz", + "integrity": "sha512-Nbcr7tvyKuRF4BKh7RQSCEOaif4gFPH/qjK2ajcoUDGL7HAY/C6PzcsmVR1Y0qQCRqrBuMuXn1onXE+wxNNNsw==", "license": "MIT", "engines": { "node": ">=22.0.0" } }, "node_modules/@secretlint/types": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@secretlint/types/-/types-13.0.2.tgz", - "integrity": "sha512-cAZjr6ZTKgSuJMLyTGDrUEtK3XEZa+JStIkD+DmdkT32VGAN+dQJiYr1So3XJopsKSrqhP5kjZKT8WWtftZIpQ==", + "version": "13.0.4", + "resolved": "https://registry.npmjs.org/@secretlint/types/-/types-13.0.4.tgz", + "integrity": "sha512-on/DivRDZEFzRD2pZJO0wkIL+AvEY+KOoZLPCWcz4pjZnJ4NzMuHQjvTJc9KY0yht+ugcYg9AmtOUzpEk31IWA==", "license": "MIT", "engines": { "node": ">=22.0.0" @@ -6507,27 +7038,27 @@ } }, "node_modules/@shikijs/primitive": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.3.1.tgz", - "integrity": "sha512-CXQRQOYy1leqQ8ceTeJdmXv/bsUY++6QyLpXJ94LZAAYj5X2SKRdc5ipguv4NPyGVKItB2PPwUpRNe0Sjh5S1A==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.4.2.tgz", + "integrity": "sha512-l6fQQKsOMlz72n38fztmSgZ76MO6KSWuw8o+GJ+FhmqrpC9pIOJNQNXGgbb5yX2AwpzlEHwsaLPnk/8o4Fm+rA==", "license": "MIT", "dependencies": { - "@shikijs/types": "4.3.1", + "@shikijs/types": "4.4.2", "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" + "@types/hast": "^3.0.5" }, "engines": { "node": ">=20" } }, "node_modules/@shikijs/primitive/node_modules/@shikijs/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.3.1.tgz", - "integrity": "sha512-CHFxE0jztBIZRHH6gxXE7DXUCFXjReEGxZ/j0rfSLGKZuwp2xBYycEP14875DSa9KLL/6700oxIq6oO6ef9K2g==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.4.2.tgz", + "integrity": "sha512-PFYitV4vpDr/iPCIhnHp+Q4ftic5N5VeNJ3KQ1O8gn3h2ar8qgwMAXF7tq4m1CWaMS60fV4VqF6vfnWH4F7vqQ==", "license": "MIT", "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" + "@types/hast": "^3.0.5" }, "engines": { "node": ">=20" @@ -6583,9 +7114,9 @@ } }, "node_modules/@speed-highlight/core": { - "version": "1.2.17", - "resolved": "https://registry.npmjs.org/@speed-highlight/core/-/core-1.2.17.tgz", - "integrity": "sha512-Z92FwKpCtfaW1V0jTU/fh3QzYEZN8wDwrzRIBoADCJfn4mJCNcJN/XegifX7BDrQ8/h9Xh/JnbyMchL0FqXrkg==", + "version": "1.2.23", + "resolved": "https://registry.npmjs.org/@speed-highlight/core/-/core-1.2.23.tgz", + "integrity": "sha512-iRoq6i6JDJP6Mt2A5JaPvzw0pgYHH6k92ij+yXiTrB7T2y9N789aWE3EHWj/5ztlJBokcCBja3iYLVdu5wgnkg==", "license": "CC0-1.0" }, "node_modules/@standard-schema/spec": { @@ -6602,47 +7133,47 @@ "peer": true }, "node_modules/@tailwindcss/node": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.2.tgz", - "integrity": "sha512-yWP/sqEcBLaD8JuA6zNwxoYKr75qxTioYwlRwekj5Jr/I5GXnoJfjetH/psLUIv74cYTH2lBUEzBkinthoYcBg==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.3.tgz", + "integrity": "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==", "license": "MIT", "dependencies": { "@jridgewell/remapping": "^2.3.5", - "enhanced-resolve": "5.21.6", + "enhanced-resolve": "^5.24.1", "jiti": "^2.7.0", "lightningcss": "1.32.0", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", - "tailwindcss": "4.3.2" + "tailwindcss": "4.3.3" } }, "node_modules/@tailwindcss/oxide": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.2.tgz", - "integrity": "sha512-z8ZgnzX8gdNoWLBLqBPoh/sjnxkwvf9ZuWjnO0l0yIzbLa5/9S+eC5QxGZKRobVHIC3/1BoMWjHblqWjcgFgag==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.3.tgz", + "integrity": "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==", "license": "MIT", "engines": { "node": ">= 20" }, "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.3.2", - "@tailwindcss/oxide-darwin-arm64": "4.3.2", - "@tailwindcss/oxide-darwin-x64": "4.3.2", - "@tailwindcss/oxide-freebsd-x64": "4.3.2", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.2", - "@tailwindcss/oxide-linux-arm64-gnu": "4.3.2", - "@tailwindcss/oxide-linux-arm64-musl": "4.3.2", - "@tailwindcss/oxide-linux-x64-gnu": "4.3.2", - "@tailwindcss/oxide-linux-x64-musl": "4.3.2", - "@tailwindcss/oxide-wasm32-wasi": "4.3.2", - "@tailwindcss/oxide-win32-arm64-msvc": "4.3.2", - "@tailwindcss/oxide-win32-x64-msvc": "4.3.2" + "@tailwindcss/oxide-android-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-x64": "4.3.3", + "@tailwindcss/oxide-freebsd-x64": "4.3.3", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.3", + "@tailwindcss/oxide-linux-arm64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-arm64-musl": "4.3.3", + "@tailwindcss/oxide-linux-x64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-x64-musl": "4.3.3", + "@tailwindcss/oxide-wasm32-wasi": "4.3.3", + "@tailwindcss/oxide-win32-arm64-msvc": "4.3.3", + "@tailwindcss/oxide-win32-x64-msvc": "4.3.3" } }, "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.2.tgz", - "integrity": "sha512-WHxqIuHpvZ5VtdX6GTl1Ik/Vp2YuN42Et+0CdeaVd/frQ9jAvGmvR8vLT+jk3e8/Q3x8kECB9+R17pgpp2BulA==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.3.tgz", + "integrity": "sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==", "cpu": [ "arm64" ], @@ -6656,9 +7187,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.2.tgz", - "integrity": "sha512-GZypeUY/IDJW3877KeM+O67vbXr3MBnbtEL4aYhNErv/JWZhye2vGSWWG9tB6iiqR2MqRNkY8IOUy4NdSZV26w==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.3.tgz", + "integrity": "sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==", "cpu": [ "arm64" ], @@ -6672,9 +7203,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.2.tgz", - "integrity": "sha512-UIIzmefR6KO1sDU7MzRqAxC8iBpft/VhkGjTjnhoS6k7Z3rQ9wEgA1ODSiyH/tcSYssulNm4Ci3hOeK1jH7ccQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.3.tgz", + "integrity": "sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==", "cpu": [ "x64" ], @@ -6688,9 +7219,9 @@ } }, "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.2.tgz", - "integrity": "sha512-GN+uAmcI6DNspnCDwtOAZrTz6oukJnp337qZvxqCGLd3BHBzJpO0ZbTLRvJNdztOeAmTzewewGIMPb0tk2R4WA==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.3.tgz", + "integrity": "sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==", "cpu": [ "x64" ], @@ -6704,9 +7235,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.2.tgz", - "integrity": "sha512-4ABn7qSbdHRwTiDiuWNegCyb5+2FJ4vKIKc3DmKrvAFw7MU1Lm11dIkTPwUaFdTzc7IsOpDbqBrlh0x6y36U/w==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.3.tgz", + "integrity": "sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==", "cpu": [ "arm" ], @@ -6720,9 +7251,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.2.tgz", - "integrity": "sha512-wDgEIGwoM8w8pufh9LVt1PahDgNdKXrLC2qfAnV3vAmococ9RWbxeAw4pxPttd/TsJfwjyLf90Dg1y9y8I6Emw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.3.tgz", + "integrity": "sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==", "cpu": [ "arm64" ], @@ -6739,9 +7270,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.2.tgz", - "integrity": "sha512-J5Nuk0uZQIiMTJj3LEx4sAA9tMFUoXQZFv1J6An+QGYe53HKRJuFDi0rpq/tuouCZeAbOBY3kQ6g8qeD4TUjtA==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.3.tgz", + "integrity": "sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==", "cpu": [ "arm64" ], @@ -6758,9 +7289,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.2.tgz", - "integrity": "sha512-kqCZpSKOBEJO4mz7OqWoofBZeXTAwaVGPj0ErAj7CojmhKpWVWVOnrt9dE8odoIraZq4oj3ausM37kXi+Tow8w==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.3.tgz", + "integrity": "sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==", "cpu": [ "x64" ], @@ -6777,9 +7308,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.2.tgz", - "integrity": "sha512-cixpqbh2toJDmkuCRI68nXA8ZxNmdK9Y+9v5h3MC3ZQKy/0BO8AWzlkWyRM7JAFSGBlfig4YVTPsK6MVgqz1uw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.3.tgz", + "integrity": "sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==", "cpu": [ "x64" ], @@ -6796,9 +7327,9 @@ } }, "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.2.tgz", - "integrity": "sha512-4ec2Z/LOmRsAgU23CS4xeJfcJlmRg94A/XrbGRCF1gyU/zdDfRLYDVsS+ynSZCmGNxQ1jQriQOKMQeQxBA3Isw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.3.tgz", + "integrity": "sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==", "bundleDependencies": [ "@napi-rs/wasm-runtime", "@emnapi/core", @@ -6885,9 +7416,9 @@ "optional": true }, "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.2.tgz", - "integrity": "sha512-Zyr/M0+XcYZu3bZrUytc7TXvrk0ftWfl8gN2MwekNDzhqhKRUucMPSeOzM0o0wH5AWOU49BsKRrfKxI2atCPMQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.3.tgz", + "integrity": "sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==", "cpu": [ "arm64" ], @@ -6901,9 +7432,9 @@ } }, "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.2.tgz", - "integrity": "sha512-QI9BO7KlNZsp2GuO0jwAAj5jCDABOKXRkCk2XuKTSaNEFSdfzqswYVTtCHBNKHLsqyjFyFkqlDiwkNbTYSssMQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.3.tgz", + "integrity": "sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==", "cpu": [ "x64" ], @@ -6917,14 +7448,14 @@ } }, "node_modules/@tailwindcss/vite": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.2.tgz", - "integrity": "sha512-eHpMeX4JXfVNJDEcsouTeCBubJBTcTLigeaw/NTUW6PB5ATKKXdyonnXgTBX2VuRbjz1hjfz6C5XAhr52ImQXA==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.3.tgz", + "integrity": "sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw==", "license": "MIT", "dependencies": { - "@tailwindcss/node": "4.3.2", - "@tailwindcss/oxide": "4.3.2", - "tailwindcss": "4.3.2" + "@tailwindcss/node": "4.3.3", + "@tailwindcss/oxide": "4.3.3", + "tailwindcss": "4.3.3" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7 || ^8" @@ -6933,6 +7464,7 @@ "node_modules/@treeseed/core": { "version": "0.12.60-dev.treedx-perf.20260805T075816Z", "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#26fc51d7f082e4b7ed3e33158ec3e9ae4847f1f3", + "integrity": "sha512-YLxyA0gjURHq6yoS8Y8vOI2rik9zymARQ4h5rtu5unYmeH7/4yKJ3EICSGyAbvaIdfSOxnl26md1Ef8L/u+08Q==", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6964,7 +7496,7 @@ "yaml": "^2.8.1" }, "bin": { - "treeseed-workspace-bootstrap": "dist/scripts/workspace-bootstrap.js" + "treeseed-workspace-bootstrap": "dist/scripts/treedx/workspaces/workspace-bootstrap.js" }, "engines": { "node": ">=22" @@ -8949,6 +9481,7 @@ "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.treedx-perf.20260805T073639Z", "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#9f015fbca43a39f1b396591fbe4ede6beab8b089", + "integrity": "sha512-ciEcxaXicSNcLq7H97bq7YX7hGBXIG9oHj7DwiBXptivRdDo+utSL+8JU8XbF7G0XvO1M66Wj7GDsxTlEL/+IA==", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", @@ -8982,7 +9515,7 @@ "yaml": "^2.8.1" }, "bin": { - "treeseed-sdk-verify": "dist/verification.js" + "treeseed-sdk-verify": "dist/scripts/verification/verify-driver.js" }, "engines": { "node": ">=22" @@ -9077,6 +9610,13 @@ "node": ">=16" } }, + "node_modules/@treeseed/sdk/node_modules/@cloudflare/workers-types": { + "version": "4.20260702.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20260702.1.tgz", + "integrity": "sha512-mOhf5TUEB1m2vPrxtqoIGfz0fUC9xyxRDx5gWHy5s+OCo6dcV+g7wI1R7gYCMFohhqF/2y2xeKVwMwCJjfn/WA==", + "extraneous": true, + "license": "MIT OR Apache-2.0" + }, "node_modules/@treeseed/sdk/node_modules/@esbuild/aix-ppc64": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", @@ -9647,6 +10187,7 @@ "node_modules/@treeseed/ui": { "version": "0.12.18-dev.staging.20260804T170811Z", "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#e4c7a0896fa6d49b183d2729150eb598084c6c35", + "integrity": "sha512-wCaTa9E3JYEFXmldqHj1fhXFBzq4ZrxnT6AFnyiNmj6V5k0N8o4gnAzZAakQqkx4Zoo/VQ8u2NXKht9HiOZkKw==", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", @@ -9949,18 +10490,18 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "19.2.17", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.17.tgz", - "integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==", + "version": "19.2.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", + "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", "license": "MIT", "dependencies": { "csstype": "^3.2.2" } }, "node_modules/@types/react-dom": { - "version": "19.2.3", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", - "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-Bsc+QHgp+P/F02XDzNCY9jnZNCUuLki36KT7VKrTXXLdHf+vHMNZnW1rVu5DNW/rCK+fya3DATySbLM4yhtKUw==", "license": "MIT", "peerDependencies": { "@types/react": "^19.2.0" @@ -9975,6 +10516,12 @@ "@types/node": "*" } }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT" + }, "node_modules/@types/unist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", @@ -10387,9 +10934,9 @@ } }, "node_modules/acorn": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", - "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -11231,15 +11778,15 @@ } }, "node_modules/astro/node_modules/@shikijs/core": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.3.1.tgz", - "integrity": "sha512-ANMDxuaPsNMdDC1m4vfvhlDmJweMwkE5XitTwrq2rWHx5jM+dlm4MmHt2PP6t0uejfR77SuhrhJ0zEijIF/uhA==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.4.2.tgz", + "integrity": "sha512-StyzbAyxg2/tBGf78gwbBkGyeQ73lf8UiJArFaQhTQIDqQOCKPCQFanvrs4/Yv3Yfyc+ONInJM6K+FMIf+P+kA==", "license": "MIT", "dependencies": { - "@shikijs/primitive": "4.3.1", - "@shikijs/types": "4.3.1", + "@shikijs/primitive": "4.4.2", + "@shikijs/types": "4.4.2", "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4", + "@types/hast": "^3.0.5", "hast-util-to-html": "^9.0.5" }, "engines": { @@ -11247,12 +11794,12 @@ } }, "node_modules/astro/node_modules/@shikijs/engine-javascript": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.3.1.tgz", - "integrity": "sha512-JBItcnPuYq7jVJdZo/vMj94r+szT7XEjHFX+mvFDGSEIbVAXAGyHAHzhbWzpGOwYidCZrErJLLgn2PVeiokHnQ==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.4.2.tgz", + "integrity": "sha512-MnIkeqWdVPUWsxlx8gKLVCJFTsqrQJgpTPBPpQwaFeJ56lOnJxj5aN2LUFnfxUEcvOQuNocmbaMnVrCEln6rkw==", "license": "MIT", "dependencies": { - "@shikijs/types": "4.3.1", + "@shikijs/types": "4.4.2", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.6" }, @@ -11261,12 +11808,12 @@ } }, "node_modules/astro/node_modules/@shikijs/engine-oniguruma": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.3.1.tgz", - "integrity": "sha512-OXyNMzg0pews+msMj4cHeqT4xiYKKvbnn6VbdAXxfoFl3SSx4fJTc8FadECuc5/H9p3BzhNAoAUXKwAu9rWYhg==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.4.2.tgz", + "integrity": "sha512-GLhowz1+jixjz+wiZ3wMnOn1jTxiFCGl2PkXufivbnwPHKuyw1AYqu5/hbWhZZ2oAb0NP05WUJhYeigY14drnw==", "license": "MIT", "dependencies": { - "@shikijs/types": "4.3.1", + "@shikijs/types": "4.4.2", "@shikijs/vscode-textmate": "^10.0.2" }, "engines": { @@ -11274,37 +11821,37 @@ } }, "node_modules/astro/node_modules/@shikijs/langs": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.3.1.tgz", - "integrity": "sha512-m0l9nsDqgBHvbZbk7A0/kXz/impK3uB/c6rAn6Gpg/uPtdZRQ+alsN/17MU5thb68XTj/4DxkZAotrM0GGSpDQ==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.4.2.tgz", + "integrity": "sha512-8DfeusD+Zdv/eYIDdXyJTUnSMHt+aAWjAOCXV20HNGAHRlInXpG8wh421v6B91WOm9TFwRLN+b/LG5F2NAIojg==", "license": "MIT", "dependencies": { - "@shikijs/types": "4.3.1" + "@shikijs/types": "4.4.2" }, "engines": { "node": ">=20" } }, "node_modules/astro/node_modules/@shikijs/themes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.3.1.tgz", - "integrity": "sha512-dgpoJ4WqNi2yTmizQHBJ5zcX6j2lE6icN/0yt4l1kkf16jrY/pwPLoTb1ETsWMz0OBLf9ZNvwmxft+cH+N9qSA==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.4.2.tgz", + "integrity": "sha512-H0CFoL07ddDC2Dd6EdrPYNkRhUR6YCkJlnuYFceYYUJJA5TIm2b5B33qqiDYryBExgbKMndFJPb2u1gTuqO37g==", "license": "MIT", "dependencies": { - "@shikijs/types": "4.3.1" + "@shikijs/types": "4.4.2" }, "engines": { "node": ">=20" } }, "node_modules/astro/node_modules/@shikijs/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.3.1.tgz", - "integrity": "sha512-CHFxE0jztBIZRHH6gxXE7DXUCFXjReEGxZ/j0rfSLGKZuwp2xBYycEP14875DSa9KLL/6700oxIq6oO6ef9K2g==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.4.2.tgz", + "integrity": "sha512-PFYitV4vpDr/iPCIhnHp+Q4ftic5N5VeNJ3KQ1O8gn3h2ar8qgwMAXF7tq4m1CWaMS60fV4VqF6vfnWH4F7vqQ==", "license": "MIT", "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" + "@types/hast": "^3.0.5" }, "engines": { "node": ">=20" @@ -11378,19 +11925,19 @@ } }, "node_modules/astro/node_modules/shiki": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.3.1.tgz", - "integrity": "sha512-oR+qDVi2OjX1tmDpyv+3KviX01KzO6Af+0NNnKnsp9491UEGz2YpxTuJboS/6VhYpTdqzmuJBuiTlrAWWJAssw==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.4.2.tgz", + "integrity": "sha512-P8F/dFhRevaw2uSdeIYlq/5SXZNY85DPtmXQ947gD1Zj2JqO5AkNvVVBar0Me9JkFx3uzVud/qOtP5ek9NEQGA==", "license": "MIT", "dependencies": { - "@shikijs/core": "4.3.1", - "@shikijs/engine-javascript": "4.3.1", - "@shikijs/engine-oniguruma": "4.3.1", - "@shikijs/langs": "4.3.1", - "@shikijs/themes": "4.3.1", - "@shikijs/types": "4.3.1", + "@shikijs/core": "4.4.2", + "@shikijs/engine-javascript": "4.4.2", + "@shikijs/engine-oniguruma": "4.4.2", + "@shikijs/langs": "4.4.2", + "@shikijs/themes": "4.4.2", + "@shikijs/types": "4.4.2", "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" + "@types/hast": "^3.0.5" }, "engines": { "node": ">=20" @@ -11526,9 +12073,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.10.43", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.43.tgz", - "integrity": "sha512-AjYpR78kDWAY3Efj+cDTFH9t9SCoL7OoTp1BOb0mQV7S+6CiLwnWM3FyxhJtdPufDFKzmCSFoUncKjWgJEZTCQ==", + "version": "2.11.12", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.12.tgz", + "integrity": "sha512-r7WnVImvVCeFpf2DOXfy41aPWzeNg3H/A2X4dKmy1QL0MSyyk/e7z8ihJ3N6Nn2PsdhkVlqnEfnUE4a05P2aTA==", "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.cjs" @@ -11730,15 +12277,15 @@ } }, "node_modules/brace-expansion": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", - "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" }, "engines": { - "node": "18 || 20 || >=22" + "node": "20 || >=22" } }, "node_modules/braces": { @@ -11754,9 +12301,9 @@ } }, "node_modules/browserslist": { - "version": "4.28.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.6.tgz", - "integrity": "sha512-FQBYNK15VMslhLHpA7+n+n1GOlF1kId2xcCg7/j95f24AOF6VDYMNH4mFxF7KuaTdv627faazpOAjFzMrfJOUw==", + "version": "4.28.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.7.tgz", + "integrity": "sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw==", "funding": [ { "type": "opencollective", @@ -11773,9 +12320,9 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.10.42", - "caniuse-lite": "^1.0.30001803", - "electron-to-chromium": "^1.5.389", + "baseline-browser-mapping": "^2.10.44", + "caniuse-lite": "^1.0.30001806", + "electron-to-chromium": "^1.5.393", "node-releases": "^2.0.51", "update-browserslist-db": "^1.2.3" }, @@ -11852,9 +12399,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001805", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001805.tgz", - "integrity": "sha512-52noaS3DubycKSXaU30TwPGIp+POyQSUVa5jBEq3vkRkY0kjyb3LQgvhU6WGyCcyXqVLWO0Cw0Q6BSdD0kUfVA==", + "version": "1.0.30001806", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001806.tgz", + "integrity": "sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==", "funding": [ { "type": "opencollective", @@ -12040,90 +12587,54 @@ } }, "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", "license": "ISC", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=20" } }, - "node_modules/cliui/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } + "node_modules/cliui/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "license": "MIT" }, "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" + "node": ">=18" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" @@ -12187,24 +12698,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, "node_modules/comma-separated-tokens": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", @@ -12754,9 +13247,9 @@ } }, "node_modules/devalue": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.8.1.tgz", - "integrity": "sha512-4CXDYRBGqN+57wVJkuXBYmpAVUSg3L6JAQa/DFqm238G73E1wuyc/JhGQJzN7vUf/CMphYau2zXbfWzDR5aTEw==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.9.0.tgz", + "integrity": "sha512-RWrqdArjvPbsATEhOPUo6Wndc/iWnkWKlhIrdlF3zMMYo/c3CVtoaVAyLtWxz5h8nSlkHzxnzV2uLydPXmtF+A==", "license": "MIT" }, "node_modules/devlop": { @@ -13032,9 +13525,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.389", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.389.tgz", - "integrity": "sha512-cEto7aeOqBfU1D+c5py5pE+ooscKE75JifxLBdFUZsqAxRS6y7kebtxAZvICszSl05gPjYHDTjY+lXpyGvpJbg==", + "version": "1.5.401", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.401.tgz", + "integrity": "sha512-H6ViHN68nGYlChEvlIU67fn8O2/tpbWQPwck98yaJmh+08LSvHiydzDQ6oXNccLU3kNRVIRS9A4mA7CG+i6fLQ==", "license": "ISC" }, "node_modules/emmet": { @@ -13078,9 +13571,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.21.6", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.6.tgz", - "integrity": "sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ==", + "version": "5.24.5", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.5.tgz", + "integrity": "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", @@ -13151,9 +13644,9 @@ } }, "node_modules/es-module-lexer": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.0.tgz", - "integrity": "sha512-KLdwQm2NvGLDkQDCGvmiQrhkd0JbMzXthwQAUgWjQuQdBLFa3eiBP5arXZyA+f8x+x7OXgud6bq2rxjGtHV2tw==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.1.tgz", + "integrity": "sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==", "license": "MIT" }, "node_modules/es-object-atoms": { @@ -13169,13 +13662,14 @@ } }, "node_modules/es-toolkit": { - "version": "1.49.0", - "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.49.0.tgz", - "integrity": "sha512-G5iZ6Pc/FNRY/soKZHC+TxGDD83rHUDXxzaWhGCX44vAv/tMs56WMusnm/KMNK+luUPsgA9U28cGr4RDlSzL2g==", + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.50.0.tgz", + "integrity": "sha512-OyZKhUVvEep9ITEiwHn8GKnMRQIVqoSIX7WnRbkWgJkllCujilqP2rD0u979tkl8wqyc8ICwlc1UBVv/Sl1G6w==", "license": "MIT", "workspaces": [ "docs", - "benchmarks" + "benchmarks", + "tests/types" ] }, "node_modules/esast-util-from-estree": { @@ -13548,11 +14042,12 @@ } }, "node_modules/express-rate-limit": { - "version": "8.5.2", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.5.2.tgz", - "integrity": "sha512-5Kb34ipNX694DH48vN9irak1Qx30nb0PLYHXfJgw4YEjiC3ZEmZJhwOp+VfiCYwFzvFTdB9QkArYS5kXa2cx2A==", + "version": "8.6.2", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.6.2.tgz", + "integrity": "sha512-YH4ru+eOJxQABscKFfRCy9R7x9QFGdezclVMwwgFFndzS2Xnm0uo6B0ABZsLhcpeptGv2qvuJVWlQr9gQZoC3A==", "license": "MIT", "dependencies": { + "debug": "^4.4.3", "ip-address": "^10.2.0" }, "engines": { @@ -13674,9 +14169,9 @@ } }, "node_modules/fast-uri": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.3.tgz", - "integrity": "sha512-i70LwGWUduXqzicKXWshooq+sWL1K3WUU5rKZNG/0i3a1OSoX3HqhH5WbWwTmqWfor4urUakGPiRQcleRZTwOg==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.5.tgz", + "integrity": "sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==", "funding": [ { "type": "github", @@ -14027,9 +14522,9 @@ "license": "BSD-2-Clause" }, "node_modules/globby": { - "version": "16.2.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-16.2.1.tgz", - "integrity": "sha512-JmsqJalahxxgW8V2ecSQ2G7UjPlI9cpKdrkG9KoNiXhd/YslXOTEB0cViENWUznuovIuNT+FkMbraDGjr4FCUg==", + "version": "16.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-16.2.2.tgz", + "integrity": "sha512-NLvV9ubZ6NDsJaOpKPy3cQeJpKi9DcWiyCiFUpJPA0YihRqiE6RWaLUmgNNPr8MgPpLZjnBjSmou7uZBRJv9wA==", "license": "MIT", "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", @@ -14556,9 +15051,9 @@ } }, "node_modules/hono": { - "version": "4.12.30", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.30.tgz", - "integrity": "sha512-emn+JoJjrN9YTpRDS5it/UI2SO9BAE37T6I3d963RxcZ81G9A4pr2SZTEiiaiKbzx+NKRg5BZ89fCL7gCJCUog==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.13.0.tgz", + "integrity": "sha512-jhunvfHWxd7J5EFfSgH4xsYJzSe/lfqbUCxiyyeaQasUsXeEHXtzVid+7EOGByc5JnFa23SSFL3Y2RV/z1T+eQ==", "license": "MIT", "engines": { "node": ">=16.9.0" @@ -14743,9 +15238,9 @@ } }, "node_modules/immer": { - "version": "11.1.11", - "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.11.tgz", - "integrity": "sha512-qzXuyXAkPySAGYkfsAwodDPWT8Zm7/Uo5BNt4BjhMhG5WlWyZZ4wQqnWwdS8kjlQ1Cwu6gjw3A6+0gTQwlyYtw==", + "version": "11.1.16", + "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.16.tgz", + "integrity": "sha512-Xs7H9rBc+kti1J6RueUvbEBkmOz7jqj11XYgf+YMXAYzu8EeE7hwZ9poLXdVfVnGmJu7QAf41T7H2KuF6QoK6Q==", "license": "MIT", "peer": true, "funding": { @@ -14782,9 +15277,9 @@ "license": "ISC" }, "node_modules/ink": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/ink/-/ink-7.1.0.tgz", - "integrity": "sha512-VWE6/yeLtFCJBNLflyI2OSylyXK1Rc24LuXup8Qt+icwkmmycFNdbn8IkSp6Frc0h1iA0NOvvi1ajW44U/w3Qg==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/ink/-/ink-7.1.1.tgz", + "integrity": "sha512-Y43xxa1ZSPvpmfLHcN5o+OdP8Rf8ykkNJEuKYOUNZKT8wXVNLFTtEm1nSDMQkfBH+YANF4Xuu0hhZ4ejqAtN2w==", "license": "MIT", "dependencies": { "@alcalzone/ansi-tokenize": "^0.3.0", @@ -14847,9 +15342,9 @@ } }, "node_modules/ip-address": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz", - "integrity": "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.4.0.tgz", + "integrity": "sha512-oSK96Grm3aP6OrS263xVxbNDGVL7rzBtYdpGqlDG8iQdoenDoTs/nkki+DflYbAEE8Xl6o5YxhxlrKvI3nqKXQ==", "license": "MIT", "engines": { "node": ">= 12" @@ -15159,9 +15654,9 @@ } }, "node_modules/jose": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.3.tgz", - "integrity": "sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==", + "version": "6.2.8", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.8.tgz", + "integrity": "sha512-Bsdjwm3Qsd/P0jR+BHDe3LytDfY7WBq2HmCCLIwuVRHMuEC9ae7/R474GIUdF1NgCyZjzVo/A9DOiOBtXq8ZoQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/panva" @@ -15174,9 +15669,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", - "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz", + "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==", "funding": [ { "type": "github", @@ -15302,10 +15797,21 @@ } }, "node_modules/lexical": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/lexical/-/lexical-0.35.0.tgz", - "integrity": "sha512-3VuV8xXhh5xJA6tzvfDvE0YBCMkIZUmxtRilJQDDdCgJCc+eut6qAv2qbN+pbqvarqcQqPN1UF+8YvsjmyOZpw==", - "license": "MIT" + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/lexical/-/lexical-0.48.0.tgz", + "integrity": "sha512-KK4Tyr/cPsleoZ7XvhGRiRmcrZidSmoFUdIXK9nPubIifoC+80Dc5THyc4xtGKtsW24S1TsHzk5gmfBU+TxmEg==", + "license": "MIT", + "dependencies": { + "@lexical/internal": "0.48.0" + }, + "peerDependencies": { + "typescript": ">=5.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } }, "node_modules/lib0": { "version": "0.2.117", @@ -15335,6 +15841,12 @@ "integrity": "sha512-3HrzSPuzm6Yt9aTYCDxYEG8x8/6C0+ag655Y7rhhWZM9PT4NpdnbqlzXhGZlDnkgR6MeSTnOt/VIyHLs9aSf+Q==", "license": "ISC" }, + "node_modules/libsodium-sumo": { + "version": "0.7.16", + "resolved": "https://registry.npmjs.org/libsodium-sumo/-/libsodium-sumo-0.7.16.tgz", + "integrity": "sha512-x6atrz2AdXCJg6G709x9W9TTJRI6/0NcL5dD0l5GGVqNE48UJmDsjO4RUWYTeyXXUpg+NXZ2SHECaZnFRYzwGA==", + "license": "ISC" + }, "node_modules/libsodium-wrappers": { "version": "0.7.15", "resolved": "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.15.tgz", @@ -15344,6 +15856,15 @@ "libsodium": "^0.7.15" } }, + "node_modules/libsodium-wrappers-sumo": { + "version": "0.7.15", + "resolved": "https://registry.npmjs.org/libsodium-wrappers-sumo/-/libsodium-wrappers-sumo-0.7.15.tgz", + "integrity": "sha512-aSWY8wKDZh5TC7rMvEdTHoyppVq/1dTSAeAR7H6pzd6QRT3vQWcT5pGwCotLcpPEOLXX6VvqihSPkpEhYAjANA==", + "license": "ISC", + "dependencies": { + "libsodium-sumo": "^0.7.15" + } + }, "node_modules/lightningcss": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", @@ -15668,13 +16189,13 @@ } }, "node_modules/magicast": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.3.tgz", - "integrity": "sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.4.tgz", + "integrity": "sha512-llBEhWm1SacoRwgHUoQJYtwp4PBLF4faQi5TCpIGyGs9n4y5+juI0tDgyKIfpqxckRHaHzouUEph3THklWh03w==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.3", - "@babel/types": "^7.29.0", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", "source-map-js": "^1.2.1" } }, @@ -16085,12 +16606,16 @@ "license": "CC0-1.0" }, "node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.1.tgz", + "integrity": "sha512-yz3xRaG20c6/BOzvYoDaGtPmGscs7YivItZEEqe6GbwNfHuxu9YNmvnEkMzKldAGY4/80pRcQRZSEnhquk9XuQ==", "license": "MIT", "engines": { "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/mediabunny": { @@ -17011,8 +17536,549 @@ "node": ">=22.0.0" } }, - "node_modules/miniflare/node_modules/ws": { - "version": "8.21.0", + "node_modules/miniflare/node_modules/@img/sharp-darwin-arm64": { + "version": "0.35.2", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.35.2.tgz", + "integrity": "sha512-eEieHsMksAW4IiO5NzauESRl2D2qz3J/kwUxUrSfV06A93eEaRfMpHXyUb1mAqrR7i8U9A0GRqE9pjn6u1Jjpg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.3.1" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-darwin-x64": { + "version": "0.35.2", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.35.2.tgz", + "integrity": "sha512-BaktuGPCeHJMARpodR8jK4uKiZrPAy9WrfQW0sdI37clracq8Bp01AYS3SZgi5FS/y5twa9t4+LIuuxQjqRrWw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.3.1" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.3.1.tgz", + "integrity": "sha512-4V/M3roRMTYjiwZY9IOVQOE8OyeCxFAkYmyZDrZl51uOKjibm3oeEJ4WAmLxutAfzFbC9jqUiPs2gbnGflH+7g==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.3.1.tgz", + "integrity": "sha512-c0/DxItpJv2+dGhgycJBBgotdqruGYDvA79drdh0MD1dFpy7JzJ/PlXwi1H4rFf0eTy8tgbI91aHDnZIceY3jQ==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.3.1.tgz", + "integrity": "sha512-aGGy9aWzXgHBG7HNyQPWorZthlp7+x6fDRoPAQbGO3ThcttuTyKIx3NuSHb6zb4gBNq6/yNn9f1cy9nFKS/Vmg==", + "cpu": [ + "arm" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.3.1.tgz", + "integrity": "sha512-JznefmcK9j1JKPz8AkQDh89kjojubyfOasWBPKfzMIhPwsgDy9evpE/naJTXXXmghS1iFwR8u/kTwh/I2/+GCw==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.3.1.tgz", + "integrity": "sha512-1EkwGNCZk6iWNCMWqrvdJ+r1j0PT1zIz60CNPhYnJlK/zyeWqlsPZIe+ocBVqPF8k/Ssee/NCk+tE9Ryrko6ng==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.3.1.tgz", + "integrity": "sha512-Ilays+w2bXdnxzxtQdmXR62u8o8GYa3eL4+Gr+1KiE4xperMZUslRaVPJwwPkzlHEjGfXAfRVAa/7CYCtSqsBw==", + "cpu": [ + "riscv64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.3.1.tgz", + "integrity": "sha512-VfBwVHQTbRoj4XlpA/KLZ7ltgMpz+4WSejFzQ+GnoImjo1PtEJ59QB2qR1xQEeRPYIkNrPIm2L4cICMvz4C2ew==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.3.1.tgz", + "integrity": "sha512-+c8ukgwU62DS54nCAjw7keOfHUkmr0B5QHEdcOqRnodF/MNXJbVI8Eopoj4B/0H8Asr65I+A4Amrn7a85/md6A==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.3.1.tgz", + "integrity": "sha512-qlKb/pwbkAi1WMsJrYHk7CuDrd12s27U2QnRhFYUoJNrRCmkosMTttuRFat/DDB3IlDm5qE1TJgZ4JDnHX8Ldw==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.3.1.tgz", + "integrity": "sha512-yO21HwoUVLN8Qa+/SBjQLMYwBWAVJjeGPNe+hc0OUeMeifEtJqu5a1c4HayE1nNpDih9y3/KkoltfkDodmKAlg==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-linux-arm": { + "version": "0.35.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.35.2.tgz", + "integrity": "sha512-SE4kzF2mepn6z+6E7L6lsV8FzuLL6IPQdyX8ZiwROAG/G8td+hP/m7FsFPwidtrF19gvajuC9l6TxAVcsA4S7A==", + "cpu": [ + "arm" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.3.1" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-linux-arm64": { + "version": "0.35.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.35.2.tgz", + "integrity": "sha512-af12Pnd0ZGu2HfP8NayB0kk6eC/lrfbQE6HlR4jD+34wdJ1Vw9TF6TMn6ZvffT+WgqVsl0hRbmNvz2u/23VmwA==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.3.1" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-linux-ppc64": { + "version": "0.35.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.35.2.tgz", + "integrity": "sha512-hYSBm7zcNtDCozCxQHYZJiu63b/bXsgRZuOxCIBZsStMM9Vap47iFHdbX4kCvQsblPB/k+clhELpdQJHQLSHvg==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.3.1" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-linux-riscv64": { + "version": "0.35.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.35.2.tgz", + "integrity": "sha512-qQt0Kc13+Hoan/Awq/qMSQw3L+RI1NCRPgD5cUJ/1WSSmIoysLOc72jlRM3E0OHN9Yr313jgeQ2T+zW+F03QFA==", + "cpu": [ + "riscv64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.3.1" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-linux-s390x": { + "version": "0.35.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.35.2.tgz", + "integrity": "sha512-E4fLLfRPzDLlEeDaTzI98OFLcv++WL5ChLLMwPoVd0CIoZQqupBSNbOisPL5am9XsbQ9T84+iiMpUvbFtkunbA==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.3.1" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-linux-x64": { + "version": "0.35.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.35.2.tgz", + "integrity": "sha512-gi0zFJJRLswfCZmHtJdikXPOc5u7qamSOS3NHedLqLd4W8Q0NqjdBr6TTRIgsfFjqfTsHFgdfvJ9LwqSgcHiAA==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.3.1" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.35.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.35.2.tgz", + "integrity": "sha512-siWbOW1u6HFnFLrp0waKyW7VEf7jYvcDWdrXEFa8AkdAQgEvuu5Fz8/Y70w9EeqAdwDtfU012BhEHHaDqvQNzg==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.3.1" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.35.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.35.2.tgz", + "integrity": "sha512-YBqMMcjDi4QGYiSn4vNOYBhmlC4z5AXqkOUUqI2e0AFA4urNv4ESgOgwNl3K+4etQhha0twXlzeF20bbULm9Yg==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.3.1" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-win32-arm64": { + "version": "0.35.2", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.35.2.tgz", + "integrity": "sha512-BiVRYc/t6/Vl3e1hBx0hugG4oN9Pydf4fgMSpxTQJmwGUg/YoXTWHiFeRymHfCZzifxu4F4rpk/I67D0LQ20wQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-win32-ia32": { + "version": "0.35.2", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.35.2.tgz", + "integrity": "sha512-YYEhx9PImCC7T0tI8JDMi4DB9LwLCXCU5OWNYEXAxh5Q1ShKkyC6byxzoBJ3gEFDnH2lQckWuDe70G7mB2XJog==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-win32-x64": { + "version": "0.35.2", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.35.2.tgz", + "integrity": "sha512-imoOyBcoM/iiUr4J6VPpCNjPnjvP/Gks95898yB8YqoGGYmHYbOyCuNv9FMhFgtaiHFGbHW8bxKqRV6VjtXThQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/miniflare/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/miniflare/node_modules/sharp": { + "version": "0.35.2", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.35.2.tgz", + "integrity": "sha512-FVtFjtBCMiJS6yb5CX7Sop45WFMpeGw6oRKuJnXYgf/f1ms/D7LE/ZUSNxnW7rZ/dbslQWYkoqFHGPaDBtaK4w==", + "license": "Apache-2.0", + "dependencies": { + "@img/colour": "^1.1.0", + "detect-libc": "^2.1.2", + "semver": "^7.8.4" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.35.2", + "@img/sharp-darwin-x64": "0.35.2", + "@img/sharp-freebsd-wasm32": "0.35.2", + "@img/sharp-libvips-darwin-arm64": "1.3.1", + "@img/sharp-libvips-darwin-x64": "1.3.1", + "@img/sharp-libvips-linux-arm": "1.3.1", + "@img/sharp-libvips-linux-arm64": "1.3.1", + "@img/sharp-libvips-linux-ppc64": "1.3.1", + "@img/sharp-libvips-linux-riscv64": "1.3.1", + "@img/sharp-libvips-linux-s390x": "1.3.1", + "@img/sharp-libvips-linux-x64": "1.3.1", + "@img/sharp-libvips-linuxmusl-arm64": "1.3.1", + "@img/sharp-libvips-linuxmusl-x64": "1.3.1", + "@img/sharp-linux-arm": "0.35.2", + "@img/sharp-linux-arm64": "0.35.2", + "@img/sharp-linux-ppc64": "0.35.2", + "@img/sharp-linux-riscv64": "0.35.2", + "@img/sharp-linux-s390x": "0.35.2", + "@img/sharp-linux-x64": "0.35.2", + "@img/sharp-linuxmusl-arm64": "0.35.2", + "@img/sharp-linuxmusl-x64": "0.35.2", + "@img/sharp-webcontainers-wasm32": "0.35.2", + "@img/sharp-win32-arm64": "0.35.2", + "@img/sharp-win32-ia32": "0.35.2", + "@img/sharp-win32-x64": "0.35.2" + } + }, + "node_modules/miniflare/node_modules/ws": { + "version": "8.21.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", "license": "MIT", @@ -17033,12 +18099,12 @@ } }, "node_modules/minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^5.0.5" + "brace-expansion": "^5.0.8" }, "engines": { "node": "18 || 20 || >=22" @@ -17114,9 +18180,9 @@ "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.15", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz", - "integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==", + "version": "3.3.17", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.17.tgz", + "integrity": "sha512-xQLf0A3HOMlgHq0n247/LRuAOYmB7dXJ/DvAxGvsSBij45XtBSmQycu+F8ODbHwns/XyFZagyL1+J0Offw1E0g==", "funding": [ { "type": "github", @@ -17175,15 +18241,15 @@ "license": "MIT" }, "node_modules/node-mock-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.4.tgz", - "integrity": "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.5.tgz", + "integrity": "sha512-KQyt/wLjG3TAc7DOUhpqWzgd4ERxR80JOlTK5VE5R1S12IaPVN5qkj4klBce9HPG1Njuup4Sb5bljaT34lIyjw==", "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.51", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.51.tgz", - "integrity": "sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==", + "version": "2.0.52", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.52.tgz", + "integrity": "sha512-MRlTqhAfoMx/4mhEbPo3Hi02g9LJZaJkka69V6h67Cb1gjrAG0jsTE4CZX1eptNx+VCAwJmfpnDIF4P0Nh1A7A==", "license": "MIT", "engines": { "node": ">=18" @@ -17253,9 +18319,9 @@ } }, "node_modules/obug": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.3.tgz", - "integrity": "sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.4.tgz", + "integrity": "sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==", "funding": [ "https://github.com/sponsors/sxzz", "https://opencollective.com/debug" @@ -17402,9 +18468,9 @@ } }, "node_modules/p-limit": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-7.3.0.tgz", - "integrity": "sha512-7cIXg/Z0M5WZRblrsOla88S4wAK+zOQQWeBYfV3qJuJXMr+LnbYjaadrFaS0JILfEDPVqHyKnZ1Z/1d6J9VVUw==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-7.3.1.tgz", + "integrity": "sha512-0trZaiG7Y7kN/Egy9a8j47t9osC0Tch4PaIWd9yGF6bvmlk7muExRvGNYb8sXBwEKMoNKsbNN9P8EefuQekE4Q==", "license": "MIT", "dependencies": { "yocto-queue": "^1.2.1" @@ -17417,9 +18483,9 @@ } }, "node_modules/p-queue": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-9.3.1.tgz", - "integrity": "sha512-POWdiIPmsUPGwb4FeQ4OBg46aqmcInSWe45CKDsGHiOBiVQM9chqfQTuqhuTzcg2Vz9faTI65at0KkVyVEiCHw==", + "version": "9.3.3", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-9.3.3.tgz", + "integrity": "sha512-NXAOdnEe5FsZJfT4oK84lE1Y5cFFdWlRuOo5tww8DyNMxyRXwn39fIkUtNLKppcPC+UYU/bXujNCUGDv01y7CA==", "license": "MIT", "dependencies": { "eventemitter3": "^5.0.4", @@ -17445,9 +18511,9 @@ } }, "node_modules/package-manager-detector": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.7.0.tgz", - "integrity": "sha512-xg1eHpwYL/D/HEdWw2goFZP6vV0FH7W+PZ5rFkGjdIDLtxq7EkzBUeT3m+lndYCt8wKbmofUu1MUdMCXkCk9ZQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.8.0.tgz", + "integrity": "sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==", "license": "MIT" }, "node_modules/pagefind": { @@ -17763,9 +18829,9 @@ } }, "node_modules/picospinner": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/picospinner/-/picospinner-3.0.0.tgz", - "integrity": "sha512-lGA1TNsmy2bxvRsTI2cV01kfTwKzZjnZSDmF9llYNyMHMrU4sP87lQ5taiIKm88L3cbswjl008nwyGc3WpNvzg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/picospinner/-/picospinner-3.1.2.tgz", + "integrity": "sha512-0Z++uU8mvB0EvCPAEUq9BGiPcSravzJ+RPdXfjYlzXffqsogisiKRQqI6ctrSSJ6n985vxrgKtQ5n4sRINcJZg==", "license": "MIT", "engines": { "node": ">=18.0.0" @@ -17781,39 +18847,39 @@ } }, "node_modules/playwright": { - "version": "1.61.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.61.1.tgz", - "integrity": "sha512-DWnY5o3YbLWK4GovuAVwpqL+1VwGNdUGrRr++8j8PtQQzvAVZUIMjKQ90fY689sEJZJBbZVw1rXaOKSTitkzPQ==", + "version": "1.62.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.62.1.tgz", + "integrity": "sha512-0M+L3LAD8/nm554LOla9Ayx0j0tmFZ0FBcoQ7F1VuVHpM/XpiC8RcDzBQB8W5+hA8L22THxELzeF+2WcUzvcLg==", "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.61.1" + "playwright-core": "1.62.1" }, "bin": { "playwright": "cli.js" }, "engines": { - "node": ">=18" + "node": ">=20" }, "optionalDependencies": { "fsevents": "2.3.2" } }, "node_modules/playwright-core": { - "version": "1.61.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.61.1.tgz", - "integrity": "sha512-h7Qlt6m4REp25qvIdvbDtVmD4LqVXfpRxhORv9L0jzETM05p4fuPJ3dKyuSXQxDSbXnmS79HAgi9589lGSpLkg==", + "version": "1.62.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.62.1.tgz", + "integrity": "sha512-wPYSwEBJY9GHraISXqyqtx0na0LpO3XEX7jNDhntbex7tzUS7kLnZsOlFruFJB4Hi/rhDMjXGqHewDZ68nYZVw==", "license": "Apache-2.0", "bin": { "playwright-core": "cli.js" }, "engines": { - "node": ">=18" + "node": ">=20" } }, "node_modules/postcss": { - "version": "8.5.17", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.17.tgz", - "integrity": "sha512-J7EF+8X+CzRPaJPOv9Ck2wNWJvGnnl3PcNPAdGg6GTLjyVpyQ0yATMSXRFRV01BviT/9Gwuc3rjEyJbDJG9a4w==", + "version": "8.5.25", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.25.tgz", + "integrity": "sha512-DTPx3RWSSnWyzLxQnlH0rJP+EW5ekl16ZU4/psbIhA0e53kJfdgaN5vKM+xP7yJtXVu+nfdVFmlgFDEKAe4Pyw==", "funding": [ { "type": "opencollective", @@ -17830,7 +18896,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.12", + "nanoid": "^3.3.16", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -17994,9 +19060,9 @@ } }, "node_modules/prettier": { - "version": "3.9.5", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.5.tgz", - "integrity": "sha512-/FVl766LpUfB5vXgCYOYa0MeV/441Ia99AeICQIQFTY/Nw0roZwULcXpku5i1/m5kt/baz+s4Zogspd839HSMg==", + "version": "3.9.6", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.6.tgz", + "integrity": "sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==", "license": "MIT", "bin": { "prettier": "bin/prettier.cjs" @@ -18192,46 +19258,30 @@ } }, "node_modules/react": { - "version": "19.2.7", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", - "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==", + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", + "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/react-dom": { - "version": "19.2.7", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz", - "integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==", + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", + "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", "license": "MIT", "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { - "react": "^19.2.7" - } - }, - "node_modules/react-error-boundary": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-3.1.4.tgz", - "integrity": "sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - }, - "peerDependencies": { - "react": ">=16.13.1" + "react": "^19.2.8" } }, "node_modules/react-hook-form": { - "version": "7.81.0", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.81.0.tgz", - "integrity": "sha512-ocbmr2p5KBMoAfj4WCUvped33lVi1Kd5DuDUvQDnB6VEAacOjPI/jMbtDdbhco4y9ct4xUuCmMY0b/C9L0QHjw==", + "version": "7.84.0", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.84.0.tgz", + "integrity": "sha512-+hWvQP6GLco56mDwrbU4XnHix8t1z90ltZsDIrREl+jnQFQxYLX8oAzqe/Xn8nHpmoXTY5M6oEXrAhbP1qevNQ==", "license": "MIT", "engines": { "node": ">=18.0.0" @@ -18245,9 +19295,9 @@ } }, "node_modules/react-is": { - "version": "19.2.7", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.7.tgz", - "integrity": "sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A==", + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.8.tgz", + "integrity": "sha512-s5un28nYxKJw5gvUHyW5PCC28CvBqLu9r3cWgzHT4Vo/5fqqkFcdRYsGcKf50WMPpjjFZS5d76fn3YCo2njKwQ==", "license": "MIT", "peer": true }, @@ -18382,9 +19432,9 @@ } }, "node_modules/recharts": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/recharts/-/recharts-3.9.2.tgz", - "integrity": "sha512-G4fy+Pk46RaXgwWMh+Nzhyo/lbFAVqXo9gtetlyehe6Ehge9CsgDuOTwQDD+i1+llaLktNBiNq4bhnGlDRXFtw==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-3.10.1.tgz", + "integrity": "sha512-QXFrvt6IVcw7eeZCoyXTwkIJAX3Dv1nyVhMicXJ47GsGDDpcN8z6o644DibE9XjpBTThtsomLKnTV6lc+cVFUA==", "license": "MIT", "peer": true, "workspaces": [ @@ -18752,9 +19802,9 @@ } }, "node_modules/remark-smartypants": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/remark-smartypants/-/remark-smartypants-3.0.2.tgz", - "integrity": "sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/remark-smartypants/-/remark-smartypants-3.0.3.tgz", + "integrity": "sha512-gCaK+ndZ0hYezlqFegHFCVh2CQemsi0Npdh1qVM9bxlUFknjkbP6VmojWhddOCrbK0PbbacmYLWfTULRiT1eWA==", "license": "MIT", "dependencies": { "retext": "^9.0.0", @@ -18792,22 +19842,22 @@ } }, "node_modules/repomix": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/repomix/-/repomix-1.16.1.tgz", - "integrity": "sha512-xOcuPTo6KstKWxL08wQ5m3PQP0MyHzVU8vsAgsAq4LGAx64nNDhKVZXVdxmFiG2CqiYRqJqhwMoVBkWA32FSow==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/repomix/-/repomix-1.18.0.tgz", + "integrity": "sha512-bJo4leK5eSc9jz+Hk64irE1cASZSrhZjUdOHfxjF0I/Lw8mynKEMkedESmS6fIXkV56K+RatuPtWz0k3AcmIJA==", "license": "MIT", "dependencies": { "@clack/prompts": "^0.11.0", "@modelcontextprotocol/sdk": "^1.29.0", "@repomix/strip-comments": "^2.4.2", "@repomix/tree-sitter-wasms": "^0.1.17", - "@secretlint/core": "^13.0.2", - "@secretlint/secretlint-rule-preset-recommend": "^13.0.2", + "@secretlint/core": "^13.0.4", + "@secretlint/secretlint-rule-preset-recommend": "^13.0.4", "chokidar": "^5.0.0", "commander": "^15.0.0", - "fast-xml-builder": "^1.2.1", + "fast-xml-builder": "^1.3.0", "git-url-parse": "^16.1.0", - "globby": "^16.2.0", + "globby": "^16.2.2", "gpt-tokenizer": "^3.4.0", "handlebars": "^4.7.9", "iconv-lite": "^0.7.0", @@ -18819,11 +19869,11 @@ "minimatch": "^10.2.5", "picocolors": "^1.1.1", "picospinner": "^3.0.0", - "tar": "^7.5.19", + "tar": "^7.5.22", "tinyclip": "^0.1.15", "tinypool": "^2.1.0", "valibot": "^1.4.2", - "web-tree-sitter": "^0.26.10", + "web-tree-sitter": "^0.26.11", "zod": "^4.4.3" }, "bin": { @@ -18893,9 +19943,9 @@ } }, "node_modules/repomix/node_modules/tar": { - "version": "7.5.20", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.20.tgz", - "integrity": "sha512-9FcyK4PA6+WbzlTM9WhQm6vB5W7cP7dUiPsv1g7YDwEQnQ1CGpK3MGlKk/ITVWMk05kHZuBhmVhiv8LZoy/PFQ==", + "version": "7.5.22", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.22.tgz", + "integrity": "sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA==", "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", @@ -18932,15 +19982,6 @@ "integrity": "sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==", "license": "MIT" }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -19054,12 +20095,12 @@ } }, "node_modules/rolldown": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.5.tgz", - "integrity": "sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.3.tgz", + "integrity": "sha512-rn9wpmxplLf7NLNyCk9FyWh3FM43DbY8jOzCdEPzH7uflhTftRbCEpqi6Ly2osgoU8OwObtmavMbWLaWy4LX7A==", "license": "MIT", "dependencies": { - "@oxc-project/types": "=0.139.0", + "@oxc-project/types": "=0.143.0", "@rolldown/pluginutils": "^1.0.0" }, "bin": { @@ -19069,27 +20110,26 @@ "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.1.5", - "@rolldown/binding-darwin-arm64": "1.1.5", - "@rolldown/binding-darwin-x64": "1.1.5", - "@rolldown/binding-freebsd-x64": "1.1.5", - "@rolldown/binding-linux-arm-gnueabihf": "1.1.5", - "@rolldown/binding-linux-arm64-gnu": "1.1.5", - "@rolldown/binding-linux-arm64-musl": "1.1.5", - "@rolldown/binding-linux-ppc64-gnu": "1.1.5", - "@rolldown/binding-linux-s390x-gnu": "1.1.5", - "@rolldown/binding-linux-x64-gnu": "1.1.5", - "@rolldown/binding-linux-x64-musl": "1.1.5", - "@rolldown/binding-openharmony-arm64": "1.1.5", - "@rolldown/binding-wasm32-wasi": "1.1.5", - "@rolldown/binding-win32-arm64-msvc": "1.1.5", - "@rolldown/binding-win32-x64-msvc": "1.1.5" + "@rolldown/binding-android-arm64": "1.2.3", + "@rolldown/binding-darwin-arm64": "1.2.3", + "@rolldown/binding-darwin-x64": "1.2.3", + "@rolldown/binding-freebsd-x64": "1.2.3", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.3", + "@rolldown/binding-linux-arm64-gnu": "1.2.3", + "@rolldown/binding-linux-arm64-musl": "1.2.3", + "@rolldown/binding-linux-ppc64-gnu": "1.2.3", + "@rolldown/binding-linux-s390x-gnu": "1.2.3", + "@rolldown/binding-linux-x64-gnu": "1.2.3", + "@rolldown/binding-linux-x64-musl": "1.2.3", + "@rolldown/binding-openharmony-arm64": "1.2.3", + "@rolldown/binding-win32-arm64-msvc": "1.2.3", + "@rolldown/binding-win32-x64-msvc": "1.2.3" } }, "node_modules/rollup": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.2.tgz", - "integrity": "sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.4.tgz", + "integrity": "sha512-RXOqwaPsBGjMNMa4sQjDjHieHEZDFoj/Rdr46l2MU5DfEs16wHJPC2RPTPHWhNl+M3aI472LLqFkFKut4SblOg==", "license": "MIT", "dependencies": { "@types/estree": "1.0.9" @@ -19102,31 +20142,32 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.62.2", - "@rollup/rollup-android-arm64": "4.62.2", - "@rollup/rollup-darwin-arm64": "4.62.2", - "@rollup/rollup-darwin-x64": "4.62.2", - "@rollup/rollup-freebsd-arm64": "4.62.2", - "@rollup/rollup-freebsd-x64": "4.62.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.62.2", - "@rollup/rollup-linux-arm-musleabihf": "4.62.2", - "@rollup/rollup-linux-arm64-gnu": "4.62.2", - "@rollup/rollup-linux-arm64-musl": "4.62.2", - "@rollup/rollup-linux-loong64-gnu": "4.62.2", - "@rollup/rollup-linux-loong64-musl": "4.62.2", - "@rollup/rollup-linux-ppc64-gnu": "4.62.2", - "@rollup/rollup-linux-ppc64-musl": "4.62.2", - "@rollup/rollup-linux-riscv64-gnu": "4.62.2", - "@rollup/rollup-linux-riscv64-musl": "4.62.2", - "@rollup/rollup-linux-s390x-gnu": "4.62.2", - "@rollup/rollup-linux-x64-gnu": "4.62.2", - "@rollup/rollup-linux-x64-musl": "4.62.2", - "@rollup/rollup-openbsd-x64": "4.62.2", - "@rollup/rollup-openharmony-arm64": "4.62.2", - "@rollup/rollup-win32-arm64-msvc": "4.62.2", - "@rollup/rollup-win32-ia32-msvc": "4.62.2", - "@rollup/rollup-win32-x64-gnu": "4.62.2", - "@rollup/rollup-win32-x64-msvc": "4.62.2", + "@napi-rs/lzma-linux-x64-gnu": "1.5.1", + "@rollup/rollup-android-arm-eabi": "4.62.4", + "@rollup/rollup-android-arm64": "4.62.4", + "@rollup/rollup-darwin-arm64": "4.62.4", + "@rollup/rollup-darwin-x64": "4.62.4", + "@rollup/rollup-freebsd-arm64": "4.62.4", + "@rollup/rollup-freebsd-x64": "4.62.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.62.4", + "@rollup/rollup-linux-arm-musleabihf": "4.62.4", + "@rollup/rollup-linux-arm64-gnu": "4.62.4", + "@rollup/rollup-linux-arm64-musl": "4.62.4", + "@rollup/rollup-linux-loong64-gnu": "4.62.4", + "@rollup/rollup-linux-loong64-musl": "4.62.4", + "@rollup/rollup-linux-ppc64-gnu": "4.62.4", + "@rollup/rollup-linux-ppc64-musl": "4.62.4", + "@rollup/rollup-linux-riscv64-gnu": "4.62.4", + "@rollup/rollup-linux-riscv64-musl": "4.62.4", + "@rollup/rollup-linux-s390x-gnu": "4.62.4", + "@rollup/rollup-linux-x64-gnu": "4.62.4", + "@rollup/rollup-linux-x64-musl": "4.62.4", + "@rollup/rollup-openbsd-x64": "4.62.4", + "@rollup/rollup-openharmony-arm64": "4.62.4", + "@rollup/rollup-win32-arm64-msvc": "4.62.4", + "@rollup/rollup-win32-ia32-msvc": "4.62.4", + "@rollup/rollup-win32-x64-gnu": "4.62.4", + "@rollup/rollup-win32-x64-msvc": "4.62.4", "fsevents": "~2.3.2" } }, @@ -19188,9 +20229,9 @@ "license": "MIT" }, "node_modules/sax": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", - "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.1.tgz", + "integrity": "sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==", "license": "BlueOak-1.0.0", "engines": { "node": ">=11.0.0" @@ -19553,9 +20594,9 @@ } }, "node_modules/smol-toml": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.7.0.tgz", - "integrity": "sha512-aqVvWoyO21L23mb+drl4RmMXbf6N7FdHjAhTRA9ZBL7apWBgfWC16KjrASI+1p9GAroljyMHj6fK67i0UiTNvQ==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.7.1.tgz", + "integrity": "sha512-PPlsspAZ4jbMBu5DMFhfUGDQLu/vrL4SyBROVS37x8ynnVmFIs1VPBz1Co8Xks3TvpIaZXmU85y4DrQ+UyVFoQ==", "license": "BSD-3-Clause", "engines": { "node": ">= 18" @@ -19849,9 +20890,9 @@ } }, "node_modules/tailwindcss": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.2.tgz", - "integrity": "sha512-WtctNNSH8A9jlMIqxzuYumOHU5uGZyRv0Q5svQl+oEPy5w84YpBxdb7MdqyiSPQge5jTJ6zFQLq0PFygdccSBA==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.3.tgz", + "integrity": "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==", "license": "MIT" }, "node_modules/tapable": { @@ -19905,9 +20946,9 @@ } }, "node_modules/terser": { - "version": "5.49.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.49.0.tgz", - "integrity": "sha512-SNiDnXyHSrxVcIOtVbULzcTmniUiwcV7Nwdyj1twVubeTmbjoa8p69KKDpfkdoOavuM4/GRm1+ykI8qqnavHoA==", + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.49.2.tgz", + "integrity": "sha512-rGbJiKeQ4WDe3EXlDAIaQcwftVfv2Q8o1awFNfvXolJYKkb1AuZY1RTOmqx4LJXZENbWZA7eIsYGHuEzHsi1nQ==", "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -20017,9 +21058,9 @@ } }, "node_modules/tinyexec": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz", - "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.0.tgz", + "integrity": "sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==", "license": "MIT", "engines": { "node": ">=18" @@ -20051,9 +21092,9 @@ } }, "node_modules/tinyrainbow": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", - "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.1.tgz", + "integrity": "sha512-yau8yJdTt989Mm0Bd/236QnzEiPf2xLLTqUZRUJOo/3CB078LSwzei343DgtJVmfJKJE3TMINY1u42SQsP6mXw==", "license": "MIT", "engines": { "node": ">=14.0.0" @@ -20146,9 +21187,9 @@ "license": "0BSD" }, "node_modules/tsx": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.0.tgz", - "integrity": "sha512-eUdUIaCr963q2h5u3+QwvYp0+eqPvn+egeqZUm0hwERCqqx1E3kK5ehbGCvqSE5MQAULr67ww0cA3jKc3YkM1w==", + "version": "4.23.8", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.8.tgz", + "integrity": "sha512-8W675THjbzfFmLOQzjDBIBna+WjqMGIxmSZ1mMc1+o9qoVsEuAgQu5j5ueLhau8inOkDu9OslVg0FmfBs1RIHw==", "license": "MIT", "dependencies": { "esbuild": "~0.28.0" @@ -20848,94 +21889,355 @@ } }, "node_modules/vite": { - "version": "8.1.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.4.tgz", - "integrity": "sha512-bTT9PsdWO+MQMNG9ZXIP/qM9wGh37DFxTV/sPq9cFpHr3w4jkgef032PkAL9jAqhk3Nz8NQw3O8n6/xFkqO4QQ==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.0.tgz", + "integrity": "sha512-pn+CFpM0lwDeKwmOq1ZaBK/9sjorZcgqxki6MbY/jPEVd9vichIlmlD4HmQ5wdP5EgqQCFRaACBxMC7uEGc6lQ==", "license": "MIT", "dependencies": { - "lightningcss": "^1.32.0", + "lightningcss": "^1.33.0", "picomatch": "^4.0.5", - "postcss": "^8.5.16", - "rolldown": "~1.1.4", + "postcss": "^8.5.23", + "rolldown": "~1.2.0", "tinyglobby": "^0.2.17" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.4.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/vite/node_modules/lightningcss": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.33.0", + "lightningcss-darwin-arm64": "1.33.0", + "lightningcss-darwin-x64": "1.33.0", + "lightningcss-freebsd-x64": "1.33.0", + "lightningcss-linux-arm-gnueabihf": "1.33.0", + "lightningcss-linux-arm64-gnu": "1.33.0", + "lightningcss-linux-arm64-musl": "1.33.0", + "lightningcss-linux-x64-gnu": "1.33.0", + "lightningcss-linux-x64-musl": "1.33.0", + "lightningcss-win32-arm64-msvc": "1.33.0", + "lightningcss-win32-x64-msvc": "1.33.0" + } + }, + "node_modules/vite/node_modules/lightningcss-android-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-darwin-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-darwin-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-freebsd-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-arm64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-x64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-x64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.3.0", - "esbuild": "^0.27.0 || ^0.28.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "@vitejs/devtools": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/vite/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "license": "MIT", + "node_modules/vite/node_modules/lightningcss-win32-x64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", + "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", "optional": true, "os": [ - "darwin" + "win32" ], "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, "node_modules/vitefu": { @@ -21743,21 +23045,20 @@ } }, "node_modules/yargs": { - "version": "17.7.3", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz", - "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.1.0.tgz", + "integrity": "sha512-2rAgRKu54VsHkqI0/tYkmluGXHD4KW7yZoycuqDQ15QOTnc2VVfy0nN/1eMhnQLO00A+dwtK20xuCnc1YGeUyg==", "license": "MIT", "dependencies": { - "cliui": "^8.0.1", + "cliui": "^9.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", + "string-width": "^8.2.1", "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" + "yargs-parser": "^22.0.0" }, "engines": { - "node": ">=12" + "node": "^20.19.0 || ^22.12.0 || >=23" } }, "node_modules/yargs-parser": { @@ -21769,59 +23070,6 @@ "node": "^20.19.0 || ^22.12.0 || >=23" } }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, "node_modules/yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", @@ -21833,9 +23081,9 @@ } }, "node_modules/yjs": { - "version": "13.6.31", - "resolved": "https://registry.npmjs.org/yjs/-/yjs-13.6.31.tgz", - "integrity": "sha512-Eq+5BRfbeGyqGVrTJL3bEcr8gKkxPuyuoHmAwpk52fDb8kOVMrfVSTRPd6yiGgX5Fskb96qCRjzjbRjrL4YEnw==", + "version": "13.6.32", + "resolved": "https://registry.npmjs.org/yjs/-/yjs-13.6.32.tgz", + "integrity": "sha512-lfiJIIC4Xayt5ItynE407ehlE03pCjeOc4hkR4yxxvvNJ4kuiN25B0g+Qp8XagYz361LLL7DCzR5bvFJ81QKtQ==", "license": "MIT", "peer": true, "dependencies": { @@ -21878,9 +23126,9 @@ } }, "node_modules/yoctocolors": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", - "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.2.0.tgz", + "integrity": "sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==", "license": "MIT", "engines": { "node": ">=18" @@ -21954,131 +23202,6 @@ "type": "github", "url": "https://github.com/sponsors/wooorm" } - }, - "node_modules/libsodium-wrappers-sumo": { - "version": "0.7.15", - "resolved": "https://registry.npmjs.org/libsodium-wrappers-sumo/-/libsodium-wrappers-sumo-0.7.15.tgz", - "integrity": "sha512-aSWY8wKDZh5TC7rMvEdTHoyppVq/1dTSAeAR7H6pzd6QRT3vQWcT5pGwCotLcpPEOLXX6VvqihSPkpEhYAjANA==", - "license": "ISC", - "dependencies": { - "libsodium-sumo": "^0.7.15" - } - }, - "node_modules/libsodium-sumo": { - "version": "0.7.15", - "resolved": "https://registry.npmjs.org/libsodium-sumo/-/libsodium-sumo-0.7.15.tgz", - "integrity": "sha512-5tPmqPmq8T8Nikpm1Nqj0hBHvsLFCXvdhBFV7SGOitQPZAA6jso8XoL0r4L7vmfKXr486fiQInvErHtEvizFMw==", - "license": "ISC" - }, - "node_modules/@astrojs/cloudflare": { - "version": "12.6.13", - "resolved": "https://registry.npmjs.org/@astrojs/cloudflare/-/cloudflare-12.6.13.tgz", - "integrity": "sha512-oKaCyiovyQr183r9U93787Ju1zwk+rRMgPnLTwCLckHmOUK7sltA1Gp4LSGt8oNMgqQS6jR7uRdfQ/NPul37QA==", - "license": "MIT", - "dependencies": { - "@astrojs/internal-helpers": "0.7.6", - "@astrojs/underscore-redirects": "1.0.0", - "@cloudflare/workers-types": "^4.20260116.0", - "tinyglobby": "^0.2.15", - "vite": "^6.4.1", - "wrangler": "4.59.2" - }, - "peerDependencies": { - "astro": "^5.7.0" - } - }, - "node_modules/@astrojs/mdx": { - "version": "4.3.14", - "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-4.3.14.tgz", - "integrity": "sha512-FBrqJQORVm+rkRa2TS5CjU9PBA6hkhrwLVBSS9A77gN2+iehvjq1w6yya/d0YKC7osiVorKkr3Qd9wNbl0ZkGA==", - "license": "MIT", - "dependencies": { - "@astrojs/markdown-remark": "6.3.11", - "@mdx-js/mdx": "^3.1.1", - "acorn": "^8.15.0", - "es-module-lexer": "^1.7.0", - "estree-util-visit": "^2.0.0", - "hast-util-to-html": "^9.0.5", - "piccolore": "^0.1.3", - "rehype-raw": "^7.0.0", - "remark-gfm": "^4.0.1", - "remark-smartypants": "^3.0.2", - "source-map": "^0.7.6", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.3" - }, - "engines": { - "node": "18.20.8 || ^20.3.0 || >=22.0.0" - }, - "peerDependencies": { - "astro": "^5.0.0" - } - }, - "node_modules/@vitejs/plugin-react": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", - "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.28.0", - "@babel/plugin-transform-react-jsx-self": "^7.27.1", - "@babel/plugin-transform-react-jsx-source": "^7.27.1", - "@rolldown/pluginutils": "1.0.0-beta.27", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.17.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" - } - }, - "node_modules/@astrojs/starlight": { - "version": "0.37.6", - "resolved": "https://registry.npmjs.org/@astrojs/starlight/-/starlight-0.37.6.tgz", - "integrity": "sha512-wQrKwH431q+8FsLBnNQeG+R36TMtEGxTQ2AuiVpcx9APcazvL3n7wVW8mMmYyxX0POjTnxlcWPkdMGR3Yj1L+w==", - "license": "MIT", - "dependencies": { - "@astrojs/markdown-remark": "^6.3.1", - "@astrojs/mdx": "^4.2.3", - "@astrojs/sitemap": "^3.3.0", - "@pagefind/default-ui": "^1.3.0", - "@types/hast": "^3.0.4", - "@types/js-yaml": "^4.0.9", - "@types/mdast": "^4.0.4", - "astro-expressive-code": "^0.41.1", - "bcp-47": "^2.1.0", - "hast-util-from-html": "^2.0.1", - "hast-util-select": "^6.0.2", - "hast-util-to-string": "^3.0.0", - "hastscript": "^9.0.0", - "i18next": "^23.11.5", - "js-yaml": "^4.1.0", - "klona": "^2.0.6", - "magic-string": "^0.30.17", - "mdast-util-directive": "^3.0.0", - "mdast-util-to-markdown": "^2.1.0", - "mdast-util-to-string": "^4.0.0", - "pagefind": "^1.3.0", - "rehype": "^13.0.1", - "rehype-format": "^5.0.0", - "remark-directive": "^3.0.0", - "ultrahtml": "^1.6.0", - "unified": "^11.0.5", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.2" - }, - "peerDependencies": { - "astro": "^5.5.0" - } - }, - "node_modules/@cloudflare/workers-types": { - "version": "5.20260804.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-5.20260804.1.tgz", - "integrity": "sha512-B1dwxpN6e5RZXZkE5zpZj+ooNeNZ1mwavLIyHDYe10ojhlGTwDfe8sAl7R1mMXc1cyIsbr+jKVdvmMEyVcdTdg==", - "extraneous": true, - "license": "MIT OR Apache-2.0" } } } From 28e06ae459073444fd59af23b446803e75527b50 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Wed, 5 Aug 2026 17:25:41 -0400 Subject: [PATCH 066/315] build(build): make published lock resolution npm authoritative Intent: - Save hint: make published lock resolution npm authoritative Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.treedx-perf.20260805T075847Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#9f015fbca43a39f1b396591fbe4ede6beab8b089 -> github:treeseed-ai/sdk#caa7bb7460e7b41be4d893fb459484475b516ef2 - dependencies.@treeseed/core: github:treeseed-ai/core#26fc51d7f082e4b7ed3e33158ec3e9ae4847f1f3 -> github:treeseed-ai/core#063362cf061f51dd43fe4c5926525e22abb1d28f --- package-lock.json | 129 +++++++++++++++++++++++++++++++++++++++++----- package.json | 4 +- 2 files changed, 117 insertions(+), 16 deletions(-) diff --git a/package-lock.json b/package-lock.json index 33aa106a..770915c4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#26fc51d7f082e4b7ed3e33158ec3e9ae4847f1f3", - "@treeseed/sdk": "github:treeseed-ai/sdk#9f015fbca43a39f1b396591fbe4ede6beab8b089", + "@treeseed/core": "github:treeseed-ai/core#063362cf061f51dd43fe4c5926525e22abb1d28f", + "@treeseed/sdk": "github:treeseed-ai/sdk#caa7bb7460e7b41be4d893fb459484475b516ef2", "@treeseed/ui": "github:treeseed-ai/ui#e4c7a0896fa6d49b183d2729150eb598084c6c35", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -6345,9 +6345,9 @@ } }, "node_modules/@rolldown/pluginutils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", "license": "MIT" }, "node_modules/@rollup/pluginutils": { @@ -7463,8 +7463,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.treedx-perf.20260805T075816Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#26fc51d7f082e4b7ed3e33158ec3e9ae4847f1f3", - "integrity": "sha512-YLxyA0gjURHq6yoS8Y8vOI2rik9zymARQ4h5rtu5unYmeH7/4yKJ3EICSGyAbvaIdfSOxnl26md1Ef8L/u+08Q==", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#063362cf061f51dd43fe4c5926525e22abb1d28f", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7475,7 +7474,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#9f015fbca43a39f1b396591fbe4ede6beab8b089", + "@treeseed/sdk": "github:treeseed-ai/sdk#caa7bb7460e7b41be4d893fb459484475b516ef2", "@treeseed/ui": "github:treeseed-ai/ui#e4c7a0896fa6d49b183d2729150eb598084c6c35", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -9480,8 +9479,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.treedx-perf.20260805T073639Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#9f015fbca43a39f1b396591fbe4ede6beab8b089", - "integrity": "sha512-ciEcxaXicSNcLq7H97bq7YX7hGBXIG9oHj7DwiBXptivRdDo+utSL+8JU8XbF7G0XvO1M66Wj7GDsxTlEL/+IA==", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#caa7bb7460e7b41be4d893fb459484475b516ef2", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", @@ -10187,7 +10185,6 @@ "node_modules/@treeseed/ui": { "version": "0.12.18-dev.staging.20260804T170811Z", "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#e4c7a0896fa6d49b183d2729150eb598084c6c35", - "integrity": "sha512-wCaTa9E3JYEFXmldqHj1fhXFBzq4ZrxnT6AFnyiNmj6V5k0N8o4gnAzZAakQqkx4Zoo/VQ8u2NXKht9HiOZkKw==", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", @@ -15669,9 +15666,10 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz", - "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", + "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", + "dev": true, "funding": [ { "type": "github", @@ -23202,6 +23200,109 @@ "type": "github", "url": "https://github.com/sponsors/wooorm" } + }, + "node_modules/@astrojs/cloudflare": { + "version": "12.6.13", + "resolved": "https://registry.npmjs.org/@astrojs/cloudflare/-/cloudflare-12.6.13.tgz", + "integrity": "sha512-oKaCyiovyQr183r9U93787Ju1zwk+rRMgPnLTwCLckHmOUK7sltA1Gp4LSGt8oNMgqQS6jR7uRdfQ/NPul37QA==", + "license": "MIT", + "dependencies": { + "@astrojs/internal-helpers": "0.7.6", + "@astrojs/underscore-redirects": "1.0.0", + "@cloudflare/workers-types": "^4.20260116.0", + "tinyglobby": "^0.2.15", + "vite": "^6.4.1", + "wrangler": "4.59.2" + }, + "peerDependencies": { + "astro": "^5.7.0" + } + }, + "node_modules/@astrojs/mdx": { + "version": "4.3.14", + "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-4.3.14.tgz", + "integrity": "sha512-FBrqJQORVm+rkRa2TS5CjU9PBA6hkhrwLVBSS9A77gN2+iehvjq1w6yya/d0YKC7osiVorKkr3Qd9wNbl0ZkGA==", + "license": "MIT", + "dependencies": { + "@astrojs/markdown-remark": "6.3.11", + "@mdx-js/mdx": "^3.1.1", + "acorn": "^8.15.0", + "es-module-lexer": "^1.7.0", + "estree-util-visit": "^2.0.0", + "hast-util-to-html": "^9.0.5", + "piccolore": "^0.1.3", + "rehype-raw": "^7.0.0", + "remark-gfm": "^4.0.1", + "remark-smartypants": "^3.0.2", + "source-map": "^0.7.6", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.3" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + }, + "peerDependencies": { + "astro": "^5.0.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/@astrojs/starlight": { + "version": "0.37.6", + "resolved": "https://registry.npmjs.org/@astrojs/starlight/-/starlight-0.37.6.tgz", + "integrity": "sha512-wQrKwH431q+8FsLBnNQeG+R36TMtEGxTQ2AuiVpcx9APcazvL3n7wVW8mMmYyxX0POjTnxlcWPkdMGR3Yj1L+w==", + "license": "MIT", + "dependencies": { + "@astrojs/markdown-remark": "^6.3.1", + "@astrojs/mdx": "^4.2.3", + "@astrojs/sitemap": "^3.3.0", + "@pagefind/default-ui": "^1.3.0", + "@types/hast": "^3.0.4", + "@types/js-yaml": "^4.0.9", + "@types/mdast": "^4.0.4", + "astro-expressive-code": "^0.41.1", + "bcp-47": "^2.1.0", + "hast-util-from-html": "^2.0.1", + "hast-util-select": "^6.0.2", + "hast-util-to-string": "^3.0.0", + "hastscript": "^9.0.0", + "i18next": "^23.11.5", + "js-yaml": "^4.1.0", + "klona": "^2.0.6", + "magic-string": "^0.30.17", + "mdast-util-directive": "^3.0.0", + "mdast-util-to-markdown": "^2.1.0", + "mdast-util-to-string": "^4.0.0", + "pagefind": "^1.3.0", + "rehype": "^13.0.1", + "rehype-format": "^5.0.0", + "remark-directive": "^3.0.0", + "ultrahtml": "^1.6.0", + "unified": "^11.0.5", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.2" + }, + "peerDependencies": { + "astro": "^5.5.0" + } } } } diff --git a/package.json b/package.json index e42480d0..fc25ae0b 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#26fc51d7f082e4b7ed3e33158ec3e9ae4847f1f3", - "@treeseed/sdk": "github:treeseed-ai/sdk#9f015fbca43a39f1b396591fbe4ede6beab8b089", + "@treeseed/core": "github:treeseed-ai/core#063362cf061f51dd43fe4c5926525e22abb1d28f", + "@treeseed/sdk": "github:treeseed-ai/sdk#caa7bb7460e7b41be4d893fb459484475b516ef2", "@treeseed/ui": "github:treeseed-ai/ui#e4c7a0896fa6d49b183d2729150eb598084c6c35", "react": "^19.2.5", "react-dom": "^19.2.6" From cedc1e3990d89cca0ec9c87f2948d4bb2e6324bd Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Wed, 5 Aug 2026 17:31:24 -0400 Subject: [PATCH 067/315] build(build): prove published dependency lockfiles are stable Intent: - Save hint: prove published dependency lockfiles are stable Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.treedx-perf.20260805T075847Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/core: github:treeseed-ai/core#063362cf061f51dd43fe4c5926525e22abb1d28f -> github:treeseed-ai/core#c60f43ea3c52f8cef38bce685e78850ad026f0e3 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 770915c4..cc6e1ca2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#063362cf061f51dd43fe4c5926525e22abb1d28f", + "@treeseed/core": "github:treeseed-ai/core#c60f43ea3c52f8cef38bce685e78850ad026f0e3", "@treeseed/sdk": "github:treeseed-ai/sdk#caa7bb7460e7b41be4d893fb459484475b516ef2", "@treeseed/ui": "github:treeseed-ai/ui#e4c7a0896fa6d49b183d2729150eb598084c6c35", "react": "^19.2.5", @@ -7463,7 +7463,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.treedx-perf.20260805T075816Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#063362cf061f51dd43fe4c5926525e22abb1d28f", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#c60f43ea3c52f8cef38bce685e78850ad026f0e3", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", diff --git a/package.json b/package.json index fc25ae0b..7a08b3b1 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#063362cf061f51dd43fe4c5926525e22abb1d28f", + "@treeseed/core": "github:treeseed-ai/core#c60f43ea3c52f8cef38bce685e78850ad026f0e3", "@treeseed/sdk": "github:treeseed-ai/sdk#caa7bb7460e7b41be4d893fb459484475b516ef2", "@treeseed/ui": "github:treeseed-ai/ui#e4c7a0896fa6d49b183d2729150eb598084c6c35", "react": "^19.2.5", From 30fd4a36e92bb8e9a3d2d50b731e02009bb2983b Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Wed, 5 Aug 2026 17:39:52 -0400 Subject: [PATCH 068/315] build(build): finalize stable downstream dependency graphs Intent: - Save hint: finalize stable downstream dependency graphs Changes: - Updates 1 file across build: 1. - Touches package-lock.json. - Plans package version/tag 0.12.59-dev.treedx-perf.20260805T075847Z for @treeseed/admin. --- package-lock.json | 119 ++++------------------------------------------ 1 file changed, 9 insertions(+), 110 deletions(-) diff --git a/package-lock.json b/package-lock.json index cc6e1ca2..04353098 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6345,9 +6345,9 @@ } }, "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.27", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", - "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", "license": "MIT" }, "node_modules/@rollup/pluginutils": { @@ -7464,6 +7464,7 @@ "node_modules/@treeseed/core": { "version": "0.12.60-dev.treedx-perf.20260805T075816Z", "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#c60f43ea3c52f8cef38bce685e78850ad026f0e3", + "integrity": "sha512-d2KyM99OT/YsI3tAW34i2JamhxJ6OhdkEmoi8hmoQeoG+pmZQlZVtTyZCs1rz7ZGRyxvSvG4pEPFSXBE7/vSCw==", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -9480,6 +9481,7 @@ "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.treedx-perf.20260805T073639Z", "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#caa7bb7460e7b41be4d893fb459484475b516ef2", + "integrity": "sha512-ciEcxaXicSNcLq7H97bq7YX7hGBXIG9oHj7DwiBXptivRdDo+utSL+8JU8XbF7G0XvO1M66Wj7GDsxTlEL/+IA==", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", @@ -10185,6 +10187,7 @@ "node_modules/@treeseed/ui": { "version": "0.12.18-dev.staging.20260804T170811Z", "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#e4c7a0896fa6d49b183d2729150eb598084c6c35", + "integrity": "sha512-wCaTa9E3JYEFXmldqHj1fhXFBzq4ZrxnT6AFnyiNmj6V5k0N8o4gnAzZAakQqkx4Zoo/VQ8u2NXKht9HiOZkKw==", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", @@ -15666,10 +15669,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", - "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", - "dev": true, + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz", + "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==", "funding": [ { "type": "github", @@ -23200,109 +23202,6 @@ "type": "github", "url": "https://github.com/sponsors/wooorm" } - }, - "node_modules/@astrojs/cloudflare": { - "version": "12.6.13", - "resolved": "https://registry.npmjs.org/@astrojs/cloudflare/-/cloudflare-12.6.13.tgz", - "integrity": "sha512-oKaCyiovyQr183r9U93787Ju1zwk+rRMgPnLTwCLckHmOUK7sltA1Gp4LSGt8oNMgqQS6jR7uRdfQ/NPul37QA==", - "license": "MIT", - "dependencies": { - "@astrojs/internal-helpers": "0.7.6", - "@astrojs/underscore-redirects": "1.0.0", - "@cloudflare/workers-types": "^4.20260116.0", - "tinyglobby": "^0.2.15", - "vite": "^6.4.1", - "wrangler": "4.59.2" - }, - "peerDependencies": { - "astro": "^5.7.0" - } - }, - "node_modules/@astrojs/mdx": { - "version": "4.3.14", - "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-4.3.14.tgz", - "integrity": "sha512-FBrqJQORVm+rkRa2TS5CjU9PBA6hkhrwLVBSS9A77gN2+iehvjq1w6yya/d0YKC7osiVorKkr3Qd9wNbl0ZkGA==", - "license": "MIT", - "dependencies": { - "@astrojs/markdown-remark": "6.3.11", - "@mdx-js/mdx": "^3.1.1", - "acorn": "^8.15.0", - "es-module-lexer": "^1.7.0", - "estree-util-visit": "^2.0.0", - "hast-util-to-html": "^9.0.5", - "piccolore": "^0.1.3", - "rehype-raw": "^7.0.0", - "remark-gfm": "^4.0.1", - "remark-smartypants": "^3.0.2", - "source-map": "^0.7.6", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.3" - }, - "engines": { - "node": "18.20.8 || ^20.3.0 || >=22.0.0" - }, - "peerDependencies": { - "astro": "^5.0.0" - } - }, - "node_modules/@vitejs/plugin-react": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", - "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.28.0", - "@babel/plugin-transform-react-jsx-self": "^7.27.1", - "@babel/plugin-transform-react-jsx-source": "^7.27.1", - "@rolldown/pluginutils": "1.0.0-beta.27", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.17.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" - } - }, - "node_modules/@astrojs/starlight": { - "version": "0.37.6", - "resolved": "https://registry.npmjs.org/@astrojs/starlight/-/starlight-0.37.6.tgz", - "integrity": "sha512-wQrKwH431q+8FsLBnNQeG+R36TMtEGxTQ2AuiVpcx9APcazvL3n7wVW8mMmYyxX0POjTnxlcWPkdMGR3Yj1L+w==", - "license": "MIT", - "dependencies": { - "@astrojs/markdown-remark": "^6.3.1", - "@astrojs/mdx": "^4.2.3", - "@astrojs/sitemap": "^3.3.0", - "@pagefind/default-ui": "^1.3.0", - "@types/hast": "^3.0.4", - "@types/js-yaml": "^4.0.9", - "@types/mdast": "^4.0.4", - "astro-expressive-code": "^0.41.1", - "bcp-47": "^2.1.0", - "hast-util-from-html": "^2.0.1", - "hast-util-select": "^6.0.2", - "hast-util-to-string": "^3.0.0", - "hastscript": "^9.0.0", - "i18next": "^23.11.5", - "js-yaml": "^4.1.0", - "klona": "^2.0.6", - "magic-string": "^0.30.17", - "mdast-util-directive": "^3.0.0", - "mdast-util-to-markdown": "^2.1.0", - "mdast-util-to-string": "^4.0.0", - "pagefind": "^1.3.0", - "rehype": "^13.0.1", - "rehype-format": "^5.0.0", - "remark-directive": "^3.0.0", - "ultrahtml": "^1.6.0", - "unified": "^11.0.5", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.2" - }, - "peerDependencies": { - "astro": "^5.5.0" - } } } } From 17210d0f235ec52d6e850874e1f99417f06d7d1c Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Wed, 5 Aug 2026 23:17:02 -0400 Subject: [PATCH 069/315] build(build): resolve staging update conflict in Core dependencies Intent: - Save hint: resolve staging update conflict in Core dependencies Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.treedx-perf.20260805T075847Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#caa7bb7460e7b41be4d893fb459484475b516ef2 -> github:treeseed-ai/sdk#cedde608dabb8674759a013c0a5c7a6b0b681b43 - dependencies.@treeseed/ui: github:treeseed-ai/ui#e4c7a0896fa6d49b183d2729150eb598084c6c35 -> github:treeseed-ai/ui#a54379ece03509225fc0bca226fbb191038b98da - dependencies.@treeseed/core: github:treeseed-ai/core#c60f43ea3c52f8cef38bce685e78850ad026f0e3 -> github:treeseed-ai/core#21aba895161fced92d527eece78c3e956727c805 --- package-lock.json | 135 ++++++++++++++++++++++++++++++++++++++++------ package.json | 6 +-- 2 files changed, 121 insertions(+), 20 deletions(-) diff --git a/package-lock.json b/package-lock.json index 04353098..d79bc50f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,9 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#c60f43ea3c52f8cef38bce685e78850ad026f0e3", - "@treeseed/sdk": "github:treeseed-ai/sdk#caa7bb7460e7b41be4d893fb459484475b516ef2", - "@treeseed/ui": "github:treeseed-ai/ui#e4c7a0896fa6d49b183d2729150eb598084c6c35", + "@treeseed/core": "github:treeseed-ai/core#21aba895161fced92d527eece78c3e956727c805", + "@treeseed/sdk": "github:treeseed-ai/sdk#cedde608dabb8674759a013c0a5c7a6b0b681b43", + "@treeseed/ui": "github:treeseed-ai/ui#a54379ece03509225fc0bca226fbb191038b98da", "react": "^19.2.5", "react-dom": "^19.2.6" }, @@ -6345,9 +6345,9 @@ } }, "node_modules/@rolldown/pluginutils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", "license": "MIT" }, "node_modules/@rollup/pluginutils": { @@ -7463,8 +7463,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.treedx-perf.20260805T075816Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#c60f43ea3c52f8cef38bce685e78850ad026f0e3", - "integrity": "sha512-d2KyM99OT/YsI3tAW34i2JamhxJ6OhdkEmoi8hmoQeoG+pmZQlZVtTyZCs1rz7ZGRyxvSvG4pEPFSXBE7/vSCw==", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#21aba895161fced92d527eece78c3e956727c805", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7475,8 +7474,8 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#caa7bb7460e7b41be4d893fb459484475b516ef2", - "@treeseed/ui": "github:treeseed-ai/ui#e4c7a0896fa6d49b183d2729150eb598084c6c35", + "@treeseed/sdk": "github:treeseed-ai/sdk#cedde608dabb8674759a013c0a5c7a6b0b681b43", + "@treeseed/ui": "github:treeseed-ai/ui#a54379ece03509225fc0bca226fbb191038b98da", "astro": "^5.6.1", "esbuild": "^0.28.0", "katex": "^0.16.22", @@ -9480,8 +9479,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.treedx-perf.20260805T073639Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#caa7bb7460e7b41be4d893fb459484475b516ef2", - "integrity": "sha512-ciEcxaXicSNcLq7H97bq7YX7hGBXIG9oHj7DwiBXptivRdDo+utSL+8JU8XbF7G0XvO1M66Wj7GDsxTlEL/+IA==", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#cedde608dabb8674759a013c0a5c7a6b0b681b43", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", @@ -10186,8 +10184,7 @@ }, "node_modules/@treeseed/ui": { "version": "0.12.18-dev.staging.20260804T170811Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#e4c7a0896fa6d49b183d2729150eb598084c6c35", - "integrity": "sha512-wCaTa9E3JYEFXmldqHj1fhXFBzq4ZrxnT6AFnyiNmj6V5k0N8o4gnAzZAakQqkx4Zoo/VQ8u2NXKht9HiOZkKw==", + "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#a54379ece03509225fc0bca226fbb191038b98da", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", @@ -15669,9 +15666,10 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz", - "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", + "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", + "dev": true, "funding": [ { "type": "github", @@ -23202,6 +23200,109 @@ "type": "github", "url": "https://github.com/sponsors/wooorm" } + }, + "node_modules/@astrojs/cloudflare": { + "version": "12.6.13", + "resolved": "https://registry.npmjs.org/@astrojs/cloudflare/-/cloudflare-12.6.13.tgz", + "integrity": "sha512-oKaCyiovyQr183r9U93787Ju1zwk+rRMgPnLTwCLckHmOUK7sltA1Gp4LSGt8oNMgqQS6jR7uRdfQ/NPul37QA==", + "license": "MIT", + "dependencies": { + "@astrojs/internal-helpers": "0.7.6", + "@astrojs/underscore-redirects": "1.0.0", + "@cloudflare/workers-types": "^4.20260116.0", + "tinyglobby": "^0.2.15", + "vite": "^6.4.1", + "wrangler": "4.59.2" + }, + "peerDependencies": { + "astro": "^5.7.0" + } + }, + "node_modules/@astrojs/mdx": { + "version": "4.3.14", + "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-4.3.14.tgz", + "integrity": "sha512-FBrqJQORVm+rkRa2TS5CjU9PBA6hkhrwLVBSS9A77gN2+iehvjq1w6yya/d0YKC7osiVorKkr3Qd9wNbl0ZkGA==", + "license": "MIT", + "dependencies": { + "@astrojs/markdown-remark": "6.3.11", + "@mdx-js/mdx": "^3.1.1", + "acorn": "^8.15.0", + "es-module-lexer": "^1.7.0", + "estree-util-visit": "^2.0.0", + "hast-util-to-html": "^9.0.5", + "piccolore": "^0.1.3", + "rehype-raw": "^7.0.0", + "remark-gfm": "^4.0.1", + "remark-smartypants": "^3.0.2", + "source-map": "^0.7.6", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.3" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + }, + "peerDependencies": { + "astro": "^5.0.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/@astrojs/starlight": { + "version": "0.37.6", + "resolved": "https://registry.npmjs.org/@astrojs/starlight/-/starlight-0.37.6.tgz", + "integrity": "sha512-wQrKwH431q+8FsLBnNQeG+R36TMtEGxTQ2AuiVpcx9APcazvL3n7wVW8mMmYyxX0POjTnxlcWPkdMGR3Yj1L+w==", + "license": "MIT", + "dependencies": { + "@astrojs/markdown-remark": "^6.3.1", + "@astrojs/mdx": "^4.2.3", + "@astrojs/sitemap": "^3.3.0", + "@pagefind/default-ui": "^1.3.0", + "@types/hast": "^3.0.4", + "@types/js-yaml": "^4.0.9", + "@types/mdast": "^4.0.4", + "astro-expressive-code": "^0.41.1", + "bcp-47": "^2.1.0", + "hast-util-from-html": "^2.0.1", + "hast-util-select": "^6.0.2", + "hast-util-to-string": "^3.0.0", + "hastscript": "^9.0.0", + "i18next": "^23.11.5", + "js-yaml": "^4.1.0", + "klona": "^2.0.6", + "magic-string": "^0.30.17", + "mdast-util-directive": "^3.0.0", + "mdast-util-to-markdown": "^2.1.0", + "mdast-util-to-string": "^4.0.0", + "pagefind": "^1.3.0", + "rehype": "^13.0.1", + "rehype-format": "^5.0.0", + "remark-directive": "^3.0.0", + "ultrahtml": "^1.6.0", + "unified": "^11.0.5", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.2" + }, + "peerDependencies": { + "astro": "^5.5.0" + } } } } diff --git a/package.json b/package.json index 7a08b3b1..05d4fd91 100644 --- a/package.json +++ b/package.json @@ -49,9 +49,9 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#c60f43ea3c52f8cef38bce685e78850ad026f0e3", - "@treeseed/sdk": "github:treeseed-ai/sdk#caa7bb7460e7b41be4d893fb459484475b516ef2", - "@treeseed/ui": "github:treeseed-ai/ui#e4c7a0896fa6d49b183d2729150eb598084c6c35", + "@treeseed/core": "github:treeseed-ai/core#21aba895161fced92d527eece78c3e956727c805", + "@treeseed/sdk": "github:treeseed-ai/sdk#cedde608dabb8674759a013c0a5c7a6b0b681b43", + "@treeseed/ui": "github:treeseed-ai/ui#a54379ece03509225fc0bca226fbb191038b98da", "react": "^19.2.5", "react-dom": "^19.2.6" }, From 5dfd4f3960fd351af650a69bbb4e6209b5706ece Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Thu, 6 Aug 2026 00:40:57 -0400 Subject: [PATCH 070/315] build(build): integrate staging and enforce island-owned realtime Intent: - Save hint: integrate staging and enforce island-owned realtime requests Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.treedx-perf.20260805T075847Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/ui: github:treeseed-ai/ui#a54379ece03509225fc0bca226fbb191038b98da -> github:treeseed-ai/ui#c58d82082ea45c882aab2004050fe803d8d09d15 - dependencies.@treeseed/core: github:treeseed-ai/core#21aba895161fced92d527eece78c3e956727c805 -> github:treeseed-ai/core#77dbd363a4686d64db898e4300858b76c324feef --- package-lock.json | 131 ++++++++++++++++++++++++++++++++++++++++------ package.json | 4 +- 2 files changed, 118 insertions(+), 17 deletions(-) diff --git a/package-lock.json b/package-lock.json index bc0b62e4..b5b4ff70 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,9 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#21aba895161fced92d527eece78c3e956727c805", + "@treeseed/core": "github:treeseed-ai/core#77dbd363a4686d64db898e4300858b76c324feef", "@treeseed/sdk": "github:treeseed-ai/sdk#cedde608dabb8674759a013c0a5c7a6b0b681b43", - "@treeseed/ui": "github:treeseed-ai/ui#a54379ece03509225fc0bca226fbb191038b98da", + "@treeseed/ui": "github:treeseed-ai/ui#c58d82082ea45c882aab2004050fe803d8d09d15", "react": "^19.2.5", "react-dom": "^19.2.6" }, @@ -6345,9 +6345,9 @@ } }, "node_modules/@rolldown/pluginutils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", "license": "MIT" }, "node_modules/@rollup/pluginutils": { @@ -7463,8 +7463,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.treedx-perf.20260805T075816Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#21aba895161fced92d527eece78c3e956727c805", - "integrity": "sha512-1DpPanmuAO/FTZlyZdl22x80tHlOxsF3bGYgjOuQ6S4+UQWnFabPnz2k2PQUxwv1P+0NjX/43ModbdQZ8JOxHA==", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#77dbd363a4686d64db898e4300858b76c324feef", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7476,7 +7475,7 @@ "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", "@treeseed/sdk": "github:treeseed-ai/sdk#cedde608dabb8674759a013c0a5c7a6b0b681b43", - "@treeseed/ui": "github:treeseed-ai/ui#a54379ece03509225fc0bca226fbb191038b98da", + "@treeseed/ui": "github:treeseed-ai/ui#c58d82082ea45c882aab2004050fe803d8d09d15", "astro": "^5.6.1", "esbuild": "^0.28.0", "katex": "^0.16.22", @@ -9481,7 +9480,6 @@ "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.treedx-perf.20260805T073639Z", "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#cedde608dabb8674759a013c0a5c7a6b0b681b43", - "integrity": "sha512-/jhzubvcWsgVd5FIVEkP0MgRmPPMzHnhlW9GCNuiUJV5K0UM0Co4JwQk0TPXeiBbZxQKRIXJnI/sZi7dxE/MJQ==", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", @@ -10185,9 +10183,8 @@ } }, "node_modules/@treeseed/ui": { - "version": "0.12.18-dev.staging.20260804T170811Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#a54379ece03509225fc0bca226fbb191038b98da", - "integrity": "sha512-AKfop1W7VDc2agSuRV8S/2eO+6+/vxa49pA3ZzWsPXe63mWzZybfd+vdWpYHxyEDx8cn6+K6Z0mgP4bj3TJsQw==", + "version": "0.12.18-dev.treedx-perf.20260806T042250Z", + "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#c58d82082ea45c882aab2004050fe803d8d09d15", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", @@ -15669,9 +15666,10 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz", - "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", + "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", + "dev": true, "funding": [ { "type": "github", @@ -23202,6 +23200,109 @@ "type": "github", "url": "https://github.com/sponsors/wooorm" } + }, + "node_modules/@astrojs/cloudflare": { + "version": "12.6.13", + "resolved": "https://registry.npmjs.org/@astrojs/cloudflare/-/cloudflare-12.6.13.tgz", + "integrity": "sha512-oKaCyiovyQr183r9U93787Ju1zwk+rRMgPnLTwCLckHmOUK7sltA1Gp4LSGt8oNMgqQS6jR7uRdfQ/NPul37QA==", + "license": "MIT", + "dependencies": { + "@astrojs/internal-helpers": "0.7.6", + "@astrojs/underscore-redirects": "1.0.0", + "@cloudflare/workers-types": "^4.20260116.0", + "tinyglobby": "^0.2.15", + "vite": "^6.4.1", + "wrangler": "4.59.2" + }, + "peerDependencies": { + "astro": "^5.7.0" + } + }, + "node_modules/@astrojs/mdx": { + "version": "4.3.14", + "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-4.3.14.tgz", + "integrity": "sha512-FBrqJQORVm+rkRa2TS5CjU9PBA6hkhrwLVBSS9A77gN2+iehvjq1w6yya/d0YKC7osiVorKkr3Qd9wNbl0ZkGA==", + "license": "MIT", + "dependencies": { + "@astrojs/markdown-remark": "6.3.11", + "@mdx-js/mdx": "^3.1.1", + "acorn": "^8.15.0", + "es-module-lexer": "^1.7.0", + "estree-util-visit": "^2.0.0", + "hast-util-to-html": "^9.0.5", + "piccolore": "^0.1.3", + "rehype-raw": "^7.0.0", + "remark-gfm": "^4.0.1", + "remark-smartypants": "^3.0.2", + "source-map": "^0.7.6", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.3" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + }, + "peerDependencies": { + "astro": "^5.0.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/@astrojs/starlight": { + "version": "0.37.6", + "resolved": "https://registry.npmjs.org/@astrojs/starlight/-/starlight-0.37.6.tgz", + "integrity": "sha512-wQrKwH431q+8FsLBnNQeG+R36TMtEGxTQ2AuiVpcx9APcazvL3n7wVW8mMmYyxX0POjTnxlcWPkdMGR3Yj1L+w==", + "license": "MIT", + "dependencies": { + "@astrojs/markdown-remark": "^6.3.1", + "@astrojs/mdx": "^4.2.3", + "@astrojs/sitemap": "^3.3.0", + "@pagefind/default-ui": "^1.3.0", + "@types/hast": "^3.0.4", + "@types/js-yaml": "^4.0.9", + "@types/mdast": "^4.0.4", + "astro-expressive-code": "^0.41.1", + "bcp-47": "^2.1.0", + "hast-util-from-html": "^2.0.1", + "hast-util-select": "^6.0.2", + "hast-util-to-string": "^3.0.0", + "hastscript": "^9.0.0", + "i18next": "^23.11.5", + "js-yaml": "^4.1.0", + "klona": "^2.0.6", + "magic-string": "^0.30.17", + "mdast-util-directive": "^3.0.0", + "mdast-util-to-markdown": "^2.1.0", + "mdast-util-to-string": "^4.0.0", + "pagefind": "^1.3.0", + "rehype": "^13.0.1", + "rehype-format": "^5.0.0", + "remark-directive": "^3.0.0", + "ultrahtml": "^1.6.0", + "unified": "^11.0.5", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.2" + }, + "peerDependencies": { + "astro": "^5.5.0" + } } } } diff --git a/package.json b/package.json index 05d4fd91..8b974959 100644 --- a/package.json +++ b/package.json @@ -49,9 +49,9 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#21aba895161fced92d527eece78c3e956727c805", + "@treeseed/core": "github:treeseed-ai/core#77dbd363a4686d64db898e4300858b76c324feef", "@treeseed/sdk": "github:treeseed-ai/sdk#cedde608dabb8674759a013c0a5c7a6b0b681b43", - "@treeseed/ui": "github:treeseed-ai/ui#a54379ece03509225fc0bca226fbb191038b98da", + "@treeseed/ui": "github:treeseed-ai/ui#c58d82082ea45c882aab2004050fe803d8d09d15", "react": "^19.2.5", "react-dom": "^19.2.6" }, From 8295ffcff59f51bd6b99317c49c8eeb9eb9dc146 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Thu, 6 Aug 2026 00:44:15 -0400 Subject: [PATCH 071/315] test(tests): integrate staging and enforce island-owned realtime Intent: - Save hint: integrate staging and enforce island-owned realtime requests Changes: - Updates 3 files across tests: 3. - Touches tests/contract/focus-command/focus-command-architecture.test.ts, tests/contract/package/admin-package.test.ts, tests/contract/team-management/team-management-architecture.test.ts. - Plans package version/tag 0.12.59-dev.treedx-perf.20260805T075847Z for @treeseed/admin. --- .../focus-command-architecture.test.ts | 35 ++++++++++--------- tests/contract/package/admin-package.test.ts | 5 ++- .../team-management-architecture.test.ts | 3 +- 3 files changed, 25 insertions(+), 18 deletions(-) diff --git a/tests/contract/focus-command/focus-command-architecture.test.ts b/tests/contract/focus-command/focus-command-architecture.test.ts index d6567156..56b047ba 100644 --- a/tests/contract/focus-command/focus-command-architecture.test.ts +++ b/tests/contract/focus-command/focus-command-architecture.test.ts @@ -3,25 +3,29 @@ import { describe, expect, it } from 'vitest'; const source = (path: string) => readFileSync(path, 'utf8'); -describe('Focus and Command content architecture', () => { - it('keeps Focus static and Command live', () => { +describe('Agent Lab content architecture', () => { + it('keeps legacy Focus and Command URLs as static compatibility redirects', () => { for (const path of ['src/pages/app/focus/index.astro', 'src/pages/app/focus/questions.astro', 'src/pages/app/focus/proposals/index.astro', 'src/pages/app/focus/proposals/[proposalId].astro', 'src/pages/app/focus/decisions.astro']) { const page = source(path); expect(page, path).not.toMatch(/setInterval|setTimeout|client:load|pollInterval|EventSource/u); - expect(page, path).toContain('currentPath="/app/focus"'); + expect(page, path).toContain("Astro.redirect(`/app/work/"); + expect(page, path).toContain(', 308)'); } const command = source('src/pages/app/command/index.astro'); - expect(command).toContain('LiveAgentActivityGantt'); - expect(command).toContain('@treeseed/ui/components/react/OperationsMonitor'); + expect(command).toContain('Astro.redirect(`/app/work/direction'); + expect(command).toContain(', 308)'); + const lab = source('src/pages/app/work/index.astro'); + expect(lab).toContain('@treeseed/ui/components/react/OperationsMonitor'); + expect(lab).toContain('client:load'); }); - it('preserves shell ownership and highlights Command on operational subpages', () => { + it('preserves shell ownership and highlights Agent Lab on operational subpages', () => { const layout = source('src/layouts/AppLayout.astro'); - expect(layout).toContain("{ label: 'Command', href: '/app/command', icon: 'capacity' }"); - expect(layout).toContain("{ label: 'Focus', href: '/app/focus', icon: 'work' }"); + expect(layout).toContain("{ label: 'Agent Lab', href: '/app/work', icon: 'capacity' }"); expect(layout).not.toContain("{ label: 'Capacity'"); - expect(layout).not.toContain("{ label: 'Work'"); - for (const path of ['src/pages/app/work/index.astro', 'src/pages/app/work/[runId].astro', 'src/pages/app/capacity/index.astro']) expect(source(path), path).toContain('currentPath="/app/command"'); + expect(layout).not.toContain("{ label: 'Command'"); + expect(layout).not.toContain("{ label: 'Focus'"); + for (const path of ['src/pages/app/work/index.astro', 'src/pages/app/work/[runId].astro']) expect(source(path), path).toContain('currentPath="/app/work"'); }); it('keeps Agent Studio inspection-only and operations bounded to existing routes', () => { @@ -29,13 +33,12 @@ describe('Focus and Command content architecture', () => { expect(studio).toContain('Inspection only'); expect(studio).not.toMatch(/method="post"|method="POST"|data-ts-method/u); const assignment = source('src/pages/app/command/assignments/[assignmentId].astro'); - expect(assignment).toContain('/cancel'); - expect(assignment).toContain('/requeue'); - expect(assignment).toContain('data-ts-confirm'); - expect(assignment).toContain('canManage && (cancelEligible || requeueEligible)'); + expect(assignment).toContain("query.append('inspect', `assignment~${encoded}`)"); + expect(assignment).toContain('Astro.redirect(`/app/work/direction?'); for (const path of ['src/pages/app/work/index.astro', 'src/pages/app/work/[runId].astro']) expect(source(path), path).toContain('const canManage = Boolean'); - expect(source('src/pages/app/focus/questions.astro')).toContain('canSteward &&'); - expect(source('src/pages/app/focus/proposals/[proposalId].astro')).toContain('canSteward ? { diff --git a/tests/contract/package/admin-package.test.ts b/tests/contract/package/admin-package.test.ts index 813729cc..21c13bd3 100644 --- a/tests/contract/package/admin-package.test.ts +++ b/tests/contract/package/admin-package.test.ts @@ -164,7 +164,7 @@ describe('@treeseed/admin identity and team surface', () => { it('keeps navigation focused on active-team work and identity management', () => { const appLayout = readFileSync('src/layouts/AppLayout.astro', 'utf8'); const publicLayout = readFileSync('src/layouts/PublicLayout.astro', 'utf8'); - for (const target of ['/app/', '/app/account', '/app/teams', '/app/teams/new', '/app/services', '/app/projects', '/app/command', '/app/focus', '/app/knowledge', '/knowledge/market/', '/status/']) { + for (const target of ['/app/', '/app/account', '/app/teams', '/app/teams/new', '/app/services', '/app/projects', '/app/work', '/app/knowledge', '/knowledge/market/', '/status/']) { expect(appLayout).toContain(target); } for (const target of ['/market', '/cart', '/seller']) { @@ -181,6 +181,9 @@ describe('@treeseed/admin identity and team surface', () => { } expect(appLayout).not.toContain("{ label: 'Capacity'"); expect(appLayout).not.toContain("{ label: 'Work'"); + expect(appLayout).not.toContain("{ label: 'Command'"); + expect(appLayout).not.toContain("{ label: 'Focus'"); + expect(appLayout).toContain("{ label: 'Agent Lab'"); expect(appLayout).not.toContain("{ label: 'Teams'"); expect(appLayout).toContain(' { '/app/projects', '/app/command', '/app/focus', + '/app/work', '/app/services', '/app/capacity', '/app/knowledge', @@ -61,7 +62,7 @@ describe('team management architecture audit', () => { it('keeps overview, settings, membership, consent, and lifecycle responsibilities complete', () => { const overview = source('src/pages/app/teams/[teamId]/index.astro'); - for (const label of ['Members', 'Pending invitations', 'Projects', 'Services', 'Capacity and allocation', 'Knowledge', 'Catalog and billing', 'Project content activity', 'Recent team audit activity', 'Command', 'Focus']) { + for (const label of ['Members', 'Pending invitations', 'Projects', 'Services', 'Capacity and allocation', 'Knowledge', 'Catalog and billing', 'Project content activity', 'Recent team audit activity', 'Agent Lab']) { expect(overview, label).toContain(label); } expect(overview).toContain("import ProjectActivityChart from '@treeseed/ui/components/react/ProjectActivityChart'"); From 87c0545b3fbba0e5a5620ba84a8c38a8d6c47cd4 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Thu, 6 Aug 2026 04:54:56 -0400 Subject: [PATCH 072/315] build(build): integrate staging and enforce island-owned realtime Intent: - Save hint: integrate staging and enforce island-owned realtime requests Changes: - Updates 3 files across build: 2, ui: 1. - Touches package-lock.json, package.json, src/layouts/AppLayout.astro. - Plans package version/tag 0.12.59-dev.treedx-perf.20260805T075847Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#cedde608dabb8674759a013c0a5c7a6b0b681b43 -> github:treeseed-ai/sdk#01097ec3207b271f21ba5b4f3132827bee72f686 - dependencies.@treeseed/ui: github:treeseed-ai/ui#c58d82082ea45c882aab2004050fe803d8d09d15 -> github:treeseed-ai/ui#1031ebed92d59e451a2a09ffae644a917cdb68ca - dependencies.@treeseed/core: github:treeseed-ai/core#77dbd363a4686d64db898e4300858b76c324feef -> github:treeseed-ai/core#107618160383c9da5a20d3c4026e8201e10f41ea --- package-lock.json | 16 ++++++++-------- package.json | 6 +++--- src/layouts/AppLayout.astro | 35 +++-------------------------------- 3 files changed, 14 insertions(+), 43 deletions(-) diff --git a/package-lock.json b/package-lock.json index b5b4ff70..d57474db 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,9 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#77dbd363a4686d64db898e4300858b76c324feef", - "@treeseed/sdk": "github:treeseed-ai/sdk#cedde608dabb8674759a013c0a5c7a6b0b681b43", - "@treeseed/ui": "github:treeseed-ai/ui#c58d82082ea45c882aab2004050fe803d8d09d15", + "@treeseed/core": "github:treeseed-ai/core#107618160383c9da5a20d3c4026e8201e10f41ea", + "@treeseed/sdk": "github:treeseed-ai/sdk#01097ec3207b271f21ba5b4f3132827bee72f686", + "@treeseed/ui": "github:treeseed-ai/ui#1031ebed92d59e451a2a09ffae644a917cdb68ca", "react": "^19.2.5", "react-dom": "^19.2.6" }, @@ -7463,7 +7463,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.treedx-perf.20260805T075816Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#77dbd363a4686d64db898e4300858b76c324feef", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#107618160383c9da5a20d3c4026e8201e10f41ea", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7474,8 +7474,8 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#cedde608dabb8674759a013c0a5c7a6b0b681b43", - "@treeseed/ui": "github:treeseed-ai/ui#c58d82082ea45c882aab2004050fe803d8d09d15", + "@treeseed/sdk": "github:treeseed-ai/sdk#01097ec3207b271f21ba5b4f3132827bee72f686", + "@treeseed/ui": "github:treeseed-ai/ui#1031ebed92d59e451a2a09ffae644a917cdb68ca", "astro": "^5.6.1", "esbuild": "^0.28.0", "katex": "^0.16.22", @@ -9479,7 +9479,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.treedx-perf.20260805T073639Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#cedde608dabb8674759a013c0a5c7a6b0b681b43", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#01097ec3207b271f21ba5b4f3132827bee72f686", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", @@ -10184,7 +10184,7 @@ }, "node_modules/@treeseed/ui": { "version": "0.12.18-dev.treedx-perf.20260806T042250Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#c58d82082ea45c882aab2004050fe803d8d09d15", + "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#1031ebed92d59e451a2a09ffae644a917cdb68ca", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", diff --git a/package.json b/package.json index 8b974959..3dec2cde 100644 --- a/package.json +++ b/package.json @@ -49,9 +49,9 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#77dbd363a4686d64db898e4300858b76c324feef", - "@treeseed/sdk": "github:treeseed-ai/sdk#cedde608dabb8674759a013c0a5c7a6b0b681b43", - "@treeseed/ui": "github:treeseed-ai/ui#c58d82082ea45c882aab2004050fe803d8d09d15", + "@treeseed/core": "github:treeseed-ai/core#107618160383c9da5a20d3c4026e8201e10f41ea", + "@treeseed/sdk": "github:treeseed-ai/sdk#01097ec3207b271f21ba5b4f3132827bee72f686", + "@treeseed/ui": "github:treeseed-ai/ui#1031ebed92d59e451a2a09ffae644a917cdb68ca", "react": "^19.2.5", "react-dom": "^19.2.6" }, diff --git a/src/layouts/AppLayout.astro b/src/layouts/AppLayout.astro index 7dad2791..b768aa86 100644 --- a/src/layouts/AppLayout.astro +++ b/src/layouts/AppLayout.astro @@ -10,6 +10,7 @@ import '@treeseed/ui/styles/account/forms.css'; import '@treeseed/ui/styles/auth.css'; import ProductShell from '@treeseed/ui/components/astro/shell/layout/ProductShell.astro'; import ShellIcon from '@treeseed/ui/components/astro/shell/navigation/ShellIcon.astro'; +import { AppearancePersistenceIsland } from '@treeseed/ui/components/react/progressive'; import { resolveAuthenticatedThemePreference } from '../lib/auth/accounts/appearance'; import { compileGuidedThemePalette } from '@treeseed/ui/theme'; import { SITE_SLOGAN } from '@treeseed/ui/site-brand'; @@ -152,6 +153,8 @@ const feedbackContext = principal ? { + + - - From d21e74432f2189fbaa863d6e22ab0be6bbb89997 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Thu, 6 Aug 2026 05:20:39 -0400 Subject: [PATCH 073/315] build(build): repair exact-ref standalone lockfiles after atomic Intent: - Save hint: repair exact-ref standalone lockfiles after atomic publication Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.treedx-perf.20260805T075847Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/core: github:treeseed-ai/core#107618160383c9da5a20d3c4026e8201e10f41ea -> github:treeseed-ai/core#9473d0e348057d80acd3d56e4637f94a8f0fa24a --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index d57474db..656c1049 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#107618160383c9da5a20d3c4026e8201e10f41ea", + "@treeseed/core": "github:treeseed-ai/core#9473d0e348057d80acd3d56e4637f94a8f0fa24a", "@treeseed/sdk": "github:treeseed-ai/sdk#01097ec3207b271f21ba5b4f3132827bee72f686", "@treeseed/ui": "github:treeseed-ai/ui#1031ebed92d59e451a2a09ffae644a917cdb68ca", "react": "^19.2.5", @@ -7463,7 +7463,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.treedx-perf.20260805T075816Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#107618160383c9da5a20d3c4026e8201e10f41ea", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#9473d0e348057d80acd3d56e4637f94a8f0fa24a", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", diff --git a/package.json b/package.json index 3dec2cde..d306ca4e 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#107618160383c9da5a20d3c4026e8201e10f41ea", + "@treeseed/core": "github:treeseed-ai/core#9473d0e348057d80acd3d56e4637f94a8f0fa24a", "@treeseed/sdk": "github:treeseed-ai/sdk#01097ec3207b271f21ba5b4f3132827bee72f686", "@treeseed/ui": "github:treeseed-ai/ui#1031ebed92d59e451a2a09ffae644a917cdb68ca", "react": "^19.2.5", From 38f6e5e844c679b25ebe7832cbd5a157f9c56814 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Thu, 6 Aug 2026 05:33:21 -0400 Subject: [PATCH 074/315] build(build): complete npm-authoritative downstream lock repair Intent: - Save hint: complete npm-authoritative downstream lock repair Changes: - Updates 1 file across build: 1. - Touches package-lock.json. - Plans package version/tag 0.12.59-dev.treedx-perf.20260805T075847Z for @treeseed/admin. --- package-lock.json | 151 ++++++++-------------------------------------- 1 file changed, 25 insertions(+), 126 deletions(-) diff --git a/package-lock.json b/package-lock.json index 656c1049..51ce9d91 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6345,9 +6345,9 @@ } }, "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.27", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", - "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", "license": "MIT" }, "node_modules/@rollup/pluginutils": { @@ -7464,6 +7464,7 @@ "node_modules/@treeseed/core": { "version": "0.12.60-dev.treedx-perf.20260805T075816Z", "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#9473d0e348057d80acd3d56e4637f94a8f0fa24a", + "integrity": "sha512-dYaNPrjHVCBuw3QWOIfiKNrRs5s1giHiQ7A6Y53taqumLKuOM3/2GFo4FIsJ21+N57eV6IKe6D2/ZUtVhSjQVg==", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -9480,6 +9481,7 @@ "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.treedx-perf.20260805T073639Z", "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#01097ec3207b271f21ba5b4f3132827bee72f686", + "integrity": "sha512-/jhzubvcWsgVd5FIVEkP0MgRmPPMzHnhlW9GCNuiUJV5K0UM0Co4JwQk0TPXeiBbZxQKRIXJnI/sZi7dxE/MJQ==", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", @@ -10185,6 +10187,7 @@ "node_modules/@treeseed/ui": { "version": "0.12.18-dev.treedx-perf.20260806T042250Z", "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#1031ebed92d59e451a2a09ffae644a917cdb68ca", + "integrity": "sha512-NeVNxtrackHulCaN901JmQZtaAm/SFZyGE/wSORN+PdUFxD6pXVjhsAtH6WEKLF2BER79yNpm6P5uU54mfOgeQ==", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", @@ -15666,10 +15669,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", - "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", - "dev": true, + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz", + "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==", "funding": [ { "type": "github", @@ -18245,9 +18247,9 @@ "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.52", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.52.tgz", - "integrity": "sha512-MRlTqhAfoMx/4mhEbPo3Hi02g9LJZaJkka69V6h67Cb1gjrAG0jsTE4CZX1eptNx+VCAwJmfpnDIF4P0Nh1A7A==", + "version": "2.0.53", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.53.tgz", + "integrity": "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==", "license": "MIT", "engines": { "node": ">=18" @@ -18875,9 +18877,9 @@ } }, "node_modules/postcss": { - "version": "8.5.25", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.25.tgz", - "integrity": "sha512-DTPx3RWSSnWyzLxQnlH0rJP+EW5ekl16ZU4/psbIhA0e53kJfdgaN5vKM+xP7yJtXVu+nfdVFmlgFDEKAe4Pyw==", + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", "funding": [ { "type": "opencollective", @@ -18894,7 +18896,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.16", + "nanoid": "^3.3.17", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -19928,9 +19930,9 @@ } }, "node_modules/repomix/node_modules/readdirp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", - "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz", + "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==", "license": "MIT", "engines": { "node": ">= 20.19.0" @@ -21185,9 +21187,9 @@ "license": "0BSD" }, "node_modules/tsx": { - "version": "4.23.8", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.8.tgz", - "integrity": "sha512-8W675THjbzfFmLOQzjDBIBna+WjqMGIxmSZ1mMc1+o9qoVsEuAgQu5j5ueLhau8inOkDu9OslVg0FmfBs1RIHw==", + "version": "4.23.9", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.9.tgz", + "integrity": "sha512-6q8uTORRGauQVjqMQnKUucLFoeXZAfw6zKvG35GLbdKWbLdeOtZ3H4mhyA5mxuUd2o2cRTskhj59nLLQseUvUw==", "license": "MIT", "dependencies": { "esbuild": "~0.28.0" @@ -21670,9 +21672,9 @@ } }, "node_modules/unstorage/node_modules/readdirp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", - "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz", + "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==", "license": "MIT", "engines": { "node": ">= 20.19.0" @@ -23200,109 +23202,6 @@ "type": "github", "url": "https://github.com/sponsors/wooorm" } - }, - "node_modules/@astrojs/cloudflare": { - "version": "12.6.13", - "resolved": "https://registry.npmjs.org/@astrojs/cloudflare/-/cloudflare-12.6.13.tgz", - "integrity": "sha512-oKaCyiovyQr183r9U93787Ju1zwk+rRMgPnLTwCLckHmOUK7sltA1Gp4LSGt8oNMgqQS6jR7uRdfQ/NPul37QA==", - "license": "MIT", - "dependencies": { - "@astrojs/internal-helpers": "0.7.6", - "@astrojs/underscore-redirects": "1.0.0", - "@cloudflare/workers-types": "^4.20260116.0", - "tinyglobby": "^0.2.15", - "vite": "^6.4.1", - "wrangler": "4.59.2" - }, - "peerDependencies": { - "astro": "^5.7.0" - } - }, - "node_modules/@astrojs/mdx": { - "version": "4.3.14", - "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-4.3.14.tgz", - "integrity": "sha512-FBrqJQORVm+rkRa2TS5CjU9PBA6hkhrwLVBSS9A77gN2+iehvjq1w6yya/d0YKC7osiVorKkr3Qd9wNbl0ZkGA==", - "license": "MIT", - "dependencies": { - "@astrojs/markdown-remark": "6.3.11", - "@mdx-js/mdx": "^3.1.1", - "acorn": "^8.15.0", - "es-module-lexer": "^1.7.0", - "estree-util-visit": "^2.0.0", - "hast-util-to-html": "^9.0.5", - "piccolore": "^0.1.3", - "rehype-raw": "^7.0.0", - "remark-gfm": "^4.0.1", - "remark-smartypants": "^3.0.2", - "source-map": "^0.7.6", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.3" - }, - "engines": { - "node": "18.20.8 || ^20.3.0 || >=22.0.0" - }, - "peerDependencies": { - "astro": "^5.0.0" - } - }, - "node_modules/@vitejs/plugin-react": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", - "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.28.0", - "@babel/plugin-transform-react-jsx-self": "^7.27.1", - "@babel/plugin-transform-react-jsx-source": "^7.27.1", - "@rolldown/pluginutils": "1.0.0-beta.27", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.17.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" - } - }, - "node_modules/@astrojs/starlight": { - "version": "0.37.6", - "resolved": "https://registry.npmjs.org/@astrojs/starlight/-/starlight-0.37.6.tgz", - "integrity": "sha512-wQrKwH431q+8FsLBnNQeG+R36TMtEGxTQ2AuiVpcx9APcazvL3n7wVW8mMmYyxX0POjTnxlcWPkdMGR3Yj1L+w==", - "license": "MIT", - "dependencies": { - "@astrojs/markdown-remark": "^6.3.1", - "@astrojs/mdx": "^4.2.3", - "@astrojs/sitemap": "^3.3.0", - "@pagefind/default-ui": "^1.3.0", - "@types/hast": "^3.0.4", - "@types/js-yaml": "^4.0.9", - "@types/mdast": "^4.0.4", - "astro-expressive-code": "^0.41.1", - "bcp-47": "^2.1.0", - "hast-util-from-html": "^2.0.1", - "hast-util-select": "^6.0.2", - "hast-util-to-string": "^3.0.0", - "hastscript": "^9.0.0", - "i18next": "^23.11.5", - "js-yaml": "^4.1.0", - "klona": "^2.0.6", - "magic-string": "^0.30.17", - "mdast-util-directive": "^3.0.0", - "mdast-util-to-markdown": "^2.1.0", - "mdast-util-to-string": "^4.0.0", - "pagefind": "^1.3.0", - "rehype": "^13.0.1", - "rehype-format": "^5.0.0", - "remark-directive": "^3.0.0", - "ultrahtml": "^1.6.0", - "unified": "^11.0.5", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.2" - }, - "peerDependencies": { - "astro": "^5.5.0" - } } } } From 6c4c3c159c8baa9490c5fb48258ac716ad020bc7 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Thu, 6 Aug 2026 05:59:19 -0400 Subject: [PATCH 075/315] build(build): sync package dependency references Changes: - Updates 4 files across build: 2, config: 1, ui: 1. - Touches guarantees/agent/discussion/use-non-overlapping-discussion-dock.guarantee.yaml, package-lock.json, package.json, src/layouts/AppLayout.astro. - Plans package version/tag 0.12.59-dev.staging.20260804T171053Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/ui: github:treeseed-ai/ui#a54379ece03509225fc0bca226fbb191038b98da -> github:treeseed-ai/ui#29ab8354761e850f058f5b4a6a67f485dffe188b - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#db7f2383023b337a4586dae62c12f130039b1d53 -> github:treeseed-ai/sdk#b3552b7349c933e709c50a0ed5495379c6acb0a3 - dependencies.@treeseed/core: github:treeseed-ai/core#d8b6bf8509625ce2aa59939aa1710b6cacea5e33 -> github:treeseed-ai/core#8e544f71802cd38fd89fac5eae6d8822ee2ba89d --- ...overlapping-discussion-dock.guarantee.yaml | 21 +++++++++++++++++++ package-lock.json | 16 +++++++------- package.json | 6 +++--- src/layouts/AppLayout.astro | 6 ++++++ 4 files changed, 38 insertions(+), 11 deletions(-) create mode 100644 guarantees/agent/discussion/use-non-overlapping-discussion-dock.guarantee.yaml diff --git a/guarantees/agent/discussion/use-non-overlapping-discussion-dock.guarantee.yaml b/guarantees/agent/discussion/use-non-overlapping-discussion-dock.guarantee.yaml new file mode 100644 index 00000000..fe0347c8 --- /dev/null +++ b/guarantees/agent/discussion/use-non-overlapping-discussion-dock.guarantee.yaml @@ -0,0 +1,21 @@ +schemaVersion: treeseed.guarantee/v1 +id: guarantee.agent.discussion.use-non-overlapping-discussion-dock.749 +journeyIndex: 749 +type: agent +subtype: discussion +journey: Use the non-overlapping Discussion dock +ownerPackage: "@treeseed/admin" +surface: admin-ui +summary: Search and continue TreeDX Discussions, edit Markdown, reference files, and observe assignment resource traces without covering page content. +status: planned +dependencies: { journeys: [744], guarantees: [guarantee.agent.discussion.persist-discussion-only-in-treedx.744] } +actors: { allowed: [authenticated_user, team_owner], forbidden: [anonymous_user] } +devices: { required: [desktop_chromium], optional: [mobile_chromium] } +gates: [future] +preconditions: { fixtures: [integrated_treeseed_project], notes: [] } +api: { required: true, verifierRefs: [] } +content: { required: true, verifierRefs: [] } +audit: { required: false, verifierRefs: [] } +negativeCases: [] +evidence: { required: [guarantee_report, scene_screenshots] } +notes: ["Activate after the stable Agent Lab Discussion scene produces repeatable evidence."] diff --git a/package-lock.json b/package-lock.json index 8316e257..b5b0688f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,9 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#d8b6bf8509625ce2aa59939aa1710b6cacea5e33", - "@treeseed/sdk": "github:treeseed-ai/sdk#db7f2383023b337a4586dae62c12f130039b1d53", - "@treeseed/ui": "github:treeseed-ai/ui#a54379ece03509225fc0bca226fbb191038b98da", + "@treeseed/core": "github:treeseed-ai/core#8e544f71802cd38fd89fac5eae6d8822ee2ba89d", + "@treeseed/sdk": "github:treeseed-ai/sdk#b3552b7349c933e709c50a0ed5495379c6acb0a3", + "@treeseed/ui": "github:treeseed-ai/ui#29ab8354761e850f058f5b4a6a67f485dffe188b", "react": "^19.2.5", "react-dom": "^19.2.6" }, @@ -6932,7 +6932,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.staging.20260804T171000Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#d8b6bf8509625ce2aa59939aa1710b6cacea5e33", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#8e544f71802cd38fd89fac5eae6d8822ee2ba89d", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6943,8 +6943,8 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#db7f2383023b337a4586dae62c12f130039b1d53", - "@treeseed/ui": "github:treeseed-ai/ui#a54379ece03509225fc0bca226fbb191038b98da", + "@treeseed/sdk": "github:treeseed-ai/sdk#b3552b7349c933e709c50a0ed5495379c6acb0a3", + "@treeseed/ui": "github:treeseed-ai/ui#29ab8354761e850f058f5b4a6a67f485dffe188b", "astro": "^5.6.1", "esbuild": "^0.28.0", "katex": "^0.16.22", @@ -8948,7 +8948,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.staging.20260804T170912Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#db7f2383023b337a4586dae62c12f130039b1d53", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#b3552b7349c933e709c50a0ed5495379c6acb0a3", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", @@ -9645,7 +9645,7 @@ }, "node_modules/@treeseed/ui": { "version": "0.12.18-dev.staging.20260804T170811Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#a54379ece03509225fc0bca226fbb191038b98da", + "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#29ab8354761e850f058f5b4a6a67f485dffe188b", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", diff --git a/package.json b/package.json index 4b12a507..1fc33d40 100644 --- a/package.json +++ b/package.json @@ -49,9 +49,9 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#d8b6bf8509625ce2aa59939aa1710b6cacea5e33", - "@treeseed/sdk": "github:treeseed-ai/sdk#db7f2383023b337a4586dae62c12f130039b1d53", - "@treeseed/ui": "github:treeseed-ai/ui#a54379ece03509225fc0bca226fbb191038b98da", + "@treeseed/core": "github:treeseed-ai/core#8e544f71802cd38fd89fac5eae6d8822ee2ba89d", + "@treeseed/sdk": "github:treeseed-ai/sdk#b3552b7349c933e709c50a0ed5495379c6acb0a3", + "@treeseed/ui": "github:treeseed-ai/ui#29ab8354761e850f058f5b4a6a67f485dffe188b", "react": "^19.2.5", "react-dom": "^19.2.6" }, diff --git a/src/layouts/AppLayout.astro b/src/layouts/AppLayout.astro index 7dad2791..2d023c57 100644 --- a/src/layouts/AppLayout.astro +++ b/src/layouts/AppLayout.astro @@ -88,6 +88,11 @@ const feedbackContext = principal ? { policy: 'authenticated' as const, source: 'page' as const, } : undefined; +const discussionContext = principal && activeTeam ? { + teamId: activeTeam.id, + identityLabel: principal.displayName ?? 'Current account', + endpoint: '/v1/discussions', +} : undefined; --- Date: Thu, 6 Aug 2026 06:57:50 -0400 Subject: [PATCH 076/315] build(build): checkpoint partial staging dependency integration Intent: - Save hint: checkpoint partial staging dependency integration Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.treedx-perf.20260805T075847Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#01097ec3207b271f21ba5b4f3132827bee72f686 -> github:treeseed-ai/sdk#0812424c7e9bfea6b94fdccfcd7beb4dbbeda48d - dependencies.@treeseed/ui: github:treeseed-ai/ui#1031ebed92d59e451a2a09ffae644a917cdb68ca -> github:treeseed-ai/ui#3b8d4074da247a9cc0ae11f912cc478b651a706d - dependencies.@treeseed/core: github:treeseed-ai/core#9473d0e348057d80acd3d56e4637f94a8f0fa24a -> github:treeseed-ai/core#4009f5bb356954b7a8bbeb3e7fbdf062e01b836b --- package-lock.json | 135 ++++++++++++++++++++++++++++++++++++++++------ package.json | 6 +-- 2 files changed, 121 insertions(+), 20 deletions(-) diff --git a/package-lock.json b/package-lock.json index 51ce9d91..2fd9f7eb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,9 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#9473d0e348057d80acd3d56e4637f94a8f0fa24a", - "@treeseed/sdk": "github:treeseed-ai/sdk#01097ec3207b271f21ba5b4f3132827bee72f686", - "@treeseed/ui": "github:treeseed-ai/ui#1031ebed92d59e451a2a09ffae644a917cdb68ca", + "@treeseed/core": "github:treeseed-ai/core#4009f5bb356954b7a8bbeb3e7fbdf062e01b836b", + "@treeseed/sdk": "github:treeseed-ai/sdk#0812424c7e9bfea6b94fdccfcd7beb4dbbeda48d", + "@treeseed/ui": "github:treeseed-ai/ui#3b8d4074da247a9cc0ae11f912cc478b651a706d", "react": "^19.2.5", "react-dom": "^19.2.6" }, @@ -6345,9 +6345,9 @@ } }, "node_modules/@rolldown/pluginutils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", "license": "MIT" }, "node_modules/@rollup/pluginutils": { @@ -7463,8 +7463,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.treedx-perf.20260805T075816Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#9473d0e348057d80acd3d56e4637f94a8f0fa24a", - "integrity": "sha512-dYaNPrjHVCBuw3QWOIfiKNrRs5s1giHiQ7A6Y53taqumLKuOM3/2GFo4FIsJ21+N57eV6IKe6D2/ZUtVhSjQVg==", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#4009f5bb356954b7a8bbeb3e7fbdf062e01b836b", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7475,8 +7474,8 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#01097ec3207b271f21ba5b4f3132827bee72f686", - "@treeseed/ui": "github:treeseed-ai/ui#1031ebed92d59e451a2a09ffae644a917cdb68ca", + "@treeseed/sdk": "github:treeseed-ai/sdk#0812424c7e9bfea6b94fdccfcd7beb4dbbeda48d", + "@treeseed/ui": "github:treeseed-ai/ui#3b8d4074da247a9cc0ae11f912cc478b651a706d", "astro": "^5.6.1", "esbuild": "^0.28.0", "katex": "^0.16.22", @@ -9480,8 +9479,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.treedx-perf.20260805T073639Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#01097ec3207b271f21ba5b4f3132827bee72f686", - "integrity": "sha512-/jhzubvcWsgVd5FIVEkP0MgRmPPMzHnhlW9GCNuiUJV5K0UM0Co4JwQk0TPXeiBbZxQKRIXJnI/sZi7dxE/MJQ==", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#0812424c7e9bfea6b94fdccfcd7beb4dbbeda48d", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", @@ -10186,8 +10184,7 @@ }, "node_modules/@treeseed/ui": { "version": "0.12.18-dev.treedx-perf.20260806T042250Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#1031ebed92d59e451a2a09ffae644a917cdb68ca", - "integrity": "sha512-NeVNxtrackHulCaN901JmQZtaAm/SFZyGE/wSORN+PdUFxD6pXVjhsAtH6WEKLF2BER79yNpm6P5uU54mfOgeQ==", + "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#3b8d4074da247a9cc0ae11f912cc478b651a706d", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", @@ -15669,9 +15666,10 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz", - "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", + "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", + "dev": true, "funding": [ { "type": "github", @@ -23202,6 +23200,109 @@ "type": "github", "url": "https://github.com/sponsors/wooorm" } + }, + "node_modules/@astrojs/cloudflare": { + "version": "12.6.13", + "resolved": "https://registry.npmjs.org/@astrojs/cloudflare/-/cloudflare-12.6.13.tgz", + "integrity": "sha512-oKaCyiovyQr183r9U93787Ju1zwk+rRMgPnLTwCLckHmOUK7sltA1Gp4LSGt8oNMgqQS6jR7uRdfQ/NPul37QA==", + "license": "MIT", + "dependencies": { + "@astrojs/internal-helpers": "0.7.6", + "@astrojs/underscore-redirects": "1.0.0", + "@cloudflare/workers-types": "^4.20260116.0", + "tinyglobby": "^0.2.15", + "vite": "^6.4.1", + "wrangler": "4.59.2" + }, + "peerDependencies": { + "astro": "^5.7.0" + } + }, + "node_modules/@astrojs/mdx": { + "version": "4.3.14", + "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-4.3.14.tgz", + "integrity": "sha512-FBrqJQORVm+rkRa2TS5CjU9PBA6hkhrwLVBSS9A77gN2+iehvjq1w6yya/d0YKC7osiVorKkr3Qd9wNbl0ZkGA==", + "license": "MIT", + "dependencies": { + "@astrojs/markdown-remark": "6.3.11", + "@mdx-js/mdx": "^3.1.1", + "acorn": "^8.15.0", + "es-module-lexer": "^1.7.0", + "estree-util-visit": "^2.0.0", + "hast-util-to-html": "^9.0.5", + "piccolore": "^0.1.3", + "rehype-raw": "^7.0.0", + "remark-gfm": "^4.0.1", + "remark-smartypants": "^3.0.2", + "source-map": "^0.7.6", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.3" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + }, + "peerDependencies": { + "astro": "^5.0.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/@astrojs/starlight": { + "version": "0.37.6", + "resolved": "https://registry.npmjs.org/@astrojs/starlight/-/starlight-0.37.6.tgz", + "integrity": "sha512-wQrKwH431q+8FsLBnNQeG+R36TMtEGxTQ2AuiVpcx9APcazvL3n7wVW8mMmYyxX0POjTnxlcWPkdMGR3Yj1L+w==", + "license": "MIT", + "dependencies": { + "@astrojs/markdown-remark": "^6.3.1", + "@astrojs/mdx": "^4.2.3", + "@astrojs/sitemap": "^3.3.0", + "@pagefind/default-ui": "^1.3.0", + "@types/hast": "^3.0.4", + "@types/js-yaml": "^4.0.9", + "@types/mdast": "^4.0.4", + "astro-expressive-code": "^0.41.1", + "bcp-47": "^2.1.0", + "hast-util-from-html": "^2.0.1", + "hast-util-select": "^6.0.2", + "hast-util-to-string": "^3.0.0", + "hastscript": "^9.0.0", + "i18next": "^23.11.5", + "js-yaml": "^4.1.0", + "klona": "^2.0.6", + "magic-string": "^0.30.17", + "mdast-util-directive": "^3.0.0", + "mdast-util-to-markdown": "^2.1.0", + "mdast-util-to-string": "^4.0.0", + "pagefind": "^1.3.0", + "rehype": "^13.0.1", + "rehype-format": "^5.0.0", + "remark-directive": "^3.0.0", + "ultrahtml": "^1.6.0", + "unified": "^11.0.5", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.2" + }, + "peerDependencies": { + "astro": "^5.5.0" + } } } } diff --git a/package.json b/package.json index d306ca4e..9151bc27 100644 --- a/package.json +++ b/package.json @@ -49,9 +49,9 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#9473d0e348057d80acd3d56e4637f94a8f0fa24a", - "@treeseed/sdk": "github:treeseed-ai/sdk#01097ec3207b271f21ba5b4f3132827bee72f686", - "@treeseed/ui": "github:treeseed-ai/ui#1031ebed92d59e451a2a09ffae644a917cdb68ca", + "@treeseed/core": "github:treeseed-ai/core#4009f5bb356954b7a8bbeb3e7fbdf062e01b836b", + "@treeseed/sdk": "github:treeseed-ai/sdk#0812424c7e9bfea6b94fdccfcd7beb4dbbeda48d", + "@treeseed/ui": "github:treeseed-ai/ui#3b8d4074da247a9cc0ae11f912cc478b651a706d", "react": "^19.2.5", "react-dom": "^19.2.6" }, From 0a7e6049768687528d4d826367d9f81cfc793f2c Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Thu, 6 Aug 2026 09:27:37 -0400 Subject: [PATCH 077/315] ci(docs): implement TreeDX changesets, content publication, Intent: - Save hint: implement TreeDX changesets, content publication, discussions, and segregated repository custody Changes: - Updates 13 files across docs: 8, build: 2, ci: 2, config: 1. - Touches .github/workflows/content.yml, .github/workflows/deploy-docs.yml, docs/src/content/agents/architect.mdx, docs/src/content/agents/engineer.mdx, docs/src/content/agents/releaser.mdx, docs/src/content/agents/reporter.mdx, .... - Plans package version/tag 0.12.59-dev.staging.20260804T171053Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#b3552b7349c933e709c50a0ed5495379c6acb0a3 -> github:treeseed-ai/sdk#edf192f64df6ef673368d8f564969df43af03619 - dependencies.@treeseed/ui: github:treeseed-ai/ui#29ab8354761e850f058f5b4a6a67f485dffe188b -> github:treeseed-ai/ui#2938d0959dcb2aaa97bbced633e6f75df83db90c - dependencies.@treeseed/core: github:treeseed-ai/core#8e544f71802cd38fd89fac5eae6d8822ee2ba89d -> github:treeseed-ai/core#e94e91c9e9148f645bb983163d4ecfc47a87edc8 --- .github/workflows/content.yml | 79 +++++++++++++++++++ .github/workflows/deploy-docs.yml | 3 + docs/src/content/agents/architect.mdx | 4 +- docs/src/content/agents/engineer.mdx | 4 +- docs/src/content/agents/releaser.mdx | 4 +- docs/src/content/agents/reporter.mdx | 2 +- docs/src/content/agents/researcher.mdx | 4 +- docs/src/content/agents/reviewer.mdx | 4 +- docs/src/content/agents/technical-writer.mdx | 4 +- docs/src/content/agents/tester.mdx | 4 +- .../monitor-agent-lab.guarantee.yaml | 6 +- package-lock.json | 16 ++-- package.json | 6 +- 13 files changed, 111 insertions(+), 29 deletions(-) create mode 100644 .github/workflows/content.yml diff --git a/.github/workflows/content.yml b/.github/workflows/content.yml new file mode 100644 index 00000000..4976dcf3 --- /dev/null +++ b/.github/workflows/content.yml @@ -0,0 +1,79 @@ +name: Content + +on: + push: + paths: + - 'docs/src/content/**' + pull_request: + paths: + - 'docs/src/content/**' + workflow_dispatch: + +permissions: + contents: read + +concurrency: + group: content-${{ github.repository }}-${{ github.ref }} + cancel-in-progress: false + +jobs: + publish: + runs-on: ubuntu-latest + environment: ${{ github.event_name == 'pull_request' && 'preview' || (github.ref_name == 'main' && 'production' || (github.ref_name == 'staging' && 'staging' || 'preview')) }} + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + ref: ${{ github.event.pull_request.head.sha || github.sha }} + + - name: Checkout canonical content publisher + uses: actions/checkout@v4 + with: + repository: treeseed-ai/sdk + ref: ${{ github.event_name == 'pull_request' && github.base_ref || (github.ref_name == 'main' && 'main' || 'staging') }} + path: .treeseed/content-publisher + persist-credentials: false + + - uses: actions/setup-node@v4 + with: + node-version: 24 + cache: npm + cache-dependency-path: .treeseed/content-publisher/package-lock.json + + - name: Build canonical content publisher + working-directory: .treeseed/content-publisher + run: npm ci --ignore-scripts && npm run build:dist + + - name: Validate and publish exact content commit + env: + TREESEED_TEAM_ID: treeseed + TREESEED_PROJECT_ID: admin + TREESEED_CLOUDFLARE_ACCOUNT_ID: ${{ vars.TREESEED_CLOUDFLARE_ACCOUNT_ID }} + TREESEED_CONTENT_BUCKET_NAME: ${{ vars.TREESEED_CONTENT_BUCKET_NAME }} + TREESEED_R2_ACCESS_KEY_ID: ${{ secrets.TREESEED_R2_ACCESS_KEY_ID }} + TREESEED_R2_SECRET_ACCESS_KEY: ${{ secrets.TREESEED_R2_SECRET_ACCESS_KEY }} + run: | + set -euo pipefail + SOURCE_COMMIT="$(git rev-parse HEAD)" + test "${SOURCE_COMMIT}" = "${{ github.event.pull_request.head.sha || github.sha }}" + CHANNEL=preview + if test "${GITHUB_REF_NAME}" = main; then CHANNEL=production; fi + if test "${GITHUB_REF_NAME}" = staging; then CHANNEL=staging; fi + VALIDATE=() + if test "${{ github.event_name }}" = pull_request; then VALIDATE+=(--validate-only); fi + if test "${{ github.event_name }}" != pull_request; then + node ./.treeseed/content-publisher/dist/scripts/content/publish-content.js --acceptance --team-id "${TREESEED_TEAM_ID}" > r2-acceptance-receipt.json + fi + node ./.treeseed/content-publisher/dist/scripts/content/publish-content.js \ + --root . \ + --content-path docs/src/content \ + --source-commit "${SOURCE_COMMIT}" \ + --ref "${GITHUB_HEAD_REF:-${GITHUB_REF_NAME}}" \ + --channel "${CHANNEL}" \ + "${VALIDATE[@]}" > content-publication-receipt.json + + - name: Upload publication receipt + uses: actions/upload-artifact@v4 + with: + name: content-publication-${{ github.sha }} + path: content-publication-receipt.json diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index 26845e58..62abde36 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -40,6 +40,9 @@ jobs: TREESEED_CLOUDFLARE_ACCOUNT_ID: ${{ vars.TREESEED_CLOUDFLARE_ACCOUNT_ID }} TREESEED_CLOUDFLARE_PAGES_PROJECT_NAME: ${{ vars.TREESEED_CLOUDFLARE_PAGES_PROJECT_NAME || 'treeseed-admin-docs' }} TREESEED_CONTENT_BUCKET_NAME: ${{ vars.TREESEED_CONTENT_BUCKET_NAME }} + TREESEED_TEAM_ID: treeseed + TREESEED_R2_ACCESS_KEY_ID: ${{ secrets.TREESEED_R2_ACCESS_KEY_ID }} + TREESEED_R2_SECRET_ACCESS_KEY: ${{ secrets.TREESEED_R2_SECRET_ACCESS_KEY }} TREESEED_CONTENT_BUCKET_BINDING: ${{ vars.TREESEED_CONTENT_BUCKET_BINDING }} TREESEED_PROJECT_ID: ${{ inputs.project_id || vars.TREESEED_PROJECT_ID || 'admin' }} TREESEED_WORKFLOW_ACTION: ${{ inputs.action_kind }} diff --git a/docs/src/content/agents/architect.mdx b/docs/src/content/agents/architect.mdx index d85bd55d..a46d7d18 100644 --- a/docs/src/content/agents/architect.mdx +++ b/docs/src/content/agents/architect.mdx @@ -96,7 +96,7 @@ activityProfiles: - treeseed.content.link - treeseed.content.validate - treeseed.content.commit - - treedx.write_workspace_file + - treedx.apply_workspace_changeset - treedx.commit_workspace outputs: messageTypes: [] @@ -311,7 +311,7 @@ activityProfiles: - treeseed.content.link - treeseed.content.validate - treeseed.content.commit - - treedx.write_workspace_file + - treedx.apply_workspace_changeset - treedx.commit_workspace outputs: messageTypes: [] diff --git a/docs/src/content/agents/engineer.mdx b/docs/src/content/agents/engineer.mdx index afea1b40..0f6b1d53 100644 --- a/docs/src/content/agents/engineer.mdx +++ b/docs/src/content/agents/engineer.mdx @@ -95,7 +95,7 @@ activityProfiles: - treeseed.content.link - treeseed.content.validate - treeseed.content.commit - - treedx.write_workspace_file + - treedx.apply_workspace_changeset - treedx.commit_workspace outputs: messageTypes: [] @@ -316,7 +316,7 @@ activityProfiles: - treeseed.content.link - treeseed.content.validate - treeseed.content.commit - - treedx.write_workspace_file + - treedx.apply_workspace_changeset - treedx.commit_workspace - treeseed.changed_paths - treeseed.verify diff --git a/docs/src/content/agents/releaser.mdx b/docs/src/content/agents/releaser.mdx index d032e33e..a7c2acdf 100644 --- a/docs/src/content/agents/releaser.mdx +++ b/docs/src/content/agents/releaser.mdx @@ -96,7 +96,7 @@ activityProfiles: - treeseed.content.link - treeseed.content.validate - treeseed.content.commit - - treedx.write_workspace_file + - treedx.apply_workspace_changeset - treedx.commit_workspace - treeseed.changed_paths - treeseed.verify @@ -315,7 +315,7 @@ activityProfiles: - treeseed.content.link - treeseed.content.validate - treeseed.content.commit - - treedx.write_workspace_file + - treedx.apply_workspace_changeset - treedx.commit_workspace - treeseed.changed_paths - treeseed.verify diff --git a/docs/src/content/agents/reporter.mdx b/docs/src/content/agents/reporter.mdx index b808cc5f..a9e1f3ce 100644 --- a/docs/src/content/agents/reporter.mdx +++ b/docs/src/content/agents/reporter.mdx @@ -94,7 +94,7 @@ activityProfiles: - treeseed.content.link - treeseed.content.validate - treeseed.content.commit - - treedx.write_workspace_file + - treedx.apply_workspace_changeset - treedx.commit_workspace outputs: messageTypes: [] diff --git a/docs/src/content/agents/researcher.mdx b/docs/src/content/agents/researcher.mdx index 68a8b8fa..7a6992a7 100644 --- a/docs/src/content/agents/researcher.mdx +++ b/docs/src/content/agents/researcher.mdx @@ -96,7 +96,7 @@ activityProfiles: - treeseed.content.link - treeseed.content.validate - treeseed.content.commit - - treedx.write_workspace_file + - treedx.apply_workspace_changeset - treedx.commit_workspace outputs: messageTypes: [] @@ -311,7 +311,7 @@ activityProfiles: - treeseed.content.link - treeseed.content.validate - treeseed.content.commit - - treedx.write_workspace_file + - treedx.apply_workspace_changeset - treedx.commit_workspace outputs: messageTypes: [] diff --git a/docs/src/content/agents/reviewer.mdx b/docs/src/content/agents/reviewer.mdx index 64793ba8..e6093b84 100644 --- a/docs/src/content/agents/reviewer.mdx +++ b/docs/src/content/agents/reviewer.mdx @@ -96,7 +96,7 @@ activityProfiles: - treeseed.content.link - treeseed.content.validate - treeseed.content.commit - - treedx.write_workspace_file + - treedx.apply_workspace_changeset - treedx.commit_workspace outputs: messageTypes: [] @@ -312,7 +312,7 @@ activityProfiles: - treeseed.content.link - treeseed.content.validate - treeseed.content.commit - - treedx.write_workspace_file + - treedx.apply_workspace_changeset - treedx.commit_workspace outputs: messageTypes: [] diff --git a/docs/src/content/agents/technical-writer.mdx b/docs/src/content/agents/technical-writer.mdx index 838fdc5b..c73dde65 100644 --- a/docs/src/content/agents/technical-writer.mdx +++ b/docs/src/content/agents/technical-writer.mdx @@ -95,7 +95,7 @@ activityProfiles: - treeseed.content.link - treeseed.content.validate - treeseed.content.commit - - treedx.write_workspace_file + - treedx.apply_workspace_changeset - treedx.commit_workspace outputs: messageTypes: [] @@ -310,7 +310,7 @@ activityProfiles: - treeseed.content.link - treeseed.content.validate - treeseed.content.commit - - treedx.write_workspace_file + - treedx.apply_workspace_changeset - treedx.commit_workspace outputs: messageTypes: [] diff --git a/docs/src/content/agents/tester.mdx b/docs/src/content/agents/tester.mdx index f5c97805..a24feb80 100644 --- a/docs/src/content/agents/tester.mdx +++ b/docs/src/content/agents/tester.mdx @@ -95,7 +95,7 @@ activityProfiles: - treeseed.content.link - treeseed.content.validate - treeseed.content.commit - - treedx.write_workspace_file + - treedx.apply_workspace_changeset - treedx.commit_workspace outputs: messageTypes: [] @@ -316,7 +316,7 @@ activityProfiles: - treeseed.content.link - treeseed.content.validate - treeseed.content.commit - - treedx.write_workspace_file + - treedx.apply_workspace_changeset - treedx.commit_workspace - treeseed.changed_paths - treeseed.verify diff --git a/guarantees/work/agent-lab/monitor-agent-lab.guarantee.yaml b/guarantees/work/agent-lab/monitor-agent-lab.guarantee.yaml index b8e5afb2..61d19f92 100644 --- a/guarantees/work/agent-lab/monitor-agent-lab.guarantee.yaml +++ b/guarantees/work/agent-lab/monitor-agent-lab.guarantee.yaml @@ -6,7 +6,7 @@ subtype: agent-lab journey: "Monitor the team Agent Lab" ownerPackage: "@treeseed/admin" surface: admin-ui -summary: "A team member sees one compact, responsive, revisioned monitoring header across the Agent Lab and can inspect command records through a human-first Readability view or an integrity-first Debug view that exposes missing data without live updates disturbing their interaction state." +summary: "A team member sees one compact, responsive, revisioned Agent Lab and can inspect an agent as designed intent, assignment-time state, or observed forensic activity; the anatomy workbench edits only human intent while generated identity, class linkage, repository placement, and operational status remain locked system facts." status: planned dependencies: { journeys: [738], guarantees: [guarantee.work.command.monitor-team-operations.033] } actors: { allowed: [authenticated_user, team_owner, project_lead], forbidden: [unauthorized_user] } @@ -16,6 +16,6 @@ preconditions: { fixtures: [integrated_treeseed_project], notes: ["An active tea api: { required: false, verifierRefs: [] } content: { required: false, verifierRefs: [] } audit: { required: false, verifierRefs: [] } -negativeCases: ["Snapshot mode makes no background requests.", "Closed charts do not poll.", "Stale responses and cursor corrections cannot restore removed records.", "Unreadable durable IDs are not primary interface labels.", "Polling does not reset the selected detail view or close cascading note and question overlays.", "Advanced forensic fields never displace the primary human-readable content by default."] +negativeCases: ["Snapshot mode makes no background requests.", "Closed charts do not poll.", "Stale responses and cursor corrections cannot restore removed records.", "Generated identity and runtime status cannot be edited as design intent.", "Provider supply cannot be widened from an agent definition.", "Polling does not reset the selected anatomy region or close cascading note and question overlays.", "Advanced forensic fields never displace the primary human-readable content by default."] evidence: { required: [guarantee_report] } -notes: ["Planned until light/dark, dense, idle, degraded, offline, side-by-side, narrow, dual-view overlay, and cascading discussion scenes produce repeatable evidence."] +notes: ["Planned while the accelerated anatomy design is iterated; activate after light/dark, idle/running/waiting/degraded, narrow, keyboard navigation, intent compilation, conflict, and TreeDX commit scenes produce repeatable evidence."] diff --git a/package-lock.json b/package-lock.json index b5b0688f..22aa3b3c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,9 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#8e544f71802cd38fd89fac5eae6d8822ee2ba89d", - "@treeseed/sdk": "github:treeseed-ai/sdk#b3552b7349c933e709c50a0ed5495379c6acb0a3", - "@treeseed/ui": "github:treeseed-ai/ui#29ab8354761e850f058f5b4a6a67f485dffe188b", + "@treeseed/core": "github:treeseed-ai/core#e94e91c9e9148f645bb983163d4ecfc47a87edc8", + "@treeseed/sdk": "github:treeseed-ai/sdk#edf192f64df6ef673368d8f564969df43af03619", + "@treeseed/ui": "github:treeseed-ai/ui#2938d0959dcb2aaa97bbced633e6f75df83db90c", "react": "^19.2.5", "react-dom": "^19.2.6" }, @@ -6932,7 +6932,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.staging.20260804T171000Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#8e544f71802cd38fd89fac5eae6d8822ee2ba89d", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#e94e91c9e9148f645bb983163d4ecfc47a87edc8", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6943,8 +6943,8 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#b3552b7349c933e709c50a0ed5495379c6acb0a3", - "@treeseed/ui": "github:treeseed-ai/ui#29ab8354761e850f058f5b4a6a67f485dffe188b", + "@treeseed/sdk": "github:treeseed-ai/sdk#edf192f64df6ef673368d8f564969df43af03619", + "@treeseed/ui": "github:treeseed-ai/ui#2938d0959dcb2aaa97bbced633e6f75df83db90c", "astro": "^5.6.1", "esbuild": "^0.28.0", "katex": "^0.16.22", @@ -8948,7 +8948,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.staging.20260804T170912Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#b3552b7349c933e709c50a0ed5495379c6acb0a3", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#edf192f64df6ef673368d8f564969df43af03619", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", @@ -9645,7 +9645,7 @@ }, "node_modules/@treeseed/ui": { "version": "0.12.18-dev.staging.20260804T170811Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#29ab8354761e850f058f5b4a6a67f485dffe188b", + "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#2938d0959dcb2aaa97bbced633e6f75df83db90c", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", diff --git a/package.json b/package.json index 1fc33d40..47bbdb9f 100644 --- a/package.json +++ b/package.json @@ -49,9 +49,9 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#8e544f71802cd38fd89fac5eae6d8822ee2ba89d", - "@treeseed/sdk": "github:treeseed-ai/sdk#b3552b7349c933e709c50a0ed5495379c6acb0a3", - "@treeseed/ui": "github:treeseed-ai/ui#29ab8354761e850f058f5b4a6a67f485dffe188b", + "@treeseed/core": "github:treeseed-ai/core#e94e91c9e9148f645bb983163d4ecfc47a87edc8", + "@treeseed/sdk": "github:treeseed-ai/sdk#edf192f64df6ef673368d8f564969df43af03619", + "@treeseed/ui": "github:treeseed-ai/ui#2938d0959dcb2aaa97bbced633e6f75df83db90c", "react": "^19.2.5", "react-dom": "^19.2.6" }, From 9c6e102fa7b161588b94f08d2155362a439f25fb Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Thu, 6 Aug 2026 09:56:46 -0400 Subject: [PATCH 078/315] build(ui): repair standalone CI contracts and remove legacy shared Intent: - Save hint: repair standalone CI contracts and remove legacy shared routes Changes: - Updates 17 files across ui: 13, build: 3, source: 1. - Touches package-lock.json, package.json, src/pages/app/domain-overview.astro, src/pages/app/market/index.astro, src/pages/app/work/agents.astro -> src/pages/app/work/agents/index.astro, src/pages/app/work/artifacts.astro -> src/pages/app/work/artifacts/index.astro, .... - Plans package version/tag 0.12.59-dev.staging.20260804T171053Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#edf192f64df6ef673368d8f564969df43af03619 -> github:treeseed-ai/sdk#ce62ff867f12b5398020ca77e424936f4a38a63a - dependencies.@treeseed/core: github:treeseed-ai/core#e94e91c9e9148f645bb983163d4ecfc47a87edc8 -> github:treeseed-ai/core#a6ca05d78dedd49c14eff49b03b69428d2ddf556 --- package-lock.json | 154 +++++++++++++++++- package.json | 4 +- src/pages/app/domain-overview.astro | 68 -------- src/pages/app/market/index.astro | 57 +++++++ .../work/{agents.astro => agents/index.astro} | 2 +- .../index.astro} | 2 +- .../index.astro} | 2 +- .../work/{build.astro => build/index.astro} | 4 +- .../index.astro} | 4 +- .../index.astro} | 4 +- .../work/{events.astro => events/index.astro} | 2 +- .../index.astro} | 2 +- .../app/work/{find.astro => find/index.astro} | 4 +- .../work/{inbox.astro => inbox/index.astro} | 4 +- .../{results.astro => results/index.astro} | 4 +- .../{workdays.astro => workdays/index.astro} | 10 +- src/routes.ts | 26 +-- 17 files changed, 240 insertions(+), 113 deletions(-) delete mode 100644 src/pages/app/domain-overview.astro create mode 100644 src/pages/app/market/index.astro rename src/pages/app/work/{agents.astro => agents/index.astro} (63%) rename src/pages/app/work/{artifacts.astro => artifacts/index.astro} (63%) rename src/pages/app/work/{assignments.astro => assignments/index.astro} (64%) rename src/pages/app/work/{build.astro => build/index.astro} (56%) rename src/pages/app/work/{decisions.astro => decisions/index.astro} (57%) rename src/pages/app/work/{direction.astro => direction/index.astro} (57%) rename src/pages/app/work/{events.astro => events/index.astro} (65%) rename src/pages/app/work/{executions.astro => executions/index.astro} (64%) rename src/pages/app/work/{find.astro => find/index.astro} (56%) rename src/pages/app/work/{inbox.astro => inbox/index.astro} (56%) rename src/pages/app/work/{results.astro => results/index.astro} (57%) rename src/pages/app/work/{workdays.astro => workdays/index.astro} (88%) diff --git a/package-lock.json b/package-lock.json index 22aa3b3c..7a328d18 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#e94e91c9e9148f645bb983163d4ecfc47a87edc8", - "@treeseed/sdk": "github:treeseed-ai/sdk#edf192f64df6ef673368d8f564969df43af03619", + "@treeseed/core": "github:treeseed-ai/core#a6ca05d78dedd49c14eff49b03b69428d2ddf556", + "@treeseed/sdk": "github:treeseed-ai/sdk#ce62ff867f12b5398020ca77e424936f4a38a63a", "@treeseed/ui": "github:treeseed-ai/ui#2938d0959dcb2aaa97bbced633e6f75df83db90c", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -6932,7 +6932,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.staging.20260804T171000Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#e94e91c9e9148f645bb983163d4ecfc47a87edc8", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#a6ca05d78dedd49c14eff49b03b69428d2ddf556", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6943,7 +6943,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#edf192f64df6ef673368d8f564969df43af03619", + "@treeseed/sdk": "github:treeseed-ai/sdk#ce62ff867f12b5398020ca77e424936f4a38a63a", "@treeseed/ui": "github:treeseed-ai/ui#2938d0959dcb2aaa97bbced633e6f75df83db90c", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -6964,7 +6964,7 @@ "yaml": "^2.8.1" }, "bin": { - "treeseed-workspace-bootstrap": "dist/scripts/workspace-bootstrap.js" + "treeseed-workspace-bootstrap": "./dist/scripts/treedx/workspaces/workspace-bootstrap.js" }, "engines": { "node": ">=22" @@ -8948,7 +8948,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.staging.20260804T170912Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#edf192f64df6ef673368d8f564969df43af03619", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#ce62ff867f12b5398020ca77e424936f4a38a63a", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", @@ -8962,7 +8962,8 @@ "github-slugger": "^2.0.0", "hono": "^4.8.2", "ink": "^7.0.0", - "libsodium-wrappers": "^0.7.15", + "libsodium-wrappers": "0.7.15", + "libsodium-wrappers-sumo": "0.7.15", "mdast-util-to-string": "^4.0.0", "minisearch": "^7.2.0", "octokit": "^5.0.3", @@ -8981,7 +8982,8 @@ "yaml": "^2.8.1" }, "bin": { - "treeseed-sdk-verify": "dist/verification.js" + "treeseed-sdk-verify": "./dist/scripts/verification/verify-driver.js", + "treeseed-content-publish": "./dist/scripts/content/publish-content.js" }, "engines": { "node": ">=22" @@ -21956,6 +21958,142 @@ "type": "github", "url": "https://github.com/sponsors/wooorm" } + }, + "node_modules/libsodium-wrappers-sumo": { + "version": "0.7.15", + "resolved": "https://registry.npmjs.org/libsodium-wrappers-sumo/-/libsodium-wrappers-sumo-0.7.15.tgz", + "integrity": "sha512-aSWY8wKDZh5TC7rMvEdTHoyppVq/1dTSAeAR7H6pzd6QRT3vQWcT5pGwCotLcpPEOLXX6VvqihSPkpEhYAjANA==", + "license": "ISC", + "dependencies": { + "libsodium-sumo": "^0.7.15" + } + }, + "node_modules/libsodium-sumo": { + "version": "0.7.15", + "resolved": "https://registry.npmjs.org/libsodium-sumo/-/libsodium-sumo-0.7.15.tgz", + "integrity": "sha512-5tPmqPmq8T8Nikpm1Nqj0hBHvsLFCXvdhBFV7SGOitQPZAA6jso8XoL0r4L7vmfKXr486fiQInvErHtEvizFMw==", + "license": "ISC" + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.2.tgz", + "integrity": "sha512-2uVLvLjgO7NZCWw01/FdqRwmA42J0BcjPMUCA+koFEOAb+zjqIP7SiFz/7zWPrKnVmSqr76Omq2ALyCuX4dhLw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@astrojs/cloudflare": { + "version": "12.6.13", + "resolved": "https://registry.npmjs.org/@astrojs/cloudflare/-/cloudflare-12.6.13.tgz", + "integrity": "sha512-oKaCyiovyQr183r9U93787Ju1zwk+rRMgPnLTwCLckHmOUK7sltA1Gp4LSGt8oNMgqQS6jR7uRdfQ/NPul37QA==", + "license": "MIT", + "dependencies": { + "@astrojs/internal-helpers": "0.7.6", + "@astrojs/underscore-redirects": "1.0.0", + "@cloudflare/workers-types": "^4.20260116.0", + "tinyglobby": "^0.2.15", + "vite": "^6.4.1", + "wrangler": "4.59.2" + }, + "peerDependencies": { + "astro": "^5.7.0" + } + }, + "node_modules/@astrojs/mdx": { + "version": "4.3.14", + "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-4.3.14.tgz", + "integrity": "sha512-FBrqJQORVm+rkRa2TS5CjU9PBA6hkhrwLVBSS9A77gN2+iehvjq1w6yya/d0YKC7osiVorKkr3Qd9wNbl0ZkGA==", + "license": "MIT", + "dependencies": { + "@astrojs/markdown-remark": "6.3.11", + "@mdx-js/mdx": "^3.1.1", + "acorn": "^8.15.0", + "es-module-lexer": "^1.7.0", + "estree-util-visit": "^2.0.0", + "hast-util-to-html": "^9.0.5", + "piccolore": "^0.1.3", + "rehype-raw": "^7.0.0", + "remark-gfm": "^4.0.1", + "remark-smartypants": "^3.0.2", + "source-map": "^0.7.6", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.3" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + }, + "peerDependencies": { + "astro": "^5.0.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/@astrojs/starlight": { + "version": "0.37.6", + "resolved": "https://registry.npmjs.org/@astrojs/starlight/-/starlight-0.37.6.tgz", + "integrity": "sha512-wQrKwH431q+8FsLBnNQeG+R36TMtEGxTQ2AuiVpcx9APcazvL3n7wVW8mMmYyxX0POjTnxlcWPkdMGR3Yj1L+w==", + "license": "MIT", + "dependencies": { + "@astrojs/markdown-remark": "^6.3.1", + "@astrojs/mdx": "^4.2.3", + "@astrojs/sitemap": "^3.3.0", + "@pagefind/default-ui": "^1.3.0", + "@types/hast": "^3.0.4", + "@types/js-yaml": "^4.0.9", + "@types/mdast": "^4.0.4", + "astro-expressive-code": "^0.41.1", + "bcp-47": "^2.1.0", + "hast-util-from-html": "^2.0.1", + "hast-util-select": "^6.0.2", + "hast-util-to-string": "^3.0.0", + "hastscript": "^9.0.0", + "i18next": "^23.11.5", + "js-yaml": "^4.1.0", + "klona": "^2.0.6", + "magic-string": "^0.30.17", + "mdast-util-directive": "^3.0.0", + "mdast-util-to-markdown": "^2.1.0", + "mdast-util-to-string": "^4.0.0", + "pagefind": "^1.3.0", + "rehype": "^13.0.1", + "rehype-format": "^5.0.0", + "remark-directive": "^3.0.0", + "ultrahtml": "^1.6.0", + "unified": "^11.0.5", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.2" + }, + "peerDependencies": { + "astro": "^5.5.0" + } } } } diff --git a/package.json b/package.json index 47bbdb9f..f5e72a23 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#e94e91c9e9148f645bb983163d4ecfc47a87edc8", - "@treeseed/sdk": "github:treeseed-ai/sdk#edf192f64df6ef673368d8f564969df43af03619", + "@treeseed/core": "github:treeseed-ai/core#a6ca05d78dedd49c14eff49b03b69428d2ddf556", + "@treeseed/sdk": "github:treeseed-ai/sdk#ce62ff867f12b5398020ca77e424936f4a38a63a", "@treeseed/ui": "github:treeseed-ai/ui#2938d0959dcb2aaa97bbced633e6f75df83db90c", "react": "^19.2.5", "react-dom": "^19.2.6" diff --git a/src/pages/app/domain-overview.astro b/src/pages/app/domain-overview.astro deleted file mode 100644 index ce2d6ac3..00000000 --- a/src/pages/app/domain-overview.astro +++ /dev/null @@ -1,68 +0,0 @@ ---- -import Button from '@treeseed/ui/components/astro/forms/actions/Button.astro'; -import PageHeader from '@treeseed/ui/components/astro/layout/PageHeader.astro'; -import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; -import Panel from '@treeseed/ui/components/astro/surface/Panel.astro'; -import TreeseedAppLayout from '../../layouts/AppLayout.astro'; -import { ApiClientFacade } from '../../lib/market/api-client'; -import { loadAppContext } from '../../view-models/app-access.js'; - -if (!Astro.locals.auth?.principal) { - return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); -} - -const domains = { - '/app/projects': { key: 'projects', title: 'Projects', description: 'Project workspaces and their operational state.' }, - '/app/services': { key: 'services', title: 'Services', description: 'Connected provider accounts and capability state.' }, - '/app/work': { key: 'work', title: 'Work', description: 'Team work streams and operational activity.' }, - '/app/capacity': { key: 'capacity', title: 'Capacity and allocation', description: 'Agent capacity available to the active team.' }, - '/app/knowledge': { key: 'knowledge', title: 'Knowledge', description: 'Knowledge activity and review work for the active team.' }, - '/app/market': { key: 'catalog', title: 'Catalog and billing', description: 'Published catalog and commerce activity for the active team.' }, -} as const; - -const currentPath = Astro.url.pathname.replace(/\/+$/u, '') || '/'; -const domain = domains[currentPath as keyof typeof domains] ?? domains['/app/projects']; -const context = await loadAppContext(Astro); -let summary: any = null; -let unavailable = false; -if (context.activeTeam) { - try { - summary = await new ApiClientFacade(Astro).request('GET', `/v1/teams/${encodeURIComponent(context.activeTeam.id)}/home`); - } catch { - unavailable = true; - Astro.response.status = 503; - } -} -const operational = summary?.operational?.[domain.key]; ---- - - -
- - {context.activeTeam ? : null} - - - {unavailable ? ( - -
-
- ) : !context.activeTeam ? ( - - ) : ( - -

Operational context loaded for @{context.activeTeam.name}.

-
- )} -
-
diff --git a/src/pages/app/market/index.astro b/src/pages/app/market/index.astro new file mode 100644 index 00000000..af30d97e --- /dev/null +++ b/src/pages/app/market/index.astro @@ -0,0 +1,57 @@ +--- +import Button from '@treeseed/ui/components/astro/forms/actions/Button.astro'; +import PageHeader from '@treeseed/ui/components/astro/layout/PageHeader.astro'; +import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; +import Panel from '@treeseed/ui/components/astro/surface/Panel.astro'; +import TreeseedAppLayout from '../../../layouts/AppLayout.astro'; +import { ApiClientFacade } from '../../../lib/market/api-client'; +import { loadAppContext } from '../../../view-models/app-access.js'; + +if (!Astro.locals.auth?.principal) { + return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); +} + +const context = await loadAppContext(Astro); +let summary: any = null; +let unavailable = false; +if (context.activeTeam) { + try { + summary = await new ApiClientFacade(Astro).request('GET', `/v1/teams/${encodeURIComponent(context.activeTeam.id)}/home`); + } catch { + unavailable = true; + Astro.response.status = 503; + } +} +const operational = summary?.operational?.catalog; +--- + + +
+ + {context.activeTeam ? : null} + + + {unavailable ? ( + +
+
+ ) : !context.activeTeam ? ( + + ) : ( + +

Operational context loaded for @{context.activeTeam.name}.

+
+ )} +
+
diff --git a/src/pages/app/work/agents.astro b/src/pages/app/work/agents/index.astro similarity index 63% rename from src/pages/app/work/agents.astro rename to src/pages/app/work/agents/index.astro index 3899c543..4e2d3c5a 100644 --- a/src/pages/app/work/agents.astro +++ b/src/pages/app/work/agents/index.astro @@ -1,5 +1,5 @@ --- -import AgentLabEntityPage from '../../../components/agent-lab/AgentLabEntityPage.astro'; import { loadAgentLabEntityPage } from '../../../view-models/agent-lab/entity-page.ts'; +import AgentLabEntityPage from '../../../../components/agent-lab/AgentLabEntityPage.astro'; import { loadAgentLabEntityPage } from '../../../../view-models/agent-lab/entity-page.ts'; if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); const frame = await loadAgentLabEntityPage(Astro, 'agents'); --- diff --git a/src/pages/app/work/artifacts.astro b/src/pages/app/work/artifacts/index.astro similarity index 63% rename from src/pages/app/work/artifacts.astro rename to src/pages/app/work/artifacts/index.astro index d7fd4c49..496d3ffb 100644 --- a/src/pages/app/work/artifacts.astro +++ b/src/pages/app/work/artifacts/index.astro @@ -1,5 +1,5 @@ --- -import AgentLabEntityPage from '../../../components/agent-lab/AgentLabEntityPage.astro'; import { loadAgentLabEntityPage } from '../../../view-models/agent-lab/entity-page.ts'; +import AgentLabEntityPage from '../../../../components/agent-lab/AgentLabEntityPage.astro'; import { loadAgentLabEntityPage } from '../../../../view-models/agent-lab/entity-page.ts'; if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); const frame = await loadAgentLabEntityPage(Astro, 'artifacts'); --- diff --git a/src/pages/app/work/assignments.astro b/src/pages/app/work/assignments/index.astro similarity index 64% rename from src/pages/app/work/assignments.astro rename to src/pages/app/work/assignments/index.astro index 268528d0..21b50793 100644 --- a/src/pages/app/work/assignments.astro +++ b/src/pages/app/work/assignments/index.astro @@ -1,5 +1,5 @@ --- -import AgentLabEntityPage from '../../../components/agent-lab/AgentLabEntityPage.astro'; import { loadAgentLabEntityPage } from '../../../view-models/agent-lab/entity-page.ts'; +import AgentLabEntityPage from '../../../../components/agent-lab/AgentLabEntityPage.astro'; import { loadAgentLabEntityPage } from '../../../../view-models/agent-lab/entity-page.ts'; if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); const frame = await loadAgentLabEntityPage(Astro, 'assignments'); --- diff --git a/src/pages/app/work/build.astro b/src/pages/app/work/build/index.astro similarity index 56% rename from src/pages/app/work/build.astro rename to src/pages/app/work/build/index.astro index 3573fe33..89262040 100644 --- a/src/pages/app/work/build.astro +++ b/src/pages/app/work/build/index.astro @@ -1,6 +1,6 @@ --- -import AgentLabCommandPage from '../../../components/agent-lab/AgentLabCommandPage.astro'; -import { loadAgentLabCommandPage } from '../../../view-models/agent-lab/command-page.ts'; +import AgentLabCommandPage from '../../../../components/agent-lab/AgentLabCommandPage.astro'; +import { loadAgentLabCommandPage } from '../../../../view-models/agent-lab/command-page.ts'; if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); const frame = await loadAgentLabCommandPage(Astro, 'build'); --- diff --git a/src/pages/app/work/decisions.astro b/src/pages/app/work/decisions/index.astro similarity index 57% rename from src/pages/app/work/decisions.astro rename to src/pages/app/work/decisions/index.astro index 919faaf5..f732bd79 100644 --- a/src/pages/app/work/decisions.astro +++ b/src/pages/app/work/decisions/index.astro @@ -1,6 +1,6 @@ --- -import AgentLabCommandPage from '../../../components/agent-lab/AgentLabCommandPage.astro'; -import { loadAgentLabCommandPage } from '../../../view-models/agent-lab/command-page.ts'; +import AgentLabCommandPage from '../../../../components/agent-lab/AgentLabCommandPage.astro'; +import { loadAgentLabCommandPage } from '../../../../view-models/agent-lab/command-page.ts'; if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); const frame = await loadAgentLabCommandPage(Astro, 'decisions'); --- diff --git a/src/pages/app/work/direction.astro b/src/pages/app/work/direction/index.astro similarity index 57% rename from src/pages/app/work/direction.astro rename to src/pages/app/work/direction/index.astro index f6a1abf8..fd4905bd 100644 --- a/src/pages/app/work/direction.astro +++ b/src/pages/app/work/direction/index.astro @@ -1,6 +1,6 @@ --- -import AgentLabCommandPage from '../../../components/agent-lab/AgentLabCommandPage.astro'; -import { loadAgentLabCommandPage } from '../../../view-models/agent-lab/command-page.ts'; +import AgentLabCommandPage from '../../../../components/agent-lab/AgentLabCommandPage.astro'; +import { loadAgentLabCommandPage } from '../../../../view-models/agent-lab/command-page.ts'; if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); const frame = await loadAgentLabCommandPage(Astro, 'direction'); --- diff --git a/src/pages/app/work/events.astro b/src/pages/app/work/events/index.astro similarity index 65% rename from src/pages/app/work/events.astro rename to src/pages/app/work/events/index.astro index 264355c9..eb1b9cd4 100644 --- a/src/pages/app/work/events.astro +++ b/src/pages/app/work/events/index.astro @@ -1,5 +1,5 @@ --- -import AgentLabEntityPage from '../../../components/agent-lab/AgentLabEntityPage.astro'; import { loadAgentLabEntityPage } from '../../../view-models/agent-lab/entity-page.ts'; +import AgentLabEntityPage from '../../../../components/agent-lab/AgentLabEntityPage.astro'; import { loadAgentLabEntityPage } from '../../../../view-models/agent-lab/entity-page.ts'; if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); const frame = await loadAgentLabEntityPage(Astro, 'events'); --- diff --git a/src/pages/app/work/executions.astro b/src/pages/app/work/executions/index.astro similarity index 64% rename from src/pages/app/work/executions.astro rename to src/pages/app/work/executions/index.astro index 1ebec5c1..8aea19e8 100644 --- a/src/pages/app/work/executions.astro +++ b/src/pages/app/work/executions/index.astro @@ -1,5 +1,5 @@ --- -import AgentLabEntityPage from '../../../components/agent-lab/AgentLabEntityPage.astro'; import { loadAgentLabEntityPage } from '../../../view-models/agent-lab/entity-page.ts'; +import AgentLabEntityPage from '../../../../components/agent-lab/AgentLabEntityPage.astro'; import { loadAgentLabEntityPage } from '../../../../view-models/agent-lab/entity-page.ts'; if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); const frame = await loadAgentLabEntityPage(Astro, 'executions'); --- diff --git a/src/pages/app/work/find.astro b/src/pages/app/work/find/index.astro similarity index 56% rename from src/pages/app/work/find.astro rename to src/pages/app/work/find/index.astro index b64048c6..8b36c64e 100644 --- a/src/pages/app/work/find.astro +++ b/src/pages/app/work/find/index.astro @@ -1,6 +1,6 @@ --- -import AgentLabCommandPage from '../../../components/agent-lab/AgentLabCommandPage.astro'; -import { loadAgentLabCommandPage } from '../../../view-models/agent-lab/command-page.ts'; +import AgentLabCommandPage from '../../../../components/agent-lab/AgentLabCommandPage.astro'; +import { loadAgentLabCommandPage } from '../../../../view-models/agent-lab/command-page.ts'; if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); const frame = await loadAgentLabCommandPage(Astro, 'find'); --- diff --git a/src/pages/app/work/inbox.astro b/src/pages/app/work/inbox/index.astro similarity index 56% rename from src/pages/app/work/inbox.astro rename to src/pages/app/work/inbox/index.astro index e4111990..6df323f8 100644 --- a/src/pages/app/work/inbox.astro +++ b/src/pages/app/work/inbox/index.astro @@ -1,6 +1,6 @@ --- -import AgentLabCommandPage from '../../../components/agent-lab/AgentLabCommandPage.astro'; -import { loadAgentLabCommandPage } from '../../../view-models/agent-lab/command-page.ts'; +import AgentLabCommandPage from '../../../../components/agent-lab/AgentLabCommandPage.astro'; +import { loadAgentLabCommandPage } from '../../../../view-models/agent-lab/command-page.ts'; if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); const frame = await loadAgentLabCommandPage(Astro, 'inbox'); --- diff --git a/src/pages/app/work/results.astro b/src/pages/app/work/results/index.astro similarity index 57% rename from src/pages/app/work/results.astro rename to src/pages/app/work/results/index.astro index 97508c84..f8729ce6 100644 --- a/src/pages/app/work/results.astro +++ b/src/pages/app/work/results/index.astro @@ -1,6 +1,6 @@ --- -import AgentLabCommandPage from '../../../components/agent-lab/AgentLabCommandPage.astro'; -import { loadAgentLabCommandPage } from '../../../view-models/agent-lab/command-page.ts'; +import AgentLabCommandPage from '../../../../components/agent-lab/AgentLabCommandPage.astro'; +import { loadAgentLabCommandPage } from '../../../../view-models/agent-lab/command-page.ts'; if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); const frame = await loadAgentLabCommandPage(Astro, 'results'); --- diff --git a/src/pages/app/work/workdays.astro b/src/pages/app/work/workdays/index.astro similarity index 88% rename from src/pages/app/work/workdays.astro rename to src/pages/app/work/workdays/index.astro index 299c1d1b..b1b93ae1 100644 --- a/src/pages/app/work/workdays.astro +++ b/src/pages/app/work/workdays/index.astro @@ -3,11 +3,11 @@ import Button from '@treeseed/ui/components/astro/forms/actions/Button.astro'; import EntityCollection from '@treeseed/ui/components/astro/data/entities/EntityCollection.astro'; import OperationsDisplayContainer from '@treeseed/ui/components/astro/operating/navigation/OperationsDisplayContainer.astro'; import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; -import AgentLabChrome from '../../../components/agent-lab/AgentLabChrome.astro'; -import TreeseedAppLayout from '../../../layouts/AppLayout.astro'; -import { ensureCsrfToken } from '../../../lib/auth/support/csrf.ts'; -import { ApiClientFacade } from '../../../lib/market/api-client.ts'; -import { loadAgentLabEntityPage } from '../../../view-models/agent-lab/entity-page.ts'; +import AgentLabChrome from '../../../../components/agent-lab/AgentLabChrome.astro'; +import TreeseedAppLayout from '../../../../layouts/AppLayout.astro'; +import { ensureCsrfToken } from '../../../../lib/auth/support/csrf.ts'; +import { ApiClientFacade } from '../../../../lib/market/api-client.ts'; +import { loadAgentLabEntityPage } from '../../../../view-models/agent-lab/entity-page.ts'; if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); const frame = await loadAgentLabEntityPage(Astro, 'workdays'); diff --git a/src/routes.ts b/src/routes.ts index c00de79f..40e0781c 100644 --- a/src/routes.ts +++ b/src/routes.ts @@ -73,22 +73,22 @@ export const ADMIN_ROUTES: readonly SiteRouteContribution[] = validateRouteCapab adminRoute('/app/projects/[projectId]/workflows', 'pages/app/projects/[projectId]/workflows.astro', { id: 'admin.projects.workflows', description: 'Project repository binding, remote workflow operation, secret, and variable administration.', guarantees: [], knowledgePageIds: ['services.workflow-execution', 'services.workflow-configuration'] }), adminRoute('/app/capacity', 'pages/app/capacity/index.astro', { id: 'admin.domain.capacity', description: 'Provider availability, reservations, usage, routing, and ledger.', guarantees: ['guarantee.work.command.monitor-team-operations.033'] }), adminRoute('/app/work', 'pages/app/work/index.astro', { id: 'admin.agent-lab.monitor', description: 'Team Agent Lab monitoring foundation and workday control.', guarantees: ['guarantee.work.command.monitor-team-operations.033', 'guarantee.work.agent-lab.monitor-agent-lab.035'] }), - adminRoute('/app/work/inbox', 'pages/app/work/inbox.astro', { id: 'admin.agent-lab.inbox', description: 'Agent Lab proposals and operational errors.' }), - adminRoute('/app/work/decisions', 'pages/app/work/decisions.astro', { id: 'admin.agent-lab.decisions', description: 'Agent Lab proposals, decisions, assignments, and outcomes.' }), - adminRoute('/app/work/build', 'pages/app/work/build.astro', { id: 'admin.agent-lab.build', description: 'Agent design and simulation entry surface.' }), - adminRoute('/app/work/direction', 'pages/app/work/direction.astro', { id: 'admin.agent-lab.direction', description: 'Assignment and execution direction timeline.' }), - adminRoute('/app/work/results', 'pages/app/work/results.astro', { id: 'admin.agent-lab.results', description: 'Agent artifacts, summaries, and reports.' }), - adminRoute('/app/work/find', 'pages/app/work/find.astro', { id: 'admin.agent-lab.find', description: 'Cross-entity Agent Lab search.' }), - adminRoute('/app/work/agents', 'pages/app/work/agents.astro', { id: 'admin.agent-lab.agents', description: 'Configured and active Agent Lab agent summaries.', guarantees: ['guarantee.work.agent-lab.monitor-agent-lab.035'] }), - adminRoute('/app/work/workdays', 'pages/app/work/workdays.astro', { id: 'admin.agent-lab.workdays', description: 'Operating-day workday summaries.', guarantees: ['guarantee.work.agent-lab.monitor-agent-lab.035'] }), - adminRoute('/app/work/events', 'pages/app/work/events.astro', { id: 'admin.agent-lab.events', description: 'Durable Agent Lab system-event summaries.', guarantees: ['guarantee.work.agent-lab.monitor-agent-lab.035'] }), - adminRoute('/app/work/assignments', 'pages/app/work/assignments.astro', { id: 'admin.agent-lab.assignments', description: 'Operating-day assignment summaries.', guarantees: ['guarantee.work.agent-lab.monitor-agent-lab.035'] }), - adminRoute('/app/work/executions', 'pages/app/work/executions.astro', { id: 'admin.agent-lab.executions', description: 'Native execution-attempt summaries.', guarantees: ['guarantee.work.agent-lab.monitor-agent-lab.035'] }), - adminRoute('/app/work/artifacts', 'pages/app/work/artifacts.astro', { id: 'admin.agent-lab.artifacts', description: 'Durable Agent Lab artifact summaries.', guarantees: ['guarantee.work.agent-lab.monitor-agent-lab.035'] }), + adminRoute('/app/work/inbox', 'pages/app/work/inbox/index.astro', { id: 'admin.agent-lab.inbox', description: 'Agent Lab proposals and operational errors.' }), + adminRoute('/app/work/decisions', 'pages/app/work/decisions/index.astro', { id: 'admin.agent-lab.decisions', description: 'Agent Lab proposals, decisions, assignments, and outcomes.' }), + adminRoute('/app/work/build', 'pages/app/work/build/index.astro', { id: 'admin.agent-lab.build', description: 'Agent design and simulation entry surface.' }), + adminRoute('/app/work/direction', 'pages/app/work/direction/index.astro', { id: 'admin.agent-lab.direction', description: 'Assignment and execution direction timeline.' }), + adminRoute('/app/work/results', 'pages/app/work/results/index.astro', { id: 'admin.agent-lab.results', description: 'Agent artifacts, summaries, and reports.' }), + adminRoute('/app/work/find', 'pages/app/work/find/index.astro', { id: 'admin.agent-lab.find', description: 'Cross-entity Agent Lab search.' }), + adminRoute('/app/work/agents', 'pages/app/work/agents/index.astro', { id: 'admin.agent-lab.agents', description: 'Configured and active Agent Lab agent summaries.', guarantees: ['guarantee.work.agent-lab.monitor-agent-lab.035'] }), + adminRoute('/app/work/workdays', 'pages/app/work/workdays/index.astro', { id: 'admin.agent-lab.workdays', description: 'Operating-day workday summaries.', guarantees: ['guarantee.work.agent-lab.monitor-agent-lab.035'] }), + adminRoute('/app/work/events', 'pages/app/work/events/index.astro', { id: 'admin.agent-lab.events', description: 'Durable Agent Lab system-event summaries.', guarantees: ['guarantee.work.agent-lab.monitor-agent-lab.035'] }), + adminRoute('/app/work/assignments', 'pages/app/work/assignments/index.astro', { id: 'admin.agent-lab.assignments', description: 'Operating-day assignment summaries.', guarantees: ['guarantee.work.agent-lab.monitor-agent-lab.035'] }), + adminRoute('/app/work/executions', 'pages/app/work/executions/index.astro', { id: 'admin.agent-lab.executions', description: 'Native execution-attempt summaries.', guarantees: ['guarantee.work.agent-lab.monitor-agent-lab.035'] }), + adminRoute('/app/work/artifacts', 'pages/app/work/artifacts/index.astro', { id: 'admin.agent-lab.artifacts', description: 'Durable Agent Lab artifact summaries.', guarantees: ['guarantee.work.agent-lab.monitor-agent-lab.035'] }), adminRoute('/app/work/[runId]', 'pages/app/work/[runId].astro', { id: 'admin.work.detail', description: 'Live workday control or historical race replay.', guarantees: ['guarantee.work.command.monitor-team-operations.033', 'guarantee.work.agent-lab.monitor-agent-lab.035'] }), adminRoute('/app/knowledge', 'pages/app/knowledge/index.astro', { id: 'admin.knowledge.workbench', description: 'Active-team repository-native book authoring, review, linking, and pack workbench.', guarantees: ['guarantee.project.book.create-book.065', 'guarantee.project.book.edit-book.066', 'guarantee.project.book.delete-book.067', 'guarantee.project.book.search-books.068', 'guarantee.project.knowledge.create-book-page.069', 'guarantee.project.book.download-book.070', 'guarantee.project.knowledge.edit-book-page.071', 'guarantee.project.knowledge.delete-book-page.072', 'guarantee.project.library.download-library.073', 'guarantee.project.library.rebuild-library-index.090', 'guarantee.project.knowledge.review-backlinks.091'], knowledgePageIds: ['knowledge.authoring'] }), adminRoute('/app/knowledge/packs/[buildId]/download', 'pages/app/knowledge/packs/[buildId]/download.ts', { id: 'admin.knowledge.pack-download', description: 'Authorized no-store knowledge-pack artifact download.', responseKind: 'data', archetype: 'action', navigation: 'hidden', guarantees: ['guarantee.project.book.download-book.070', 'guarantee.project.library.download-library.073'] }), - adminRoute('/app/market', 'pages/app/domain-overview.astro', { id: 'admin.domain.market', description: 'Bounded active-team catalog and billing domain landing page.', guarantees: ['guarantee.team.team.view-team-overview.015'] }), + adminRoute('/app/market', 'pages/app/market/index.astro', { id: 'admin.domain.market', description: 'Bounded active-team catalog and billing domain landing page.', guarantees: ['guarantee.team.team.view-team-overview.015'] }), adminRoute('/auth/register', 'pages/auth/register.astro', { id: 'admin.auth.register', description: 'Credential registration with username/email availability and immutable username disclosure.', guarantees: ['guarantee.user.auth.register-user.001'] }), adminRoute('/auth/check-email', 'pages/auth/check-email.astro', { id: 'admin.auth.check-email', description: 'Hidden verification/reset check-inbox continuation.', archetype: 'message', template: 'MessageTemplate' }), adminRoute('/auth/confirm-email', 'pages/auth/confirm-email.astro', { From 17bd3838bc3b05e6f59b6f51b8e3fc0c159cbfbe Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Thu, 6 Aug 2026 10:10:28 -0400 Subject: [PATCH 079/315] build(build): complete atomic lock closure reconciliation Intent: - Save hint: complete atomic lock closure reconciliation Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.staging.20260804T171053Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#ce62ff867f12b5398020ca77e424936f4a38a63a -> github:treeseed-ai/sdk#de8d6fa197167bdd4ec743986ff2d08dc2fa1ed1 - dependencies.@treeseed/core: github:treeseed-ai/core#a6ca05d78dedd49c14eff49b03b69428d2ddf556 -> github:treeseed-ai/core#cf54b1c0312f950d291d74cee733f09e651e4ea6 --- package-lock.json | 1307 ++++++++++++++++++++++----------------------- package.json | 4 +- 2 files changed, 649 insertions(+), 662 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7a328d18..b33e916b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#a6ca05d78dedd49c14eff49b03b69428d2ddf556", - "@treeseed/sdk": "github:treeseed-ai/sdk#ce62ff867f12b5398020ca77e424936f4a38a63a", + "@treeseed/core": "github:treeseed-ai/core#cf54b1c0312f950d291d74cee733f09e651e4ea6", + "@treeseed/sdk": "github:treeseed-ai/sdk#de8d6fa197167bdd4ec743986ff2d08dc2fa1ed1", "@treeseed/ui": "github:treeseed-ai/ui#2938d0959dcb2aaa97bbced633e6f75df83db90c", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -770,15 +770,17 @@ } }, "node_modules/@astrojs/telemetry": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.3.2.tgz", - "integrity": "sha512-j8DNruA8ors99Al39RYZPJK4DC1bKkoNm93mAMuBhY9TCNC4R8n1q7ovFnJ5qhGh5Lsh7pa1gpQVpYpsJPeTHQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.3.0.tgz", + "integrity": "sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ==", "license": "MIT", "dependencies": { - "ci-info": "^4.4.0", + "ci-info": "^4.2.0", + "debug": "^4.4.0", + "dlv": "^1.1.3", "dset": "^3.1.4", - "is-docker": "^4.0.0", - "is-wsl": "^3.1.1", + "is-docker": "^3.0.0", + "is-wsl": "^3.1.0", "which-pm-runs": "^1.1.0" }, "engines": { @@ -1118,40 +1120,33 @@ } }, "node_modules/@clack/core": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/@clack/core/-/core-1.4.3.tgz", - "integrity": "sha512-/kr3UWNtdJfxZtPgDqUOmG2pvwlmcLGheex5yiZKdwbzZJxhV+HMNR9QNmyY5cGwTNV6LrR7Jtp+KjhUAP1qBQ==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@clack/core/-/core-0.5.0.tgz", + "integrity": "sha512-p3y0FIOwaYRUPRcMO7+dlmLh8PSRcrjuTndsiA0WAFbWES0mLZlrjVoBRZ9DzkPFJZG6KGkJmoEAY0ZcVWTkow==", "license": "MIT", "dependencies": { - "fast-wrap-ansi": "^0.2.0", + "picocolors": "^1.0.0", "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 20.12.0" } }, "node_modules/@clack/prompts": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-1.7.0.tgz", - "integrity": "sha512-y7/yvZ2TPAnR9+jnc00klvNNLkJiXFFrQA/hlLCcxA9a2A4zQIOimyFQ9XfwYKiGD1fb5GY8vbKIIgO8d5Tb2A==", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-0.11.0.tgz", + "integrity": "sha512-pMN5FcrEw9hUkZA4f+zLlzivQSeQf5dRGJjSUbvVYDLvpKCdQx5OaknvKzgbtXOizhP+SJJJjqEbOe55uKKfAw==", "license": "MIT", "dependencies": { - "@clack/core": "1.4.3", - "fast-string-width": "^3.0.2", - "fast-wrap-ansi": "^0.2.0", + "@clack/core": "0.5.0", + "picocolors": "^1.0.0", "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 20.12.0" } }, "node_modules/@cloudflare/kv-asset-handler": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.5.0.tgz", - "integrity": "sha512-jxQYkj8dSIzc0cD6cMMNdOc1UVjqSqu8BZdor5s8cGjW2I8BjODt/kWPVdY+u9zj3ms75Q5qaZgnxUad83+eAg==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.4.2.tgz", + "integrity": "sha512-SIOD2DxrRRwQ+jgzlXCqoEFiKOFqaPjhnNTGKXSRLvp1HiOvapLaFG2kEr9dYQTYe8rKrd9uvDUzmAITeNyaHQ==", "license": "MIT OR Apache-2.0", "engines": { - "node": ">=22.0.0" + "node": ">=18.0.0" } }, "node_modules/@cloudflare/unenv-preset": { @@ -1170,9 +1165,9 @@ } }, "node_modules/@cloudflare/workerd-darwin-64": { - "version": "1.20260708.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20260708.1.tgz", - "integrity": "sha512-HXFCvhS1wpg3uXO0CLUwmwC41i2loM5FSK69EUchOBpmYBAXxT1oHLm6EOA5lqhTk5Mu9kjRiQYxa1GwKPwfJg==", + "version": "1.20260426.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20260426.1.tgz", + "integrity": "sha512-Ch7DqsmYzSQRTY87pZpsGsFVz9VVBnLPnCBOHxKt1HH25a7oMu1w1PbPWqVmE0VerCLsj/TScX7Ob3v6E14TZw==", "cpu": [ "x64" ], @@ -1186,9 +1181,9 @@ } }, "node_modules/@cloudflare/workerd-darwin-arm64": { - "version": "1.20260708.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20260708.1.tgz", - "integrity": "sha512-JVlJaKDoRTVKSroHIlf8g3UCPjKj4iDbMZE2CNYht5qQ+2rL0FAUiVlV82G3BqKnnw9kHYnnsMzC08b9zVtdzA==", + "version": "1.20260426.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20260426.1.tgz", + "integrity": "sha512-0m0U8vaPRH25SpKjbSyRql6gmPe4rCsETRV2WW0qBnuMdKNr5Vh5/Uez80xVrfiCCRMTULGeg63Nqg2vg6CDOA==", "cpu": [ "arm64" ], @@ -1202,9 +1197,9 @@ } }, "node_modules/@cloudflare/workerd-linux-64": { - "version": "1.20260708.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20260708.1.tgz", - "integrity": "sha512-3daE60YdD7YX0Jtuzc9DE/r/qMkmx8ZvHTkF8Mzmp3F5tbzlV0DAzmu5PFUPF2WuvtKbAhZKbvC2cHmWpQYxnA==", + "version": "1.20260426.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20260426.1.tgz", + "integrity": "sha512-C8LlC8uSYzg49y51n++75esxZmMp+Uz1OKHHA/4lkv6rjOTbcHQJuEwSLppjybVIXpv7A8MBhbu9iyCTvyv1mw==", "cpu": [ "x64" ], @@ -1218,9 +1213,9 @@ } }, "node_modules/@cloudflare/workerd-linux-arm64": { - "version": "1.20260708.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20260708.1.tgz", - "integrity": "sha512-VLdNYOx5Hj+9C6isy0ACWZsbMtSxex2DIJWEe7cZxUdlphZ58ZT8zxNXK8yunFiowd34hn3VwGMopdvdj8lvmA==", + "version": "1.20260426.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20260426.1.tgz", + "integrity": "sha512-ESVp/OIFMAqjQsa8BOP2BQQz5Vpfv6ncN6lNnIuNeOgsISQBdYk+LA60bwQHMud9tvmnSYtONp1zkZ8OQz+x6w==", "cpu": [ "arm64" ], @@ -1234,9 +1229,9 @@ } }, "node_modules/@cloudflare/workerd-windows-64": { - "version": "1.20260708.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20260708.1.tgz", - "integrity": "sha512-bC/aSAwLy16Vjo24i9XU3aWH+eRgz7NeR5xPKavGbembO18ZywYTQbXh14eXtY6fAqN3RzRG8psijTdhX4xydA==", + "version": "1.20260426.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20260426.1.tgz", + "integrity": "sha512-d3Xj/IjINRgNVwH+eKhpUn4xkkcEewbWXbOvBlapiirKWh5zl9m0Epi3qOqmjyRYK6MICqIGXg4qZBEt0lxudw==", "cpu": [ "x64" ], @@ -1262,13 +1257,13 @@ } }, "node_modules/@codemirror/commands": { - "version": "6.10.4", - "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.10.4.tgz", - "integrity": "sha512-Ryk9y9T0FFVF0cUGhAknveAyUOl/A1qReTFi+qPKtOh2Z9F4AUBz3XOrYD4ZEgZirdugVzHvd/2/Wcwy5OliTg==", + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.10.3.tgz", + "integrity": "sha512-JFRiqhKu+bvSkDLI+rUhJwSxQxYb759W5GBezE8Uc8mHLqC9aV/9aTC7yJSqCtB3F00pylrLCwnyS91Ap5ej4Q==", "license": "MIT", "dependencies": { "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.7.0", + "@codemirror/state": "^6.6.0", "@codemirror/view": "^6.27.0", "@lezer/common": "^1.1.0" } @@ -1554,9 +1549,9 @@ } }, "node_modules/@codemirror/language": { - "version": "6.12.4", - "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.12.4.tgz", - "integrity": "sha512-1q4PaT+o6PbgpkJt4Q8Fv5XJxTy4FUZ4MWETtyiDw3J0Pyr9E2vqcKL+k9wcvjNTIsauxvE7OfmWj3FRPHQ76A==", + "version": "6.12.3", + "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.12.3.tgz", + "integrity": "sha512-QwCZW6Tt1siP37Jet9Tb02Zs81TQt6qQrZR2H+eGMcFsL1zMrk2/b9CLC7/9ieP1fjIUMgviLWMmgiHoJrj+ZA==", "license": "MIT", "dependencies": { "@codemirror/state": "^6.0.0", @@ -1608,9 +1603,9 @@ } }, "node_modules/@codemirror/lint": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.9.7.tgz", - "integrity": "sha512-28/+iWLYxKxsvGYhSYL7zaCZqLz5+FFFDq9tVsvGv9kv8RY4fFAchJ5WX9M3YrrRlTIsECjsXPqeNgnSmNP2dg==", + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.9.6.tgz", + "integrity": "sha512-6Kp7r6XfCi/D/5sdXieMfg9pJU1bUEx96WITuLU6ESaKizCz0QHFMjY/TaFSbigDdEAIgi93itLBIUETP4oK+A==", "license": "MIT", "dependencies": { "@codemirror/state": "^6.0.0", @@ -1619,9 +1614,9 @@ } }, "node_modules/@codemirror/merge": { - "version": "6.12.2", - "resolved": "https://registry.npmjs.org/@codemirror/merge/-/merge-6.12.2.tgz", - "integrity": "sha512-V8JvyAPjHbPupqP7BeMcsdsYCbyPij74jxIbaIJDORI+VZzW44zFmon8bF+oxGWvOKhcRmkiUMXd8MxHr3YA2w==", + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/@codemirror/merge/-/merge-6.12.1.tgz", + "integrity": "sha512-GA8hBq2T+IFM0sb5fk8CunTrqOulA3zurJmHtzcU15EMnL8aYpVINfJ5bkfd53M4ikwoew4Y1ydtSaAlk6+B1w==", "license": "MIT", "dependencies": { "@codemirror/language": "^6.0.0", @@ -1632,9 +1627,9 @@ } }, "node_modules/@codemirror/search": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.7.1.tgz", - "integrity": "sha512-uMe5UO6PamJtSHrXhhHOzSX3ReWtiJrva6GnPMwSOrZtiExb5X5eExhr2OUZQVvdxPsKpY3Ro2mFbQadpPWmHA==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.7.0.tgz", + "integrity": "sha512-ZvGm99wc/s2cITtMT15LFdn8aH/aS+V+DqyGq/N5ZlV5vWtH+nILvC2nw0zX7ByNoHHDZ2IxxdW38O0tc5nVHg==", "license": "MIT", "dependencies": { "@codemirror/state": "^6.0.0", @@ -1643,21 +1638,21 @@ } }, "node_modules/@codemirror/state": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.7.1.tgz", - "integrity": "sha512-9QzNDgE4EYDnAHfrTlR2lwiPciiOymLtwKK+8yHQzCc7GXhAP9xdEbEJFy2IWB1j9UGUl9BsgMmTo/ImA02T7A==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.6.0.tgz", + "integrity": "sha512-4nbvra5R5EtiCzr9BTHiTLc+MLXK2QGiAVYMyi8PkQd3SR+6ixar/Q/01Fa21TBIDOZXgeWV4WppsQolSreAPQ==", "license": "MIT", "dependencies": { "@marijn/find-cluster-break": "^1.0.0" } }, "node_modules/@codemirror/view": { - "version": "6.43.6", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.43.6.tgz", - "integrity": "sha512-EVunGSYN1wz1p75WY1s3Xg7t3i8Yol0kGZGizNdX9BUFgMFILYVe8/u6EVpo7Ff5PwbZuILb4QAq7IZoKzIEQA==", + "version": "6.43.0", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.43.0.tgz", + "integrity": "sha512-V7ZCLQO3Jus9hzh2jVCCPW3mO4IBMr43O37PqSUYautJSnnJF41YlgLw21x0fLJTYvJ+Vkm6Gp+qKGH9pltgXA==", "license": "MIT", "dependencies": { - "@codemirror/state": "^6.7.0", + "@codemirror/state": "^6.6.0", "crelt": "^1.0.6", "style-mod": "^4.1.0", "w3c-keyname": "^2.2.4" @@ -1761,9 +1756,9 @@ } }, "node_modules/@emnapi/runtime": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.2.tgz", - "integrity": "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", + "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", "license": "MIT", "optional": true, "dependencies": { @@ -2242,32 +2237,32 @@ } }, "node_modules/@floating-ui/core": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.8.0.tgz", - "integrity": "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==", + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz", + "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==", "license": "MIT", "dependencies": { - "@floating-ui/utils": "^0.2.12" + "@floating-ui/utils": "^0.2.11" } }, "node_modules/@floating-ui/dom": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.8.0.tgz", - "integrity": "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==", + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz", + "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==", "license": "MIT", "dependencies": { - "@floating-ui/core": "^1.8.0", - "@floating-ui/utils": "^0.2.12" + "@floating-ui/core": "^1.7.5", + "@floating-ui/utils": "^0.2.11" } }, "node_modules/@floating-ui/react": { - "version": "0.27.20", - "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.27.20.tgz", - "integrity": "sha512-CMqMy7OaXl9W0eq1Uy7L7i2Y/anPvHmFmESd2CEw0t5YvZhcVCeo4MBevAmswRllX7Y2dEidA4ozGPunLSTQpw==", + "version": "0.27.19", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.27.19.tgz", + "integrity": "sha512-31B8h5mm8YxotlE7/AU/PhNAl8eWxAmjL/v2QOxroDNkTFLk3Uu82u63N3b6TXa4EGJeeZLVcd/9AlNlVqzeog==", "license": "MIT", "dependencies": { - "@floating-ui/react-dom": "^2.1.9", - "@floating-ui/utils": "^0.2.12", + "@floating-ui/react-dom": "^2.1.8", + "@floating-ui/utils": "^0.2.11", "tabbable": "^6.0.0" }, "peerDependencies": { @@ -2276,12 +2271,12 @@ } }, "node_modules/@floating-ui/react-dom": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.9.tgz", - "integrity": "sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.8.tgz", + "integrity": "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==", "license": "MIT", "dependencies": { - "@floating-ui/dom": "^1.8.0" + "@floating-ui/dom": "^1.7.6" }, "peerDependencies": { "react": ">=16.8.0", @@ -2289,9 +2284,9 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.12.tgz", - "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==", + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz", + "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", "license": "MIT" }, "node_modules/@github/copilot": { @@ -3120,13 +3115,13 @@ "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } }, "node_modules/@lexical/clipboard": { @@ -3402,9 +3397,9 @@ } }, "node_modules/@lezer/css": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@lezer/css/-/css-1.3.4.tgz", - "integrity": "sha512-N+tn9tej2hPvyKgHEApMOQfHczDJCwxrRFS3SPn9QjYN+uwHvEDnCgKRrb3mxDYxRS8sKMM8fhC3+lc04Abz5Q==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@lezer/css/-/css-1.3.3.tgz", + "integrity": "sha512-RzBo8r+/6QJeow7aPHIpGVIH59xTcJXp399820gZoMo9noQDRVpJLheIBUicYwKcsbOYoBRoLZlf2720dG/4Tg==", "license": "MIT", "dependencies": { "@lezer/common": "^1.2.0", @@ -3486,9 +3481,9 @@ } }, "node_modules/@lezer/markdown": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@lezer/markdown/-/markdown-1.7.1.tgz", - "integrity": "sha512-MEBZeFSBxgteUjEC3Wxg2Dwld5/JxRKG267L3bMFdibm8KjqSdiJYBeFw1Nt1CM8+zKMpSIEHblY8FD9z38sJQ==", + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/@lezer/markdown/-/markdown-1.6.4.tgz", + "integrity": "sha512-N0SxazMj4k65DBfaf1azqtMZd6u7MqluP84/NZnB/io8Td9aleFmAhz9hcbvSfsxT5tdYlJ5qgv5aMJGY4zEtA==", "license": "MIT", "dependencies": { "@lezer/common": "^1.5.0", @@ -3562,9 +3557,9 @@ } }, "node_modules/@marijn/find-cluster-break": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.3.tgz", - "integrity": "sha512-FY+MKLBoTsLNJF/eLWaOsXGdz6uh3Iu1axjPf6TUq92IYumcTcXWHoS747JARLkcdlJ/Waiaxc5wQfFO8jC6NA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz", + "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==", "license": "MIT" }, "node_modules/@mdx-js/mdx": { @@ -3623,9 +3618,9 @@ } }, "node_modules/@mdxeditor/editor": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@mdxeditor/editor/-/editor-4.0.4.tgz", - "integrity": "sha512-fUUWoIFfHB4g+PHkcpKp5zRfoMmDWrVeSaoB4x81759J2xrWsmYYoCYx0oVLcL6HXat8f/8LprlRmAxpcIPnLQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@mdxeditor/editor/-/editor-4.0.2.tgz", + "integrity": "sha512-tS286FC61NbA+pEJomUBLc5pgEtpowQ0z3nVuqba275CwmVWb//dQVAgIX9lN+ZB8VRa/XwpDXBxi+AMnP8Wpg==", "license": "MIT", "dependencies": { "@codemirror/commands": "^6.2.4", @@ -3657,7 +3652,7 @@ "cm6-theme-basic-light": "^0.2.0", "codemirror": "^6.0.1", "downshift": "^7.6.0", - "js-yaml": "4.2.0", + "js-yaml": "4.1.1", "lexical": "^0.35.0", "mdast-util-directive": "^3.0.0", "mdast-util-from-markdown": "^2.0.0", @@ -3847,15 +3842,22 @@ } }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.7.tgz", - "integrity": "sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", + "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==", + "dev": true, "license": "MIT", "optional": true, "dependencies": { - "@emnapi/core": "^1.5.0", - "@emnapi/runtime": "^1.5.0", - "@tybys/wasm-util": "^0.10.1" + "@tybys/wasm-util": "^0.10.3" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" } }, "node_modules/@nodelib/fs.scandir": { @@ -4175,9 +4177,9 @@ } }, "node_modules/@octokit/request": { - "version": "10.0.11", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.11.tgz", - "integrity": "sha512-+s7HUxjfFqOMS9VlIwDffq0MikjSAK0gSpG73W+meAvVAvX4MBrHYTK5Bj3Uot55qFT4gzUtfzE4mGWY4Br8/Q==", + "version": "10.0.10", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.10.tgz", + "integrity": "sha512-KxNC2pTqqhszMNrf12ZRd4PonRgyJdsM4F/jySiddQK+DsRcfBtUvqn8t7UsyZhnRJHvX46OohDt5N3VqIWC2w==", "license": "MIT", "dependencies": { "@octokit/endpoint": "^11.0.3", @@ -4398,18 +4400,18 @@ "license": "MIT" }, "node_modules/@radix-ui/primitive": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.5.tgz", - "integrity": "sha512-d86WIWFYNtGA0H/d8exstrTRTp7eWJYlYJbtNofxr/3ljupZYn6EFDG/Qgu/0Kc8v7yMUxySagqJsL1+PdYjWg==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.4.tgz", + "integrity": "sha512-7AdCK9PQyiljKoBDbN8OuctCbd/esdwZPQ8RtOE3SsyQtUpiPb+ND75q0jEhC1m1ecBI0MFNeLJvwIh9iKHRcQ==", "license": "MIT" }, "node_modules/@radix-ui/react-arrow": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.11.tgz", - "integrity": "sha512-Kdil9BB1rIFC/khmf4hC35bn8701AJcizTU7G7cUbEbk5XqqbjDuHW60uUfKqO5WojjZcbAW51Q7P0hRmMLw8A==", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.9.tgz", + "integrity": "sha512-yqHW5WQ/cTpU/un7dqqIKNy2iRU8BC0JB78PEzTfCCYvZu1U6W9KwObAniMk9nhSfyotKPQTYaUD/HB0f5muig==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.7" + "@radix-ui/react-primitive": "2.1.5" }, "peerDependencies": { "@types/react": "*", @@ -4427,15 +4429,15 @@ } }, "node_modules/@radix-ui/react-collection": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.12.tgz", - "integrity": "sha512-nb67INpE0IahJKN7EYPp9m9YGwYeKlnzxT3MwXVkgCskaSJia97kG4T0ywpjNUSSnoJk/uvk12V8vbrEHEj+/Q==", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.9.tgz", + "integrity": "sha512-zuSVi7ziP7uQRqc+yGxsKJfNkdyHv3ZKDaHe0gzg4dRgws96TPKWIiz84tVHP4GEcEl8bC0mdt17NkcxaJHmaQ==", "license": "MIT", "dependencies": { "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.2.0", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-slot": "1.3.0" + "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-primitive": "2.1.5", + "@radix-ui/react-slot": "1.2.5" }, "peerDependencies": { "@types/react": "*", @@ -4468,9 +4470,9 @@ } }, "node_modules/@radix-ui/react-context": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.2.0.tgz", - "integrity": "sha512-fOE+JtN9rygNZkCnHRBEP0TAvLldlhyOxMsbwFvTP4nAs+nBmfnna+o/Zski2wkmY1YMrFC0aSzsHoLY47iLrg==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.4.tgz", + "integrity": "sha512-QwH4PO5urrbO+FaGd5Aglg+YJgWTyyuZ3g/6mKvsqraLkglDdckw9JafgL5McL5VEJ6EPNduPaT3ZE9BttDAqg==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -4483,22 +4485,22 @@ } }, "node_modules/@radix-ui/react-dialog": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.19.tgz", - "integrity": "sha512-+HhbN2+YtkRgVirjZ2afMeutQRuGOrdkWR5+EFC58SJojGmtyNQwYzgi6tHBpOxvFHefMtPeHdgtjz0BOGxFQg==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.16.tgz", + "integrity": "sha512-l9ok83YBclEZhbjgzt76Hw733e6cvRKPNgO6GJ/IETlufXG9p+fRu2wlvpImQvR6xdJ8h7J8J2DBvsPEiEsKMw==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.5", + "@radix-ui/primitive": "1.1.4", "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.2.0", - "@radix-ui/react-dismissable-layer": "1.1.15", + "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-dismissable-layer": "1.1.12", "@radix-ui/react-focus-guards": "1.1.4", - "@radix-ui/react-focus-scope": "1.1.12", + "@radix-ui/react-focus-scope": "1.1.9", "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-portal": "1.1.13", - "@radix-ui/react-presence": "1.1.7", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-slot": "1.3.0", + "@radix-ui/react-portal": "1.1.11", + "@radix-ui/react-presence": "1.1.6", + "@radix-ui/react-primitive": "2.1.5", + "@radix-ui/react-slot": "1.2.5", "@radix-ui/react-use-controllable-state": "1.2.3", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.7.2" @@ -4534,16 +4536,16 @@ } }, "node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.15.tgz", - "integrity": "sha512-b0XaRlzn2QKuo10XyNgi2DAJDf5XC9d1nD3FJcuvCjbR7+4Ad28zmZsLsqx+hvDEzMnRuZaZxZm9gYObV6RmRA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.12.tgz", + "integrity": "sha512-MhoruH6xEzsbvOmo4TNgMfmtvRGyDZw4MDSdf4ybMHfezjqwzv6hyd4lsMzBp8K9Sn6sGzCF62x1I7BYUECXOg==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.5", + "@radix-ui/primitive": "1.1.4", "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-primitive": "2.1.7", + "@radix-ui/react-primitive": "2.1.5", "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-effect-event": "0.0.3" + "@radix-ui/react-use-escape-keydown": "1.1.2" }, "peerDependencies": { "@types/react": "*", @@ -4576,13 +4578,13 @@ } }, "node_modules/@radix-ui/react-focus-scope": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.12.tgz", - "integrity": "sha512-jjk/lqTeNL0azUx5ZYzVrl4NgaDIrdzTNE4mABV9yBFI7FQqN7pIgzV1bTleUezP2QiTGA1BFTqY8MegDgWX9A==", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.9.tgz", + "integrity": "sha512-9Se8t+Zry+1rEOL7Y6l/4ANYU/TOtAtf8O2fKdwLltcaMcm6kOqYGbzO4tMFQ0bvzO920pRAoHpFZ4W85S3keQ==", "license": "MIT", "dependencies": { "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-primitive": "2.1.7", + "@radix-ui/react-primitive": "2.1.5", "@radix-ui/react-use-callback-ref": "1.1.2" }, "peerDependencies": { @@ -4628,23 +4630,23 @@ } }, "node_modules/@radix-ui/react-popover": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.19.tgz", - "integrity": "sha512-jkrTdQVxnIB8fpn0NyyxW9CTB5aCXZZelVz5z+Xmii6g5WxMqS3fInNslZ63puP39+Puu4jYohUK31y3dT87gQ==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.16.tgz", + "integrity": "sha512-8brVpAU5Uq7Bh0c8EFc4ZTf2JJTYn0o+1L+CUJB3UYIOkTjKGMgoHvduylrahdmNlr3DfH0rFq2DrbNZXgaspw==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.5", + "@radix-ui/primitive": "1.1.4", "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.2.0", - "@radix-ui/react-dismissable-layer": "1.1.15", + "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-dismissable-layer": "1.1.12", "@radix-ui/react-focus-guards": "1.1.4", - "@radix-ui/react-focus-scope": "1.1.12", + "@radix-ui/react-focus-scope": "1.1.9", "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-popper": "1.3.3", - "@radix-ui/react-portal": "1.1.13", - "@radix-ui/react-presence": "1.1.7", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-slot": "1.3.0", + "@radix-ui/react-popper": "1.3.0", + "@radix-ui/react-portal": "1.1.11", + "@radix-ui/react-presence": "1.1.6", + "@radix-ui/react-primitive": "2.1.5", + "@radix-ui/react-slot": "1.2.5", "@radix-ui/react-use-controllable-state": "1.2.3", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.7.2" @@ -4665,16 +4667,16 @@ } }, "node_modules/@radix-ui/react-popper": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.3.3.tgz", - "integrity": "sha512-mS7dGpyjv6b+gsDjLF7e0ia1W4Im1B1hSCy2yuXlHuvnZxHKagfDaobt/KAKt27EpZMit2pss8eJBVyVjEWM+g==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.3.0.tgz", + "integrity": "sha512-9PB589e1aWZbrlFUHdz6WiPCL+xLZHQFX7oibqG/6Q0SwOkxDyQX9W/cyPa+sAPPKuC8cpLCpRczE5a/1DiwVQ==", "license": "MIT", "dependencies": { "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.1.11", + "@radix-ui/react-arrow": "1.1.9", "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.2.0", - "@radix-ui/react-primitive": "2.1.7", + "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-primitive": "2.1.5", "@radix-ui/react-use-callback-ref": "1.1.2", "@radix-ui/react-use-layout-effect": "1.1.2", "@radix-ui/react-use-rect": "1.1.2", @@ -4697,12 +4699,12 @@ } }, "node_modules/@radix-ui/react-portal": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.13.tgz", - "integrity": "sha512-z3oXfmaHLJTF1wktbjgD6cn9jiEbq3WSondB10LIuIt2m2Ym4iJlrW04/euMwENDdWDdE7z+OuY7Qyp1YpRSwA==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.11.tgz", + "integrity": "sha512-UEytdjgEh2tJGgD/gZK4FUx6t1rNIlM3U0DENhSrG7I75FGm1DnaDuVUWF1pWAWUwGmn1sCJ1VGHn8LhN1aTOw==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.7", + "@radix-ui/react-primitive": "2.1.5", "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { @@ -4721,9 +4723,9 @@ } }, "node_modules/@radix-ui/react-presence": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.7.tgz", - "integrity": "sha512-zBZ4QM5XG3JRanDmqXYf3MD6th4AFXFmgU6KNMFzUaV6F3uw9I5/zjMUvFriSEn5ewo1nxuibvyxJdmLlDcslA==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.6.tgz", + "integrity": "sha512-zdTk4PlUO0E18HnZ3wYbW0KkJJxWCdiNYp6g6X1PtONFhxVkg01vliTJAmwIszU6mHiyBOoW9P0rAugl5/hULQ==", "license": "MIT", "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.2" @@ -4744,12 +4746,12 @@ } }, "node_modules/@radix-ui/react-primitive": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.7.tgz", - "integrity": "sha512-bC3NiwsprbxKjuon9l7X6BUTw7FPVzEYaL92MPEY5SCd/9hUTPXVFtVwRix7778wtRsVao+zE062gL79FZleeQ==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.5.tgz", + "integrity": "sha512-zifXeB8Y88qCYx8PLZ5oQb32KwZub+s925mMoZsBBq9KUQqWKkREubTfs6ASjRPPBe7Jt9O8OHH89+95VG+grA==", "license": "MIT", "dependencies": { - "@radix-ui/react-slot": "1.3.0" + "@radix-ui/react-slot": "1.2.5" }, "peerDependencies": { "@types/react": "*", @@ -4767,22 +4769,20 @@ } }, "node_modules/@radix-ui/react-roving-focus": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.15.tgz", - "integrity": "sha512-40svmmugfM3mUN7VUDGVE1tQGOhyi8enlGD0CNJEcMM36C1f71PKM21DFgNHUfem0XnA+d8H8oN3Z9ZpJjSslg==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.12.tgz", + "integrity": "sha512-FvgPt1bRmg8Xt2QpF7NUZW3dE0ZQHGm41dAdgT2J2GJPoIXz+9Em3NobAxf4fupcxhgHu03E5CRiU2MWvObXyg==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.5", - "@radix-ui/react-collection": "1.1.12", + "@radix-ui/primitive": "1.1.4", + "@radix-ui/react-collection": "1.1.9", "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.2.0", + "@radix-ui/react-context": "1.1.4", "@radix-ui/react-direction": "1.1.2", "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-primitive": "2.1.7", + "@radix-ui/react-primitive": "2.1.5", "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-controllable-state": "1.2.3", - "@radix-ui/react-use-is-hydrated": "0.1.1", - "@radix-ui/react-use-layout-effect": "1.1.2" + "@radix-ui/react-use-controllable-state": "1.2.3" }, "peerDependencies": { "@types/react": "*", @@ -4800,31 +4800,31 @@ } }, "node_modules/@radix-ui/react-select": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.3.3.tgz", - "integrity": "sha512-L5RQTXz6Anxsf9CCv+pTgiAsUpyVj7rJxsGtmhFaEOJ++cVfXucv4qWfsIO0AIB4NAhi3yovWGVMKKS1Xf1Wrg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.3.0.tgz", + "integrity": "sha512-mENc7WpJvJcW8hlMpzfFcHcEhTvYS5JMBmi9HVC1Q00uhBwML086MHYUV8QQdQv6lcu0Wg8dzd1RB8AFADcG/g==", "license": "MIT", "dependencies": { "@radix-ui/number": "1.1.2", - "@radix-ui/primitive": "1.1.5", - "@radix-ui/react-collection": "1.1.12", + "@radix-ui/primitive": "1.1.4", + "@radix-ui/react-collection": "1.1.9", "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.2.0", + "@radix-ui/react-context": "1.1.4", "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.15", + "@radix-ui/react-dismissable-layer": "1.1.12", "@radix-ui/react-focus-guards": "1.1.4", - "@radix-ui/react-focus-scope": "1.1.12", + "@radix-ui/react-focus-scope": "1.1.9", "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-popper": "1.3.3", - "@radix-ui/react-portal": "1.1.13", - "@radix-ui/react-presence": "1.1.7", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-slot": "1.3.0", + "@radix-ui/react-popper": "1.3.0", + "@radix-ui/react-portal": "1.1.11", + "@radix-ui/react-presence": "1.1.6", + "@radix-ui/react-primitive": "2.1.5", + "@radix-ui/react-slot": "1.2.5", "@radix-ui/react-use-callback-ref": "1.1.2", "@radix-ui/react-use-controllable-state": "1.2.3", "@radix-ui/react-use-layout-effect": "1.1.2", "@radix-ui/react-use-previous": "1.1.2", - "@radix-ui/react-visually-hidden": "1.2.7", + "@radix-ui/react-visually-hidden": "1.2.5", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.7.2" }, @@ -4844,12 +4844,12 @@ } }, "node_modules/@radix-ui/react-separator": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.11.tgz", - "integrity": "sha512-jRhe86+8PF7VZ1u14eOWVOuh2BuAhALg/FT1VcMC4OHedMTRUazDnDlKTt+yxo5cRNKHMfmvZ4sSQtWDeMV4CQ==", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.9.tgz", + "integrity": "sha512-gvgW+JV/Mbjj6darztTetnmElpQEzZrXpJvfj+dOxNAxiyHEAyUvEjjl4zxblvmjmKmi3jfPoy7ZdxzCuUBJSA==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.7" + "@radix-ui/react-primitive": "2.1.5" }, "peerDependencies": { "@types/react": "*", @@ -4867,9 +4867,9 @@ } }, "node_modules/@radix-ui/react-slot": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.3.0.tgz", - "integrity": "sha512-MojKku4U/miO8Av4Dkb+ctMAQx7JmY96LmtDQlAarCRtd7rN52QCSzBF+XAvr5S6coSVj9HEPBgHAHKEJVk/WA==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.5.tgz", + "integrity": "sha512-rCMO3QsIVKv5JTY5CVbo2MvO77SpEqqYc8AvRE7OWqRDOIqAKjsp+DrmnY9uc8NPdxB5E2z47HTYGeE2+NTptg==", "license": "MIT", "dependencies": { "@radix-ui/react-compose-refs": "1.1.3" @@ -4885,13 +4885,13 @@ } }, "node_modules/@radix-ui/react-toggle": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.14.tgz", - "integrity": "sha512-QI/hB65XKWACA66P64A+aHxtLUgHJeJLkaQa+awUNXT6T3swndtY5DojeHA+vldrTspMTtFBd7HfZ9QGbM1Qrw==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.11.tgz", + "integrity": "sha512-FikrKJemoBGZQ6uRID0HJqSPBP6D7OppdD2OhLl0ZYLlAyPXI7MezoYGmumwNkrAoRm35xXkb4C8JPfJZZzcaw==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.5", - "@radix-ui/react-primitive": "2.1.7", + "@radix-ui/primitive": "1.1.4", + "@radix-ui/react-primitive": "2.1.5", "@radix-ui/react-use-controllable-state": "1.2.3" }, "peerDependencies": { @@ -4910,17 +4910,17 @@ } }, "node_modules/@radix-ui/react-toggle-group": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.15.tgz", - "integrity": "sha512-gIC5Q+Xljg7lmUdzSuDoy0t97yZn1sZl00Ra37ZvKrYdWnQLU6sWLd09yG8cIB9jUAlQfHgJ2ACAG00MFwsqSQ==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.12.tgz", + "integrity": "sha512-TEgECgJaWGAHJJZGzNNEYTNBdIXqX7LchANycpyP7DkfjmuiSN7ISt1k/ZRGVJgVJonsgP4vwaiKMn5utrcwWQ==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.5", - "@radix-ui/react-context": "1.2.0", + "@radix-ui/primitive": "1.1.4", + "@radix-ui/react-context": "1.1.4", "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-roving-focus": "1.1.15", - "@radix-ui/react-toggle": "1.1.14", + "@radix-ui/react-primitive": "2.1.5", + "@radix-ui/react-roving-focus": "1.1.12", + "@radix-ui/react-toggle": "1.1.11", "@radix-ui/react-use-controllable-state": "1.2.3" }, "peerDependencies": { @@ -4939,18 +4939,18 @@ } }, "node_modules/@radix-ui/react-toolbar": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toolbar/-/react-toolbar-1.1.15.tgz", - "integrity": "sha512-t/iEuVjUnXXtrsGK40AA43uIx37sn3AqZ7oAVnPICK6lFJP6dzMzWR3U9b6eCfFjb6wtSEqkJ9Rn9xDjiOx20g==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toolbar/-/react-toolbar-1.1.12.tgz", + "integrity": "sha512-4wHtJVdIgqMmEwUvxA0BYg/2JMRbt0L3+8UD8Ml/nhKkfXtiZcM8u/S15gQ5xj9YEd/0qlrm5bE805LsjQ+J8A==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.5", - "@radix-ui/react-context": "1.2.0", + "@radix-ui/primitive": "1.1.4", + "@radix-ui/react-context": "1.1.4", "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-roving-focus": "1.1.15", - "@radix-ui/react-separator": "1.1.11", - "@radix-ui/react-toggle-group": "1.1.15" + "@radix-ui/react-primitive": "2.1.5", + "@radix-ui/react-roving-focus": "1.1.12", + "@radix-ui/react-separator": "1.1.9", + "@radix-ui/react-toggle-group": "1.1.12" }, "peerDependencies": { "@types/react": "*", @@ -4968,23 +4968,23 @@ } }, "node_modules/@radix-ui/react-tooltip": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.12.tgz", - "integrity": "sha512-U3HoftgWnmla78vzQbLvKKb7bUYJxoiiqYFzp1wu/TBMyDqMZSuCl3aRICsD6EfVEwcJD2mumGDGUXLFVqQHKA==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.9.tgz", + "integrity": "sha512-u6F9MmTtBSLkiXNVDrtB/yPCZarM9smNswC24YYLV/M+bth6J3Gs3vlJezEoFwKZvPvxhCpUYdUnOsNG/0XOlA==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.5", + "@radix-ui/primitive": "1.1.4", "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.2.0", - "@radix-ui/react-dismissable-layer": "1.1.15", + "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-dismissable-layer": "1.1.12", "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-popper": "1.3.3", - "@radix-ui/react-portal": "1.1.13", - "@radix-ui/react-presence": "1.1.7", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-slot": "1.3.0", + "@radix-ui/react-popper": "1.3.0", + "@radix-ui/react-portal": "1.1.11", + "@radix-ui/react-presence": "1.1.6", + "@radix-ui/react-primitive": "2.1.5", + "@radix-ui/react-slot": "1.2.5", "@radix-ui/react-use-controllable-state": "1.2.3", - "@radix-ui/react-visually-hidden": "1.2.7" + "@radix-ui/react-visually-hidden": "1.2.5" }, "peerDependencies": { "@types/react": "*", @@ -5135,12 +5135,12 @@ } }, "node_modules/@radix-ui/react-visually-hidden": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.7.tgz", - "integrity": "sha512-1wNZBggTDK3GRuuQ6nP4k2yi7a6l7I5qbMPbZcRsrGsGVead/f/d5FhEzUvqFs0bcrDLx7n1zKQ3JvLR6whaaw==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.5.tgz", + "integrity": "sha512-tPcHNI3FajdDBFpl/Ez1m2WL0ufJqBKyHxMDBvKitopamK36WwBGOMicuMEZKkM5Wce41QxUyv6BsiqfrWBiGg==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.7" + "@radix-ui/react-primitive": "2.1.5" }, "peerDependencies": { "@types/react": "*", @@ -5814,9 +5814,9 @@ } }, "node_modules/@rolldown/pluginutils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", "license": "MIT" }, "node_modules/@rollup/pluginutils": { @@ -6413,42 +6413,42 @@ } }, "node_modules/@secretlint/core": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@secretlint/core/-/core-13.0.2.tgz", - "integrity": "sha512-15vg+zCmjQuDFVoOPNt0TyEu0Z95eir2MO19++wG82yM/vbPtFu/m9qd6oh54ZOBXgMcchdGDTxMwJNDnCLxcA==", + "version": "11.7.1", + "resolved": "https://registry.npmjs.org/@secretlint/core/-/core-11.7.1.tgz", + "integrity": "sha512-D1a/6U3JT2hhs+OpocAf1j+2t79ExrFqNm8j7pilhCQqpJ9QIEexGs1ty3v9wDACm48v0PFhCNCyn4hyctGYig==", "license": "MIT", "dependencies": { - "@secretlint/profiler": "13.0.2", - "@secretlint/types": "13.0.2", + "@secretlint/profiler": "11.7.1", + "@secretlint/types": "11.7.1", "debug": "^4.4.3", "structured-source": "^4.0.0" }, "engines": { - "node": ">=22.0.0" + "node": ">=20.0.0" } }, "node_modules/@secretlint/profiler": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@secretlint/profiler/-/profiler-13.0.2.tgz", - "integrity": "sha512-vGaLZCoi9KewOF+sM0iIEBviWaH9mls1HmQFBgEPq4fnvmVO4PfKIkVr4CcAFm3Msg4NjzFE2RBAGwRR+5HEmQ==", + "version": "11.7.1", + "resolved": "https://registry.npmjs.org/@secretlint/profiler/-/profiler-11.7.1.tgz", + "integrity": "sha512-Fa1fCVT4izv8PRXL8t4KB6FwBEL2OYqOYtNsyssWd7giNoNcohCoLGnDhJNLcTxTyTqkDzLlGV0M4CYsCkcfZQ==", "license": "MIT" }, "node_modules/@secretlint/secretlint-rule-preset-recommend": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@secretlint/secretlint-rule-preset-recommend/-/secretlint-rule-preset-recommend-13.0.2.tgz", - "integrity": "sha512-D03Kw51qOgffj9zNlJFZUarVmP8zGcCZNi7A14+vZtHskbbBPEsS/f09idb48rrlMSaRMBN29IkqfbmPyL9xtw==", + "version": "11.7.1", + "resolved": "https://registry.npmjs.org/@secretlint/secretlint-rule-preset-recommend/-/secretlint-rule-preset-recommend-11.7.1.tgz", + "integrity": "sha512-LsiEhDWoXi9GNx1Zp5eYRNajeUvBrZ82h3k/vzFqo0WoSdmpyDnkkzBTLXqWqj1VNyPCcTwlxOqnEmlz6lXc7A==", "license": "MIT", "engines": { - "node": ">=22.0.0" + "node": ">=20.0.0" } }, "node_modules/@secretlint/types": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@secretlint/types/-/types-13.0.2.tgz", - "integrity": "sha512-cAZjr6ZTKgSuJMLyTGDrUEtK3XEZa+JStIkD+DmdkT32VGAN+dQJiYr1So3XJopsKSrqhP5kjZKT8WWtftZIpQ==", + "version": "11.7.1", + "resolved": "https://registry.npmjs.org/@secretlint/types/-/types-11.7.1.tgz", + "integrity": "sha512-bIkBwIdQScZX5xm3DsLp3oL5U/KKUYWgmst39dZsDi55X9tKuPd7/uVpO1PqNrDW1I0QD5t6es/2LonG5RjxXg==", "license": "MIT", "engines": { - "node": ">=22.0.0" + "node": ">=20.0.0" } }, "node_modules/@selderee/plugin-htmlparser2": { @@ -6583,9 +6583,9 @@ } }, "node_modules/@speed-highlight/core": { - "version": "1.2.17", - "resolved": "https://registry.npmjs.org/@speed-highlight/core/-/core-1.2.17.tgz", - "integrity": "sha512-Z92FwKpCtfaW1V0jTU/fh3QzYEZN8wDwrzRIBoADCJfn4mJCNcJN/XegifX7BDrQ8/h9Xh/JnbyMchL0FqXrkg==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@speed-highlight/core/-/core-1.2.15.tgz", + "integrity": "sha512-BMq1K3DsElxDWawkX6eLg9+CKJrTVGCBAWVuHXVUV2u0s2711qiChLSId6ikYPfxhdYocLNt3wWwSvDiTvFabw==", "license": "CC0-1.0" }, "node_modules/@standard-schema/spec": { @@ -6932,7 +6932,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.staging.20260804T171000Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#a6ca05d78dedd49c14eff49b03b69428d2ddf556", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#cf54b1c0312f950d291d74cee733f09e651e4ea6", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6943,7 +6943,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#ce62ff867f12b5398020ca77e424936f4a38a63a", + "@treeseed/sdk": "github:treeseed-ai/sdk#de8d6fa197167bdd4ec743986ff2d08dc2fa1ed1", "@treeseed/ui": "github:treeseed-ai/ui#2938d0959dcb2aaa97bbced633e6f75df83db90c", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8948,7 +8948,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.staging.20260804T170912Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#ce62ff867f12b5398020ca77e424936f4a38a63a", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#de8d6fa197167bdd4ec743986ff2d08dc2fa1ed1", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", @@ -9684,9 +9684,9 @@ } }, "node_modules/@types/aws-lambda": { - "version": "8.10.162", - "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.162.tgz", - "integrity": "sha512-Fn658grtLOci1oxi1391vvDWJRKNGWRSqfxRkmN/Iy3c0tQH1USMKEXcPYHLvope+ZgTFocx9FRQJx1muBL6qw==", + "version": "8.10.161", + "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.161.tgz", + "integrity": "sha512-rUYdp+MQwSFocxIOcSsYSF3YYYC/uUpMbCY/mbO21vGqfrEYvNSoPyKYDj6RhXXpPfS0KstW9RwG3qXh9sL7FQ==", "license": "MIT" }, "node_modules/@types/babel__core": { @@ -9828,9 +9828,9 @@ "license": "MIT" }, "node_modules/@types/dom-mediacapture-transform": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/@types/dom-mediacapture-transform/-/dom-mediacapture-transform-0.1.12.tgz", - "integrity": "sha512-d7/QsLRwF864A5mgIM/YrfiglHoYn7zgCcAoJgW404r+2DwnNr7EBbLnCWpmOMgH8y0te73L1AV6H1bmauaWFw==", + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/@types/dom-mediacapture-transform/-/dom-mediacapture-transform-0.1.11.tgz", + "integrity": "sha512-Y2p+nGf1bF2XMttBnsVPHUWzRRZzqUoJAKmiP10b5umnO6DDrWI0BrGDJy1pOHoOULVmGSfFNkQrAlC5dcj6nQ==", "license": "MIT", "dependencies": { "@types/dom-webcodecs": "*" @@ -9878,9 +9878,9 @@ } }, "node_modules/@types/hast": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.5.tgz", - "integrity": "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "license": "MIT", "dependencies": { "@types/unist": "*" @@ -9935,9 +9935,9 @@ } }, "node_modules/@types/node": { - "version": "24.13.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz", - "integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==", + "version": "24.13.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.1.tgz", + "integrity": "sha512-RSpUJGmvsJ1ZeBehQZFhIdpsz+bIpES0nIQXko4Ybq+N+kX6XvOq3Jo+iJ82FWLdblFq85AsMikd3m35jgezYg==", "license": "MIT", "dependencies": { "undici-types": "~7.18.0" @@ -10000,9 +10000,9 @@ } }, "node_modules/@ungap/structured-clone": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.3.tgz", - "integrity": "sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.1.tgz", + "integrity": "sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==", "license": "ISC" }, "node_modules/@vitest/expect": { @@ -10388,9 +10388,9 @@ } }, "node_modules/acorn": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", - "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -10667,72 +10667,80 @@ } }, "node_modules/astro": { - "version": "6.4.8", - "resolved": "https://registry.npmjs.org/astro/-/astro-6.4.8.tgz", - "integrity": "sha512-KK5lX90uU9EeVaTjINyj3sy9/NFXVa59aowaqbWBDDKLXZh4rr7GwIaCFYVetE22MJtsCNFerQXn0vlCLmpP/Q==", + "version": "5.18.2", + "resolved": "https://registry.npmjs.org/astro/-/astro-5.18.2.tgz", + "integrity": "sha512-TnFwLnAXty5MXKPDGuKXqK4AMBXG+FH6RUdK7Oyc3gyfNoFIthT+4eRbzOK43bdRlLaZuxgciDSjgtggZ3OtGQ==", "license": "MIT", "dependencies": { - "@astrojs/compiler": "^4.0.0", - "@astrojs/internal-helpers": "0.10.0", - "@astrojs/markdown-remark": "7.2.0", - "@astrojs/telemetry": "3.3.2", + "@astrojs/compiler": "^2.13.0", + "@astrojs/internal-helpers": "0.7.6", + "@astrojs/markdown-remark": "6.3.11", + "@astrojs/telemetry": "3.3.0", "@capsizecss/unpack": "^4.0.0", - "@clack/prompts": "^1.1.0", "@oslojs/encoding": "^1.1.0", "@rollup/pluginutils": "^5.3.0", + "acorn": "^8.15.0", "aria-query": "^5.3.2", "axobject-query": "^4.1.0", - "ci-info": "^4.4.0", + "boxen": "8.0.1", + "ci-info": "^4.3.1", "clsx": "^2.1.1", - "common-ancestor-path": "^2.0.0", + "common-ancestor-path": "^1.0.1", "cookie": "^1.1.1", - "devalue": "^5.8.1", + "cssesc": "^3.0.0", + "debug": "^4.4.3", + "deterministic-object-hash": "^2.0.2", + "devalue": "^5.6.2", "diff": "^8.0.3", + "dlv": "^1.1.3", "dset": "^3.1.4", - "es-module-lexer": "^2.0.0", + "es-module-lexer": "^1.7.0", "esbuild": "^0.27.3", + "estree-walker": "^3.0.3", "flattie": "^1.1.1", - "fontace": "~0.4.1", - "get-tsconfig": "5.0.0-beta.4", + "fontace": "~0.4.0", "github-slugger": "^2.0.0", "html-escaper": "3.0.3", "http-cache-semantics": "^4.2.0", + "import-meta-resolve": "^4.2.0", "js-yaml": "^4.1.1", - "jsonc-parser": "^3.3.1", "magic-string": "^0.30.21", - "magicast": "^0.5.2", + "magicast": "^0.5.1", "mrmime": "^2.0.1", "neotraverse": "^0.6.18", - "obug": "^2.1.1", - "p-limit": "^7.3.0", - "p-queue": "^9.1.0", + "p-limit": "^6.2.0", + "p-queue": "^8.1.1", "package-manager-detector": "^1.6.0", "piccolore": "^0.1.3", - "picomatch": "^4.0.4", + "picomatch": "^4.0.3", + "prompts": "^2.4.2", "rehype": "^13.0.2", - "semver": "^7.7.4", - "shiki": "^4.0.2", + "semver": "^7.7.3", + "shiki": "^3.21.0", "smol-toml": "^1.6.0", - "svgo": "^4.0.1", - "tinyclip": "^0.1.12", - "tinyexec": "^1.0.4", + "svgo": "^4.0.0", + "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", + "tsconfck": "^3.1.6", "ultrahtml": "^1.6.0", - "unifont": "~0.7.4", - "unist-util-visit": "^5.1.0", - "unstorage": "^1.17.5", + "unifont": "~0.7.3", + "unist-util-visit": "^5.0.0", + "unstorage": "^1.17.4", "vfile": "^6.0.3", - "vite": "^7.3.2", - "vitefu": "^1.1.2", + "vite": "^6.4.1", + "vitefu": "^1.1.1", "xxhash-wasm": "^1.1.0", - "yargs-parser": "^22.0.0", - "zod": "^4.3.6" + "yargs-parser": "^21.1.1", + "yocto-spinner": "^0.2.3", + "zod": "^3.25.76", + "zod-to-json-schema": "^3.25.1", + "zod-to-ts": "^1.2.0" }, "bin": { - "astro": "bin/astro.mjs" + "astro": "astro.js" }, "engines": { - "node": ">=22.12.0", + "node": "18.20.8 || ^20.3.0 || >=22.0.0", "npm": ">=9.6.5", "pnpm": ">=7.1.0" }, @@ -11527,9 +11535,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.10.43", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.43.tgz", - "integrity": "sha512-AjYpR78kDWAY3Efj+cDTFH9t9SCoL7OoTp1BOb0mQV7S+6CiLwnWM3FyxhJtdPufDFKzmCSFoUncKjWgJEZTCQ==", + "version": "2.10.38", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.38.tgz", + "integrity": "sha512-31/02mVB4yuQU6adKk5SlY6m+mxDwUq5KZkyYgnLrrKl7TEm1+3PyDtDBz2kOv/wxZz41GHsvV1A/u6RmiyBvw==", "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.cjs" @@ -11588,20 +11596,20 @@ "license": "MIT" }, "node_modules/body-parser": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.3.0.tgz", - "integrity": "sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", + "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", "license": "MIT", "dependencies": { "bytes": "^3.1.2", - "content-type": "^2.0.0", + "content-type": "^1.0.5", "debug": "^4.4.3", - "http-errors": "^2.0.1", - "iconv-lite": "^0.7.2", + "http-errors": "^2.0.0", + "iconv-lite": "^0.7.0", "on-finished": "^2.4.1", - "qs": "^6.15.2", - "raw-body": "^3.0.2", - "type-is": "^2.1.0" + "qs": "^6.14.1", + "raw-body": "^3.0.1", + "type-is": "^2.0.1" }, "engines": { "node": ">=18" @@ -11731,9 +11739,9 @@ } }, "node_modules/brace-expansion": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", - "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" @@ -11755,9 +11763,9 @@ } }, "node_modules/browserslist": { - "version": "4.28.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.6.tgz", - "integrity": "sha512-FQBYNK15VMslhLHpA7+n+n1GOlF1kId2xcCg7/j95f24AOF6VDYMNH4mFxF7KuaTdv627faazpOAjFzMrfJOUw==", + "version": "4.28.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.4.tgz", + "integrity": "sha512-MTc8i/x9jBQd1iMw2CFGS+rwMa07eYjLR0CCTLDACl9xhxy+nIs3KeML/biicXtk9JrZ6dnnTatmc7ErPXIxqw==", "funding": [ { "type": "opencollective", @@ -11774,10 +11782,10 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.10.42", - "caniuse-lite": "^1.0.30001803", - "electron-to-chromium": "^1.5.389", - "node-releases": "^2.0.51", + "baseline-browser-mapping": "^2.10.38", + "caniuse-lite": "^1.0.30001799", + "electron-to-chromium": "^1.5.376", + "node-releases": "^2.0.48", "update-browserslist-db": "^1.2.3" }, "bin": { @@ -11853,9 +11861,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001805", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001805.tgz", - "integrity": "sha512-52noaS3DubycKSXaU30TwPGIp+POyQSUVa5jBEq3vkRkY0kjyb3LQgvhU6WGyCcyXqVLWO0Cw0Q6BSdD0kUfVA==", + "version": "1.0.30001799", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001799.tgz", + "integrity": "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==", "funding": [ { "type": "opencollective", @@ -12025,9 +12033,9 @@ } }, "node_modules/cli-truncate": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-6.1.1.tgz", - "integrity": "sha512-06p9vyLahLa4zkGcgsGxU6iEkSOiuI4fhCH6Emhe2lPAcoUv73n72DnODsnHA+5wwXGnV0n9M9/qOQJSjYhFhw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-6.0.0.tgz", + "integrity": "sha512-3+YKIUFsohD9MIoOFPFBldjAlnfCmCDcqe6aYGFqlDTRKg80p4wg35L+j83QQ63iOlKRccEkbn8IuM++HsgEjA==", "license": "MIT", "dependencies": { "slice-ansi": "^9.0.0", @@ -12217,22 +12225,19 @@ } }, "node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", "license": "MIT", "engines": { - "node": ">= 12" + "node": ">=20" } }, "node_modules/common-ancestor-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-2.0.0.tgz", - "integrity": "sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">= 18" - } + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", + "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", + "license": "ISC" }, "node_modules/compute-scroll-into-view": { "version": "2.0.4", @@ -12282,16 +12287,12 @@ } }, "node_modules/cookie": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", - "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "license": "MIT", "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "node": ">= 0.6" } }, "node_modules/cookie-es": { @@ -12327,9 +12328,9 @@ } }, "node_modules/crelt": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.7.tgz", - "integrity": "sha512-aK6BbWfhf4U/wCcLHKPJl/xa6VkVstRaPywWtMKGwuOLc/wZTyQYuoxgvZnNsBvv7Kg3YTBQYYBCggcviQczuA==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", + "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", "license": "MIT" }, "node_modules/cross-spawn": { @@ -12777,6 +12778,7 @@ "version": "8.0.4", "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.4.tgz", "integrity": "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==", + "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" @@ -13033,9 +13035,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.389", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.389.tgz", - "integrity": "sha512-cEto7aeOqBfU1D+c5py5pE+ooscKE75JifxLBdFUZsqAxRS6y7kebtxAZvICszSl05gPjYHDTjY+lXpyGvpJbg==", + "version": "1.5.378", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.378.tgz", + "integrity": "sha512-VinvOAuuPmdD1guEgGv5f2Qp7/vlfqOrUOMYNnOD4wj3pit8kRsQHzfIf6teyUGWo15Tg5+bOJaRunvyltpVWQ==", "license": "ISC" }, "node_modules/emmet": { @@ -13079,9 +13081,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.21.6", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.6.tgz", - "integrity": "sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ==", + "version": "5.24.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.1.tgz", + "integrity": "sha512-7DdUaTjmNwMcH2gLr1qycesKII3BK4RLy/mdAb7x10Lq7bR4aNKHt1BR1ZALSv0rPM/hF5wYF0PhGop/rJm8vw==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", @@ -13092,9 +13094,9 @@ } }, "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -13152,9 +13154,9 @@ } }, "node_modules/es-module-lexer": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.0.tgz", - "integrity": "sha512-KLdwQm2NvGLDkQDCGvmiQrhkd0JbMzXthwQAUgWjQuQdBLFa3eiBP5arXZyA+f8x+x7OXgud6bq2rxjGtHV2tw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", + "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", "license": "MIT" }, "node_modules/es-object-atoms": { @@ -13170,9 +13172,9 @@ } }, "node_modules/es-toolkit": { - "version": "1.49.0", - "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.49.0.tgz", - "integrity": "sha512-G5iZ6Pc/FNRY/soKZHC+TxGDD83rHUDXxzaWhGCX44vAv/tMs56WMusnm/KMNK+luUPsgA9U28cGr4RDlSzL2g==", + "version": "1.47.0", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.47.0.tgz", + "integrity": "sha512-n1GuoD0WEQZMBk5tttoZSqwgyLx01oqa5XsBmCHwPyNe1S9jPBEmtR2pSgp2kJuWE3ciFZ6yRHmY4pM4C3OOkw==", "license": "MIT", "workspaces": [ "docs", @@ -13423,10 +13425,13 @@ } }, "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "license": "MIT" + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } }, "node_modules/etag": { "version": "1.8.1", @@ -13675,9 +13680,9 @@ } }, "node_modules/fast-uri": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.3.tgz", - "integrity": "sha512-i70LwGWUduXqzicKXWshooq+sWL1K3WUU5rKZNG/0i3a1OSoX3HqhH5WbWwTmqWfor4urUakGPiRQcleRZTwOg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", "funding": [ { "type": "github", @@ -13700,9 +13705,9 @@ } }, "node_modules/fast-xml-builder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.3.0.tgz", - "integrity": "sha512-F74cZEdCvuw9P41GAC3rod4X04jjWGM1JPEv/GWSqFTWLsdyMSBMBMlm9Hk3GLBgLBbdBNY8yee0pQh2RBVESQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.2.0.tgz", + "integrity": "sha512-00aAWieqff+ZJhsXA4g1g7M8k+7AYoMUUHF+/zFb5U6Uv/P0Vl4QZo84/IcufzYalLuEj9928bXN9PbbFzMF0Q==", "funding": [ { "type": "github", @@ -13711,8 +13716,8 @@ ], "license": "MIT", "dependencies": { - "path-expression-matcher": "^1.6.2", - "xml-naming": "^0.3.0" + "path-expression-matcher": "^1.5.0", + "xml-naming": "^0.1.0" } }, "node_modules/fastq": { @@ -13859,9 +13864,9 @@ "license": "Unlicense" }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "hasInstallScript": true, "license": "MIT", "optional": true, @@ -13958,12 +13963,15 @@ } }, "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -14028,9 +14036,9 @@ "license": "BSD-2-Clause" }, "node_modules/globby": { - "version": "16.2.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-16.2.1.tgz", - "integrity": "sha512-JmsqJalahxxgW8V2ecSQ2G7UjPlI9cpKdrkG9KoNiXhd/YslXOTEB0cViENWUznuovIuNT+FkMbraDGjr4FCUg==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-16.2.0.tgz", + "integrity": "sha512-QrJia2qDf5BB/V6HYlDTs0I0lBahyjLzpGQg3KT7FnCdTonAyPy2RtY802m2k4ALx6Dp752f82WsOczEVr3l6Q==", "license": "MIT", "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", @@ -14557,9 +14565,9 @@ } }, "node_modules/hono": { - "version": "4.12.30", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.30.tgz", - "integrity": "sha512-emn+JoJjrN9YTpRDS5it/UI2SO9BAE37T6I3d963RxcZ81G9A4pr2SZTEiiaiKbzx+NKRg5BZ89fCL7gCJCUog==", + "version": "4.12.23", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.23.tgz", + "integrity": "sha512-eIaZ9qDgu7XV0pxOCrg7/WhnQ6Ivm22UcxhXx/A3dcbqbbYgBEkc6e/J/s7j2tS96zoB0S9VBdLwQNCWwUo4LA==", "license": "MIT", "engines": { "node": ">=16.9.0" @@ -14707,9 +14715,9 @@ } }, "node_modules/iconv-lite": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz", - "integrity": "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -14735,9 +14743,9 @@ } }, "node_modules/ignore": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.6.tgz", - "integrity": "sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "license": "MIT", "engines": { "node": ">= 4" @@ -14783,9 +14791,9 @@ "license": "ISC" }, "node_modules/ink": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/ink/-/ink-7.1.0.tgz", - "integrity": "sha512-VWE6/yeLtFCJBNLflyI2OSylyXK1Rc24LuXup8Qt+icwkmmycFNdbn8IkSp6Frc0h1iA0NOvvi1ajW44U/w3Qg==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ink/-/ink-7.0.5.tgz", + "integrity": "sha512-zWNjGHQPxSeiSAmDUOq+QPQ6CfmMhmNi85vrJIuy4prafKKUSoZlXEy4wbM7LuLuF1pDURk7qvF4fxrQlLxv3w==", "license": "MIT", "dependencies": { "@alcalzone/ansi-tokenize": "^0.3.0", @@ -14924,15 +14932,15 @@ } }, "node_modules/is-docker": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-4.0.0.tgz", - "integrity": "sha512-LHE+wROyG/Y/0ZnbktRCoTix2c1RhgWaZraMZ8o1Q7zCh0VSrICJQO5oqIIISrcSBtrXv0o233w1IYwsWCjTzA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "license": "MIT", "bin": { "is-docker": "cli.js" }, "engines": { - "node": ">=20" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -15093,18 +15101,15 @@ } }, "node_modules/is-wsl": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", - "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "license": "MIT", "dependencies": { - "is-inside-container": "^1.0.0" + "is-docker": "^2.0.0" }, "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/isbinaryfile": { @@ -15178,6 +15183,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", + "dev": true, "funding": [ { "type": "github", @@ -15236,9 +15242,9 @@ "license": "BSD-2-Clause" }, "node_modules/json-with-bigint": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/json-with-bigint/-/json-with-bigint-3.5.10.tgz", - "integrity": "sha512-Vcx+JVNEBts/xfcoCS69sKrOhOk/3TVlvlT+XzUOefVKnnrbYSCKpDCm10pohsJFtsJVYnwa/cXRZ4eElzaM6w==", + "version": "3.5.8", + "resolved": "https://registry.npmjs.org/json-with-bigint/-/json-with-bigint-3.5.8.tgz", + "integrity": "sha512-eq/4KP6K34kwa7TcFdtvnftvHCD9KvHOGGICWwMFc4dOOKF5t4iYqnfLK8otCRCRv06FXOzGGyqE8h8ElMvvdw==", "license": "MIT" }, "node_modules/json5": { @@ -15254,9 +15260,9 @@ } }, "node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.1.tgz", + "integrity": "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==", "license": "MIT" }, "node_modules/katex": { @@ -15331,18 +15337,18 @@ } }, "node_modules/libsodium": { - "version": "0.7.16", - "resolved": "https://registry.npmjs.org/libsodium/-/libsodium-0.7.16.tgz", - "integrity": "sha512-3HrzSPuzm6Yt9aTYCDxYEG8x8/6C0+ag655Y7rhhWZM9PT4NpdnbqlzXhGZlDnkgR6MeSTnOt/VIyHLs9aSf+Q==", + "version": "0.7.15", + "resolved": "https://registry.npmjs.org/libsodium/-/libsodium-0.7.15.tgz", + "integrity": "sha512-sZwRknt/tUpE2AwzHq3jEyUU5uvIZHtSssktXq7owd++3CSgn8RGrv6UZJJBpP7+iBghBqe7Z06/2M31rI2NKw==", "license": "ISC" }, "node_modules/libsodium-wrappers": { - "version": "0.7.16", - "resolved": "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.16.tgz", - "integrity": "sha512-Gtr/WBx4dKjvRL1pvfwZqu7gO6AfrQ0u9vFL+kXihtHf6NfkROR8pjYWn98MFDI3jN19Ii1ZUfPR9afGiPyfHg==", + "version": "0.7.15", + "resolved": "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.15.tgz", + "integrity": "sha512-E4anqJQwcfiC6+Yrl01C1m8p99wEhLmJSs0VQqST66SbQXXBoaJY0pF4BNjRYa/sOQAxx6lXAaAFIlx+15tXJQ==", "license": "ISC", "dependencies": { - "libsodium": "^0.7.16" + "libsodium": "^0.7.15" } }, "node_modules/lightningcss": { @@ -15648,15 +15654,12 @@ } }, "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "license": "ISC", "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" + "yallist": "^3.0.2" } }, "node_modules/magic-string": { @@ -16996,23 +16999,23 @@ } }, "node_modules/miniflare": { - "version": "4.20260708.1", - "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20260708.1.tgz", - "integrity": "sha512-c94O9zRDISdqO18EHt6l0iF/fWgWt8p18PJvRsA/L/NJZ9Cfke3s/F5Blg1XXF7WDutVRzWVWy8Vy4LaT5ifsA==", + "version": "4.20260426.0", + "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20260426.0.tgz", + "integrity": "sha512-KM+v76d04qT+NsPfVKVQEgnnuLNE3uzCCl2QKMTJ5OXor5JbBm1vpkQwQ+l7o5ELCrZ74RnyKhJKLiJyUA39Tw==", "license": "MIT", "dependencies": { "@cspotcode/source-map-support": "0.8.1", - "sharp": "0.34.5", - "undici": "7.28.0", - "workerd": "1.20260708.1", - "ws": "8.21.0", + "sharp": "^0.34.5", + "undici": "7.24.8", + "workerd": "1.20260426.1", + "ws": "8.18.0", "youch": "4.1.0-beta.10" }, "bin": { "miniflare": "bootstrap.js" }, "engines": { - "node": ">=22.0.0" + "node": ">=18.0.0" } }, "node_modules/miniflare/node_modules/ws": { @@ -17118,9 +17121,9 @@ "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.15", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz", - "integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==", + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", "funding": [ { "type": "github", @@ -17185,9 +17188,9 @@ "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.51", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.51.tgz", - "integrity": "sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==", + "version": "2.0.50", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.50.tgz", + "integrity": "sha512-J6l92tKHX6w8Jy5nO1Vuc01NoIiRGi/d6qBKVxh+IQ8Cr3b6HbVNfKiF8ZpFKufTwpwxMmce2W3iQZ861ZRyTg==", "license": "MIT", "engines": { "node": ">=18" @@ -17406,43 +17409,43 @@ } }, "node_modules/p-limit": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-7.3.0.tgz", - "integrity": "sha512-7cIXg/Z0M5WZRblrsOla88S4wAK+zOQQWeBYfV3qJuJXMr+LnbYjaadrFaS0JILfEDPVqHyKnZ1Z/1d6J9VVUw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-6.2.0.tgz", + "integrity": "sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==", "license": "MIT", "dependencies": { - "yocto-queue": "^1.2.1" + "yocto-queue": "^1.1.1" }, "engines": { - "node": ">=20" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-queue": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-9.3.1.tgz", - "integrity": "sha512-POWdiIPmsUPGwb4FeQ4OBg46aqmcInSWe45CKDsGHiOBiVQM9chqfQTuqhuTzcg2Vz9faTI65at0KkVyVEiCHw==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.1.1.tgz", + "integrity": "sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ==", "license": "MIT", "dependencies": { - "eventemitter3": "^5.0.4", - "p-timeout": "^7.0.0" + "eventemitter3": "^5.0.1", + "p-timeout": "^6.1.2" }, "engines": { - "node": ">=20" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-timeout": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-7.0.1.tgz", - "integrity": "sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg==", + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz", + "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==", "license": "MIT", "engines": { - "node": ">=20" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -17599,9 +17602,9 @@ "license": "MIT" }, "node_modules/path-expression-matcher": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.6.2.tgz", - "integrity": "sha512-enSlaiat05iasnzmgNxRj8reFdj3puY2QpNgP1aPIaVfT6nn9ICuPoFlKHk8EN22HcwewshO+mN2DGbkCEOtqQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.5.0.tgz", + "integrity": "sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ==", "funding": [ { "type": "github", @@ -17654,14 +17657,14 @@ "license": "MIT" }, "node_modules/pg": { - "version": "8.22.0", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.22.0.tgz", - "integrity": "sha512-8wih1vVIBMxoUM2oB4soJsD9tDnDpLv4OXBJ+EJzFsvycD+lfyIreC2gGHq78f8jbLLt+bvlPTFdFZfJkOuzAA==", + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.21.0.tgz", + "integrity": "sha512-AUP1EYJuHraQGsVoCQVIcM7TEJVGtDzxWtGFZd8rds9d+CCXlU5Js1rYgfLNvxy9iJrpHjGrRjoi/3BT9fRyiA==", "license": "MIT", "dependencies": { - "pg-connection-string": "^2.14.0", + "pg-connection-string": "^2.13.0", "pg-pool": "^3.14.0", - "pg-protocol": "^1.15.0", + "pg-protocol": "^1.14.0", "pg-types": "2.2.0", "pgpass": "1.0.5" }, @@ -17688,9 +17691,9 @@ "optional": true }, "node_modules/pg-connection-string": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.14.0.tgz", - "integrity": "sha512-XwWDGcLRGCXAR8F/AM5bG7Q+A3Wm2s6QeEjlOKZLlH3UYcguiqCWKyWXVag5TLTIjR7oOJUY8kcADaZgWPyLeg==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.13.0.tgz", + "integrity": "sha512-EMnU9E2fSULdsbErBbMaXJvFeD9B4+nPcM3f+4lsiCR0BHLPrLVjv3DbyM2hgQQviKJaTWIRRTjKjWlHg3p2ig==", "license": "MIT" }, "node_modules/pg-int8": { @@ -17712,9 +17715,9 @@ } }, "node_modules/pg-protocol": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.15.0.tgz", - "integrity": "sha512-cq9sECI5s0+uPUXjbz8ioyPJni6RzsRib0US67i5IoTZKw8fNeYlVE7u8F4dG7vEJJtc5wdD1K189lCCUwqWTQ==", + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.14.0.tgz", + "integrity": "sha512-n5taZ1kO3s9ngDTVxsEznOqCyToTgz0FLuPq0B33COy5pPpuWJpY3/2oRBVETuOgzdqRXfWpM9HIhp2LBBT1BA==", "license": "MIT" }, "node_modules/pg-types": { @@ -17755,12 +17758,12 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", - "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "license": "MIT", "engines": { - "node": ">=12" + "node": ">=8.6" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" @@ -17815,9 +17818,9 @@ } }, "node_modules/postcss": { - "version": "8.5.17", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.17.tgz", - "integrity": "sha512-J7EF+8X+CzRPaJPOv9Ck2wNWJvGnnl3PcNPAdGg6GTLjyVpyQ0yATMSXRFRV01BviT/9Gwuc3rjEyJbDJG9a4w==", + "version": "8.5.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.16.tgz", + "integrity": "sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==", "funding": [ { "type": "opencollective", @@ -18109,13 +18112,12 @@ } }, "node_modules/qs": { - "version": "6.15.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", - "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", + "version": "6.15.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz", + "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==", "license": "BSD-3-Clause", "dependencies": { - "es-define-property": "^1.0.1", - "side-channel": "^1.1.1" + "side-channel": "^1.1.0" }, "engines": { "node": ">=0.6" @@ -18168,16 +18170,12 @@ } }, "node_modules/range-parser": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.3.0.tgz", - "integrity": "sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "license": "MIT", "engines": { "node": ">= 0.6" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" } }, "node_modules/raw-body": { @@ -18233,9 +18231,9 @@ } }, "node_modules/react-hook-form": { - "version": "7.81.0", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.81.0.tgz", - "integrity": "sha512-ocbmr2p5KBMoAfj4WCUvped33lVi1Kd5DuDUvQDnB6VEAacOjPI/jMbtDdbhco4y9ct4xUuCmMY0b/C9L0QHjw==", + "version": "7.78.0", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.78.0.tgz", + "integrity": "sha512-EEZqc+N23moyzTlz61Pj+JvcXo76ICkpfOZo8JZw+sM4+wLQGh6nI2Ms+PdMOYNluFu0ghlM7B8mCzhRYtJCnA==", "license": "MIT", "engines": { "node": ">=18.0.0" @@ -18252,6 +18250,7 @@ "version": "19.2.7", "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.7.tgz", "integrity": "sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A==", + "dev": true, "license": "MIT", "peer": true }, @@ -18796,20 +18795,19 @@ } }, "node_modules/repomix": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/repomix/-/repomix-1.16.1.tgz", - "integrity": "sha512-xOcuPTo6KstKWxL08wQ5m3PQP0MyHzVU8vsAgsAq4LGAx64nNDhKVZXVdxmFiG2CqiYRqJqhwMoVBkWA32FSow==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/repomix/-/repomix-1.14.1.tgz", + "integrity": "sha512-RQKku9nASd7LGyUVhj2Z1B4/ro6R2NcExF+bqjmLtsqDd6MdM4ltdM1nFaY+q2UWHn6pQXNBqHlx7VyRrW0MKA==", "license": "MIT", "dependencies": { "@clack/prompts": "^0.11.0", "@modelcontextprotocol/sdk": "^1.29.0", "@repomix/strip-comments": "^2.4.2", "@repomix/tree-sitter-wasms": "^0.1.17", - "@secretlint/core": "^13.0.2", - "@secretlint/secretlint-rule-preset-recommend": "^13.0.2", - "chokidar": "^5.0.0", - "commander": "^15.0.0", - "fast-xml-builder": "^1.2.1", + "@secretlint/core": "^11.7.1", + "@secretlint/secretlint-rule-preset-recommend": "^11.7.1", + "commander": "^14.0.3", + "fast-xml-builder": "^1.2.0", "git-url-parse": "^16.1.0", "globby": "^16.2.0", "gpt-tokenizer": "^3.4.0", @@ -18823,11 +18821,11 @@ "minimatch": "^10.2.5", "picocolors": "^1.1.1", "picospinner": "^3.0.0", - "tar": "^7.5.19", - "tinyclip": "^0.1.15", + "tar": "^7.5.15", + "tinyclip": "^0.1.12", "tinypool": "^2.1.0", - "valibot": "^1.4.2", - "web-tree-sitter": "^0.26.10", + "valibot": "^1.4.0", + "web-tree-sitter": "^0.26.8", "zod": "^4.4.3" }, "bin": { @@ -19255,13 +19253,10 @@ } }, "node_modules/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.2.tgz", + "integrity": "sha512-c8jsqUZm3omBOI66G90z1Dyw5z622G8oLG+omfsHBJf3CWQTlOcwOjvOG6wtiNfW6anKm/eA39LMwMtMez2TiQ==", "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -19414,14 +19409,14 @@ } }, "node_modules/side-channel": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", - "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "object-inspect": "^1.13.4", - "side-channel-list": "^1.0.1", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" }, @@ -19569,16 +19564,12 @@ } }, "node_modules/source-map": { - "version": "0.8.0-beta.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", - "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", - "deprecated": "The work that was done in this beta branch won't be included in future versions", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "license": "BSD-3-Clause", - "dependencies": { - "whatwg-url": "^7.0.0" - }, "engines": { - "node": ">= 8" + "node": ">=0.10.0" } }, "node_modules/source-map-js": { @@ -19683,9 +19674,9 @@ "license": "MIT" }, "node_modules/string-width": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz", - "integrity": "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==", + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.1.tgz", + "integrity": "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==", "license": "MIT", "dependencies": { "get-east-asian-width": "^1.5.0", @@ -19786,15 +19777,12 @@ } }, "node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz", + "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==", "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/chalk/supports-color?sponsor=1" @@ -19835,9 +19823,9 @@ } }, "node_modules/tabbable": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.5.0.tgz", - "integrity": "sha512-wieBHXygIm7OyQOu5hQlkk62/WyCFYGlWg7L6/ZCUZwx0o398Zkn4pVmMyfYhfMG8kGrj/Krt8eIk6UKC6VzwA==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.4.0.tgz", + "integrity": "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==", "license": "MIT" }, "node_modules/tagged-tag": { @@ -19909,9 +19897,9 @@ } }, "node_modules/terser": { - "version": "5.49.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.49.0.tgz", - "integrity": "sha512-SNiDnXyHSrxVcIOtVbULzcTmniUiwcV7Nwdyj1twVubeTmbjoa8p69KKDpfkdoOavuM4/GRm1+ykI8qqnavHoA==", + "version": "5.48.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.48.0.tgz", + "integrity": "sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q==", "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -20012,9 +20000,9 @@ "license": "MIT" }, "node_modules/tinyclip": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/tinyclip/-/tinyclip-0.1.15.tgz", - "integrity": "sha512-uo33abH+Ays0xYaDysoBt494Hb3hsEczMpcC0MwFl773pazORx4fmvKhclhR1wonUbB6vvpRsvVMwnhfqeMc+A==", + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/tinyclip/-/tinyclip-0.1.14.tgz", + "integrity": "sha512-F1oWdz8tjT17qe1d5JgDK6z03WGOhYYAN0lK3/D/fzNiy93xswLLEw7pk+3g05onhAy6Bsc6PLNUGhdgVjemMQ==", "license": "MIT", "engines": { "node": "^16.14.0 || >= 17.3.0" @@ -20076,9 +20064,9 @@ } }, "node_modules/toad-cache": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.4.tgz", - "integrity": "sha512-m1TdR/rvT7kgGJZhspNtXdsdYk0fddFpJJFlG5s+UkPFo6lkLoZ3YLOaovPYjq1R75NP5JfeTlSHaOsE09peCg==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.1.tgz", + "integrity": "sha512-5DXWzE4Vz7xNHsv+xQ+MGfJYyC78Aok3tEr0MNwHoRf7vZnga1mQXZ4/Nsodld4VR6Wd+VhfmqnNrsRJyYPfrQ==", "license": "MIT", "engines": { "node": ">=20" @@ -20150,9 +20138,9 @@ "license": "0BSD" }, "node_modules/tsx": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.0.tgz", - "integrity": "sha512-eUdUIaCr963q2h5u3+QwvYp0+eqPvn+egeqZUm0hwERCqqx1E3kK5ehbGCvqSE5MQAULr67ww0cA3jKc3YkM1w==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.22.4.tgz", + "integrity": "sha512-X8EX+XV4QR5xCsrgxaED954zTDfY8KqlDtskKEL0cHhyS/P8b4IFOvGDQpsC9Q1XnLq915wEfwwY/zzskCtmhg==", "license": "MIT", "dependencies": { "esbuild": "~0.28.0" @@ -20182,9 +20170,9 @@ } }, "node_modules/type-fest": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.8.0.tgz", - "integrity": "sha512-YGYEVz3Fm5iy/AybuA0oyNFq7H4CgQNfRp/qfe8nurE1kuCeNm3/vfm9X4Mtl+qLyaKJUh5xrFZwogr41SMjYA==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.7.0.tgz", + "integrity": "sha512-1URUxUqfHFM1c+zfSPsa3gnkO7Aq21qyH75SIduNYz4SzY964rn1X2vCMQaHSHhktiw+0kPa2iyb6PUpXqB6Vg==", "license": "(MIT OR CC0-1.0)", "dependencies": { "tagged-tag": "^1.0.0" @@ -20274,9 +20262,9 @@ "license": "MIT" }, "node_modules/undici": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.28.0.tgz", - "integrity": "sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.8.tgz", + "integrity": "sha512-6KQ/+QxK49Z/p3HO6E5ZCZWNnCasyZLa5ExaVYyvPxUwKtbCPMKELJOqh7EqOle0t9cH/7d2TaaTRRa6Nhs4YQ==", "license": "MIT", "engines": { "node": ">=20.18.1" @@ -20764,9 +20752,9 @@ } }, "node_modules/valibot": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/valibot/-/valibot-1.4.2.tgz", - "integrity": "sha512-gjdCvJ6d3RyHAneqxMYMW9QMCwYMb3jpOO0IyHZV1bnRHFBHrX3VkIILt5XYR0WhwHiH7Mty8ovuPZ/O3gamrg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/valibot/-/valibot-1.4.1.tgz", + "integrity": "sha512-klCmFTz2jeDluy9RwX+F884TCiogtdBJ/YaxSx1EOBYXa3NXNWj8kR1jjN8rzluwojJVWWaHJ4r1U5LfICnM3g==", "license": "MIT", "peerDependencies": { "typescript": ">=5" @@ -20852,22 +20840,23 @@ } }, "node_modules/vite": { - "version": "8.1.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.4.tgz", - "integrity": "sha512-bTT9PsdWO+MQMNG9ZXIP/qM9wGh37DFxTV/sPq9cFpHr3w4jkgef032PkAL9jAqhk3Nz8NQw3O8n6/xFkqO4QQ==", + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.3.tgz", + "integrity": "sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==", "license": "MIT", "dependencies": { - "lightningcss": "^1.32.0", - "picomatch": "^4.0.5", - "postcss": "^8.5.16", - "rolldown": "~1.1.4", - "tinyglobby": "^0.2.17" + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -20876,15 +20865,14 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.3.0", - "esbuild": "^0.27.0 || ^0.28.0", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", - "less": "^4.0.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" @@ -20893,18 +20881,15 @@ "@types/node": { "optional": true }, - "@vitejs/devtools": { - "optional": true - }, - "esbuild": { - "optional": true - }, "jiti": { "optional": true }, "less": { "optional": true }, + "lightningcss": { + "optional": true + }, "sass": { "optional": true }, @@ -21266,12 +21251,12 @@ } }, "node_modules/vscode-languageserver-protocol": { - "version": "3.18.2", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.18.2.tgz", - "integrity": "sha512-XRyDbT0Pp3sSNti3JmxVEUMySWCSi1hhM+/KUlCy1hV1zmrqpM1OwO12EAki8blhmLuIMpaJrYbo0OzGVfK2Qg==", + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.18.0.tgz", + "integrity": "sha512-Zdz+kJ12Iz6tc11xfZyEo501bBATHXrCjmMfnaR3pMnf1CoqZBKIynba3P+/bi9VEdrMbNtAVKYpKhbODvqy+Q==", "license": "MIT", "dependencies": { - "vscode-jsonrpc": "9.0.1", + "vscode-jsonrpc": "9.0.0", "vscode-languageserver-types": "3.18.0" } }, @@ -21362,9 +21347,9 @@ } }, "node_modules/web-tree-sitter": { - "version": "0.26.11", - "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.26.11.tgz", - "integrity": "sha512-Q5Dm3YTIXSXuH6FxX6RuzX2Qwpc4DPGiYMU87Wg5Z8OIStiQFiUex4zMDc0vBTw78EphaYJacncJghCHzbZptg==", + "version": "0.26.9", + "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.26.9.tgz", + "integrity": "sha512-YJwSHANl6XFgeEjB8nitgj0qZYt5gkIesJ4w2srS2wcLB4GUa4xcOkM0YaMsU6WNR53YVIkDSY7Ej4pf3IXtCA==", "license": "MIT" }, "node_modules/webidl-conversions": { @@ -21422,9 +21407,9 @@ } }, "node_modules/webpack-sources": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.5.1.tgz", - "integrity": "sha512-jyuiGJdtvY434z5bUZrjz67v76/ePNvFZTp9Mdz29IlH4+GPsgyGjiv0fKI+M7BdkU6ADjulUcKAd3tUK3WlEw==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.5.0.tgz", + "integrity": "sha512-HPuy+uuoTCaaoEoI1LQ3JN9+vrPBvEesnnX1jADHy728cHSMlq4wUc4afYqahq2B1mhQVZxCXOkNTnXltr+2vQ==", "license": "MIT", "engines": { "node": ">=10.13.0" @@ -21524,9 +21509,9 @@ "license": "MIT" }, "node_modules/workerd": { - "version": "1.20260708.1", - "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20260708.1.tgz", - "integrity": "sha512-WAK+Kt/VVCSldH2qSr8lx46XCJ4Q+bdlHNaFqUtOHthBEIB8C1N8HVW+VOLrxDoTCk0NGNv0zajnBeQK4JOB9w==", + "version": "1.20260426.1", + "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20260426.1.tgz", + "integrity": "sha512-ELvGgN8c9oo+E6EPyecxk1TEf6/eAK4TxxQTW5mQ87C7jbjCzhMbg0P2ije49UBHV0dkBYPJcJvcklUltipl2A==", "hasInstallScript": true, "license": "Apache-2.0", "bin": { @@ -21536,41 +21521,40 @@ "node": ">=16" }, "optionalDependencies": { - "@cloudflare/workerd-darwin-64": "1.20260708.1", - "@cloudflare/workerd-darwin-arm64": "1.20260708.1", - "@cloudflare/workerd-linux-64": "1.20260708.1", - "@cloudflare/workerd-linux-arm64": "1.20260708.1", - "@cloudflare/workerd-windows-64": "1.20260708.1" + "@cloudflare/workerd-darwin-64": "1.20260426.1", + "@cloudflare/workerd-darwin-arm64": "1.20260426.1", + "@cloudflare/workerd-linux-64": "1.20260426.1", + "@cloudflare/workerd-linux-arm64": "1.20260426.1", + "@cloudflare/workerd-windows-64": "1.20260426.1" } }, "node_modules/wrangler": { - "version": "4.110.0", - "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.110.0.tgz", - "integrity": "sha512-xZeXKYi7hxQRF5anL+v77RkufJNpF9f3Eqeyqq2QBsETpLZgh0Agj0jJ6JPtkbgn6ukZdh8OK5egsGPWIditgg==", + "version": "4.86.0", + "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.86.0.tgz", + "integrity": "sha512-9aa/gbF/HiUeeUEwyQpW5LDPBEzyt7iaE6xHwm0vk2Ly8A6J+jh03pzchqVnCCWR832mNyA28MD8oAYt0Kfvlw==", "license": "MIT OR Apache-2.0", "dependencies": { - "@cloudflare/kv-asset-handler": "0.5.0", + "@cloudflare/kv-asset-handler": "0.4.2", "@cloudflare/unenv-preset": "2.16.1", "blake3-wasm": "2.1.5", - "esbuild": "0.28.1", - "miniflare": "4.20260708.1", + "esbuild": "0.27.3", + "miniflare": "4.20260426.0", "path-to-regexp": "6.3.0", "unenv": "2.0.0-rc.24", - "workerd": "1.20260708.1" + "workerd": "1.20260426.1" }, "bin": { - "cf-wrangler": "bin/cf-wrangler.js", "wrangler": "bin/wrangler.js", "wrangler2": "bin/wrangler.js" }, "engines": { - "node": ">=22.0.0" + "node": ">=20.3.0" }, "optionalDependencies": { - "fsevents": "2.3.3" + "fsevents": "~2.3.2" }, "peerDependencies": { - "@cloudflare/workers-types": "^5.20260708.1" + "@cloudflare/workers-types": "^4.20260426.1" }, "peerDependenciesMeta": { "@cloudflare/workers-types": { @@ -21622,9 +21606,9 @@ "license": "ISC" }, "node_modules/ws": { - "version": "8.20.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.1.tgz", - "integrity": "sha512-It4dO0K5v//JtTXuPkfEOaI3uUN87iYPnqo/ZzqCoG3g8uhA66QUMs/SrM0YK7/NAu+r4LMh/9dq2A7k+rHs+w==", + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -21643,9 +21627,9 @@ } }, "node_modules/xml-naming": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.3.0.tgz", - "integrity": "sha512-ghig2TBE/H11aOVgmahA3MhimvkBr6JIYknH/Dhdk10nXwdbIqBJsbfMxpvFPG8bAw77gN29aQWvKpmVoPlvPQ==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.1.0.tgz", + "integrity": "sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw==", "funding": [ { "type": "github", @@ -21682,10 +21666,13 @@ } }, "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } }, "node_modules/yaml": { "version": "2.9.0", @@ -21765,12 +21752,12 @@ } }, "node_modules/yargs-parser": { - "version": "22.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", - "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "license": "ISC", "engines": { - "node": "^20.19.0 || ^22.12.0 || >=23" + "node": ">=12" } }, "node_modules/yargs/node_modules/ansi-regex": { @@ -21923,9 +21910,9 @@ } }, "node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" diff --git a/package.json b/package.json index f5e72a23..75228d6f 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#a6ca05d78dedd49c14eff49b03b69428d2ddf556", - "@treeseed/sdk": "github:treeseed-ai/sdk#ce62ff867f12b5398020ca77e424936f4a38a63a", + "@treeseed/core": "github:treeseed-ai/core#cf54b1c0312f950d291d74cee733f09e651e4ea6", + "@treeseed/sdk": "github:treeseed-ai/sdk#de8d6fa197167bdd4ec743986ff2d08dc2fa1ed1", "@treeseed/ui": "github:treeseed-ai/ui#2938d0959dcb2aaa97bbced633e6f75df83db90c", "react": "^19.2.5", "react-dom": "^19.2.6" From 65547a5e3f46ec49dfcf395cb0bfc52828542524 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Thu, 6 Aug 2026 10:54:43 -0400 Subject: [PATCH 080/315] build(build): resolve atomic consumer locks from local package commits Intent: - Save hint: resolve atomic consumer locks from local package commits Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.staging.20260804T171053Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#de8d6fa197167bdd4ec743986ff2d08dc2fa1ed1 -> github:treeseed-ai/sdk#2a8bc4722d887d9360128d855885a424483a2074 - dependencies.@treeseed/core: github:treeseed-ai/core#cf54b1c0312f950d291d74cee733f09e651e4ea6 -> github:treeseed-ai/core#08a3b9bc6d5354eccf5c491a5dfab37bca505f33 --- package-lock.json | 4820 ++++++++++++++++++++++++++++----------------- package.json | 4 +- 2 files changed, 2973 insertions(+), 1851 deletions(-) diff --git a/package-lock.json b/package-lock.json index b33e916b..7da35a36 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#cf54b1c0312f950d291d74cee733f09e651e4ea6", - "@treeseed/sdk": "github:treeseed-ai/sdk#de8d6fa197167bdd4ec743986ff2d08dc2fa1ed1", + "@treeseed/core": "github:treeseed-ai/core#08a3b9bc6d5354eccf5c491a5dfab37bca505f33", + "@treeseed/sdk": "github:treeseed-ai/sdk#2a8bc4722d887d9360128d855885a424483a2074", "@treeseed/ui": "github:treeseed-ai/ui#2938d0959dcb2aaa97bbced633e6f75df83db90c", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -47,15 +47,15 @@ } }, "node_modules/@astrojs/check": { - "version": "0.9.9", - "resolved": "https://registry.npmjs.org/@astrojs/check/-/check-0.9.9.tgz", - "integrity": "sha512-A5UW8uIuErLWEoRQvzgXpO1gTjUFtK8r7nU2Z7GewAMxUb7bPvpk11qaKKgxqXlHJWlAvaaxy+Xg28A6bmQ1Tg==", + "version": "0.9.10", + "resolved": "https://registry.npmjs.org/@astrojs/check/-/check-0.9.10.tgz", + "integrity": "sha512-zgx/UQMozdjOa3bOxjgeCFdtpE3c9rRX6xHwa+2QXvy8z8Akifu2AtubHyv/zzC2znO8dl8fFWL4K+Ba9kS8HQ==", "license": "MIT", "dependencies": { "@astrojs/language-server": "^2.16.7", "chokidar": "^4.0.3", "kleur": "^4.1.5", - "yargs": "^17.7.2" + "yargs": "^18.0.0" }, "bin": { "astro-check": "bin/astro-check.js" @@ -77,9 +77,9 @@ "license": "MIT" }, "node_modules/@astrojs/language-server": { - "version": "2.16.11", - "resolved": "https://registry.npmjs.org/@astrojs/language-server/-/language-server-2.16.11.tgz", - "integrity": "sha512-sJ/EfnFp0+gurTrkvONtd9qRqmMZLT9bHelfI1SA35CaQVTrRrA74qteOcNT/al1b9Atg3IiH1Jk/qfckyC+fg==", + "version": "2.16.13", + "resolved": "https://registry.npmjs.org/@astrojs/language-server/-/language-server-2.16.13.tgz", + "integrity": "sha512-ekOa+CYprEq5n4EJC1qTIAhLk49HZIUQuFwrEuF+3JK/pdMaYnWoREFUI2A0KEPOJiFA2kamBzKzbYljDvUxLg==", "license": "MIT", "dependencies": { "@astrojs/compiler": "^2.13.1", @@ -770,17 +770,15 @@ } }, "node_modules/@astrojs/telemetry": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.3.0.tgz", - "integrity": "sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.3.2.tgz", + "integrity": "sha512-j8DNruA8ors99Al39RYZPJK4DC1bKkoNm93mAMuBhY9TCNC4R8n1q7ovFnJ5qhGh5Lsh7pa1gpQVpYpsJPeTHQ==", "license": "MIT", "dependencies": { - "ci-info": "^4.2.0", - "debug": "^4.4.0", - "dlv": "^1.1.3", + "ci-info": "^4.4.0", "dset": "^3.1.4", - "is-docker": "^3.0.0", - "is-wsl": "^3.1.0", + "is-docker": "^4.0.0", + "is-wsl": "^3.1.1", "which-pm-runs": "^1.1.0" }, "engines": { @@ -865,13 +863,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", - "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.7", - "@babel/types": "^7.29.7", + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -1009,12 +1007,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", - "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", "license": "MIT", "dependencies": { - "@babel/types": "^7.29.7" + "@babel/types": "^7.29.8" }, "bin": { "parser": "bin/babel-parser.js" @@ -1077,17 +1075,17 @@ } }, "node_modules/@babel/traverse": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", - "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.7", + "@babel/generator": "^7.29.8", "@babel/helper-globals": "^7.29.7", - "@babel/parser": "^7.29.7", + "@babel/parser": "^7.29.8", "@babel/template": "^7.29.7", - "@babel/types": "^7.29.7", + "@babel/types": "^7.29.8", "debug": "^4.3.1" }, "engines": { @@ -1095,9 +1093,9 @@ } }, "node_modules/@babel/types": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", - "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.29.7", @@ -1120,33 +1118,40 @@ } }, "node_modules/@clack/core": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@clack/core/-/core-0.5.0.tgz", - "integrity": "sha512-p3y0FIOwaYRUPRcMO7+dlmLh8PSRcrjuTndsiA0WAFbWES0mLZlrjVoBRZ9DzkPFJZG6KGkJmoEAY0ZcVWTkow==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@clack/core/-/core-1.4.3.tgz", + "integrity": "sha512-/kr3UWNtdJfxZtPgDqUOmG2pvwlmcLGheex5yiZKdwbzZJxhV+HMNR9QNmyY5cGwTNV6LrR7Jtp+KjhUAP1qBQ==", "license": "MIT", "dependencies": { - "picocolors": "^1.0.0", + "fast-wrap-ansi": "^0.2.0", "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 20.12.0" } }, "node_modules/@clack/prompts": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-0.11.0.tgz", - "integrity": "sha512-pMN5FcrEw9hUkZA4f+zLlzivQSeQf5dRGJjSUbvVYDLvpKCdQx5OaknvKzgbtXOizhP+SJJJjqEbOe55uKKfAw==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-1.7.0.tgz", + "integrity": "sha512-y7/yvZ2TPAnR9+jnc00klvNNLkJiXFFrQA/hlLCcxA9a2A4zQIOimyFQ9XfwYKiGD1fb5GY8vbKIIgO8d5Tb2A==", "license": "MIT", "dependencies": { - "@clack/core": "0.5.0", - "picocolors": "^1.0.0", + "@clack/core": "1.4.3", + "fast-string-width": "^3.0.2", + "fast-wrap-ansi": "^0.2.0", "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 20.12.0" } }, "node_modules/@cloudflare/kv-asset-handler": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.4.2.tgz", - "integrity": "sha512-SIOD2DxrRRwQ+jgzlXCqoEFiKOFqaPjhnNTGKXSRLvp1HiOvapLaFG2kEr9dYQTYe8rKrd9uvDUzmAITeNyaHQ==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.5.0.tgz", + "integrity": "sha512-jxQYkj8dSIzc0cD6cMMNdOc1UVjqSqu8BZdor5s8cGjW2I8BjODt/kWPVdY+u9zj3ms75Q5qaZgnxUad83+eAg==", "license": "MIT OR Apache-2.0", "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" } }, "node_modules/@cloudflare/unenv-preset": { @@ -1165,9 +1170,9 @@ } }, "node_modules/@cloudflare/workerd-darwin-64": { - "version": "1.20260426.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20260426.1.tgz", - "integrity": "sha512-Ch7DqsmYzSQRTY87pZpsGsFVz9VVBnLPnCBOHxKt1HH25a7oMu1w1PbPWqVmE0VerCLsj/TScX7Ob3v6E14TZw==", + "version": "1.20260801.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20260801.1.tgz", + "integrity": "sha512-wuJWbXpKvncJi1P0GKS+iYpN5tHdb7JPJJ/+6ZQe8zzovHHVMkLJPNBsgWpqeUhpM3g9qTwEKd2rglNKejuh5A==", "cpu": [ "x64" ], @@ -1181,9 +1186,9 @@ } }, "node_modules/@cloudflare/workerd-darwin-arm64": { - "version": "1.20260426.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20260426.1.tgz", - "integrity": "sha512-0m0U8vaPRH25SpKjbSyRql6gmPe4rCsETRV2WW0qBnuMdKNr5Vh5/Uez80xVrfiCCRMTULGeg63Nqg2vg6CDOA==", + "version": "1.20260801.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20260801.1.tgz", + "integrity": "sha512-kwoZiTpnhNrF3+APx84Q/oAqvJ3sU9yefGagwm/ASaH/2W19x0vghkW/r4qCoHCK0WW7EPugZ+aXjgPMRtlq1Q==", "cpu": [ "arm64" ], @@ -1197,9 +1202,9 @@ } }, "node_modules/@cloudflare/workerd-linux-64": { - "version": "1.20260426.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20260426.1.tgz", - "integrity": "sha512-C8LlC8uSYzg49y51n++75esxZmMp+Uz1OKHHA/4lkv6rjOTbcHQJuEwSLppjybVIXpv7A8MBhbu9iyCTvyv1mw==", + "version": "1.20260801.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20260801.1.tgz", + "integrity": "sha512-r0vAxCZH+Jih9Unm1yoyiByPNWNgawcKciOHDm5Q37ZVGOkKLsT9AtLe3yLSaul76WrKqtf+JP2n0WW32VBLJg==", "cpu": [ "x64" ], @@ -1213,9 +1218,9 @@ } }, "node_modules/@cloudflare/workerd-linux-arm64": { - "version": "1.20260426.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20260426.1.tgz", - "integrity": "sha512-ESVp/OIFMAqjQsa8BOP2BQQz5Vpfv6ncN6lNnIuNeOgsISQBdYk+LA60bwQHMud9tvmnSYtONp1zkZ8OQz+x6w==", + "version": "1.20260801.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20260801.1.tgz", + "integrity": "sha512-zWgpdZtSozvIgzQNmQiDSF8yEOQJUkRAWNsDXXzAAoy+fCn8YUoSibj3mpFSbZRvbUldeBEaW6SCdC2VEMkhNQ==", "cpu": [ "arm64" ], @@ -1229,9 +1234,9 @@ } }, "node_modules/@cloudflare/workerd-windows-64": { - "version": "1.20260426.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20260426.1.tgz", - "integrity": "sha512-d3Xj/IjINRgNVwH+eKhpUn4xkkcEewbWXbOvBlapiirKWh5zl9m0Epi3qOqmjyRYK6MICqIGXg4qZBEt0lxudw==", + "version": "1.20260801.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20260801.1.tgz", + "integrity": "sha512-2oQz+Ksu4ji6e/+ZoYX+tWQEcxAii2p7l+iR8kx48W1llMalaufAsmVxTlk+3/vrM7D3/2c0iK448e0UQTcIMg==", "cpu": [ "x64" ], @@ -1244,6 +1249,13 @@ "node": ">=16" } }, + "node_modules/@cloudflare/workers-types": { + "version": "5.20260804.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-5.20260804.1.tgz", + "integrity": "sha512-B1dwxpN6e5RZXZkE5zpZj+ooNeNZ1mwavLIyHDYe10ojhlGTwDfe8sAl7R1mMXc1cyIsbr+jKVdvmMEyVcdTdg==", + "extraneous": true, + "license": "MIT OR Apache-2.0" + }, "node_modules/@codemirror/autocomplete": { "version": "6.20.3", "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.20.3.tgz", @@ -1257,13 +1269,13 @@ } }, "node_modules/@codemirror/commands": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.10.3.tgz", - "integrity": "sha512-JFRiqhKu+bvSkDLI+rUhJwSxQxYb759W5GBezE8Uc8mHLqC9aV/9aTC7yJSqCtB3F00pylrLCwnyS91Ap5ej4Q==", + "version": "6.10.4", + "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.10.4.tgz", + "integrity": "sha512-Ryk9y9T0FFVF0cUGhAknveAyUOl/A1qReTFi+qPKtOh2Z9F4AUBz3XOrYD4ZEgZirdugVzHvd/2/Wcwy5OliTg==", "license": "MIT", "dependencies": { "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.6.0", + "@codemirror/state": "^6.7.0", "@codemirror/view": "^6.27.0", "@lezer/common": "^1.1.0" } @@ -1319,9 +1331,9 @@ } }, "node_modules/@codemirror/lang-html": { - "version": "6.4.11", - "resolved": "https://registry.npmjs.org/@codemirror/lang-html/-/lang-html-6.4.11.tgz", - "integrity": "sha512-9NsXp7Nwp891pQchI7gPdTwBuSuT3K65NGTHWHNJ55HjYcHLllr0rbIZNdOzas9ztc1EUVBlHou85FFZS4BNnw==", + "version": "6.4.12", + "resolved": "https://registry.npmjs.org/@codemirror/lang-html/-/lang-html-6.4.12.tgz", + "integrity": "sha512-pw2ReWKUqSkbvh76RAT4NYxiogRu+PWkR2ukAwO9uOgrm8uipkzjtKKtNpyeAQwHOqxEeSvAXZ6vr3AfyB9y/w==", "license": "MIT", "dependencies": { "@codemirror/autocomplete": "^6.0.0", @@ -1416,9 +1428,9 @@ } }, "node_modules/@codemirror/lang-markdown": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@codemirror/lang-markdown/-/lang-markdown-6.5.0.tgz", - "integrity": "sha512-0K40bZ35jpHya6FriukbgaleaqzBLZfOh7HuzqbMxBXkbYMJDxfF39c23xOgxFezR+3G+tR2/Mup+Xk865OMvw==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@codemirror/lang-markdown/-/lang-markdown-6.5.2.tgz", + "integrity": "sha512-AwBOdkWYuA//WcM0xO5PfHPUcmz/O2i5o0Nsg1U69SII/loCJlFI1Romd9xp2HYb1kYJRGZotyqRghuHH5n8Kw==", "license": "MIT", "dependencies": { "@codemirror/autocomplete": "^6.7.1", @@ -1549,9 +1561,9 @@ } }, "node_modules/@codemirror/language": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.12.3.tgz", - "integrity": "sha512-QwCZW6Tt1siP37Jet9Tb02Zs81TQt6qQrZR2H+eGMcFsL1zMrk2/b9CLC7/9ieP1fjIUMgviLWMmgiHoJrj+ZA==", + "version": "6.12.4", + "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.12.4.tgz", + "integrity": "sha512-1q4PaT+o6PbgpkJt4Q8Fv5XJxTy4FUZ4MWETtyiDw3J0Pyr9E2vqcKL+k9wcvjNTIsauxvE7OfmWj3FRPHQ76A==", "license": "MIT", "dependencies": { "@codemirror/state": "^6.0.0", @@ -1603,9 +1615,9 @@ } }, "node_modules/@codemirror/lint": { - "version": "6.9.6", - "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.9.6.tgz", - "integrity": "sha512-6Kp7r6XfCi/D/5sdXieMfg9pJU1bUEx96WITuLU6ESaKizCz0QHFMjY/TaFSbigDdEAIgi93itLBIUETP4oK+A==", + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.9.7.tgz", + "integrity": "sha512-28/+iWLYxKxsvGYhSYL7zaCZqLz5+FFFDq9tVsvGv9kv8RY4fFAchJ5WX9M3YrrRlTIsECjsXPqeNgnSmNP2dg==", "license": "MIT", "dependencies": { "@codemirror/state": "^6.0.0", @@ -1614,9 +1626,9 @@ } }, "node_modules/@codemirror/merge": { - "version": "6.12.1", - "resolved": "https://registry.npmjs.org/@codemirror/merge/-/merge-6.12.1.tgz", - "integrity": "sha512-GA8hBq2T+IFM0sb5fk8CunTrqOulA3zurJmHtzcU15EMnL8aYpVINfJ5bkfd53M4ikwoew4Y1ydtSaAlk6+B1w==", + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/@codemirror/merge/-/merge-6.12.2.tgz", + "integrity": "sha512-V8JvyAPjHbPupqP7BeMcsdsYCbyPij74jxIbaIJDORI+VZzW44zFmon8bF+oxGWvOKhcRmkiUMXd8MxHr3YA2w==", "license": "MIT", "dependencies": { "@codemirror/language": "^6.0.0", @@ -1627,9 +1639,9 @@ } }, "node_modules/@codemirror/search": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.7.0.tgz", - "integrity": "sha512-ZvGm99wc/s2cITtMT15LFdn8aH/aS+V+DqyGq/N5ZlV5vWtH+nILvC2nw0zX7ByNoHHDZ2IxxdW38O0tc5nVHg==", + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.7.1.tgz", + "integrity": "sha512-uMe5UO6PamJtSHrXhhHOzSX3ReWtiJrva6GnPMwSOrZtiExb5X5eExhr2OUZQVvdxPsKpY3Ro2mFbQadpPWmHA==", "license": "MIT", "dependencies": { "@codemirror/state": "^6.0.0", @@ -1638,21 +1650,21 @@ } }, "node_modules/@codemirror/state": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.6.0.tgz", - "integrity": "sha512-4nbvra5R5EtiCzr9BTHiTLc+MLXK2QGiAVYMyi8PkQd3SR+6ixar/Q/01Fa21TBIDOZXgeWV4WppsQolSreAPQ==", + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.7.1.tgz", + "integrity": "sha512-9QzNDgE4EYDnAHfrTlR2lwiPciiOymLtwKK+8yHQzCc7GXhAP9xdEbEJFy2IWB1j9UGUl9BsgMmTo/ImA02T7A==", "license": "MIT", "dependencies": { "@marijn/find-cluster-break": "^1.0.0" } }, "node_modules/@codemirror/view": { - "version": "6.43.0", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.43.0.tgz", - "integrity": "sha512-V7ZCLQO3Jus9hzh2jVCCPW3mO4IBMr43O37PqSUYautJSnnJF41YlgLw21x0fLJTYvJ+Vkm6Gp+qKGH9pltgXA==", + "version": "6.43.8", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.43.8.tgz", + "integrity": "sha512-qtItTDssZ/5GFfi94hrILu9j/VUeFPDPkhovEfmWFj2ipTxnzPB8DdHgfbb8HYTzLTYhrndKmyQxXUz/PDLenw==", "license": "MIT", "dependencies": { - "@codemirror/state": "^6.6.0", + "@codemirror/state": "^6.7.0", "crelt": "^1.0.6", "style-mod": "^4.1.0", "w3c-keyname": "^2.2.4" @@ -1745,20 +1757,20 @@ "license": "MIT" }, "node_modules/@emnapi/core": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.2.tgz", - "integrity": "sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA==", + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.3.tgz", + "integrity": "sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg==", "license": "MIT", "optional": true, "dependencies": { - "@emnapi/wasi-threads": "1.2.2", + "@emnapi/wasi-threads": "1.2.3", "tslib": "^2.4.0" } }, "node_modules/@emnapi/runtime": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", - "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz", + "integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==", "license": "MIT", "optional": true, "dependencies": { @@ -1766,9 +1778,9 @@ } }, "node_modules/@emnapi/wasi-threads": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", - "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.3.tgz", + "integrity": "sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g==", "license": "MIT", "optional": true, "dependencies": { @@ -2237,32 +2249,32 @@ } }, "node_modules/@floating-ui/core": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz", - "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.8.0.tgz", + "integrity": "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==", "license": "MIT", "dependencies": { - "@floating-ui/utils": "^0.2.11" + "@floating-ui/utils": "^0.2.12" } }, "node_modules/@floating-ui/dom": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz", - "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.8.0.tgz", + "integrity": "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==", "license": "MIT", "dependencies": { - "@floating-ui/core": "^1.7.5", - "@floating-ui/utils": "^0.2.11" + "@floating-ui/core": "^1.8.0", + "@floating-ui/utils": "^0.2.12" } }, "node_modules/@floating-ui/react": { - "version": "0.27.19", - "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.27.19.tgz", - "integrity": "sha512-31B8h5mm8YxotlE7/AU/PhNAl8eWxAmjL/v2QOxroDNkTFLk3Uu82u63N3b6TXa4EGJeeZLVcd/9AlNlVqzeog==", + "version": "0.27.20", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.27.20.tgz", + "integrity": "sha512-CMqMy7OaXl9W0eq1Uy7L7i2Y/anPvHmFmESd2CEw0t5YvZhcVCeo4MBevAmswRllX7Y2dEidA4ozGPunLSTQpw==", "license": "MIT", "dependencies": { - "@floating-ui/react-dom": "^2.1.8", - "@floating-ui/utils": "^0.2.11", + "@floating-ui/react-dom": "^2.1.9", + "@floating-ui/utils": "^0.2.12", "tabbable": "^6.0.0" }, "peerDependencies": { @@ -2271,12 +2283,12 @@ } }, "node_modules/@floating-ui/react-dom": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.8.tgz", - "integrity": "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==", + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.9.tgz", + "integrity": "sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg==", "license": "MIT", "dependencies": { - "@floating-ui/dom": "^1.7.6" + "@floating-ui/dom": "^1.8.0" }, "peerDependencies": { "react": ">=16.8.0", @@ -2284,9 +2296,9 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz", - "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.12.tgz", + "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==", "license": "MIT" }, "node_modules/@github/copilot": { @@ -2533,12 +2545,12 @@ } }, "node_modules/@hono/node-server": { - "version": "1.19.14", - "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.14.tgz", - "integrity": "sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-2.1.0.tgz", + "integrity": "sha512-XovyyCCnBzW+zKu+z/zq8hwNs4KOR5rEMAOxo2f40Q5xoOI37IMm6MIg2COOUtUApo0i6850MTBKH2u4QLGIqg==", "license": "MIT", "engines": { - "node": ">=18.14.1" + "node": ">=20" }, "peerDependencies": { "hono": "^4" @@ -2597,6 +2609,41 @@ "@img/sharp-libvips-darwin-x64": "1.2.4" } }, + "node_modules/@img/sharp-freebsd-wasm32": { + "version": "0.35.2", + "resolved": "https://registry.npmjs.org/@img/sharp-freebsd-wasm32/-/sharp-freebsd-wasm32-0.35.2.tgz", + "integrity": "sha512-YoAxdnd8hPUkvLHd3bWY+YA8nw3xM/RyRopYucNsWHVSan8NLVM3X2volsfoRDcXdUJPg6tXahSd7HXPK7lRnw==", + "license": "Apache-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "dependencies": { + "@img/sharp-wasm32": "0.35.2" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-freebsd-wasm32/node_modules/@img/sharp-wasm32": { + "version": "0.35.2", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.35.2.tgz", + "integrity": "sha512-Mrv4JQNYVQ94xH+jzZ9r+gowleN8mv2FTgKT+PI6bx5C0G8TdNYndu161pg2i7uoBwxy2ImPMHrJOM2LZef7Bw==", + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.11.1" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, "node_modules/@img/sharp-libvips-darwin-arm64": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", @@ -3000,6 +3047,41 @@ "url": "https://opencollective.com/libvips" } }, + "node_modules/@img/sharp-webcontainers-wasm32": { + "version": "0.35.2", + "resolved": "https://registry.npmjs.org/@img/sharp-webcontainers-wasm32/-/sharp-webcontainers-wasm32-0.35.2.tgz", + "integrity": "sha512-QNV27pxs9wpApEiCfvHM1RDoP1w1+2KrUWWDPEhEwg+latvOrfuhWrHWZKwdSFwU6jh3myjw/yOCRsUIuOft3g==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@img/sharp-wasm32": "0.35.2" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-webcontainers-wasm32/node_modules/@img/sharp-wasm32": { + "version": "0.35.2", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.35.2.tgz", + "integrity": "sha512-Mrv4JQNYVQ94xH+jzZ9r+gowleN8mv2FTgKT+PI6bx5C0G8TdNYndu161pg2i7uoBwxy2ImPMHrJOM2LZef7Bw==", + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.11.1" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, "node_modules/@img/sharp-win32-arm64": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", @@ -3115,268 +3197,498 @@ "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@lexical/a11y": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@lexical/a11y/-/a11y-0.48.0.tgz", + "integrity": "sha512-18W4ehyipkUim4YVoDZitoH63Om3j6iCN4c84zdqE9RgkWf/PE4rvI/8BHTm6Ni7NkVE14nimXgkpaP5ok15zA==", + "license": "MIT", + "dependencies": { + "@lexical/extension": "0.48.0", + "@lexical/utils": "0.48.0", + "lexical": "0.48.0" + }, + "peerDependencies": { + "typescript": ">=5.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@lexical/clipboard": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@lexical/clipboard/-/clipboard-0.35.0.tgz", - "integrity": "sha512-ko7xSIIiayvDiqjNDX6fgH9RlcM6r9vrrvJYTcfGVBor5httx16lhIi0QJZ4+RNPvGtTjyFv4bwRmsixRRwImg==", + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@lexical/clipboard/-/clipboard-0.48.0.tgz", + "integrity": "sha512-xO2trk6+yBl8XXa/VNe20kXczmPxFoWtUHjidbBLEtlGBj+mo63pJj6H5o/WlZsoMKmIOJxwxsn2ejrS8G0/7A==", "license": "MIT", "dependencies": { - "@lexical/html": "0.35.0", - "@lexical/list": "0.35.0", - "@lexical/selection": "0.35.0", - "@lexical/utils": "0.35.0", - "lexical": "0.35.0" + "@lexical/extension": "0.48.0", + "@lexical/html": "0.48.0", + "@lexical/internal": "0.48.0", + "@lexical/list": "0.48.0", + "@lexical/selection": "0.48.0", + "@lexical/utils": "0.48.0", + "@types/trusted-types": "^2.0.7", + "lexical": "0.48.0" + }, + "peerDependencies": { + "typescript": ">=5.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@lexical/code": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@lexical/code/-/code-0.35.0.tgz", - "integrity": "sha512-ox4DZwETQ9IA7+DS6PN8RJNwSAF7RMjL7YTVODIqFZ5tUFIf+5xoCHbz7Fll0Bvixlp12hVH90xnLwTLRGpkKw==", + "node_modules/@lexical/code-core": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@lexical/code-core/-/code-core-0.48.0.tgz", + "integrity": "sha512-+O1Ge06AuSo6+r8R2Xk6SkWG07H5/e4K/Scw9aqCM/BRjITxgvFTHTNvgQbaobCsP0uBJiwW1+ZGeWAWcBCY4w==", "license": "MIT", "dependencies": { - "@lexical/utils": "0.35.0", - "lexical": "0.35.0", - "prismjs": "^1.30.0" + "@lexical/extension": "0.48.0", + "@lexical/html": "0.48.0", + "@lexical/internal": "0.48.0", + "@lexical/utils": "0.48.0", + "lexical": "0.48.0" + }, + "peerDependencies": { + "typescript": ">=5.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@lexical/devtools-core": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@lexical/devtools-core/-/devtools-core-0.35.0.tgz", - "integrity": "sha512-C2wwtsMCR6ZTfO0TqpSM17RLJWyfHmifAfCTjFtOJu15p3M6NO/nHYK5Mt7YMQteuS89mOjB4ng8iwoLEZ6QpQ==", + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@lexical/devtools-core/-/devtools-core-0.48.0.tgz", + "integrity": "sha512-4kvKWW6ebgQnJNLXPLmw7dqgSChvzYIBNYtfuR6c48Sw+V/QXQTWqfIUbCIe5X4uG8EEXd5O/udXaJx7GBuP+w==", "license": "MIT", "dependencies": { - "@lexical/html": "0.35.0", - "@lexical/link": "0.35.0", - "@lexical/mark": "0.35.0", - "@lexical/table": "0.35.0", - "@lexical/utils": "0.35.0", - "lexical": "0.35.0" + "@lexical/html": "0.48.0", + "@lexical/link": "0.48.0", + "@lexical/mark": "0.48.0", + "@lexical/table": "0.48.0", + "@lexical/utils": "0.48.0", + "lexical": "0.48.0" }, "peerDependencies": { - "react": ">=17.x", - "react-dom": ">=17.x" + "react": ">=18.x", + "react-dom": ">=18.x", + "typescript": ">=5.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@lexical/dragon": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@lexical/dragon/-/dragon-0.35.0.tgz", - "integrity": "sha512-SL6mT5pcqrt6hEbJ16vWxip5+r3uvMd0bQV5UUxuk+cxIeuP86iTgRh0HFR7SM2dRTYovL6/tM/O+8QLAUGTIg==", + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@lexical/dragon/-/dragon-0.48.0.tgz", + "integrity": "sha512-uPuu7fVca9vmL/Oz30CRZ7FIPIodwMrTgNsRmV8jE6Qd6a7RNiTW7r3+EhbhIdkLb/sjcWsYyOMyUR1TJAB0wQ==", + "license": "MIT", + "dependencies": { + "@lexical/extension": "0.48.0", + "lexical": "0.48.0" + }, + "peerDependencies": { + "typescript": ">=5.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@lexical/extension": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@lexical/extension/-/extension-0.48.0.tgz", + "integrity": "sha512-4uBObgz84mVbQWiumndmIhkuJL0ojHiMwFSvSUM/FCo1YMVIZvpI56blI0y+2Vix/oLui9EgVQSJjjWV4NAszw==", "license": "MIT", "dependencies": { - "lexical": "0.35.0" + "@lexical/internal": "0.48.0", + "@lexical/utils": "0.48.0", + "@preact/signals-core": "^1.14.1", + "lexical": "0.48.0" + }, + "peerDependencies": { + "typescript": ">=5.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@lexical/hashtag": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@lexical/hashtag/-/hashtag-0.35.0.tgz", - "integrity": "sha512-LYJWzXuO2ZjKsvQwrLkNZiS2TsjwYkKjlDgtugzejquTBQ/o/nfSn/MmVx6EkYLOYizaJemmZbz3IBh+u732FA==", + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@lexical/hashtag/-/hashtag-0.48.0.tgz", + "integrity": "sha512-hPQtdnbVoNAFsmfnCGfgY7mDbvk6mIznlCRmIR7tLeQKXqz/0Tb6eH3W24EESk9hAF8wFUYNKWE1/Kb3Hl2vEQ==", "license": "MIT", "dependencies": { - "@lexical/utils": "0.35.0", - "lexical": "0.35.0" + "@lexical/text": "0.48.0", + "@lexical/utils": "0.48.0", + "lexical": "0.48.0" + }, + "peerDependencies": { + "typescript": ">=5.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@lexical/history": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@lexical/history/-/history-0.35.0.tgz", - "integrity": "sha512-onjDRLLxGbCfHexSxxrQaDaieIHyV28zCDrbxR5dxTfW8F8PxjuNyuaG0z6o468AXYECmclxkP+P4aT6poHEpQ==", + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@lexical/history/-/history-0.48.0.tgz", + "integrity": "sha512-NllvUfO+u3mfi5uC8k2CodwdzeeopFFVtMZ/NMifzFbZFysdWi9m9mqfO46NrEA1rSFOydyefv6oMzC8ULXInA==", "license": "MIT", "dependencies": { - "@lexical/utils": "0.35.0", - "lexical": "0.35.0" + "@lexical/extension": "0.48.0", + "@lexical/utils": "0.48.0", + "lexical": "0.48.0" + }, + "peerDependencies": { + "typescript": ">=5.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@lexical/html": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@lexical/html/-/html-0.35.0.tgz", - "integrity": "sha512-rXGFE5S5rKsg3tVnr1s4iEgOfCApNXGpIFI3T2jGEShaCZ5HLaBY9NVBXnE9Nb49e9bkDkpZ8FZd1qokCbQXbw==", + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@lexical/html/-/html-0.48.0.tgz", + "integrity": "sha512-uBxlgKl4YgSNEgHJSshdBqtGDzruWdx1ewop+u6faT67qHUdP3P0cUXIrG6NToDWvsL6fzCstAbN76PMER1Pnw==", "license": "MIT", "dependencies": { - "@lexical/selection": "0.35.0", - "@lexical/utils": "0.35.0", - "lexical": "0.35.0" + "@lexical/extension": "0.48.0", + "@lexical/internal": "0.48.0", + "@lexical/selection": "0.48.0", + "@lexical/utils": "0.48.0", + "lexical": "0.48.0" + }, + "peerDependencies": { + "typescript": ">=5.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@lexical/internal": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@lexical/internal/-/internal-0.48.0.tgz", + "integrity": "sha512-sRwg53K7N0ZQ7KNAvcCY38LSwGizbXP1zlR1lIojZp0GoqHWNvR+vL49t1wYXu1nXx3Osf4ilHHm+aGcwq5hTw==", + "license": "MIT", + "peerDependencies": { + "typescript": ">=5.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@lexical/link": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@lexical/link/-/link-0.35.0.tgz", - "integrity": "sha512-+0Wx6cBwO8TfdMzpkYFacsmgFh8X1rkiYbq3xoLvk3qV8upYxaMzK1s8Q1cpKmWyI0aZrU6z7fiK4vUqB7+69w==", + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@lexical/link/-/link-0.48.0.tgz", + "integrity": "sha512-E0UDmNLUXs/yMCnnE7hbFO0CvhWghmqa+qqPksFfzLkpMHdPpdS1yg59YEbYoNHLi/DXIu4cFRvpHIEuooxwNg==", "license": "MIT", "dependencies": { - "@lexical/utils": "0.35.0", - "lexical": "0.35.0" + "@lexical/extension": "0.48.0", + "@lexical/html": "0.48.0", + "@lexical/internal": "0.48.0", + "@lexical/utils": "0.48.0", + "lexical": "0.48.0" + }, + "peerDependencies": { + "typescript": ">=5.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@lexical/list": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@lexical/list/-/list-0.35.0.tgz", - "integrity": "sha512-owsmc8iwgExBX8sFe8fKTiwJVhYULt9hD1RZ/HwfaiEtRZZkINijqReOBnW2mJfRxBzhFSWc4NG3ISB+fHYzqw==", + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@lexical/list/-/list-0.48.0.tgz", + "integrity": "sha512-9Qe/Vur44v9F9enj55SUzf79FVsijcGOQug7SpiIU8ekLr7JNzcilKYBYcZ6etGEo7bqQHsYMHXeJcSBbCI2zA==", "license": "MIT", "dependencies": { - "@lexical/selection": "0.35.0", - "@lexical/utils": "0.35.0", - "lexical": "0.35.0" + "@lexical/extension": "0.48.0", + "@lexical/html": "0.48.0", + "@lexical/internal": "0.48.0", + "@lexical/utils": "0.48.0", + "lexical": "0.48.0" + }, + "peerDependencies": { + "typescript": ">=5.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@lexical/mark": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@lexical/mark/-/mark-0.35.0.tgz", - "integrity": "sha512-W0hwMTAVeexvpk9/+J6n1G/sNkpI/Meq1yeDazahFLLAwXLHtvhIAq2P/klgFknDy1hr8X7rcsQuN/bqKcKHYg==", + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@lexical/mark/-/mark-0.48.0.tgz", + "integrity": "sha512-DTtypWvnYSXyNUxEmsUnh4y0xXkmdk8Y72EZl8WDHcCwjqaLJlUakH7p/TuSJczs3uVSaoJzu0yh7oGkP1Vsvw==", "license": "MIT", "dependencies": { - "@lexical/utils": "0.35.0", - "lexical": "0.35.0" + "@lexical/utils": "0.48.0", + "lexical": "0.48.0" + }, + "peerDependencies": { + "typescript": ">=5.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@lexical/markdown": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@lexical/markdown/-/markdown-0.35.0.tgz", - "integrity": "sha512-BlNyXZAt4gWidMw0SRWrhBETY1BpPglFBZI7yzfqukFqgXRh7HUQA28OYeI/nsx9pgNob8TiUduUwShqqvOdEA==", - "license": "MIT", - "dependencies": { - "@lexical/code": "0.35.0", - "@lexical/link": "0.35.0", - "@lexical/list": "0.35.0", - "@lexical/rich-text": "0.35.0", - "@lexical/text": "0.35.0", - "@lexical/utils": "0.35.0", - "lexical": "0.35.0" - } - }, - "node_modules/@lexical/offset": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@lexical/offset/-/offset-0.35.0.tgz", - "integrity": "sha512-DRE4Df6qYf2XiV6foh6KpGNmGAv2ANqt3oVXpyS6W8hTx3+cUuAA1APhCZmLNuU107um4zmHym7taCu6uXW5Yg==", + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@lexical/markdown/-/markdown-0.48.0.tgz", + "integrity": "sha512-1WasBenW4bEsa5xtnycVo8G2hcxIqyYLn3/r98yD2Y+54ZyeFuIQfOeJYhIgCh4YkKpfqyrFwkMQwAOsQDqZjA==", "license": "MIT", "dependencies": { - "lexical": "0.35.0" + "@lexical/code-core": "0.48.0", + "@lexical/internal": "0.48.0", + "@lexical/link": "0.48.0", + "@lexical/list": "0.48.0", + "@lexical/rich-text": "0.48.0", + "@lexical/selection": "0.48.0", + "@lexical/text": "0.48.0", + "@lexical/utils": "0.48.0", + "lexical": "0.48.0" + }, + "peerDependencies": { + "typescript": ">=5.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@lexical/overflow": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@lexical/overflow/-/overflow-0.35.0.tgz", - "integrity": "sha512-B25YvnJQTGlZcrNv7b0PJBLWq3tl8sql497OHfYYLem7EOMPKKDGJScJAKM/91D4H/mMAsx5gnA/XgKobriuTg==", + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@lexical/overflow/-/overflow-0.48.0.tgz", + "integrity": "sha512-1YEvMz2tW3EbwrON9mjrkjMVl/vdTcPYSn9P1j6mf5gj0LOoLDNI4TbvSD4SViy+TDghxNdG8YdCISyU2b4YKA==", "license": "MIT", "dependencies": { - "lexical": "0.35.0" + "lexical": "0.48.0" + }, + "peerDependencies": { + "typescript": ">=5.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@lexical/plain-text": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@lexical/plain-text/-/plain-text-0.35.0.tgz", - "integrity": "sha512-lwBCUNMJf7Gujp2syVWMpKRahfbTv5Wq+H3HK1Q1gKH1P2IytPRxssCHvexw9iGwprSyghkKBlbF3fGpEdIJvQ==", + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@lexical/plain-text/-/plain-text-0.48.0.tgz", + "integrity": "sha512-q4f/4VZKVgCrIW2FhDFR2RII1BU0ljedPgEmJ8XQn1zc+JOFPom8Lp0lV5nyEvZaAJYwM/TfoJ9g2V7ESFKznA==", "license": "MIT", "dependencies": { - "@lexical/clipboard": "0.35.0", - "@lexical/selection": "0.35.0", - "@lexical/utils": "0.35.0", - "lexical": "0.35.0" + "@lexical/clipboard": "0.48.0", + "@lexical/dragon": "0.48.0", + "@lexical/extension": "0.48.0", + "@lexical/selection": "0.48.0", + "@lexical/utils": "0.48.0", + "lexical": "0.48.0" + }, + "peerDependencies": { + "typescript": ">=5.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@lexical/react": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@lexical/react/-/react-0.35.0.tgz", - "integrity": "sha512-uYAZSqumH8tRymMef+A0f2hQvMwplKK9DXamcefnk3vSNDHHqRWQXpiUo6kD+rKWuQmMbVa5RW4xRQebXEW+1A==", - "license": "MIT", - "dependencies": { - "@floating-ui/react": "^0.27.8", - "@lexical/devtools-core": "0.35.0", - "@lexical/dragon": "0.35.0", - "@lexical/hashtag": "0.35.0", - "@lexical/history": "0.35.0", - "@lexical/link": "0.35.0", - "@lexical/list": "0.35.0", - "@lexical/mark": "0.35.0", - "@lexical/markdown": "0.35.0", - "@lexical/overflow": "0.35.0", - "@lexical/plain-text": "0.35.0", - "@lexical/rich-text": "0.35.0", - "@lexical/table": "0.35.0", - "@lexical/text": "0.35.0", - "@lexical/utils": "0.35.0", - "@lexical/yjs": "0.35.0", - "lexical": "0.35.0", - "react-error-boundary": "^3.1.4" + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@lexical/react/-/react-0.48.0.tgz", + "integrity": "sha512-uVh9/QSrbtjLjVbxfJ+sfiMyhUq/rv7H6uBEVDDIw1rkZJSDY1fvf/CX+dyKgwcDFjKQZ8/9i5f9UCVPeQ01hA==", + "license": "MIT", + "dependencies": { + "@floating-ui/react": "^0.27.19", + "@lexical/a11y": "0.48.0", + "@lexical/devtools-core": "0.48.0", + "@lexical/dragon": "0.48.0", + "@lexical/extension": "0.48.0", + "@lexical/hashtag": "0.48.0", + "@lexical/history": "0.48.0", + "@lexical/internal": "0.48.0", + "@lexical/link": "0.48.0", + "@lexical/list": "0.48.0", + "@lexical/mark": "0.48.0", + "@lexical/markdown": "0.48.0", + "@lexical/overflow": "0.48.0", + "@lexical/plain-text": "0.48.0", + "@lexical/rich-text": "0.48.0", + "@lexical/table": "0.48.0", + "@lexical/text": "0.48.0", + "@lexical/utils": "0.48.0", + "@lexical/yjs": "0.48.0", + "lexical": "0.48.0" }, "peerDependencies": { - "react": ">=17.x", - "react-dom": ">=17.x" + "react": ">=18.x", + "react-dom": ">=18.x", + "typescript": ">=5.2", + "yjs": ">=13.5.22" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "yjs": { + "optional": true + } } }, "node_modules/@lexical/rich-text": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@lexical/rich-text/-/rich-text-0.35.0.tgz", - "integrity": "sha512-qEHu8g7vOEzz9GUz1VIUxZBndZRJPh9iJUFI+qTDHj+tQqnd5LCs+G9yz6jgNfiuWWpezTp0i1Vz/udNEuDPKQ==", + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@lexical/rich-text/-/rich-text-0.48.0.tgz", + "integrity": "sha512-QMXFnwCKAQ4yzxvx5FwmANcx3K+NaBkGTxAVD8s8pOKDD/U5rzDS1iIvhH6TLWaFp7VzvLmLB+Sl1Ie/RnkaDQ==", "license": "MIT", "dependencies": { - "@lexical/clipboard": "0.35.0", - "@lexical/selection": "0.35.0", - "@lexical/utils": "0.35.0", - "lexical": "0.35.0" + "@lexical/clipboard": "0.48.0", + "@lexical/dragon": "0.48.0", + "@lexical/extension": "0.48.0", + "@lexical/html": "0.48.0", + "@lexical/selection": "0.48.0", + "@lexical/utils": "0.48.0", + "lexical": "0.48.0" + }, + "peerDependencies": { + "typescript": ">=5.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@lexical/selection": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@lexical/selection/-/selection-0.35.0.tgz", - "integrity": "sha512-mMtDE7Q0nycXdFTTH/+ta6EBrBwxBB4Tg8QwsGntzQ1Cq//d838dpXpFjJOqHEeVHUqXpiuj+cBG8+bvz/rPRw==", + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@lexical/selection/-/selection-0.48.0.tgz", + "integrity": "sha512-Uc0wTrEtHcYK6z/aHHjkgH3vX/R4Bf8mO+qH3VbxfSAKYzNYktM0j+ZGdq5kIEL4frnw/9SulNCXlH7xpjuDgA==", "license": "MIT", "dependencies": { - "lexical": "0.35.0" - } - }, + "@lexical/internal": "0.48.0", + "lexical": "0.48.0" + }, + "peerDependencies": { + "typescript": ">=5.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/@lexical/table": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@lexical/table/-/table-0.35.0.tgz", - "integrity": "sha512-9jlTlkVideBKwsEnEkqkdg7A3mije1SvmfiqoYnkl1kKJCLA5iH90ywx327PU0p+bdnURAytWUeZPXaEuEl2OA==", + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@lexical/table/-/table-0.48.0.tgz", + "integrity": "sha512-t9Mz7q6ODLUz0lG5Xn9EY/5YiVpTHCqlPQP4EtFXlnBQT3DuKeDS3cC0Cn8sGSZc11YY5OLDfWpB64Frs9BL3g==", "license": "MIT", "dependencies": { - "@lexical/clipboard": "0.35.0", - "@lexical/utils": "0.35.0", - "lexical": "0.35.0" + "@lexical/clipboard": "0.48.0", + "@lexical/extension": "0.48.0", + "@lexical/html": "0.48.0", + "@lexical/internal": "0.48.0", + "@lexical/utils": "0.48.0", + "lexical": "0.48.0" + }, + "peerDependencies": { + "typescript": ">=5.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@lexical/text": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@lexical/text/-/text-0.35.0.tgz", - "integrity": "sha512-uaMh46BkysV8hK8wQwp5g/ByZW+2hPDt8ahAErxtf8NuzQem1FHG/f5RTchmFqqUDVHO3qLNTv4AehEGmXv8MA==", + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@lexical/text/-/text-0.48.0.tgz", + "integrity": "sha512-ktTMRbsX4wKxdG2OpZCkrqtt8k9Vg/ZpWdukOQ0r1xPRtCuL1T+q91l7cy2ywIuCfMGYS0aoZGB4LdpUMe/H1g==", "license": "MIT", "dependencies": { - "lexical": "0.35.0" + "@lexical/internal": "0.48.0", + "lexical": "0.48.0" + }, + "peerDependencies": { + "typescript": ">=5.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@lexical/utils": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@lexical/utils/-/utils-0.35.0.tgz", - "integrity": "sha512-2H393EYDnFznYCDFOW3MHiRzwEO5M/UBhtUjvTT+9kc+qhX4U3zc8ixQalo5UmZ5B2nh7L/inXdTFzvSRXtsRA==", + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@lexical/utils/-/utils-0.48.0.tgz", + "integrity": "sha512-W4k4P+y6jmRfna8+ad4X+iMd5h8es5PC3bUw5tbi7MRApxaaFG/0w+uJiZVSwbT2Q6JnA2xhBaqzPgt/Gn6djg==", "license": "MIT", "dependencies": { - "@lexical/list": "0.35.0", - "@lexical/selection": "0.35.0", - "@lexical/table": "0.35.0", - "lexical": "0.35.0" + "@lexical/internal": "0.48.0", + "@lexical/selection": "0.48.0", + "lexical": "0.48.0" + }, + "peerDependencies": { + "typescript": ">=5.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@lexical/yjs": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@lexical/yjs/-/yjs-0.35.0.tgz", - "integrity": "sha512-3DSP7QpmTGYU9bN/yljP0PIao4tNIQtsR4ycauWNSawxs/GQCZtSmAPcLRnCm6qpqsDDjUtKjO/1Ej8FRp0m0w==", + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@lexical/yjs/-/yjs-0.48.0.tgz", + "integrity": "sha512-fFsE8EnPM/2KK9rMJ0z6T+Da5UW5V4P+XiAA03LoHTY5YQ/Oy8Q0i7Wcmocv/B/SpsY2o8g07euZEfudl9MVKA==", "license": "MIT", "dependencies": { - "@lexical/offset": "0.35.0", - "@lexical/selection": "0.35.0", - "lexical": "0.35.0" + "@lexical/internal": "0.48.0", + "@lexical/selection": "0.48.0", + "lexical": "0.48.0" }, "peerDependencies": { + "typescript": ">=5.2", "yjs": ">=13.5.22" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@lezer/common": { @@ -3397,9 +3709,9 @@ } }, "node_modules/@lezer/css": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@lezer/css/-/css-1.3.3.tgz", - "integrity": "sha512-RzBo8r+/6QJeow7aPHIpGVIH59xTcJXp399820gZoMo9noQDRVpJLheIBUicYwKcsbOYoBRoLZlf2720dG/4Tg==", + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/@lezer/css/-/css-1.3.6.tgz", + "integrity": "sha512-YJE78Wcg+zX8f10hiHWQ4Az48Qr/c13eId0VtRQYLBpxHDmDeSrXIlkbl+fJGW42rWC/uoUco9mhBZeVWP/A1g==", "license": "MIT", "dependencies": { "@lezer/common": "^1.2.0", @@ -3481,9 +3793,9 @@ } }, "node_modules/@lezer/markdown": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/@lezer/markdown/-/markdown-1.6.4.tgz", - "integrity": "sha512-N0SxazMj4k65DBfaf1azqtMZd6u7MqluP84/NZnB/io8Td9aleFmAhz9hcbvSfsxT5tdYlJ5qgv5aMJGY4zEtA==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@lezer/markdown/-/markdown-1.7.2.tgz", + "integrity": "sha512-iTkYvoVcKt3WkeL7qUDyXHONZEwLio4wj8KTNi2dnjQEXBZKMV63BpQrPqfsM+OkvuRbiSTAcycYAsQzLhRNoQ==", "license": "MIT", "dependencies": { "@lezer/common": "^1.5.0", @@ -3557,9 +3869,9 @@ } }, "node_modules/@marijn/find-cluster-break": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz", - "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.3.tgz", + "integrity": "sha512-FY+MKLBoTsLNJF/eLWaOsXGdz6uh3Iu1axjPf6TUq92IYumcTcXWHoS747JARLkcdlJ/Waiaxc5wQfFO8jC6NA==", "license": "MIT" }, "node_modules/@mdx-js/mdx": { @@ -3618,9 +3930,9 @@ } }, "node_modules/@mdxeditor/editor": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@mdxeditor/editor/-/editor-4.0.2.tgz", - "integrity": "sha512-tS286FC61NbA+pEJomUBLc5pgEtpowQ0z3nVuqba275CwmVWb//dQVAgIX9lN+ZB8VRa/XwpDXBxi+AMnP8Wpg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@mdxeditor/editor/-/editor-4.2.0.tgz", + "integrity": "sha512-S/IPY8AjWTV2v1TGbEy5lsbQ5w+J2M2j2QDeswxP4FpNh2B49OPkpSqHbbX5GbV0YBlhfXJxtzwBJv/sQACufw==", "license": "MIT", "dependencies": { "@codemirror/commands": "^6.2.4", @@ -3629,15 +3941,17 @@ "@codemirror/merge": "^6.4.0", "@codemirror/state": "^6.4.0", "@codemirror/view": "^6.23.0", - "@lexical/clipboard": "^0.35.0", - "@lexical/link": "^0.35.0", - "@lexical/list": "^0.35.0", - "@lexical/markdown": "^0.35.0", - "@lexical/plain-text": "^0.35.0", - "@lexical/react": "^0.35.0", - "@lexical/rich-text": "^0.35.0", - "@lexical/selection": "^0.35.0", - "@lexical/utils": "^0.35.0", + "@lexical/clipboard": "^0.48.0", + "@lexical/extension": "^0.48.0", + "@lexical/history": "^0.48.0", + "@lexical/link": "^0.48.0", + "@lexical/list": "^0.48.0", + "@lexical/markdown": "^0.48.0", + "@lexical/plain-text": "^0.48.0", + "@lexical/react": "^0.48.0", + "@lexical/rich-text": "^0.48.0", + "@lexical/selection": "^0.48.0", + "@lexical/utils": "^0.48.0", "@mdxeditor/gurx": "^1.2.4", "@radix-ui/colors": "^3.0.0", "@radix-ui/react-dialog": "^1.1.11", @@ -3652,8 +3966,8 @@ "cm6-theme-basic-light": "^0.2.0", "codemirror": "^6.0.1", "downshift": "^7.6.0", - "js-yaml": "4.1.1", - "lexical": "^0.35.0", + "js-yaml": "4.3.0", + "lexical": "^0.48.0", "mdast-util-directive": "^3.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-frontmatter": "^2.0.1", @@ -3687,6 +4001,28 @@ "react-dom": ">= 18 || >= 19" } }, + "node_modules/@mdxeditor/editor/node_modules/js-yaml": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", + "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/@mdxeditor/gurx": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@mdxeditor/gurx/-/gurx-1.2.4.tgz", @@ -3740,12 +4076,12 @@ } }, "node_modules/@modelcontextprotocol/sdk": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.29.0.tgz", - "integrity": "sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==", + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.30.0.tgz", + "integrity": "sha512-xKd8OIzlqNzcqcNumGAa6g+PW2kjD5vrpcKOnfldAUPP3j7lnqMPwlTXQm8gF+UwH72z0lqaRbjr9hqGz0eITA==", "license": "MIT", "dependencies": { - "@hono/node-server": "^1.19.9", + "@hono/node-server": "^1.19.9 || ^2.0.5", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", @@ -3841,23 +4177,35 @@ "@module-federation/sdk": "0.22.0" } }, + "node_modules/@napi-rs/lzma-linux-x64-gnu": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", + "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", - "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==", - "dev": true, + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.7.tgz", + "integrity": "sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==", "license": "MIT", "optional": true, "dependencies": { - "@tybys/wasm-util": "^0.10.3" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "peerDependencies": { - "@emnapi/core": "^1.7.1", - "@emnapi/runtime": "^1.7.1" + "@emnapi/core": "^1.5.0", + "@emnapi/runtime": "^1.5.0", + "@tybys/wasm-util": "^0.10.1" } }, "node_modules/@nodelib/fs.scandir": { @@ -3896,34 +4244,64 @@ } }, "node_modules/@octokit/app": { - "version": "16.1.2", - "resolved": "https://registry.npmjs.org/@octokit/app/-/app-16.1.2.tgz", - "integrity": "sha512-8j7sEpUYVj18dxvh0KWj6W/l6uAiVRBl1JBDVRqH1VHKAO/G5eRVl4yEoYACjakWers1DjUkcCHyJNQK47JqyQ==", + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@octokit/app/-/app-16.1.4.tgz", + "integrity": "sha512-g70WONQyGoBgqIJtv4O0MUEfOF1iJpTfFt3qAW7HaiwiJ6k607xg/gBezCa4tuq6BpO6qXn7qvq8v9tjWtgGQg==", "license": "MIT", "dependencies": { - "@octokit/auth-app": "^8.1.2", - "@octokit/auth-unauthenticated": "^7.0.3", - "@octokit/core": "^7.0.6", - "@octokit/oauth-app": "^8.0.3", - "@octokit/plugin-paginate-rest": "^14.0.0", - "@octokit/types": "^16.0.0", + "@octokit/auth-app": "^8.3.0", + "@octokit/auth-unauthenticated": "^7.0.4", + "@octokit/core": "^7.0.7", + "@octokit/oauth-app": "^8.0.4", + "@octokit/plugin-paginate-rest": "^15.0.0", + "@octokit/types": "^17.0.0", "@octokit/webhooks": "^14.0.0" }, "engines": { "node": ">= 20" } }, + "node_modules/@octokit/app/node_modules/@octokit/openapi-types": { + "version": "28.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-28.0.0.tgz", + "integrity": "sha512-0rFyLuyHvIj6uuZWuDslxkowFYdPXoNIkeAv4b27dzm2Tf4vGWXnPsMcxs7d65kLdMERgP3wc1AEPlqMz8e1cQ==", + "license": "MIT" + }, + "node_modules/@octokit/app/node_modules/@octokit/plugin-paginate-rest": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-15.0.0.tgz", + "integrity": "sha512-lw9A9YL5s4VPj+VEx8uMxaxQm2YTgrPDkrLEuZuu18R8TK3oPcXF4K6t52nx6xn1RcogZC9i188sAr/4XYJaQQ==", + "license": "MIT", + "dependencies": { + "@octokit/types": "^17.0.0" + }, + "engines": { + "node": ">= 20" + }, + "peerDependencies": { + "@octokit/core": ">=6" + } + }, + "node_modules/@octokit/app/node_modules/@octokit/types": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-17.0.0.tgz", + "integrity": "sha512-ByP1v7YL5SMveFPP7+sj0/ZuWCOOg/Chs4NafOMpq6WNIM/hdGY0S7C0TCGDBWu1aGmOxmUIhMx3cO+IdwYZ1Q==", + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^28.0.0" + } + }, "node_modules/@octokit/auth-app": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-app/-/auth-app-8.2.0.tgz", - "integrity": "sha512-vVjdtQQwomrZ4V46B9LaCsxsySxGoHsyw6IYBov/TqJVROrlYdyNgw5q6tQbB7KZt53v1l1W53RiqTvpzL907g==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-app/-/auth-app-8.3.0.tgz", + "integrity": "sha512-/UaKmJCsOc5XBZwhnFiGNdLH/FkDF8lYtBn1QlKxtX7IpgaRB/XOXjixFtERAknyUZHxp3oDuoiG0En4VptJSg==", "license": "MIT", "dependencies": { - "@octokit/auth-oauth-app": "^9.0.3", - "@octokit/auth-oauth-user": "^6.0.2", - "@octokit/request": "^10.0.6", - "@octokit/request-error": "^7.0.2", - "@octokit/types": "^16.0.0", + "@octokit/auth-oauth-app": "^9.0.4", + "@octokit/auth-oauth-user": "^6.0.3", + "@octokit/request": "^10.0.13", + "@octokit/request-error": "^7.1.1", + "@octokit/types": "^17.0.0", "toad-cache": "^3.7.0", "universal-github-app-jwt": "^2.2.0", "universal-user-agent": "^7.0.0" @@ -3932,53 +4310,113 @@ "node": ">= 20" } }, + "node_modules/@octokit/auth-app/node_modules/@octokit/openapi-types": { + "version": "28.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-28.0.0.tgz", + "integrity": "sha512-0rFyLuyHvIj6uuZWuDslxkowFYdPXoNIkeAv4b27dzm2Tf4vGWXnPsMcxs7d65kLdMERgP3wc1AEPlqMz8e1cQ==", + "license": "MIT" + }, + "node_modules/@octokit/auth-app/node_modules/@octokit/types": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-17.0.0.tgz", + "integrity": "sha512-ByP1v7YL5SMveFPP7+sj0/ZuWCOOg/Chs4NafOMpq6WNIM/hdGY0S7C0TCGDBWu1aGmOxmUIhMx3cO+IdwYZ1Q==", + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^28.0.0" + } + }, "node_modules/@octokit/auth-oauth-app": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-app/-/auth-oauth-app-9.0.3.tgz", - "integrity": "sha512-+yoFQquaF8OxJSxTb7rnytBIC2ZLbLqA/yb71I4ZXT9+Slw4TziV9j/kyGhUFRRTF2+7WlnIWsePZCWHs+OGjg==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-app/-/auth-oauth-app-9.0.4.tgz", + "integrity": "sha512-Pe3du5LrC6dlv10b0RbarBlJtIT1Urq8BFoQklK8WmBw8YKnGgrANn7cQmHiA1v8AVihgi7YutV8MncP57I4og==", "license": "MIT", "dependencies": { - "@octokit/auth-oauth-device": "^8.0.3", - "@octokit/auth-oauth-user": "^6.0.2", - "@octokit/request": "^10.0.6", - "@octokit/types": "^16.0.0", + "@octokit/auth-oauth-device": "^8.0.4", + "@octokit/auth-oauth-user": "^6.0.3", + "@octokit/request": "^10.0.13", + "@octokit/types": "^17.0.0", "universal-user-agent": "^7.0.0" }, "engines": { "node": ">= 20" } }, + "node_modules/@octokit/auth-oauth-app/node_modules/@octokit/openapi-types": { + "version": "28.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-28.0.0.tgz", + "integrity": "sha512-0rFyLuyHvIj6uuZWuDslxkowFYdPXoNIkeAv4b27dzm2Tf4vGWXnPsMcxs7d65kLdMERgP3wc1AEPlqMz8e1cQ==", + "license": "MIT" + }, + "node_modules/@octokit/auth-oauth-app/node_modules/@octokit/types": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-17.0.0.tgz", + "integrity": "sha512-ByP1v7YL5SMveFPP7+sj0/ZuWCOOg/Chs4NafOMpq6WNIM/hdGY0S7C0TCGDBWu1aGmOxmUIhMx3cO+IdwYZ1Q==", + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^28.0.0" + } + }, "node_modules/@octokit/auth-oauth-device": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-device/-/auth-oauth-device-8.0.3.tgz", - "integrity": "sha512-zh2W0mKKMh/VWZhSqlaCzY7qFyrgd9oTWmTmHaXnHNeQRCZr/CXy2jCgHo4e4dJVTiuxP5dLa0YM5p5QVhJHbw==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-device/-/auth-oauth-device-8.0.4.tgz", + "integrity": "sha512-M/+34rmkxMvUnnTo/uqNeVRCXJoJ+5N34eNTbL1KMtIyJpedCTsu/iFL1cWdL+w5hQMlYt6xzXoyux2gn0OVnw==", "license": "MIT", "dependencies": { - "@octokit/oauth-methods": "^6.0.2", - "@octokit/request": "^10.0.6", - "@octokit/types": "^16.0.0", + "@octokit/oauth-methods": "^6.0.3", + "@octokit/request": "^10.0.13", + "@octokit/types": "^17.0.0", "universal-user-agent": "^7.0.0" }, "engines": { "node": ">= 20" } }, + "node_modules/@octokit/auth-oauth-device/node_modules/@octokit/openapi-types": { + "version": "28.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-28.0.0.tgz", + "integrity": "sha512-0rFyLuyHvIj6uuZWuDslxkowFYdPXoNIkeAv4b27dzm2Tf4vGWXnPsMcxs7d65kLdMERgP3wc1AEPlqMz8e1cQ==", + "license": "MIT" + }, + "node_modules/@octokit/auth-oauth-device/node_modules/@octokit/types": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-17.0.0.tgz", + "integrity": "sha512-ByP1v7YL5SMveFPP7+sj0/ZuWCOOg/Chs4NafOMpq6WNIM/hdGY0S7C0TCGDBWu1aGmOxmUIhMx3cO+IdwYZ1Q==", + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^28.0.0" + } + }, "node_modules/@octokit/auth-oauth-user": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-user/-/auth-oauth-user-6.0.2.tgz", - "integrity": "sha512-qLoPPc6E6GJoz3XeDG/pnDhJpTkODTGG4kY0/Py154i/I003O9NazkrwJwRuzgCalhzyIeWQ+6MDvkUmKXjg/A==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-user/-/auth-oauth-user-6.0.3.tgz", + "integrity": "sha512-t4OKUhrI5britmpRiSzPAz1TJPyUN/Hw1HEE3Hz/uElxcmnf/YCRSKtFRNc5gy4yJFTlXgk34H1lvxiotQJQvQ==", "license": "MIT", "dependencies": { - "@octokit/auth-oauth-device": "^8.0.3", - "@octokit/oauth-methods": "^6.0.2", - "@octokit/request": "^10.0.6", - "@octokit/types": "^16.0.0", + "@octokit/auth-oauth-device": "^8.0.4", + "@octokit/oauth-methods": "^6.0.3", + "@octokit/request": "^10.0.13", + "@octokit/types": "^17.0.0", "universal-user-agent": "^7.0.0" }, "engines": { "node": ">= 20" } }, + "node_modules/@octokit/auth-oauth-user/node_modules/@octokit/openapi-types": { + "version": "28.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-28.0.0.tgz", + "integrity": "sha512-0rFyLuyHvIj6uuZWuDslxkowFYdPXoNIkeAv4b27dzm2Tf4vGWXnPsMcxs7d65kLdMERgP3wc1AEPlqMz8e1cQ==", + "license": "MIT" + }, + "node_modules/@octokit/auth-oauth-user/node_modules/@octokit/types": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-17.0.0.tgz", + "integrity": "sha512-ByP1v7YL5SMveFPP7+sj0/ZuWCOOg/Chs4NafOMpq6WNIM/hdGY0S7C0TCGDBWu1aGmOxmUIhMx3cO+IdwYZ1Q==", + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^28.0.0" + } + }, "node_modules/@octokit/auth-token": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-6.0.0.tgz", @@ -3989,29 +4427,44 @@ } }, "node_modules/@octokit/auth-unauthenticated": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@octokit/auth-unauthenticated/-/auth-unauthenticated-7.0.3.tgz", - "integrity": "sha512-8Jb1mtUdmBHL7lGmop9mU9ArMRUTRhg8vp0T1VtZ4yd9vEm3zcLwmjQkhNEduKawOOORie61xhtYIhTDN+ZQ3g==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@octokit/auth-unauthenticated/-/auth-unauthenticated-7.0.4.tgz", + "integrity": "sha512-j4zgVdP8C8C53PNsj4LLI+WFtoykaQARwwrIBILTdxwZ2Ljaa9YUxb1yQ7/seGVnmWPdC3OBefX3LLbh28gKtw==", "license": "MIT", "dependencies": { - "@octokit/request-error": "^7.0.2", - "@octokit/types": "^16.0.0" + "@octokit/request-error": "^7.1.1", + "@octokit/types": "^17.0.0" }, "engines": { "node": ">= 20" } }, + "node_modules/@octokit/auth-unauthenticated/node_modules/@octokit/openapi-types": { + "version": "28.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-28.0.0.tgz", + "integrity": "sha512-0rFyLuyHvIj6uuZWuDslxkowFYdPXoNIkeAv4b27dzm2Tf4vGWXnPsMcxs7d65kLdMERgP3wc1AEPlqMz8e1cQ==", + "license": "MIT" + }, + "node_modules/@octokit/auth-unauthenticated/node_modules/@octokit/types": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-17.0.0.tgz", + "integrity": "sha512-ByP1v7YL5SMveFPP7+sj0/ZuWCOOg/Chs4NafOMpq6WNIM/hdGY0S7C0TCGDBWu1aGmOxmUIhMx3cO+IdwYZ1Q==", + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^28.0.0" + } + }, "node_modules/@octokit/core": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-7.0.6.tgz", - "integrity": "sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-7.0.7.tgz", + "integrity": "sha512-DcB0M3KFgr9ECI328lhBMVsyFT2DnmNucSBTqEN3exyNKUzkkpUSCHmTRcunF41Eou2TIQKW4seewri8ON9bSA==", "license": "MIT", "dependencies": { "@octokit/auth-token": "^6.0.0", - "@octokit/graphql": "^9.0.3", - "@octokit/request": "^10.0.6", - "@octokit/request-error": "^7.0.2", - "@octokit/types": "^16.0.0", + "@octokit/graphql": "^9.0.4", + "@octokit/request": "^10.0.13", + "@octokit/request-error": "^7.1.1", + "@octokit/types": "^17.0.0", "before-after-hook": "^4.0.0", "universal-user-agent": "^7.0.0" }, @@ -4019,45 +4472,90 @@ "node": ">= 20" } }, + "node_modules/@octokit/core/node_modules/@octokit/openapi-types": { + "version": "28.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-28.0.0.tgz", + "integrity": "sha512-0rFyLuyHvIj6uuZWuDslxkowFYdPXoNIkeAv4b27dzm2Tf4vGWXnPsMcxs7d65kLdMERgP3wc1AEPlqMz8e1cQ==", + "license": "MIT" + }, + "node_modules/@octokit/core/node_modules/@octokit/types": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-17.0.0.tgz", + "integrity": "sha512-ByP1v7YL5SMveFPP7+sj0/ZuWCOOg/Chs4NafOMpq6WNIM/hdGY0S7C0TCGDBWu1aGmOxmUIhMx3cO+IdwYZ1Q==", + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^28.0.0" + } + }, "node_modules/@octokit/endpoint": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.3.tgz", - "integrity": "sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag==", + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.4.tgz", + "integrity": "sha512-f1cOWoHPmxryJFknxbtDdjODWfV8A9tc8Aae6ermXPNgHFZ/x91AtHIz4gicEjL8hkJiip+u21QHJORfBv/qiA==", "license": "MIT", "dependencies": { - "@octokit/types": "^16.0.0", + "@octokit/types": "^17.0.0", "universal-user-agent": "^7.0.2" }, "engines": { "node": ">= 20" } }, + "node_modules/@octokit/endpoint/node_modules/@octokit/openapi-types": { + "version": "28.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-28.0.0.tgz", + "integrity": "sha512-0rFyLuyHvIj6uuZWuDslxkowFYdPXoNIkeAv4b27dzm2Tf4vGWXnPsMcxs7d65kLdMERgP3wc1AEPlqMz8e1cQ==", + "license": "MIT" + }, + "node_modules/@octokit/endpoint/node_modules/@octokit/types": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-17.0.0.tgz", + "integrity": "sha512-ByP1v7YL5SMveFPP7+sj0/ZuWCOOg/Chs4NafOMpq6WNIM/hdGY0S7C0TCGDBWu1aGmOxmUIhMx3cO+IdwYZ1Q==", + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^28.0.0" + } + }, "node_modules/@octokit/graphql": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-9.0.3.tgz", - "integrity": "sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-9.0.4.tgz", + "integrity": "sha512-5s15CCiY8XXQ+FG+b1YQcl6Z2FA++nwAz/tg2VUrTmnMncP+2nnGUEYANImdnxsA2Fnq+Mbl7hDjUTw7cFAwcg==", "license": "MIT", "dependencies": { - "@octokit/request": "^10.0.6", - "@octokit/types": "^16.0.0", + "@octokit/request": "^10.0.13", + "@octokit/types": "^17.0.0", "universal-user-agent": "^7.0.0" }, "engines": { "node": ">= 20" } }, + "node_modules/@octokit/graphql/node_modules/@octokit/openapi-types": { + "version": "28.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-28.0.0.tgz", + "integrity": "sha512-0rFyLuyHvIj6uuZWuDslxkowFYdPXoNIkeAv4b27dzm2Tf4vGWXnPsMcxs7d65kLdMERgP3wc1AEPlqMz8e1cQ==", + "license": "MIT" + }, + "node_modules/@octokit/graphql/node_modules/@octokit/types": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-17.0.0.tgz", + "integrity": "sha512-ByP1v7YL5SMveFPP7+sj0/ZuWCOOg/Chs4NafOMpq6WNIM/hdGY0S7C0TCGDBWu1aGmOxmUIhMx3cO+IdwYZ1Q==", + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^28.0.0" + } + }, "node_modules/@octokit/oauth-app": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/@octokit/oauth-app/-/oauth-app-8.0.3.tgz", - "integrity": "sha512-jnAjvTsPepyUaMu9e69hYBuozEPgYqP4Z3UnpmvoIzHDpf8EXDGvTY1l1jK0RsZ194oRd+k6Hm13oRU8EoDFwg==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@octokit/oauth-app/-/oauth-app-8.0.4.tgz", + "integrity": "sha512-Ji5JpRwAJcbOJkO4ij0tW6+GrQ8efpICnAca3o5xI8/HUNjqJu3hhG4cCZdXAHMKaOaQTFX0Yl+cpu61Rsx94A==", "license": "MIT", "dependencies": { - "@octokit/auth-oauth-app": "^9.0.2", - "@octokit/auth-oauth-user": "^6.0.1", - "@octokit/auth-unauthenticated": "^7.0.2", - "@octokit/core": "^7.0.5", + "@octokit/auth-oauth-app": "^9.0.4", + "@octokit/auth-oauth-user": "^6.0.3", + "@octokit/auth-unauthenticated": "^7.0.4", + "@octokit/core": "^7.0.7", "@octokit/oauth-authorization-url": "^8.0.0", - "@octokit/oauth-methods": "^6.0.1", + "@octokit/oauth-methods": "^6.0.3", "@types/aws-lambda": "^8.10.83", "universal-user-agent": "^7.0.0" }, @@ -4075,20 +4573,35 @@ } }, "node_modules/@octokit/oauth-methods": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@octokit/oauth-methods/-/oauth-methods-6.0.2.tgz", - "integrity": "sha512-HiNOO3MqLxlt5Da5bZbLV8Zarnphi4y9XehrbaFMkcoJ+FL7sMxH/UlUsCVxpddVu4qvNDrBdaTVE2o4ITK8ng==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@octokit/oauth-methods/-/oauth-methods-6.0.3.tgz", + "integrity": "sha512-t7MBs34Ja16BBZlOSAFslFh4wBMuofD83wVLG9zIuuEGMv/U12XAJ8ESOifgEcC1ptjhNA3sorLA9BCtVfgPuw==", "license": "MIT", "dependencies": { "@octokit/oauth-authorization-url": "^8.0.0", - "@octokit/request": "^10.0.6", - "@octokit/request-error": "^7.0.2", - "@octokit/types": "^16.0.0" + "@octokit/request": "^10.0.13", + "@octokit/request-error": "^7.1.1", + "@octokit/types": "^17.0.0" }, "engines": { "node": ">= 20" } }, + "node_modules/@octokit/oauth-methods/node_modules/@octokit/openapi-types": { + "version": "28.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-28.0.0.tgz", + "integrity": "sha512-0rFyLuyHvIj6uuZWuDslxkowFYdPXoNIkeAv4b27dzm2Tf4vGWXnPsMcxs7d65kLdMERgP3wc1AEPlqMz8e1cQ==", + "license": "MIT" + }, + "node_modules/@octokit/oauth-methods/node_modules/@octokit/types": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-17.0.0.tgz", + "integrity": "sha512-ByP1v7YL5SMveFPP7+sj0/ZuWCOOg/Chs4NafOMpq6WNIM/hdGY0S7C0TCGDBWu1aGmOxmUIhMx3cO+IdwYZ1Q==", + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^28.0.0" + } + }, "node_modules/@octokit/openapi-types": { "version": "27.0.0", "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-27.0.0.tgz", @@ -4144,13 +4657,13 @@ } }, "node_modules/@octokit/plugin-retry": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-8.1.0.tgz", - "integrity": "sha512-O1FZgXeiGb2sowEr/hYTr6YunGdSAFWnr2fyW39Ah85H8O33ELASQxcvOFF5LE6Tjekcyu2ms4qAzJVhSaJxTw==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-8.1.1.tgz", + "integrity": "sha512-VCVvZ/R1+u3WuiBWpNavZ0mY4aaJNAsENrpBP9aLSR2QyOpQgd7DhM5j4AW7z4MQpnJYgwBPf0XqPQoNBRdQwg==", "license": "MIT", "dependencies": { - "@octokit/request-error": "^7.0.2", - "@octokit/types": "^16.0.0", + "@octokit/request-error": "^7.1.1", + "@octokit/types": "^17.0.0", "bottleneck": "^2.15.3" }, "engines": { @@ -4160,13 +4673,28 @@ "@octokit/core": ">=7" } }, + "node_modules/@octokit/plugin-retry/node_modules/@octokit/openapi-types": { + "version": "28.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-28.0.0.tgz", + "integrity": "sha512-0rFyLuyHvIj6uuZWuDslxkowFYdPXoNIkeAv4b27dzm2Tf4vGWXnPsMcxs7d65kLdMERgP3wc1AEPlqMz8e1cQ==", + "license": "MIT" + }, + "node_modules/@octokit/plugin-retry/node_modules/@octokit/types": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-17.0.0.tgz", + "integrity": "sha512-ByP1v7YL5SMveFPP7+sj0/ZuWCOOg/Chs4NafOMpq6WNIM/hdGY0S7C0TCGDBWu1aGmOxmUIhMx3cO+IdwYZ1Q==", + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^28.0.0" + } + }, "node_modules/@octokit/plugin-throttling": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-11.0.3.tgz", - "integrity": "sha512-34eE0RkFCKycLl2D2kq7W+LovheM/ex3AwZCYN8udpi6bxsyjZidb2McXs69hZhLmJlDqTSP8cH+jSRpiaijBg==", + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-11.0.5.tgz", + "integrity": "sha512-LIdrkrUv+DWbKeg/49rGuFJ3SU0d3hUS+B4MhNZLepBoNUFXms8Ic9edJjrlx+zycqJHjrMRudVpVb/bAXM2Lw==", "license": "MIT", "dependencies": { - "@octokit/types": "^16.0.0", + "@octokit/types": "^17.0.0", "bottleneck": "^2.15.3" }, "engines": { @@ -4176,15 +4704,30 @@ "@octokit/core": "^7.0.0" } }, + "node_modules/@octokit/plugin-throttling/node_modules/@octokit/openapi-types": { + "version": "28.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-28.0.0.tgz", + "integrity": "sha512-0rFyLuyHvIj6uuZWuDslxkowFYdPXoNIkeAv4b27dzm2Tf4vGWXnPsMcxs7d65kLdMERgP3wc1AEPlqMz8e1cQ==", + "license": "MIT" + }, + "node_modules/@octokit/plugin-throttling/node_modules/@octokit/types": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-17.0.0.tgz", + "integrity": "sha512-ByP1v7YL5SMveFPP7+sj0/ZuWCOOg/Chs4NafOMpq6WNIM/hdGY0S7C0TCGDBWu1aGmOxmUIhMx3cO+IdwYZ1Q==", + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^28.0.0" + } + }, "node_modules/@octokit/request": { - "version": "10.0.10", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.10.tgz", - "integrity": "sha512-KxNC2pTqqhszMNrf12ZRd4PonRgyJdsM4F/jySiddQK+DsRcfBtUvqn8t7UsyZhnRJHvX46OohDt5N3VqIWC2w==", + "version": "10.0.13", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.13.tgz", + "integrity": "sha512-v2269YxL9Yf+x3d+gRI63FP0vFQEiWgLyBzxe/Y+0yFDg2B/Tzf5dhh9VNfccVAQnfcfwQWyk/y6Bn7rUXXs7A==", "license": "MIT", "dependencies": { "@octokit/endpoint": "^11.0.3", - "@octokit/request-error": "^7.0.2", - "@octokit/types": "^16.0.0", + "@octokit/request-error": "^7.1.1", + "@octokit/types": "^17.0.0", "content-type": "^2.0.0", "json-with-bigint": "^3.5.3", "universal-user-agent": "^7.0.2" @@ -4194,17 +4737,47 @@ } }, "node_modules/@octokit/request-error": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.1.0.tgz", - "integrity": "sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.1.1.tgz", + "integrity": "sha512-+eaY7G2VVpSf2pc5Gn1+mph837V/d/TYTJAgWL9Tb0ogGYcpN3IlAVFgjL+Vv93F/sevrxkvsYCedtpLdcFLzA==", "license": "MIT", "dependencies": { - "@octokit/types": "^16.0.0" + "@octokit/types": "^17.0.0" }, "engines": { "node": ">= 20" } }, + "node_modules/@octokit/request-error/node_modules/@octokit/openapi-types": { + "version": "28.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-28.0.0.tgz", + "integrity": "sha512-0rFyLuyHvIj6uuZWuDslxkowFYdPXoNIkeAv4b27dzm2Tf4vGWXnPsMcxs7d65kLdMERgP3wc1AEPlqMz8e1cQ==", + "license": "MIT" + }, + "node_modules/@octokit/request-error/node_modules/@octokit/types": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-17.0.0.tgz", + "integrity": "sha512-ByP1v7YL5SMveFPP7+sj0/ZuWCOOg/Chs4NafOMpq6WNIM/hdGY0S7C0TCGDBWu1aGmOxmUIhMx3cO+IdwYZ1Q==", + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^28.0.0" + } + }, + "node_modules/@octokit/request/node_modules/@octokit/openapi-types": { + "version": "28.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-28.0.0.tgz", + "integrity": "sha512-0rFyLuyHvIj6uuZWuDslxkowFYdPXoNIkeAv4b27dzm2Tf4vGWXnPsMcxs7d65kLdMERgP3wc1AEPlqMz8e1cQ==", + "license": "MIT" + }, + "node_modules/@octokit/request/node_modules/@octokit/types": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-17.0.0.tgz", + "integrity": "sha512-ByP1v7YL5SMveFPP7+sj0/ZuWCOOg/Chs4NafOMpq6WNIM/hdGY0S7C0TCGDBWu1aGmOxmUIhMx3cO+IdwYZ1Q==", + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^28.0.0" + } + }, "node_modules/@octokit/types": { "version": "16.0.0", "resolved": "https://registry.npmjs.org/@octokit/types/-/types-16.0.0.tgz", @@ -4244,9 +4817,9 @@ "license": "MIT" }, "node_modules/@oxc-project/types": { - "version": "0.139.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.139.0.tgz", - "integrity": "sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==", + "version": "0.143.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.143.0.tgz", + "integrity": "sha512-u6JZdLBTLotrNC9Vd6vPssINdzcCzleKAH6EJKImQb7GtYvX5keN2dxkoK44stCc4tffE6QQRtZTXVSzsLUlWA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/Boshen" @@ -4387,6 +4960,16 @@ "integrity": "sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==", "license": "MIT" }, + "node_modules/@preact/signals-core": { + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/@preact/signals-core/-/signals-core-1.14.4.tgz", + "integrity": "sha512-HNB6HYeYKhQbJ1aKl+YRjrS4+QWHLKX6qKoUsfS/m0vqzsVaEBiZiaKbG/e+NKk2ch5ALQr/ihWaMHxiCuuWHA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, "node_modules/@radix-ui/colors": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@radix-ui/colors/-/colors-3.0.0.tgz", @@ -4394,24 +4977,24 @@ "license": "MIT" }, "node_modules/@radix-ui/number": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.2.tgz", - "integrity": "sha512-ceTwaxc4I5IOi97DgCotl3pqiyRGvffcc0oOsE2dQYaJOFIDsDt4VWG6xEbg1QePv9QWausCEIppud/tJ1wNig==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.3.tgz", + "integrity": "sha512-Road2bidD0uu/1BGDOWNdPI06g0lIRy6IF9GZcIrDK2KGItfor8IQwQa+yM2ERgHM1MmHxaxpTzk0/Jp42lNfA==", "license": "MIT" }, "node_modules/@radix-ui/primitive": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.4.tgz", - "integrity": "sha512-7AdCK9PQyiljKoBDbN8OuctCbd/esdwZPQ8RtOE3SsyQtUpiPb+ND75q0jEhC1m1ecBI0MFNeLJvwIh9iKHRcQ==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.7.tgz", + "integrity": "sha512-rqWnm76nYT8HoNNqEjpgJ7Pw/DrBj5iBTrmEPo6HTX5+VJyBNOqTdv4g89G63HuR5g0AaENoAcH7Is5fF2kZ8Q==", "license": "MIT" }, "node_modules/@radix-ui/react-arrow": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.9.tgz", - "integrity": "sha512-yqHW5WQ/cTpU/un7dqqIKNy2iRU8BC0JB78PEzTfCCYvZu1U6W9KwObAniMk9nhSfyotKPQTYaUD/HB0f5muig==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.15.tgz", + "integrity": "sha512-v4zggRcjadnI+ClKDuijlQEW4tw3NoaeHc/PwpKnLoLLKNUG4InLegkstooLcRIUWCs+8L22dGURCVuFfOKfnA==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.5" + "@radix-ui/react-primitive": "2.1.10" }, "peerDependencies": { "@types/react": "*", @@ -4429,15 +5012,15 @@ } }, "node_modules/@radix-ui/react-collection": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.9.tgz", - "integrity": "sha512-zuSVi7ziP7uQRqc+yGxsKJfNkdyHv3ZKDaHe0gzg4dRgws96TPKWIiz84tVHP4GEcEl8bC0mdt17NkcxaJHmaQ==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.15.tgz", + "integrity": "sha512-9W+B9NPF0NaaPh/1NJd3+KqsnlLqU9H7T2rvww+fp+T/evVXdNAyYcnfRQZFOjkR1ajQp3yORlqnI8soawLvNA==", "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-primitive": "2.1.5", - "@radix-ui/react-slot": "1.2.5" + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-slot": "1.3.3" }, "peerDependencies": { "@types/react": "*", @@ -4455,9 +5038,9 @@ } }, "node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.3.tgz", - "integrity": "sha512-rYOP8OMnuuPMQF1uhPVlGNcCDlkokKqGFE3JcxFViIkAXP7EvFWUliJAstrapypaBLJNHbZL6jGhbVDGTwmVhA==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.5.tgz", + "integrity": "sha512-+48PbAAbq3didjJxa+OaWY2ZwgAKsNiRGyeHKszblZMQ+kcpd9pAaT11cMkGEie0vsOi3QdeTE6d5Fe3Gn61kA==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -4470,9 +5053,9 @@ } }, "node_modules/@radix-ui/react-context": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.4.tgz", - "integrity": "sha512-QwH4PO5urrbO+FaGd5Aglg+YJgWTyyuZ3g/6mKvsqraLkglDdckw9JafgL5McL5VEJ6EPNduPaT3ZE9BttDAqg==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.2.2.tgz", + "integrity": "sha512-RHCUGwKHDr0hDGg4X7ma4JG4/+12qxw8rkh5QKdDldlCvtja6nUx1Ef/8HVrJze81lEsgLQlqjzjGNHantgnQA==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -4485,23 +5068,24 @@ } }, "node_modules/@radix-ui/react-dialog": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.16.tgz", - "integrity": "sha512-l9ok83YBclEZhbjgzt76Hw733e6cvRKPNgO6GJ/IETlufXG9p+fRu2wlvpImQvR6xdJ8h7J8J2DBvsPEiEsKMw==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-dismissable-layer": "1.1.12", - "@radix-ui/react-focus-guards": "1.1.4", - "@radix-ui/react-focus-scope": "1.1.9", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-portal": "1.1.11", - "@radix-ui/react-presence": "1.1.6", - "@radix-ui/react-primitive": "2.1.5", - "@radix-ui/react-slot": "1.2.5", - "@radix-ui/react-use-controllable-state": "1.2.3", + "version": "1.1.23", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.23.tgz", + "integrity": "sha512-Ksw4WeROkO4rC9k/onilX/Ao2Cr1ku1unMNH+XSCcP4jSXYu7HDsg9n4ojMjVb22XpYjAQ9qfrFlVbru1vXDUA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-focus-guards": "1.1.6", + "@radix-ui/react-focus-scope": "1.1.16", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-slot": "1.3.3", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-layout-effect": "1.1.4", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.7.2" }, @@ -4521,9 +5105,9 @@ } }, "node_modules/@radix-ui/react-direction": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.2.tgz", - "integrity": "sha512-C3vFhbyi4SW3PmbAi6Awpu4OzJtd0MxGurvSsYtr7p7nM8RNB3VAF3CUmnp2j50knpkrRcB7+ycVXzgLgF6yNA==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.4.tgz", + "integrity": "sha512-5pzg4FGQNpExhnhT2zlrP1wZFaYCd1K0nYWoFAdcYoYK868IEigqMX3B3f8yIoRlAhAeDWciLI6ZdCKHF9P4Vg==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -4536,16 +5120,16 @@ } }, "node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.12.tgz", - "integrity": "sha512-MhoruH6xEzsbvOmo4TNgMfmtvRGyDZw4MDSdf4ybMHfezjqwzv6hyd4lsMzBp8K9Sn6sGzCF62x1I7BYUECXOg==", + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.19.tgz", + "integrity": "sha512-8g4pfOL9HoKKLWGiypT+dphVqjFfmcXO5GBnhsG6zI+lxAx/8feQpr+1LSN8Re3hiZ+XkLNS4O9ztK11/LzQ6w==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-primitive": "2.1.5", - "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-escape-keydown": "1.1.2" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-effect-event": "0.0.5" }, "peerDependencies": { "@types/react": "*", @@ -4563,9 +5147,9 @@ } }, "node_modules/@radix-ui/react-focus-guards": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.4.tgz", - "integrity": "sha512-cot/aB/mOm0IYVYTTmQcEEK1M48lZWi8FlYe5nDPQQ8NYZUlXEFgncJ9p2Kzer3RKSrY7cTTpEMLZKNo9QoP5Q==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.6.tgz", + "integrity": "sha512-RNOJjfZMTyBM6xYmV3IVGXkPjIhcBAuv48POevAXwrGJhkWZ9p1rFoIS1JFooPuT193AZmRsCPhpoVJxx6OPoQ==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -4578,14 +5162,14 @@ } }, "node_modules/@radix-ui/react-focus-scope": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.9.tgz", - "integrity": "sha512-9Se8t+Zry+1rEOL7Y6l/4ANYU/TOtAtf8O2fKdwLltcaMcm6kOqYGbzO4tMFQ0bvzO920pRAoHpFZ4W85S3keQ==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.16.tgz", + "integrity": "sha512-wmRZ2WWLvmt6KHy2rNPOdPUjwq5xOHY02+m+udwJTn0aNIox/rkskAvJTyTLGhPK6KgrUjlJUJpgmx/+wFiFIQ==", "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-primitive": "2.1.5", - "@radix-ui/react-use-callback-ref": "1.1.2" + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -4612,12 +5196,12 @@ } }, "node_modules/@radix-ui/react-id": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.2.tgz", - "integrity": "sha512-orBC88futVpqCmhX1p4cvquNHsELQ+w+vBJnuj3ftETI5bJb0bZn3Tqu3SWN2IOcPycTnMGnhwoermvISt72sA==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.4.tgz", + "integrity": "sha512-TMQp2llA+RYn7JcjnrMnz7wN4pcVttPZnRZo52PLQsoLVKzNlVwUeHmfePgTgRluXFvlD3GD5g5MOVVTJCO0qA==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.2" + "@radix-ui/react-use-layout-effect": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -4630,24 +5214,24 @@ } }, "node_modules/@radix-ui/react-popover": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.16.tgz", - "integrity": "sha512-8brVpAU5Uq7Bh0c8EFc4ZTf2JJTYn0o+1L+CUJB3UYIOkTjKGMgoHvduylrahdmNlr3DfH0rFq2DrbNZXgaspw==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-dismissable-layer": "1.1.12", - "@radix-ui/react-focus-guards": "1.1.4", - "@radix-ui/react-focus-scope": "1.1.9", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-popper": "1.3.0", - "@radix-ui/react-portal": "1.1.11", - "@radix-ui/react-presence": "1.1.6", - "@radix-ui/react-primitive": "2.1.5", - "@radix-ui/react-slot": "1.2.5", - "@radix-ui/react-use-controllable-state": "1.2.3", + "version": "1.1.23", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.23.tgz", + "integrity": "sha512-mw58MrBlyHWFisTOYignD0vf/3gdcgAR+9of1s9G/38CbFiUwH1nCDkc0AUM9IrXFgN5Ue8n45j9WCgyM1sbiQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-focus-guards": "1.1.6", + "@radix-ui/react-focus-scope": "1.1.16", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-popper": "1.3.7", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-slot": "1.3.3", + "@radix-ui/react-use-controllable-state": "1.2.6", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.7.2" }, @@ -4667,21 +5251,21 @@ } }, "node_modules/@radix-ui/react-popper": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.3.0.tgz", - "integrity": "sha512-9PB589e1aWZbrlFUHdz6WiPCL+xLZHQFX7oibqG/6Q0SwOkxDyQX9W/cyPa+sAPPKuC8cpLCpRczE5a/1DiwVQ==", + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.3.7.tgz", + "integrity": "sha512-UsJrrd7w4wuKKTdvd/DNERVlwSlUcyXzjhyDwBk+3aPOsCjOY6ZSbxuw8E6lZTjjfP8Cpd0J8VVkrYUWyGYXyg==", "license": "MIT", "dependencies": { "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.1.9", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-primitive": "2.1.5", - "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-layout-effect": "1.1.2", - "@radix-ui/react-use-rect": "1.1.2", - "@radix-ui/react-use-size": "1.1.2", - "@radix-ui/rect": "1.1.2" + "@radix-ui/react-arrow": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-layout-effect": "1.1.4", + "@radix-ui/react-use-rect": "1.1.4", + "@radix-ui/react-use-size": "1.1.4", + "@radix-ui/rect": "1.1.3" }, "peerDependencies": { "@types/react": "*", @@ -4699,13 +5283,13 @@ } }, "node_modules/@radix-ui/react-portal": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.11.tgz", - "integrity": "sha512-UEytdjgEh2tJGgD/gZK4FUx6t1rNIlM3U0DENhSrG7I75FGm1DnaDuVUWF1pWAWUwGmn1sCJ1VGHn8LhN1aTOw==", + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.17.tgz", + "integrity": "sha512-vKQLcWypUnwZVvfV7UkGahH2g6ySe8M8R+zYBwPrv5byZ9QAW6cQVvNKo7GgmD+p8aYb6D9JBuvy8/WhOno2wQ==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.5", - "@radix-ui/react-use-layout-effect": "1.1.2" + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-layout-effect": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -4723,12 +5307,12 @@ } }, "node_modules/@radix-ui/react-presence": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.6.tgz", - "integrity": "sha512-zdTk4PlUO0E18HnZ3wYbW0KkJJxWCdiNYp6g6X1PtONFhxVkg01vliTJAmwIszU6mHiyBOoW9P0rAugl5/hULQ==", + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.10.tgz", + "integrity": "sha512-3wyzCQ6+ubRA+D4uv9m95JYLXxmOHp05qjrkjeA7uKHHtjpPggQzc6DAb0URl7j67oR0K2foO4ip27TiX037Bw==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.2" + "@radix-ui/react-use-layout-effect": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -4746,12 +5330,12 @@ } }, "node_modules/@radix-ui/react-primitive": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.5.tgz", - "integrity": "sha512-zifXeB8Y88qCYx8PLZ5oQb32KwZub+s925mMoZsBBq9KUQqWKkREubTfs6ASjRPPBe7Jt9O8OHH89+95VG+grA==", + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.10.tgz", + "integrity": "sha512-MucOnzh6hR5mid6VpkbglRAMYMjKLqRnGBbjXkzjK52fuQDd1qbkx78a5P40mkcnVXJdEVxm26E9OPAiUq7nBg==", "license": "MIT", "dependencies": { - "@radix-ui/react-slot": "1.2.5" + "@radix-ui/react-slot": "1.3.3" }, "peerDependencies": { "@types/react": "*", @@ -4769,20 +5353,22 @@ } }, "node_modules/@radix-ui/react-roving-focus": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.12.tgz", - "integrity": "sha512-FvgPt1bRmg8Xt2QpF7NUZW3dE0ZQHGm41dAdgT2J2GJPoIXz+9Em3NobAxf4fupcxhgHu03E5CRiU2MWvObXyg==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-collection": "1.1.9", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-primitive": "2.1.5", - "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-controllable-state": "1.2.3" + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.19.tgz", + "integrity": "sha512-V9jI6hDjT7l3jsCQD9bLNvDLM3tH/gdbOTp7Tefp3hbbgCGQoK7tUvrWiRlcoBHIZ809ElXwNQwVo0B98LuTXQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-is-hydrated": "0.1.3", + "@radix-ui/react-use-layout-effect": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -4800,31 +5386,31 @@ } }, "node_modules/@radix-ui/react-select": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.3.0.tgz", - "integrity": "sha512-mENc7WpJvJcW8hlMpzfFcHcEhTvYS5JMBmi9HVC1Q00uhBwML086MHYUV8QQdQv6lcu0Wg8dzd1RB8AFADcG/g==", - "license": "MIT", - "dependencies": { - "@radix-ui/number": "1.1.2", - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-collection": "1.1.9", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.12", - "@radix-ui/react-focus-guards": "1.1.4", - "@radix-ui/react-focus-scope": "1.1.9", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-popper": "1.3.0", - "@radix-ui/react-portal": "1.1.11", - "@radix-ui/react-presence": "1.1.6", - "@radix-ui/react-primitive": "2.1.5", - "@radix-ui/react-slot": "1.2.5", - "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-controllable-state": "1.2.3", - "@radix-ui/react-use-layout-effect": "1.1.2", - "@radix-ui/react-use-previous": "1.1.2", - "@radix-ui/react-visually-hidden": "1.2.5", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.3.7.tgz", + "integrity": "sha512-WFGImkmbzcfxeIwq/+4HvRN0pizBwbwQUED4I13ezQsDdfl38ZntN6TmR8XaSzPBqoCToe8rF75j6NPNDSzhbg==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.3", + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-focus-guards": "1.1.6", + "@radix-ui/react-focus-scope": "1.1.16", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-popper": "1.3.7", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-slot": "1.3.3", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-layout-effect": "1.1.4", + "@radix-ui/react-use-previous": "1.1.4", + "@radix-ui/react-visually-hidden": "1.2.11", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.7.2" }, @@ -4844,12 +5430,12 @@ } }, "node_modules/@radix-ui/react-separator": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.9.tgz", - "integrity": "sha512-gvgW+JV/Mbjj6darztTetnmElpQEzZrXpJvfj+dOxNAxiyHEAyUvEjjl4zxblvmjmKmi3jfPoy7ZdxzCuUBJSA==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.15.tgz", + "integrity": "sha512-jOLO4lssEzWpoDu7G+Ze4VjwMRUBt291pnZD0gmalREZipnTX3wadQo7Fy48GCTfe14/YRN6rw/rOJqrE85Wxw==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.5" + "@radix-ui/react-primitive": "2.1.10" }, "peerDependencies": { "@types/react": "*", @@ -4867,12 +5453,12 @@ } }, "node_modules/@radix-ui/react-slot": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.5.tgz", - "integrity": "sha512-rCMO3QsIVKv5JTY5CVbo2MvO77SpEqqYc8AvRE7OWqRDOIqAKjsp+DrmnY9uc8NPdxB5E2z47HTYGeE2+NTptg==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.3.3.tgz", + "integrity": "sha512-qx7oqnYbxnK9kYI9m317qmFmEgo6ywqWvbTogdj7cL9p3/yx4M48p7Rnw5z3H890cL/ow/EeWJsuTykeZVXP5Q==", "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.3" + "@radix-ui/react-compose-refs": "1.1.5" }, "peerDependencies": { "@types/react": "*", @@ -4885,14 +5471,14 @@ } }, "node_modules/@radix-ui/react-toggle": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.11.tgz", - "integrity": "sha512-FikrKJemoBGZQ6uRID0HJqSPBP6D7OppdD2OhLl0ZYLlAyPXI7MezoYGmumwNkrAoRm35xXkb4C8JPfJZZzcaw==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.18.tgz", + "integrity": "sha512-7lonPlKfSacd20GlOBx2ltuVKz9oqWYZz+oMQyOltw6t1y2nyftj2ZmwwUHYn49kqfDWcp8dNZm5NgV+5Z+mug==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-primitive": "2.1.5", - "@radix-ui/react-use-controllable-state": "1.2.3" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6" }, "peerDependencies": { "@types/react": "*", @@ -4910,18 +5496,18 @@ } }, "node_modules/@radix-ui/react-toggle-group": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.12.tgz", - "integrity": "sha512-TEgECgJaWGAHJJZGzNNEYTNBdIXqX7LchANycpyP7DkfjmuiSN7ISt1k/ZRGVJgVJonsgP4vwaiKMn5utrcwWQ==", + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.19.tgz", + "integrity": "sha512-OtnwuSVjd1Ofi+AdnvhsjQdyuhCDwYs1w9RyB5BN/OavXOVQo42SYqQjwUnbPnaiPFBpQ9aX70dWeee+v2oBLA==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-primitive": "2.1.5", - "@radix-ui/react-roving-focus": "1.1.12", - "@radix-ui/react-toggle": "1.1.11", - "@radix-ui/react-use-controllable-state": "1.2.3" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-roving-focus": "1.1.19", + "@radix-ui/react-toggle": "1.1.18", + "@radix-ui/react-use-controllable-state": "1.2.6" }, "peerDependencies": { "@types/react": "*", @@ -4939,18 +5525,18 @@ } }, "node_modules/@radix-ui/react-toolbar": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toolbar/-/react-toolbar-1.1.12.tgz", - "integrity": "sha512-4wHtJVdIgqMmEwUvxA0BYg/2JMRbt0L3+8UD8Ml/nhKkfXtiZcM8u/S15gQ5xj9YEd/0qlrm5bE805LsjQ+J8A==", + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toolbar/-/react-toolbar-1.1.19.tgz", + "integrity": "sha512-Ph0IvtYw4VB12ZnZg+YtrGs8yJQsnizwo/zu0R4Y/nWugtJzA7Pg1eWeuDR9+LSqn+xjamss+UOSOJJJ4gx8jw==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-primitive": "2.1.5", - "@radix-ui/react-roving-focus": "1.1.12", - "@radix-ui/react-separator": "1.1.9", - "@radix-ui/react-toggle-group": "1.1.12" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-roving-focus": "1.1.19", + "@radix-ui/react-separator": "1.1.15", + "@radix-ui/react-toggle-group": "1.1.19" }, "peerDependencies": { "@types/react": "*", @@ -4968,23 +5554,24 @@ } }, "node_modules/@radix-ui/react-tooltip": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.9.tgz", - "integrity": "sha512-u6F9MmTtBSLkiXNVDrtB/yPCZarM9smNswC24YYLV/M+bth6J3Gs3vlJezEoFwKZvPvxhCpUYdUnOsNG/0XOlA==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-dismissable-layer": "1.1.12", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-popper": "1.3.0", - "@radix-ui/react-portal": "1.1.11", - "@radix-ui/react-presence": "1.1.6", - "@radix-ui/react-primitive": "2.1.5", - "@radix-ui/react-slot": "1.2.5", - "@radix-ui/react-use-controllable-state": "1.2.3", - "@radix-ui/react-visually-hidden": "1.2.5" + "version": "1.2.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.16.tgz", + "integrity": "sha512-6EamKFRRnlpdadndbZ6LMwycfwkwPte1B42hs6QA0gYhjaOKqW4PZ4pjaW9UrlDX5eVt/OjncE7BFTPL5nmZhg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-popper": "1.3.7", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-slot": "1.3.3", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-layout-effect": "1.1.4", + "@radix-ui/react-visually-hidden": "1.2.11" }, "peerDependencies": { "@types/react": "*", @@ -5002,9 +5589,9 @@ } }, "node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.2.tgz", - "integrity": "sha512-xCso9j1/u8sEgP1RNHjFrXJLApL8LiqOkI1R4ywuN00rxWdYg4oQXuwKLS3i0j5NWLromUD27/4nlxj2UFVvIw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.4.tgz", + "integrity": "sha512-R6OUY2e2fA6Yn6s+VSx5KBV6Nx8LQEhu+cz7LCej18rQ1HLyg9PSC9jP/ZNx0o6FAIK9c0F1kHylzSxKsdlkrQ==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -5017,13 +5604,14 @@ } }, "node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.3.tgz", - "integrity": "sha512-PLzC90MS+ReootmjC597dvopoelpZ8Q61HJkDXZSExitIq7PL55vHNnesAHwguHK0aPfBnpdNzQtv1uliaqQrA==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.6.tgz", + "integrity": "sha512-uEQJGT97ZA/TgP/Hydw47lHu+/vQj6z/0jA+WeTbK1o9Rx45GImjpD0tc3W5ad3D6XTSR6e1yEO0FvGq6WQfVQ==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-effect-event": "0.0.3", - "@radix-ui/react-use-layout-effect": "1.1.2" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-use-effect-event": "0.0.5", + "@radix-ui/react-use-layout-effect": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -5036,12 +5624,12 @@ } }, "node_modules/@radix-ui/react-use-effect-event": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.3.tgz", - "integrity": "sha512-6c8ZqvPTWILEKnyVkP53EGRCcpnJiKTC21sS/6R1GF5xKyHJJWQEPfkqlcgUkdRQivd6tb23abUwe4ngWmY0JA==", + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.5.tgz", + "integrity": "sha512-7cshFL8HGS/7HEiHH+9kL9HBwp2sa9yX18Knwek6KYWmXwM7pegMgta2AXMQKI+rq3JnfSj9x8wYqFMTdG1Jgg==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.2" + "@radix-ui/react-use-layout-effect": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -5054,9 +5642,9 @@ } }, "node_modules/@radix-ui/react-use-is-hydrated": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.1.tgz", - "integrity": "sha512-qwOiz4Tjo8CNnrOLAYUMXeZwDzXgXpvK4TKQPmWLECM9XoWvA6+0Z2/7Ag3A4ivjS4ovbLJPbskkxioFyBhr8A==", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.3.tgz", + "integrity": "sha512-umO/aJ+82CpOnhDZUTbILCQf7kU/g0iv+oGs/Q8jw7IkhWBzaEP4sA268PhFAJTFetbwp3ICc6ktpI4TqtxcIw==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -5069,9 +5657,9 @@ } }, "node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.2.tgz", - "integrity": "sha512-jrBWOxZITuGcnjRCM2t2U5ZPkCLxD+Ym6DjfssS5haTj2iiak/DOb64JeN6OdLfLgptb6/e2kKR+ZuTrGoZTPA==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.4.tgz", + "integrity": "sha512-K20DkRkUwDnxEYMBPcg3Y6voLkEy5p5QQmszZgLngKKiC7dzBR/aEuK3w1qlx2JWDUNH6FluahYdgR3BP+QbYw==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -5084,9 +5672,9 @@ } }, "node_modules/@radix-ui/react-use-previous": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.2.tgz", - "integrity": "sha512-IGBQPtRFdhN6MQ8dbegVmBq1LVZluya3F1jWY+puIcQC3MHctRwTDSBWCkL/3ZcnMJLTMJ++Z+ktmvg0F89iCw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.4.tgz", + "integrity": "sha512-XoSLhbRbqxFtgJoi2fNHA3C6pDlY34x508vUpUGoFZfvePfHXHbE1lC4FYFMnJWgiCRroSTw6fOsXQoVS9RwZg==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -5099,12 +5687,12 @@ } }, "node_modules/@radix-ui/react-use-rect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.2.tgz", - "integrity": "sha512-d8a+bBY/FxikNPlgJJoaBHZX+zKVbWHYJGTLnLvveQgFSTntkGdEKv3JDtHrMS0DNYpllz2nRsTLGLKYttbpmw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.4.tgz", + "integrity": "sha512-cSOCh6JlkmfjLyNcLiu2nB4v+nm+dkZ+Q5KHWk/soo4U7ZLiEQFKHK9/YmtBHjfCEaU43IBKQOc4/uJmCaiCTQ==", "license": "MIT", "dependencies": { - "@radix-ui/rect": "1.1.2" + "@radix-ui/rect": "1.1.3" }, "peerDependencies": { "@types/react": "*", @@ -5117,12 +5705,12 @@ } }, "node_modules/@radix-ui/react-use-size": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.2.tgz", - "integrity": "sha512-giWQp+4mxjBPt4KZ0MmyuykFNWfbDxKt4x+fPkRYmgRFJSbCZFzUglvMb/Kjn38tm10YP4ufiQZDx3zna4LU6w==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.4.tgz", + "integrity": "sha512-D3anSY15EJoxrihpsXI6SMrmmonnQtR2ni7arO+Lfdg3O95b9hNXxONk8jA5C8ANdF/h5HMAxejgs8PWJ6rlhw==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.2" + "@radix-ui/react-use-layout-effect": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -5135,12 +5723,12 @@ } }, "node_modules/@radix-ui/react-visually-hidden": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.5.tgz", - "integrity": "sha512-tPcHNI3FajdDBFpl/Ez1m2WL0ufJqBKyHxMDBvKitopamK36WwBGOMicuMEZKkM5Wce41QxUyv6BsiqfrWBiGg==", + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.11.tgz", + "integrity": "sha512-NFS86RYYZb4/exihaESBGOpMJFz8MGLAfu3mOBSGByVnVPC9JPASfYubxd/8KbkQK0sYAv8lVQDEQukDX/qXvQ==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.5" + "@radix-ui/react-primitive": "2.1.10" }, "peerDependencies": { "@types/react": "*", @@ -5158,9 +5746,9 @@ } }, "node_modules/@radix-ui/rect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.2.tgz", - "integrity": "sha512-xnXE7wG13PI+cxieVssYXlQJuYVRhH9NBoxt3KNwzghDIA69GMm7d4wXRouHIYjE+KvS6U/MsMO73NdS2MH9ZA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.3.tgz", + "integrity": "sha512-JtyZR+mqgBibTo8xea3B6ZRmzZiM/YeVBtUkas6zMuXjAlfIFIW2FgqeM9eLyvEaYX66vr6DJMK+4U6LV0KhNw==", "license": "MIT" }, "node_modules/@react-email/render": { @@ -5515,9 +6103,9 @@ "license": "Unlicense" }, "node_modules/@rolldown/binding-android-arm64": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.5.tgz", - "integrity": "sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.3.tgz", + "integrity": "sha512-zrJtHDcaZJ1Fp7xf4hNl+7seH9Cn/N5TwLYkhgXREtBwAd/jaqW3uqeHxpDugJLVICWg4eW44kOQEGJ1r6jCGw==", "cpu": [ "arm64" ], @@ -5531,9 +6119,9 @@ } }, "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.5.tgz", - "integrity": "sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.3.tgz", + "integrity": "sha512-ieIiibVCp0tX7TLu2cafoNPv8wJyYi01ekXpbf8q2j7F4rGAhhXb/eQh7ge9DRBY78GwmRQtvjZDux7EDbA8kA==", "cpu": [ "arm64" ], @@ -5547,9 +6135,9 @@ } }, "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.5.tgz", - "integrity": "sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.3.tgz", + "integrity": "sha512-Zh9tCon19eDXJoihx0rqKhMUlMYqzwj3aPsSuHmI4RWZh62dWUL+DJN4C5YQya5TcQBJU/Fe8+rY0jhXTQITqA==", "cpu": [ "x64" ], @@ -5563,9 +6151,9 @@ } }, "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.5.tgz", - "integrity": "sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.3.tgz", + "integrity": "sha512-nGbJWewA1wrXXZiQhjAT5rhibGfns5ZNkDVqxsO6zJ3f3YvpoDNNmGMSbbhLuXKjNScaBJVOAboztAWVespQMg==", "cpu": [ "x64" ], @@ -5579,9 +6167,9 @@ } }, "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.5.tgz", - "integrity": "sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.3.tgz", + "integrity": "sha512-QNniJr5Kml0kDEB98jiDOJjXNroxIIi0IXIbdYzY26Xt1pVbeP62+KnoIZLwirOymX/0jDk/2gI/bNUv7A7OIw==", "cpu": [ "arm" ], @@ -5595,9 +6183,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.5.tgz", - "integrity": "sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.3.tgz", + "integrity": "sha512-TkqEAcmmvH3I/q4114NB4RVt6241Dao48pF45uLcFGrwAaIn0iITgTAKP/dLjbN0R4buJjGb91+UHSoFmpgIWw==", "cpu": [ "arm64" ], @@ -5614,9 +6202,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.5.tgz", - "integrity": "sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.3.tgz", + "integrity": "sha512-NHqjnxpsndf4MPymxteFAWHHfkTL8HjWh1KB7z23ofZ6QO2euONuxDXjat69dKZRALnGypg8k8SsK8vZJoXv1Q==", "cpu": [ "arm64" ], @@ -5633,9 +6221,9 @@ } }, "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.5.tgz", - "integrity": "sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.3.tgz", + "integrity": "sha512-6tbrbwfz5GB9DQ4Jwo6hy9v+vR31xZlvzZ6n5Xut6Hhx5PvrA9q/HsK8KMaYQp063iqZGXwNvZtYNLD7EM/x0w==", "cpu": [ "ppc64" ], @@ -5652,9 +6240,9 @@ } }, "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.5.tgz", - "integrity": "sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.3.tgz", + "integrity": "sha512-oyuXxXmoZHjXC917IAPFAAv4wWAa0cM9afk8nx1+9/jNNOX1uPf8yDA6p7G0RypOfw/X0PQt5IfoquY1um+zSg==", "cpu": [ "s390x" ], @@ -5671,9 +6259,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.5.tgz", - "integrity": "sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.3.tgz", + "integrity": "sha512-TytMwF2KVGqP2tgd0I1OY0PAv78dZRAYcF5ssDzjM34SUXCED3uXvSd5+lHoC0bTD6eEdFz7LdQNCO1y0oVk9w==", "cpu": [ "x64" ], @@ -5690,9 +6278,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.5.tgz", - "integrity": "sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.3.tgz", + "integrity": "sha512-/E9m3qstrJFVPoULV25mVQblSNExY2+kBsYe4sy0Tn0yOOgJ8wZbZt3KnRbF/XeU2Gl1STKUQnDNTqhIE5MD4A==", "cpu": [ "x64" ], @@ -5709,9 +6297,9 @@ } }, "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.5.tgz", - "integrity": "sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.3.tgz", + "integrity": "sha512-Kr0OcsoQI816i6HOl3vFHpd1K0eZyh76zgfj4c1nTyaTsd5r2Mj1lwM4R90y/qaCfmTn9eHy0SKwi98eitRxug==", "cpu": [ "arm64" ], @@ -5724,67 +6312,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@rolldown/binding-wasm32-wasi": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.5.tgz", - "integrity": "sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==", - "cpu": [ - "wasm32" - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "1.11.1", - "@emnapi/runtime": "1.11.1", - "@napi-rs/wasm-runtime": "^1.1.6" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@emnapi/core": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", - "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.2.2", - "tslib": "^2.4.0" - } - }, - "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@emnapi/runtime": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", - "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", - "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==", - "license": "MIT", - "optional": true, - "dependencies": { - "@tybys/wasm-util": "^0.10.3" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "peerDependencies": { - "@emnapi/core": "^1.7.1", - "@emnapi/runtime": "^1.7.1" - } - }, "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.5.tgz", - "integrity": "sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.3.tgz", + "integrity": "sha512-hOtMwTqnME+/gJcH/PCZ0wn0zPUjiWOgkHpxbSJpfGKMezHltx1S7/k1SitzVa7Ww2cqrDDaFbZEhcJZO8o+Jw==", "cpu": [ "arm64" ], @@ -5798,9 +6329,9 @@ } }, "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.5.tgz", - "integrity": "sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.3.tgz", + "integrity": "sha512-ekcqMMkI2PlhYnfzQnB/cEdYUVVJViWvoUyLrbzgDoi3Snfc1mVBwdnc306ufA5ejy8JSPjT2RlW1nQSjW7efg==", "cpu": [ "x64" ], @@ -5814,9 +6345,9 @@ } }, "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.27", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", - "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", "license": "MIT" }, "node_modules/@rollup/pluginutils": { @@ -5842,9 +6373,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.2.tgz", - "integrity": "sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.4.tgz", + "integrity": "sha512-RrPokAb7dmbxFoeO3TloqHyOjgye8RkBhSqmp4aJMIex4c9r46ZstPnleDQOq1t46VOVjwIuwNogIqbodV1Vvg==", "cpu": [ "arm" ], @@ -5855,9 +6386,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.2.tgz", - "integrity": "sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.4.tgz", + "integrity": "sha512-JKuJc+pnpks2pjy7L/N3v/cAkZxYlnmuZoD840ldbMI5KDbC4iO9NKwPKYdjYFCMAIIlBzYSFHxIJVYzRo2/8A==", "cpu": [ "arm64" ], @@ -5868,9 +6399,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.2.tgz", - "integrity": "sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.4.tgz", + "integrity": "sha512-krw5uS2STmvJ02x0uTXHbqQNuz+9eZ1iw+qXk9dmW2gvV4jV7O2hEoOnuhFrpOPiel1mBFtqbxYZZtC46hXLOw==", "cpu": [ "arm64" ], @@ -5881,9 +6412,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.2.tgz", - "integrity": "sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.4.tgz", + "integrity": "sha512-wsTxtgApb4PrOsNJIm0FZ1h3WvCC+k9uxLJ4ad75hgoS4NiRes2SoJFlDAyMwiUY8IssDqGcHbXuN0sx1tfF1A==", "cpu": [ "x64" ], @@ -5894,9 +6425,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.2.tgz", - "integrity": "sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.4.tgz", + "integrity": "sha512-GUOnQlyZe3yAXhWOtOMsn5Qkrv5E5mZXa0thbARWi5Ei2szlVXJFQhddZ4HbAzh8q92w5twp+CQvs/eFanz9YQ==", "cpu": [ "arm64" ], @@ -5907,9 +6438,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.2.tgz", - "integrity": "sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.4.tgz", + "integrity": "sha512-/Y7f3QuxjzPKsjA/rfEDa3+0vXqyjmJ50Ln8dPpCmWkKTrUoWHG1cWhTqaAMLob2m2nESWuC7yGrREz019Ztqg==", "cpu": [ "x64" ], @@ -5920,9 +6451,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.2.tgz", - "integrity": "sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.4.tgz", + "integrity": "sha512-81wiiX3v7aqy+T+bT61TJ78yJjRquqFFTTbAPt08imfQQzkPIW8t6aJbkTagtCCrXMNc9D66+geqlK7ydLPNqA==", "cpu": [ "arm" ], @@ -5936,9 +6467,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.2.tgz", - "integrity": "sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.4.tgz", + "integrity": "sha512-9kmDIvNZqdoHOBZgNtpTBeLWYO/LVipM3H/j62P8848/l/VPEQL6N3uxU9pvP1oZAsXyC2MEnFP3ovRjo7WYNQ==", "cpu": [ "arm" ], @@ -5952,9 +6483,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.2.tgz", - "integrity": "sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.4.tgz", + "integrity": "sha512-CcnXHWnXg69g+DX5VWL3FHts3qMRN2uVEHX+BZvGLdd07/gXkn3ePjYtO1LDJvxkGKVHMclKBRa1QUTH+6toYQ==", "cpu": [ "arm64" ], @@ -5968,9 +6499,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.2.tgz", - "integrity": "sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.4.tgz", + "integrity": "sha512-iFOibiHnTRuhrWLlRsOQFdZJJIa7S8OwkneJr4ocALP16u5yk6lWLINFwhHaEqBFMsKDUZofLkGos7+CPzGB3g==", "cpu": [ "arm64" ], @@ -5984,9 +6515,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.2.tgz", - "integrity": "sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.4.tgz", + "integrity": "sha512-XnWYMI7euHlb5a871xPja+Gm7DRCFU+FGRrtS2sMq9N8FvqtpagUy6gD4YOemC5MRk9xbh8+jYMEJbigFQwsgA==", "cpu": [ "loong64" ], @@ -6000,9 +6531,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.2.tgz", - "integrity": "sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.4.tgz", + "integrity": "sha512-qGDAlO0U8xedCcsdRm9oaoQY8DAx/QT7uIxJWhCdx0ceIWX783UC9QSYkdpzAe29wNiVfp24+bZdQmn49o45SQ==", "cpu": [ "loong64" ], @@ -6016,9 +6547,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.2.tgz", - "integrity": "sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.4.tgz", + "integrity": "sha512-ru4H6ezD7ysA5EiEK6qkkaEb4modH8CTej6kUy/gQi20u3kB3G7Zn8snXXkeJSCOFKG/rbPPtM/+9Wgas1961w==", "cpu": [ "ppc64" ], @@ -6032,9 +6563,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.2.tgz", - "integrity": "sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.4.tgz", + "integrity": "sha512-2W4MO5WQVJnbJaZdvDb9rhBDuFU1nKIepPFpJUBsTh2k1YY2g+ODViaWuyOAjQ5cOP7NvrvLzt3wvHOoiAvc7w==", "cpu": [ "ppc64" ], @@ -6048,9 +6579,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.2.tgz", - "integrity": "sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.4.tgz", + "integrity": "sha512-+fxjfuoAmVMCYV5QyjoIpu0cp5DOiOTeqYFk1AVaxGr+/ravWLX89XfQmptsoWcaVy/TGf2hexzbUOrCQIL1CQ==", "cpu": [ "riscv64" ], @@ -6064,9 +6595,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.2.tgz", - "integrity": "sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.4.tgz", + "integrity": "sha512-jTn8JfHGL4djjFxPuM06LmNUJDsst2jeVlsd9OmIH6zc5sC9K6rIuO4YajXatLUpBmBKl6b35ro1QZocLi+tcA==", "cpu": [ "riscv64" ], @@ -6080,9 +6611,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.2.tgz", - "integrity": "sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.4.tgz", + "integrity": "sha512-oCJCJL4pXsoDcP2QZ+JVlPTIRc6266zsIaeJJsWImmF7HO0W8nb6HuSgZlMWxJwaPf8ehbSw8yo0EUw925hKsA==", "cpu": [ "s390x" ], @@ -6096,9 +6627,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.2.tgz", - "integrity": "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.4.tgz", + "integrity": "sha512-W69hukhZ3KKNRCaMIEzKvcFye42hh0FE1+YoYaf5+Ikacuftoco6yO/xouz0hc5d5W/s3yBro5jRiuEE/Q5vUw==", "cpu": [ "x64" ], @@ -6112,9 +6643,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.2.tgz", - "integrity": "sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.4.tgz", + "integrity": "sha512-qiXbGG2jkjXhzXpsFZSR2Xpb8DN/UaxYsbb/STbuR/6fpaDgRmmaq1B/LmtF2wQFOFOSsK2jdE0RZ3a0zHn4QA==", "cpu": [ "x64" ], @@ -6128,9 +6659,9 @@ ] }, "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.2.tgz", - "integrity": "sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.4.tgz", + "integrity": "sha512-nWeM//hxv8mIo6jD7Hu4o48DVmV9pbV6gsKaWU+4NFyqHoPKwrkRiZGLKUhOBk8qNmDmpwFtPKg80Bo/Tn4xiQ==", "cpu": [ "x64" ], @@ -6141,9 +6672,9 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.2.tgz", - "integrity": "sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.4.tgz", + "integrity": "sha512-s62SQ/vgsRSvMwDkOEfTqfgASF0f26ZNaQuTA6Aok5lrikf89yI2W0gFHvZb2Jpgc6N8JnOKZgCK2iciO3CsxQ==", "cpu": [ "arm64" ], @@ -6154,9 +6685,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.2.tgz", - "integrity": "sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.4.tgz", + "integrity": "sha512-J6wGf8TVGbXJq+HH+ttTvrcfNKPbuZecV6KT1B8I18BC5IURUh5kl4Yl5OEP5eFIUoI5BWxCsyYMhFsDx8kekw==", "cpu": [ "arm64" ], @@ -6167,9 +6698,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.2.tgz", - "integrity": "sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.4.tgz", + "integrity": "sha512-zmfrQd/0wu6oJs8Vq8KwY/YtsKSsLtKe/HwAP4Wqy8LhWjeT55fHRAkOhYQ12wI3ayS4Tt12d5CDRD7N96SAYQ==", "cpu": [ "ia32" ], @@ -6180,9 +6711,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.2.tgz", - "integrity": "sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.4.tgz", + "integrity": "sha512-qPzHqdj9rfUD+w79dtE07zi/kFwKyCJqplp5K5ygeLTp7jLpAoc16OAH39HSmRC9UpozaecsleI8uAdEj6v2yw==", "cpu": [ "x64" ], @@ -6193,9 +6724,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.2.tgz", - "integrity": "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.4.tgz", + "integrity": "sha512-zD6NdeWEByGE9QF9vCrlJ5YQB4oq9q91kPZS37Jwj5hOkvR1lTBSpsKhKDw4IJtbQ35LsTS1HD9DZYGKIshU1Q==", "cpu": [ "x64" ], @@ -6413,42 +6944,42 @@ } }, "node_modules/@secretlint/core": { - "version": "11.7.1", - "resolved": "https://registry.npmjs.org/@secretlint/core/-/core-11.7.1.tgz", - "integrity": "sha512-D1a/6U3JT2hhs+OpocAf1j+2t79ExrFqNm8j7pilhCQqpJ9QIEexGs1ty3v9wDACm48v0PFhCNCyn4hyctGYig==", + "version": "13.0.4", + "resolved": "https://registry.npmjs.org/@secretlint/core/-/core-13.0.4.tgz", + "integrity": "sha512-Wv49KcI5XX6xjLR1wxyjORA15PtMb5ar/M27ShimVudaSi6iAM04QCA5Ozx+uEahfHNefUUKbjKGpy/9pxuW7g==", "license": "MIT", "dependencies": { - "@secretlint/profiler": "11.7.1", - "@secretlint/types": "11.7.1", + "@secretlint/profiler": "13.0.4", + "@secretlint/types": "13.0.4", "debug": "^4.4.3", "structured-source": "^4.0.0" }, "engines": { - "node": ">=20.0.0" + "node": ">=22.0.0" } }, "node_modules/@secretlint/profiler": { - "version": "11.7.1", - "resolved": "https://registry.npmjs.org/@secretlint/profiler/-/profiler-11.7.1.tgz", - "integrity": "sha512-Fa1fCVT4izv8PRXL8t4KB6FwBEL2OYqOYtNsyssWd7giNoNcohCoLGnDhJNLcTxTyTqkDzLlGV0M4CYsCkcfZQ==", + "version": "13.0.4", + "resolved": "https://registry.npmjs.org/@secretlint/profiler/-/profiler-13.0.4.tgz", + "integrity": "sha512-T2hSyZmJrQbGAe+Vl9AGNlMnoB0MP6m2BLh7EH80QcesvNM2t0pCzdiBvQ/yCe76w6/gZNpHlrSVayUeT43qVw==", "license": "MIT" }, "node_modules/@secretlint/secretlint-rule-preset-recommend": { - "version": "11.7.1", - "resolved": "https://registry.npmjs.org/@secretlint/secretlint-rule-preset-recommend/-/secretlint-rule-preset-recommend-11.7.1.tgz", - "integrity": "sha512-LsiEhDWoXi9GNx1Zp5eYRNajeUvBrZ82h3k/vzFqo0WoSdmpyDnkkzBTLXqWqj1VNyPCcTwlxOqnEmlz6lXc7A==", + "version": "13.0.4", + "resolved": "https://registry.npmjs.org/@secretlint/secretlint-rule-preset-recommend/-/secretlint-rule-preset-recommend-13.0.4.tgz", + "integrity": "sha512-Nbcr7tvyKuRF4BKh7RQSCEOaif4gFPH/qjK2ajcoUDGL7HAY/C6PzcsmVR1Y0qQCRqrBuMuXn1onXE+wxNNNsw==", "license": "MIT", "engines": { - "node": ">=20.0.0" + "node": ">=22.0.0" } }, "node_modules/@secretlint/types": { - "version": "11.7.1", - "resolved": "https://registry.npmjs.org/@secretlint/types/-/types-11.7.1.tgz", - "integrity": "sha512-bIkBwIdQScZX5xm3DsLp3oL5U/KKUYWgmst39dZsDi55X9tKuPd7/uVpO1PqNrDW1I0QD5t6es/2LonG5RjxXg==", + "version": "13.0.4", + "resolved": "https://registry.npmjs.org/@secretlint/types/-/types-13.0.4.tgz", + "integrity": "sha512-on/DivRDZEFzRD2pZJO0wkIL+AvEY+KOoZLPCWcz4pjZnJ4NzMuHQjvTJc9KY0yht+ugcYg9AmtOUzpEk31IWA==", "license": "MIT", "engines": { - "node": ">=20.0.0" + "node": ">=22.0.0" } }, "node_modules/@selderee/plugin-htmlparser2": { @@ -6507,27 +7038,27 @@ } }, "node_modules/@shikijs/primitive": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.3.1.tgz", - "integrity": "sha512-CXQRQOYy1leqQ8ceTeJdmXv/bsUY++6QyLpXJ94LZAAYj5X2SKRdc5ipguv4NPyGVKItB2PPwUpRNe0Sjh5S1A==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.4.2.tgz", + "integrity": "sha512-l6fQQKsOMlz72n38fztmSgZ76MO6KSWuw8o+GJ+FhmqrpC9pIOJNQNXGgbb5yX2AwpzlEHwsaLPnk/8o4Fm+rA==", "license": "MIT", "dependencies": { - "@shikijs/types": "4.3.1", + "@shikijs/types": "4.4.2", "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" + "@types/hast": "^3.0.5" }, "engines": { "node": ">=20" } }, "node_modules/@shikijs/primitive/node_modules/@shikijs/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.3.1.tgz", - "integrity": "sha512-CHFxE0jztBIZRHH6gxXE7DXUCFXjReEGxZ/j0rfSLGKZuwp2xBYycEP14875DSa9KLL/6700oxIq6oO6ef9K2g==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.4.2.tgz", + "integrity": "sha512-PFYitV4vpDr/iPCIhnHp+Q4ftic5N5VeNJ3KQ1O8gn3h2ar8qgwMAXF7tq4m1CWaMS60fV4VqF6vfnWH4F7vqQ==", "license": "MIT", "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" + "@types/hast": "^3.0.5" }, "engines": { "node": ">=20" @@ -6583,9 +7114,9 @@ } }, "node_modules/@speed-highlight/core": { - "version": "1.2.15", - "resolved": "https://registry.npmjs.org/@speed-highlight/core/-/core-1.2.15.tgz", - "integrity": "sha512-BMq1K3DsElxDWawkX6eLg9+CKJrTVGCBAWVuHXVUV2u0s2711qiChLSId6ikYPfxhdYocLNt3wWwSvDiTvFabw==", + "version": "1.2.23", + "resolved": "https://registry.npmjs.org/@speed-highlight/core/-/core-1.2.23.tgz", + "integrity": "sha512-iRoq6i6JDJP6Mt2A5JaPvzw0pgYHH6k92ij+yXiTrB7T2y9N789aWE3EHWj/5ztlJBokcCBja3iYLVdu5wgnkg==", "license": "CC0-1.0" }, "node_modules/@standard-schema/spec": { @@ -6602,47 +7133,47 @@ "peer": true }, "node_modules/@tailwindcss/node": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.2.tgz", - "integrity": "sha512-yWP/sqEcBLaD8JuA6zNwxoYKr75qxTioYwlRwekj5Jr/I5GXnoJfjetH/psLUIv74cYTH2lBUEzBkinthoYcBg==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.3.tgz", + "integrity": "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==", "license": "MIT", "dependencies": { "@jridgewell/remapping": "^2.3.5", - "enhanced-resolve": "5.21.6", + "enhanced-resolve": "^5.24.1", "jiti": "^2.7.0", "lightningcss": "1.32.0", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", - "tailwindcss": "4.3.2" + "tailwindcss": "4.3.3" } }, "node_modules/@tailwindcss/oxide": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.2.tgz", - "integrity": "sha512-z8ZgnzX8gdNoWLBLqBPoh/sjnxkwvf9ZuWjnO0l0yIzbLa5/9S+eC5QxGZKRobVHIC3/1BoMWjHblqWjcgFgag==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.3.tgz", + "integrity": "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==", "license": "MIT", "engines": { "node": ">= 20" }, "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.3.2", - "@tailwindcss/oxide-darwin-arm64": "4.3.2", - "@tailwindcss/oxide-darwin-x64": "4.3.2", - "@tailwindcss/oxide-freebsd-x64": "4.3.2", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.2", - "@tailwindcss/oxide-linux-arm64-gnu": "4.3.2", - "@tailwindcss/oxide-linux-arm64-musl": "4.3.2", - "@tailwindcss/oxide-linux-x64-gnu": "4.3.2", - "@tailwindcss/oxide-linux-x64-musl": "4.3.2", - "@tailwindcss/oxide-wasm32-wasi": "4.3.2", - "@tailwindcss/oxide-win32-arm64-msvc": "4.3.2", - "@tailwindcss/oxide-win32-x64-msvc": "4.3.2" + "@tailwindcss/oxide-android-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-x64": "4.3.3", + "@tailwindcss/oxide-freebsd-x64": "4.3.3", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.3", + "@tailwindcss/oxide-linux-arm64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-arm64-musl": "4.3.3", + "@tailwindcss/oxide-linux-x64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-x64-musl": "4.3.3", + "@tailwindcss/oxide-wasm32-wasi": "4.3.3", + "@tailwindcss/oxide-win32-arm64-msvc": "4.3.3", + "@tailwindcss/oxide-win32-x64-msvc": "4.3.3" } }, "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.2.tgz", - "integrity": "sha512-WHxqIuHpvZ5VtdX6GTl1Ik/Vp2YuN42Et+0CdeaVd/frQ9jAvGmvR8vLT+jk3e8/Q3x8kECB9+R17pgpp2BulA==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.3.tgz", + "integrity": "sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==", "cpu": [ "arm64" ], @@ -6656,9 +7187,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.2.tgz", - "integrity": "sha512-GZypeUY/IDJW3877KeM+O67vbXr3MBnbtEL4aYhNErv/JWZhye2vGSWWG9tB6iiqR2MqRNkY8IOUy4NdSZV26w==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.3.tgz", + "integrity": "sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==", "cpu": [ "arm64" ], @@ -6672,9 +7203,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.2.tgz", - "integrity": "sha512-UIIzmefR6KO1sDU7MzRqAxC8iBpft/VhkGjTjnhoS6k7Z3rQ9wEgA1ODSiyH/tcSYssulNm4Ci3hOeK1jH7ccQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.3.tgz", + "integrity": "sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==", "cpu": [ "x64" ], @@ -6688,9 +7219,9 @@ } }, "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.2.tgz", - "integrity": "sha512-GN+uAmcI6DNspnCDwtOAZrTz6oukJnp337qZvxqCGLd3BHBzJpO0ZbTLRvJNdztOeAmTzewewGIMPb0tk2R4WA==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.3.tgz", + "integrity": "sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==", "cpu": [ "x64" ], @@ -6704,9 +7235,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.2.tgz", - "integrity": "sha512-4ABn7qSbdHRwTiDiuWNegCyb5+2FJ4vKIKc3DmKrvAFw7MU1Lm11dIkTPwUaFdTzc7IsOpDbqBrlh0x6y36U/w==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.3.tgz", + "integrity": "sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==", "cpu": [ "arm" ], @@ -6720,9 +7251,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.2.tgz", - "integrity": "sha512-wDgEIGwoM8w8pufh9LVt1PahDgNdKXrLC2qfAnV3vAmococ9RWbxeAw4pxPttd/TsJfwjyLf90Dg1y9y8I6Emw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.3.tgz", + "integrity": "sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==", "cpu": [ "arm64" ], @@ -6739,9 +7270,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.2.tgz", - "integrity": "sha512-J5Nuk0uZQIiMTJj3LEx4sAA9tMFUoXQZFv1J6An+QGYe53HKRJuFDi0rpq/tuouCZeAbOBY3kQ6g8qeD4TUjtA==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.3.tgz", + "integrity": "sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==", "cpu": [ "arm64" ], @@ -6758,9 +7289,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.2.tgz", - "integrity": "sha512-kqCZpSKOBEJO4mz7OqWoofBZeXTAwaVGPj0ErAj7CojmhKpWVWVOnrt9dE8odoIraZq4oj3ausM37kXi+Tow8w==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.3.tgz", + "integrity": "sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==", "cpu": [ "x64" ], @@ -6777,9 +7308,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.2.tgz", - "integrity": "sha512-cixpqbh2toJDmkuCRI68nXA8ZxNmdK9Y+9v5h3MC3ZQKy/0BO8AWzlkWyRM7JAFSGBlfig4YVTPsK6MVgqz1uw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.3.tgz", + "integrity": "sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==", "cpu": [ "x64" ], @@ -6796,9 +7327,9 @@ } }, "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.2.tgz", - "integrity": "sha512-4ec2Z/LOmRsAgU23CS4xeJfcJlmRg94A/XrbGRCF1gyU/zdDfRLYDVsS+ynSZCmGNxQ1jQriQOKMQeQxBA3Isw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.3.tgz", + "integrity": "sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==", "bundleDependencies": [ "@napi-rs/wasm-runtime", "@emnapi/core", @@ -6885,9 +7416,9 @@ "optional": true }, "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.2.tgz", - "integrity": "sha512-Zyr/M0+XcYZu3bZrUytc7TXvrk0ftWfl8gN2MwekNDzhqhKRUucMPSeOzM0o0wH5AWOU49BsKRrfKxI2atCPMQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.3.tgz", + "integrity": "sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==", "cpu": [ "arm64" ], @@ -6901,9 +7432,9 @@ } }, "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.2.tgz", - "integrity": "sha512-QI9BO7KlNZsp2GuO0jwAAj5jCDABOKXRkCk2XuKTSaNEFSdfzqswYVTtCHBNKHLsqyjFyFkqlDiwkNbTYSssMQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.3.tgz", + "integrity": "sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==", "cpu": [ "x64" ], @@ -6917,14 +7448,14 @@ } }, "node_modules/@tailwindcss/vite": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.2.tgz", - "integrity": "sha512-eHpMeX4JXfVNJDEcsouTeCBubJBTcTLigeaw/NTUW6PB5ATKKXdyonnXgTBX2VuRbjz1hjfz6C5XAhr52ImQXA==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.3.tgz", + "integrity": "sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw==", "license": "MIT", "dependencies": { - "@tailwindcss/node": "4.3.2", - "@tailwindcss/oxide": "4.3.2", - "tailwindcss": "4.3.2" + "@tailwindcss/node": "4.3.3", + "@tailwindcss/oxide": "4.3.3", + "tailwindcss": "4.3.3" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7 || ^8" @@ -6932,7 +7463,8 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.staging.20260804T171000Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#cf54b1c0312f950d291d74cee733f09e651e4ea6", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#08a3b9bc6d5354eccf5c491a5dfab37bca505f33", + "integrity": "sha512-zPB/vIn+gj5pMwvSFS/lv0cz63rgAYv7ZVXEdbmGDf8xOpva/mLAercg799VCH0auvg0c59HuvI8ioohFs4cng==", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -6943,7 +7475,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#de8d6fa197167bdd4ec743986ff2d08dc2fa1ed1", + "@treeseed/sdk": "github:treeseed-ai/sdk#2a8bc4722d887d9360128d855885a424483a2074", "@treeseed/ui": "github:treeseed-ai/ui#2938d0959dcb2aaa97bbced633e6f75df83db90c", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -6964,7 +7496,7 @@ "yaml": "^2.8.1" }, "bin": { - "treeseed-workspace-bootstrap": "./dist/scripts/treedx/workspaces/workspace-bootstrap.js" + "treeseed-workspace-bootstrap": "dist/scripts/treedx/workspaces/workspace-bootstrap.js" }, "engines": { "node": ">=22" @@ -8948,7 +9480,8 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.staging.20260804T170912Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#de8d6fa197167bdd4ec743986ff2d08dc2fa1ed1", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#2a8bc4722d887d9360128d855885a424483a2074", + "integrity": "sha512-k09Lh1oqyVTTAhmn0v1o3Ec8leVWE5KxdQ2wXZZ06HG9LZ4VtsS7RnX+MO1t6uGZeK7+/lOO6B9XUFk0g/5Dig==", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", @@ -8982,8 +9515,8 @@ "yaml": "^2.8.1" }, "bin": { - "treeseed-sdk-verify": "./dist/scripts/verification/verify-driver.js", - "treeseed-content-publish": "./dist/scripts/content/publish-content.js" + "treeseed-content-publish": "dist/scripts/content/publish-content.js", + "treeseed-sdk-verify": "dist/scripts/verification/verify-driver.js" }, "engines": { "node": ">=22" @@ -9078,6 +9611,13 @@ "node": ">=16" } }, + "node_modules/@treeseed/sdk/node_modules/@cloudflare/workers-types": { + "version": "4.20260702.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20260702.1.tgz", + "integrity": "sha512-mOhf5TUEB1m2vPrxtqoIGfz0fUC9xyxRDx5gWHy5s+OCo6dcV+g7wI1R7gYCMFohhqF/2y2xeKVwMwCJjfn/WA==", + "extraneous": true, + "license": "MIT OR Apache-2.0" + }, "node_modules/@treeseed/sdk/node_modules/@esbuild/aix-ppc64": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", @@ -9648,6 +10188,7 @@ "node_modules/@treeseed/ui": { "version": "0.12.18-dev.staging.20260804T170811Z", "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#2938d0959dcb2aaa97bbced633e6f75df83db90c", + "integrity": "sha512-AKfop1W7VDc2agSuRV8S/2eO+6+/vxa49pA3ZzWsPXe63mWzZybfd+vdWpYHxyEDx8cn6+K6Z0mgP4bj3TJsQw==", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", @@ -9684,9 +10225,9 @@ } }, "node_modules/@types/aws-lambda": { - "version": "8.10.161", - "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.161.tgz", - "integrity": "sha512-rUYdp+MQwSFocxIOcSsYSF3YYYC/uUpMbCY/mbO21vGqfrEYvNSoPyKYDj6RhXXpPfS0KstW9RwG3qXh9sL7FQ==", + "version": "8.10.162", + "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.162.tgz", + "integrity": "sha512-Fn658grtLOci1oxi1391vvDWJRKNGWRSqfxRkmN/Iy3c0tQH1USMKEXcPYHLvope+ZgTFocx9FRQJx1muBL6qw==", "license": "MIT" }, "node_modules/@types/babel__core": { @@ -9828,9 +10369,9 @@ "license": "MIT" }, "node_modules/@types/dom-mediacapture-transform": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/@types/dom-mediacapture-transform/-/dom-mediacapture-transform-0.1.11.tgz", - "integrity": "sha512-Y2p+nGf1bF2XMttBnsVPHUWzRRZzqUoJAKmiP10b5umnO6DDrWI0BrGDJy1pOHoOULVmGSfFNkQrAlC5dcj6nQ==", + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/@types/dom-mediacapture-transform/-/dom-mediacapture-transform-0.1.12.tgz", + "integrity": "sha512-d7/QsLRwF864A5mgIM/YrfiglHoYn7zgCcAoJgW404r+2DwnNr7EBbLnCWpmOMgH8y0te73L1AV6H1bmauaWFw==", "license": "MIT", "dependencies": { "@types/dom-webcodecs": "*" @@ -9878,9 +10419,9 @@ } }, "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.5.tgz", + "integrity": "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==", "license": "MIT", "dependencies": { "@types/unist": "*" @@ -9935,9 +10476,9 @@ } }, "node_modules/@types/node": { - "version": "24.13.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.1.tgz", - "integrity": "sha512-RSpUJGmvsJ1ZeBehQZFhIdpsz+bIpES0nIQXko4Ybq+N+kX6XvOq3Jo+iJ82FWLdblFq85AsMikd3m35jgezYg==", + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz", + "integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==", "license": "MIT", "dependencies": { "undici-types": "~7.18.0" @@ -9950,18 +10491,18 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "19.2.17", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.17.tgz", - "integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==", + "version": "19.2.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", + "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", "license": "MIT", "dependencies": { "csstype": "^3.2.2" } }, "node_modules/@types/react-dom": { - "version": "19.2.3", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", - "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-Bsc+QHgp+P/F02XDzNCY9jnZNCUuLki36KT7VKrTXXLdHf+vHMNZnW1rVu5DNW/rCK+fya3DATySbLM4yhtKUw==", "license": "MIT", "peerDependencies": { "@types/react": "^19.2.0" @@ -9976,6 +10517,12 @@ "@types/node": "*" } }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT" + }, "node_modules/@types/unist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", @@ -10000,9 +10547,9 @@ } }, "node_modules/@ungap/structured-clone": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.1.tgz", - "integrity": "sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.3.tgz", + "integrity": "sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==", "license": "ISC" }, "node_modules/@vitest/expect": { @@ -10388,9 +10935,9 @@ } }, "node_modules/acorn": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -10667,80 +11214,72 @@ } }, "node_modules/astro": { - "version": "5.18.2", - "resolved": "https://registry.npmjs.org/astro/-/astro-5.18.2.tgz", - "integrity": "sha512-TnFwLnAXty5MXKPDGuKXqK4AMBXG+FH6RUdK7Oyc3gyfNoFIthT+4eRbzOK43bdRlLaZuxgciDSjgtggZ3OtGQ==", + "version": "6.4.8", + "resolved": "https://registry.npmjs.org/astro/-/astro-6.4.8.tgz", + "integrity": "sha512-KK5lX90uU9EeVaTjINyj3sy9/NFXVa59aowaqbWBDDKLXZh4rr7GwIaCFYVetE22MJtsCNFerQXn0vlCLmpP/Q==", "license": "MIT", "dependencies": { - "@astrojs/compiler": "^2.13.0", - "@astrojs/internal-helpers": "0.7.6", - "@astrojs/markdown-remark": "6.3.11", - "@astrojs/telemetry": "3.3.0", + "@astrojs/compiler": "^4.0.0", + "@astrojs/internal-helpers": "0.10.0", + "@astrojs/markdown-remark": "7.2.0", + "@astrojs/telemetry": "3.3.2", "@capsizecss/unpack": "^4.0.0", + "@clack/prompts": "^1.1.0", "@oslojs/encoding": "^1.1.0", "@rollup/pluginutils": "^5.3.0", - "acorn": "^8.15.0", "aria-query": "^5.3.2", "axobject-query": "^4.1.0", - "boxen": "8.0.1", - "ci-info": "^4.3.1", + "ci-info": "^4.4.0", "clsx": "^2.1.1", - "common-ancestor-path": "^1.0.1", + "common-ancestor-path": "^2.0.0", "cookie": "^1.1.1", - "cssesc": "^3.0.0", - "debug": "^4.4.3", - "deterministic-object-hash": "^2.0.2", - "devalue": "^5.6.2", + "devalue": "^5.8.1", "diff": "^8.0.3", - "dlv": "^1.1.3", "dset": "^3.1.4", - "es-module-lexer": "^1.7.0", + "es-module-lexer": "^2.0.0", "esbuild": "^0.27.3", - "estree-walker": "^3.0.3", "flattie": "^1.1.1", - "fontace": "~0.4.0", + "fontace": "~0.4.1", + "get-tsconfig": "5.0.0-beta.4", "github-slugger": "^2.0.0", "html-escaper": "3.0.3", "http-cache-semantics": "^4.2.0", - "import-meta-resolve": "^4.2.0", "js-yaml": "^4.1.1", + "jsonc-parser": "^3.3.1", "magic-string": "^0.30.21", - "magicast": "^0.5.1", + "magicast": "^0.5.2", "mrmime": "^2.0.1", "neotraverse": "^0.6.18", - "p-limit": "^6.2.0", - "p-queue": "^8.1.1", + "obug": "^2.1.1", + "p-limit": "^7.3.0", + "p-queue": "^9.1.0", "package-manager-detector": "^1.6.0", "piccolore": "^0.1.3", - "picomatch": "^4.0.3", - "prompts": "^2.4.2", + "picomatch": "^4.0.4", "rehype": "^13.0.2", - "semver": "^7.7.3", - "shiki": "^3.21.0", + "semver": "^7.7.4", + "shiki": "^4.0.2", "smol-toml": "^1.6.0", - "svgo": "^4.0.0", - "tinyexec": "^1.0.2", + "svgo": "^4.0.1", + "tinyclip": "^0.1.12", + "tinyexec": "^1.0.4", "tinyglobby": "^0.2.15", - "tsconfck": "^3.1.6", "ultrahtml": "^1.6.0", - "unifont": "~0.7.3", - "unist-util-visit": "^5.0.0", - "unstorage": "^1.17.4", + "unifont": "~0.7.4", + "unist-util-visit": "^5.1.0", + "unstorage": "^1.17.5", "vfile": "^6.0.3", - "vite": "^6.4.1", - "vitefu": "^1.1.1", + "vite": "^7.3.2", + "vitefu": "^1.1.2", "xxhash-wasm": "^1.1.0", - "yargs-parser": "^21.1.1", - "yocto-spinner": "^0.2.3", - "zod": "^3.25.76", - "zod-to-json-schema": "^3.25.1", - "zod-to-ts": "^1.2.0" + "yargs-parser": "^22.0.0", + "zod": "^4.3.6" }, "bin": { - "astro": "astro.js" + "astro": "bin/astro.mjs" }, "engines": { - "node": "18.20.8 || ^20.3.0 || >=22.0.0", + "node": ">=22.12.0", "npm": ">=9.6.5", "pnpm": ">=7.1.0" }, @@ -11240,15 +11779,15 @@ } }, "node_modules/astro/node_modules/@shikijs/core": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.3.1.tgz", - "integrity": "sha512-ANMDxuaPsNMdDC1m4vfvhlDmJweMwkE5XitTwrq2rWHx5jM+dlm4MmHt2PP6t0uejfR77SuhrhJ0zEijIF/uhA==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.4.2.tgz", + "integrity": "sha512-StyzbAyxg2/tBGf78gwbBkGyeQ73lf8UiJArFaQhTQIDqQOCKPCQFanvrs4/Yv3Yfyc+ONInJM6K+FMIf+P+kA==", "license": "MIT", "dependencies": { - "@shikijs/primitive": "4.3.1", - "@shikijs/types": "4.3.1", + "@shikijs/primitive": "4.4.2", + "@shikijs/types": "4.4.2", "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4", + "@types/hast": "^3.0.5", "hast-util-to-html": "^9.0.5" }, "engines": { @@ -11256,12 +11795,12 @@ } }, "node_modules/astro/node_modules/@shikijs/engine-javascript": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.3.1.tgz", - "integrity": "sha512-JBItcnPuYq7jVJdZo/vMj94r+szT7XEjHFX+mvFDGSEIbVAXAGyHAHzhbWzpGOwYidCZrErJLLgn2PVeiokHnQ==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.4.2.tgz", + "integrity": "sha512-MnIkeqWdVPUWsxlx8gKLVCJFTsqrQJgpTPBPpQwaFeJ56lOnJxj5aN2LUFnfxUEcvOQuNocmbaMnVrCEln6rkw==", "license": "MIT", "dependencies": { - "@shikijs/types": "4.3.1", + "@shikijs/types": "4.4.2", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.6" }, @@ -11270,12 +11809,12 @@ } }, "node_modules/astro/node_modules/@shikijs/engine-oniguruma": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.3.1.tgz", - "integrity": "sha512-OXyNMzg0pews+msMj4cHeqT4xiYKKvbnn6VbdAXxfoFl3SSx4fJTc8FadECuc5/H9p3BzhNAoAUXKwAu9rWYhg==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.4.2.tgz", + "integrity": "sha512-GLhowz1+jixjz+wiZ3wMnOn1jTxiFCGl2PkXufivbnwPHKuyw1AYqu5/hbWhZZ2oAb0NP05WUJhYeigY14drnw==", "license": "MIT", "dependencies": { - "@shikijs/types": "4.3.1", + "@shikijs/types": "4.4.2", "@shikijs/vscode-textmate": "^10.0.2" }, "engines": { @@ -11283,37 +11822,37 @@ } }, "node_modules/astro/node_modules/@shikijs/langs": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.3.1.tgz", - "integrity": "sha512-m0l9nsDqgBHvbZbk7A0/kXz/impK3uB/c6rAn6Gpg/uPtdZRQ+alsN/17MU5thb68XTj/4DxkZAotrM0GGSpDQ==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.4.2.tgz", + "integrity": "sha512-8DfeusD+Zdv/eYIDdXyJTUnSMHt+aAWjAOCXV20HNGAHRlInXpG8wh421v6B91WOm9TFwRLN+b/LG5F2NAIojg==", "license": "MIT", "dependencies": { - "@shikijs/types": "4.3.1" + "@shikijs/types": "4.4.2" }, "engines": { "node": ">=20" } }, "node_modules/astro/node_modules/@shikijs/themes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.3.1.tgz", - "integrity": "sha512-dgpoJ4WqNi2yTmizQHBJ5zcX6j2lE6icN/0yt4l1kkf16jrY/pwPLoTb1ETsWMz0OBLf9ZNvwmxft+cH+N9qSA==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.4.2.tgz", + "integrity": "sha512-H0CFoL07ddDC2Dd6EdrPYNkRhUR6YCkJlnuYFceYYUJJA5TIm2b5B33qqiDYryBExgbKMndFJPb2u1gTuqO37g==", "license": "MIT", "dependencies": { - "@shikijs/types": "4.3.1" + "@shikijs/types": "4.4.2" }, "engines": { "node": ">=20" } }, "node_modules/astro/node_modules/@shikijs/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.3.1.tgz", - "integrity": "sha512-CHFxE0jztBIZRHH6gxXE7DXUCFXjReEGxZ/j0rfSLGKZuwp2xBYycEP14875DSa9KLL/6700oxIq6oO6ef9K2g==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.4.2.tgz", + "integrity": "sha512-PFYitV4vpDr/iPCIhnHp+Q4ftic5N5VeNJ3KQ1O8gn3h2ar8qgwMAXF7tq4m1CWaMS60fV4VqF6vfnWH4F7vqQ==", "license": "MIT", "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" + "@types/hast": "^3.0.5" }, "engines": { "node": ">=20" @@ -11387,19 +11926,19 @@ } }, "node_modules/astro/node_modules/shiki": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.3.1.tgz", - "integrity": "sha512-oR+qDVi2OjX1tmDpyv+3KviX01KzO6Af+0NNnKnsp9491UEGz2YpxTuJboS/6VhYpTdqzmuJBuiTlrAWWJAssw==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.4.2.tgz", + "integrity": "sha512-P8F/dFhRevaw2uSdeIYlq/5SXZNY85DPtmXQ947gD1Zj2JqO5AkNvVVBar0Me9JkFx3uzVud/qOtP5ek9NEQGA==", "license": "MIT", "dependencies": { - "@shikijs/core": "4.3.1", - "@shikijs/engine-javascript": "4.3.1", - "@shikijs/engine-oniguruma": "4.3.1", - "@shikijs/langs": "4.3.1", - "@shikijs/themes": "4.3.1", - "@shikijs/types": "4.3.1", + "@shikijs/core": "4.4.2", + "@shikijs/engine-javascript": "4.4.2", + "@shikijs/engine-oniguruma": "4.4.2", + "@shikijs/langs": "4.4.2", + "@shikijs/themes": "4.4.2", + "@shikijs/types": "4.4.2", "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" + "@types/hast": "^3.0.5" }, "engines": { "node": ">=20" @@ -11535,9 +12074,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.10.38", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.38.tgz", - "integrity": "sha512-31/02mVB4yuQU6adKk5SlY6m+mxDwUq5KZkyYgnLrrKl7TEm1+3PyDtDBz2kOv/wxZz41GHsvV1A/u6RmiyBvw==", + "version": "2.11.12", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.12.tgz", + "integrity": "sha512-r7WnVImvVCeFpf2DOXfy41aPWzeNg3H/A2X4dKmy1QL0MSyyk/e7z8ihJ3N6Nn2PsdhkVlqnEfnUE4a05P2aTA==", "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.cjs" @@ -11596,20 +12135,20 @@ "license": "MIT" }, "node_modules/body-parser": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", - "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.3.0.tgz", + "integrity": "sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==", "license": "MIT", "dependencies": { "bytes": "^3.1.2", - "content-type": "^1.0.5", + "content-type": "^2.0.0", "debug": "^4.4.3", - "http-errors": "^2.0.0", - "iconv-lite": "^0.7.0", + "http-errors": "^2.0.1", + "iconv-lite": "^0.7.2", "on-finished": "^2.4.1", - "qs": "^6.14.1", - "raw-body": "^3.0.1", - "type-is": "^2.0.1" + "qs": "^6.15.2", + "raw-body": "^3.0.2", + "type-is": "^2.1.0" }, "engines": { "node": ">=18" @@ -11739,15 +12278,15 @@ } }, "node_modules/brace-expansion": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", - "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" }, "engines": { - "node": "18 || 20 || >=22" + "node": "20 || >=22" } }, "node_modules/braces": { @@ -11763,9 +12302,9 @@ } }, "node_modules/browserslist": { - "version": "4.28.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.4.tgz", - "integrity": "sha512-MTc8i/x9jBQd1iMw2CFGS+rwMa07eYjLR0CCTLDACl9xhxy+nIs3KeML/biicXtk9JrZ6dnnTatmc7ErPXIxqw==", + "version": "4.28.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.7.tgz", + "integrity": "sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw==", "funding": [ { "type": "opencollective", @@ -11782,10 +12321,10 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.10.38", - "caniuse-lite": "^1.0.30001799", - "electron-to-chromium": "^1.5.376", - "node-releases": "^2.0.48", + "baseline-browser-mapping": "^2.10.44", + "caniuse-lite": "^1.0.30001806", + "electron-to-chromium": "^1.5.393", + "node-releases": "^2.0.51", "update-browserslist-db": "^1.2.3" }, "bin": { @@ -11861,9 +12400,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001799", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001799.tgz", - "integrity": "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==", + "version": "1.0.30001807", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001807.tgz", + "integrity": "sha512-daRXJ9EB/rdRgu7kV+TTl1YUKtlsMWblPl2sLnpg9DZae16QCegol6A1SmCE31Lm9mXC1sRWGt/krouH+/dl7Q==", "funding": [ { "type": "opencollective", @@ -12033,9 +12572,9 @@ } }, "node_modules/cli-truncate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-6.0.0.tgz", - "integrity": "sha512-3+YKIUFsohD9MIoOFPFBldjAlnfCmCDcqe6aYGFqlDTRKg80p4wg35L+j83QQ63iOlKRccEkbn8IuM++HsgEjA==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-6.1.1.tgz", + "integrity": "sha512-06p9vyLahLa4zkGcgsGxU6iEkSOiuI4fhCH6Emhe2lPAcoUv73n72DnODsnHA+5wwXGnV0n9M9/qOQJSjYhFhw==", "license": "MIT", "dependencies": { "slice-ansi": "^9.0.0", @@ -12049,90 +12588,54 @@ } }, "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", "license": "ISC", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" }, "engines": { - "node": ">=12" + "node": ">=20" } }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } + "node_modules/cliui/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "license": "MIT" }, - "node_modules/cliui/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/cliui/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/cliui/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" @@ -12196,24 +12699,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, "node_modules/comma-separated-tokens": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", @@ -12225,19 +12710,22 @@ } }, "node_modules/commander": { - "version": "14.0.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", - "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", "license": "MIT", "engines": { - "node": ">=20" + "node": ">= 12" } }, "node_modules/common-ancestor-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", - "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", - "license": "ISC" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-2.0.0.tgz", + "integrity": "sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">= 18" + } }, "node_modules/compute-scroll-into-view": { "version": "2.0.4", @@ -12287,12 +12775,16 @@ } }, "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/cookie-es": { @@ -12328,9 +12820,9 @@ } }, "node_modules/crelt": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", - "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.7.tgz", + "integrity": "sha512-aK6BbWfhf4U/wCcLHKPJl/xa6VkVstRaPywWtMKGwuOLc/wZTyQYuoxgvZnNsBvv7Kg3YTBQYYBCggcviQczuA==", "license": "MIT" }, "node_modules/cross-spawn": { @@ -12756,9 +13248,9 @@ } }, "node_modules/devalue": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.8.1.tgz", - "integrity": "sha512-4CXDYRBGqN+57wVJkuXBYmpAVUSg3L6JAQa/DFqm238G73E1wuyc/JhGQJzN7vUf/CMphYau2zXbfWzDR5aTEw==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.9.0.tgz", + "integrity": "sha512-RWrqdArjvPbsATEhOPUo6Wndc/iWnkWKlhIrdlF3zMMYo/c3CVtoaVAyLtWxz5h8nSlkHzxnzV2uLydPXmtF+A==", "license": "MIT" }, "node_modules/devlop": { @@ -12778,7 +13270,6 @@ "version": "8.0.4", "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.4.tgz", "integrity": "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==", - "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" @@ -13035,9 +13526,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.378", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.378.tgz", - "integrity": "sha512-VinvOAuuPmdD1guEgGv5f2Qp7/vlfqOrUOMYNnOD4wj3pit8kRsQHzfIf6teyUGWo15Tg5+bOJaRunvyltpVWQ==", + "version": "1.5.402", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.402.tgz", + "integrity": "sha512-/oOpMaPT6Yg+6/1XQhyIPlzgj7Ye9zf+nNM2Uh6OcE2G2oNptWazFa+qB2Pdqqbsc9KnIDzgAntoYN0dbwOXwA==", "license": "ISC" }, "node_modules/emmet": { @@ -13081,9 +13572,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.24.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.1.tgz", - "integrity": "sha512-7DdUaTjmNwMcH2gLr1qycesKII3BK4RLy/mdAb7x10Lq7bR4aNKHt1BR1ZALSv0rPM/hF5wYF0PhGop/rJm8vw==", + "version": "5.24.5", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.5.tgz", + "integrity": "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", @@ -13094,9 +13585,9 @@ } }, "node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -13154,9 +13645,9 @@ } }, "node_modules/es-module-lexer": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", - "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.1.tgz", + "integrity": "sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==", "license": "MIT" }, "node_modules/es-object-atoms": { @@ -13172,13 +13663,14 @@ } }, "node_modules/es-toolkit": { - "version": "1.47.0", - "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.47.0.tgz", - "integrity": "sha512-n1GuoD0WEQZMBk5tttoZSqwgyLx01oqa5XsBmCHwPyNe1S9jPBEmtR2pSgp2kJuWE3ciFZ6yRHmY4pM4C3OOkw==", + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.50.0.tgz", + "integrity": "sha512-OyZKhUVvEep9ITEiwHn8GKnMRQIVqoSIX7WnRbkWgJkllCujilqP2rD0u979tkl8wqyc8ICwlc1UBVv/Sl1G6w==", "license": "MIT", "workspaces": [ "docs", - "benchmarks" + "benchmarks", + "tests/types" ] }, "node_modules/esast-util-from-estree": { @@ -13425,13 +13917,10 @@ } }, "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" }, "node_modules/etag": { "version": "1.8.1", @@ -13554,11 +14043,12 @@ } }, "node_modules/express-rate-limit": { - "version": "8.5.2", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.5.2.tgz", - "integrity": "sha512-5Kb34ipNX694DH48vN9irak1Qx30nb0PLYHXfJgw4YEjiC3ZEmZJhwOp+VfiCYwFzvFTdB9QkArYS5kXa2cx2A==", + "version": "8.6.2", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.6.2.tgz", + "integrity": "sha512-YH4ru+eOJxQABscKFfRCy9R7x9QFGdezclVMwwgFFndzS2Xnm0uo6B0ABZsLhcpeptGv2qvuJVWlQr9gQZoC3A==", "license": "MIT", "dependencies": { + "debug": "^4.4.3", "ip-address": "^10.2.0" }, "engines": { @@ -13680,9 +14170,9 @@ } }, "node_modules/fast-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", - "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.5.tgz", + "integrity": "sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==", "funding": [ { "type": "github", @@ -13705,9 +14195,9 @@ } }, "node_modules/fast-xml-builder": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.2.0.tgz", - "integrity": "sha512-00aAWieqff+ZJhsXA4g1g7M8k+7AYoMUUHF+/zFb5U6Uv/P0Vl4QZo84/IcufzYalLuEj9928bXN9PbbFzMF0Q==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.3.0.tgz", + "integrity": "sha512-F74cZEdCvuw9P41GAC3rod4X04jjWGM1JPEv/GWSqFTWLsdyMSBMBMlm9Hk3GLBgLBbdBNY8yee0pQh2RBVESQ==", "funding": [ { "type": "github", @@ -13716,8 +14206,8 @@ ], "license": "MIT", "dependencies": { - "path-expression-matcher": "^1.5.0", - "xml-naming": "^0.1.0" + "path-expression-matcher": "^1.6.2", + "xml-naming": "^0.3.0" } }, "node_modules/fastq": { @@ -13864,9 +14354,9 @@ "license": "Unlicense" }, "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "hasInstallScript": true, "license": "MIT", "optional": true, @@ -13963,15 +14453,12 @@ } }, "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -14036,9 +14523,9 @@ "license": "BSD-2-Clause" }, "node_modules/globby": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-16.2.0.tgz", - "integrity": "sha512-QrJia2qDf5BB/V6HYlDTs0I0lBahyjLzpGQg3KT7FnCdTonAyPy2RtY802m2k4ALx6Dp752f82WsOczEVr3l6Q==", + "version": "16.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-16.2.2.tgz", + "integrity": "sha512-NLvV9ubZ6NDsJaOpKPy3cQeJpKi9DcWiyCiFUpJPA0YihRqiE6RWaLUmgNNPr8MgPpLZjnBjSmou7uZBRJv9wA==", "license": "MIT", "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", @@ -14565,9 +15052,9 @@ } }, "node_modules/hono": { - "version": "4.12.23", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.23.tgz", - "integrity": "sha512-eIaZ9qDgu7XV0pxOCrg7/WhnQ6Ivm22UcxhXx/A3dcbqbbYgBEkc6e/J/s7j2tS96zoB0S9VBdLwQNCWwUo4LA==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.13.0.tgz", + "integrity": "sha512-jhunvfHWxd7J5EFfSgH4xsYJzSe/lfqbUCxiyyeaQasUsXeEHXtzVid+7EOGByc5JnFa23SSFL3Y2RV/z1T+eQ==", "license": "MIT", "engines": { "node": ">=16.9.0" @@ -14715,9 +15202,9 @@ } }, "node_modules/iconv-lite": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", - "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz", + "integrity": "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -14743,18 +15230,18 @@ } }, "node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.6.tgz", + "integrity": "sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==", "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/immer": { - "version": "11.1.11", - "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.11.tgz", - "integrity": "sha512-qzXuyXAkPySAGYkfsAwodDPWT8Zm7/Uo5BNt4BjhMhG5WlWyZZ4wQqnWwdS8kjlQ1Cwu6gjw3A6+0gTQwlyYtw==", + "version": "11.1.16", + "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.16.tgz", + "integrity": "sha512-Xs7H9rBc+kti1J6RueUvbEBkmOz7jqj11XYgf+YMXAYzu8EeE7hwZ9poLXdVfVnGmJu7QAf41T7H2KuF6QoK6Q==", "license": "MIT", "peer": true, "funding": { @@ -14791,9 +15278,9 @@ "license": "ISC" }, "node_modules/ink": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ink/-/ink-7.0.5.tgz", - "integrity": "sha512-zWNjGHQPxSeiSAmDUOq+QPQ6CfmMhmNi85vrJIuy4prafKKUSoZlXEy4wbM7LuLuF1pDURk7qvF4fxrQlLxv3w==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/ink/-/ink-7.1.1.tgz", + "integrity": "sha512-Y43xxa1ZSPvpmfLHcN5o+OdP8Rf8ykkNJEuKYOUNZKT8wXVNLFTtEm1nSDMQkfBH+YANF4Xuu0hhZ4ejqAtN2w==", "license": "MIT", "dependencies": { "@alcalzone/ansi-tokenize": "^0.3.0", @@ -14856,9 +15343,9 @@ } }, "node_modules/ip-address": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz", - "integrity": "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.4.0.tgz", + "integrity": "sha512-oSK96Grm3aP6OrS263xVxbNDGVL7rzBtYdpGqlDG8iQdoenDoTs/nkki+DflYbAEE8Xl6o5YxhxlrKvI3nqKXQ==", "license": "MIT", "engines": { "node": ">= 12" @@ -14932,15 +15419,15 @@ } }, "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-4.0.0.tgz", + "integrity": "sha512-LHE+wROyG/Y/0ZnbktRCoTix2c1RhgWaZraMZ8o1Q7zCh0VSrICJQO5oqIIISrcSBtrXv0o233w1IYwsWCjTzA==", "license": "MIT", "bin": { "is-docker": "cli.js" }, "engines": { - "node": ">=8" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -15101,15 +15588,18 @@ } }, "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", "license": "MIT", "dependencies": { - "is-docker": "^2.0.0" + "is-inside-container": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/isbinaryfile": { @@ -15165,9 +15655,9 @@ } }, "node_modules/jose": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.3.tgz", - "integrity": "sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==", + "version": "6.2.8", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.8.tgz", + "integrity": "sha512-Bsdjwm3Qsd/P0jR+BHDe3LytDfY7WBq2HmCCLIwuVRHMuEC9ae7/R474GIUdF1NgCyZjzVo/A9DOiOBtXq8ZoQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/panva" @@ -15180,10 +15670,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", - "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", - "dev": true, + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz", + "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==", "funding": [ { "type": "github", @@ -15242,9 +15731,9 @@ "license": "BSD-2-Clause" }, "node_modules/json-with-bigint": { - "version": "3.5.8", - "resolved": "https://registry.npmjs.org/json-with-bigint/-/json-with-bigint-3.5.8.tgz", - "integrity": "sha512-eq/4KP6K34kwa7TcFdtvnftvHCD9KvHOGGICWwMFc4dOOKF5t4iYqnfLK8otCRCRv06FXOzGGyqE8h8ElMvvdw==", + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/json-with-bigint/-/json-with-bigint-3.5.10.tgz", + "integrity": "sha512-Vcx+JVNEBts/xfcoCS69sKrOhOk/3TVlvlT+XzUOefVKnnrbYSCKpDCm10pohsJFtsJVYnwa/cXRZ4eElzaM6w==", "license": "MIT" }, "node_modules/json5": { @@ -15260,9 +15749,9 @@ } }, "node_modules/jsonc-parser": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.1.tgz", - "integrity": "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", "license": "MIT" }, "node_modules/katex": { @@ -15309,10 +15798,21 @@ } }, "node_modules/lexical": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/lexical/-/lexical-0.35.0.tgz", - "integrity": "sha512-3VuV8xXhh5xJA6tzvfDvE0YBCMkIZUmxtRilJQDDdCgJCc+eut6qAv2qbN+pbqvarqcQqPN1UF+8YvsjmyOZpw==", - "license": "MIT" + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/lexical/-/lexical-0.48.0.tgz", + "integrity": "sha512-KK4Tyr/cPsleoZ7XvhGRiRmcrZidSmoFUdIXK9nPubIifoC+80Dc5THyc4xtGKtsW24S1TsHzk5gmfBU+TxmEg==", + "license": "MIT", + "dependencies": { + "@lexical/internal": "0.48.0" + }, + "peerDependencies": { + "typescript": ">=5.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } }, "node_modules/lib0": { "version": "0.2.117", @@ -15337,9 +15837,15 @@ } }, "node_modules/libsodium": { - "version": "0.7.15", - "resolved": "https://registry.npmjs.org/libsodium/-/libsodium-0.7.15.tgz", - "integrity": "sha512-sZwRknt/tUpE2AwzHq3jEyUU5uvIZHtSssktXq7owd++3CSgn8RGrv6UZJJBpP7+iBghBqe7Z06/2M31rI2NKw==", + "version": "0.7.16", + "resolved": "https://registry.npmjs.org/libsodium/-/libsodium-0.7.16.tgz", + "integrity": "sha512-3HrzSPuzm6Yt9aTYCDxYEG8x8/6C0+ag655Y7rhhWZM9PT4NpdnbqlzXhGZlDnkgR6MeSTnOt/VIyHLs9aSf+Q==", + "license": "ISC" + }, + "node_modules/libsodium-sumo": { + "version": "0.7.16", + "resolved": "https://registry.npmjs.org/libsodium-sumo/-/libsodium-sumo-0.7.16.tgz", + "integrity": "sha512-x6atrz2AdXCJg6G709x9W9TTJRI6/0NcL5dD0l5GGVqNE48UJmDsjO4RUWYTeyXXUpg+NXZ2SHECaZnFRYzwGA==", "license": "ISC" }, "node_modules/libsodium-wrappers": { @@ -15351,6 +15857,15 @@ "libsodium": "^0.7.15" } }, + "node_modules/libsodium-wrappers-sumo": { + "version": "0.7.15", + "resolved": "https://registry.npmjs.org/libsodium-wrappers-sumo/-/libsodium-wrappers-sumo-0.7.15.tgz", + "integrity": "sha512-aSWY8wKDZh5TC7rMvEdTHoyppVq/1dTSAeAR7H6pzd6QRT3vQWcT5pGwCotLcpPEOLXX6VvqihSPkpEhYAjANA==", + "license": "ISC", + "dependencies": { + "libsodium-sumo": "^0.7.15" + } + }, "node_modules/lightningcss": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", @@ -15654,12 +16169,15 @@ } }, "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "license": "ISC", "dependencies": { - "yallist": "^3.0.2" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" } }, "node_modules/magic-string": { @@ -15672,13 +16190,13 @@ } }, "node_modules/magicast": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.3.tgz", - "integrity": "sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.4.tgz", + "integrity": "sha512-llBEhWm1SacoRwgHUoQJYtwp4PBLF4faQi5TCpIGyGs9n4y5+juI0tDgyKIfpqxckRHaHzouUEph3THklWh03w==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.3", - "@babel/types": "^7.29.0", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", "source-map-js": "^1.2.1" } }, @@ -16089,12 +16607,16 @@ "license": "CC0-1.0" }, "node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.1.tgz", + "integrity": "sha512-yz3xRaG20c6/BOzvYoDaGtPmGscs7YivItZEEqe6GbwNfHuxu9YNmvnEkMzKldAGY4/80pRcQRZSEnhquk9XuQ==", "license": "MIT", "engines": { "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/mediabunny": { @@ -16999,85 +17521,623 @@ } }, "node_modules/miniflare": { - "version": "4.20260426.0", - "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20260426.0.tgz", - "integrity": "sha512-KM+v76d04qT+NsPfVKVQEgnnuLNE3uzCCl2QKMTJ5OXor5JbBm1vpkQwQ+l7o5ELCrZ74RnyKhJKLiJyUA39Tw==", + "version": "5.20260801.0-alpha", + "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-5.20260801.0-alpha.tgz", + "integrity": "sha512-AfMrnQbJg81ESsGkGhOkHBtwTqCG+mosR+3GE+qDrhF1I/ieIvgg3ICxNyBvgHBZ3iapy6cysBQHNPykkzrfgw==", "license": "MIT", "dependencies": { "@cspotcode/source-map-support": "0.8.1", - "sharp": "^0.34.5", - "undici": "7.24.8", - "workerd": "1.20260426.1", - "ws": "8.18.0", + "sharp": "0.35.2", + "undici": "7.28.0", + "workerd": "1.20260801.1", + "ws": "8.21.0", "youch": "4.1.0-beta.10" }, - "bin": { - "miniflare": "bootstrap.js" - }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" } }, - "node_modules/miniflare/node_modules/ws": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", - "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", - "license": "MIT", + "node_modules/miniflare/node_modules/@img/sharp-darwin-arm64": { + "version": "0.35.2", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.35.2.tgz", + "integrity": "sha512-eEieHsMksAW4IiO5NzauESRl2D2qz3J/kwUxUrSfV06A93eEaRfMpHXyUb1mAqrR7i8U9A0GRqE9pjn6u1Jjpg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=10.0.0" + "node": ">=20.9.0" }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" + "funding": { + "url": "https://opencollective.com/libvips" }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.3.1" } }, - "node_modules/minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.5" - }, + "node_modules/miniflare/node_modules/@img/sharp-darwin-x64": { + "version": "0.35.2", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.35.2.tgz", + "integrity": "sha512-BaktuGPCeHJMARpodR8jK4uKiZrPAy9WrfQW0sdI37clracq8Bp01AYS3SZgi5FS/y5twa9t4+LIuuxQjqRrWw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "18 || 20 || >=22" + "node": ">=20.9.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.3.1" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "license": "MIT", + "node_modules/miniflare/node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.3.1.tgz", + "integrity": "sha512-4V/M3roRMTYjiwZY9IOVQOE8OyeCxFAkYmyZDrZl51uOKjibm3oeEJ4WAmLxutAfzFbC9jqUiPs2gbnGflH+7g==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", - "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=16 || 14 >=14.17" + "url": "https://opencollective.com/libvips" } }, - "node_modules/minisearch": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.2.0.tgz", - "integrity": "sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==", - "license": "MIT" - }, + "node_modules/miniflare/node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.3.1.tgz", + "integrity": "sha512-c0/DxItpJv2+dGhgycJBBgotdqruGYDvA79drdh0MD1dFpy7JzJ/PlXwi1H4rFf0eTy8tgbI91aHDnZIceY3jQ==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.3.1.tgz", + "integrity": "sha512-aGGy9aWzXgHBG7HNyQPWorZthlp7+x6fDRoPAQbGO3ThcttuTyKIx3NuSHb6zb4gBNq6/yNn9f1cy9nFKS/Vmg==", + "cpu": [ + "arm" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.3.1.tgz", + "integrity": "sha512-JznefmcK9j1JKPz8AkQDh89kjojubyfOasWBPKfzMIhPwsgDy9evpE/naJTXXXmghS1iFwR8u/kTwh/I2/+GCw==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.3.1.tgz", + "integrity": "sha512-1EkwGNCZk6iWNCMWqrvdJ+r1j0PT1zIz60CNPhYnJlK/zyeWqlsPZIe+ocBVqPF8k/Ssee/NCk+tE9Ryrko6ng==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.3.1.tgz", + "integrity": "sha512-Ilays+w2bXdnxzxtQdmXR62u8o8GYa3eL4+Gr+1KiE4xperMZUslRaVPJwwPkzlHEjGfXAfRVAa/7CYCtSqsBw==", + "cpu": [ + "riscv64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.3.1.tgz", + "integrity": "sha512-VfBwVHQTbRoj4XlpA/KLZ7ltgMpz+4WSejFzQ+GnoImjo1PtEJ59QB2qR1xQEeRPYIkNrPIm2L4cICMvz4C2ew==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.3.1.tgz", + "integrity": "sha512-+c8ukgwU62DS54nCAjw7keOfHUkmr0B5QHEdcOqRnodF/MNXJbVI8Eopoj4B/0H8Asr65I+A4Amrn7a85/md6A==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.3.1.tgz", + "integrity": "sha512-qlKb/pwbkAi1WMsJrYHk7CuDrd12s27U2QnRhFYUoJNrRCmkosMTttuRFat/DDB3IlDm5qE1TJgZ4JDnHX8Ldw==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.3.1.tgz", + "integrity": "sha512-yO21HwoUVLN8Qa+/SBjQLMYwBWAVJjeGPNe+hc0OUeMeifEtJqu5a1c4HayE1nNpDih9y3/KkoltfkDodmKAlg==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-linux-arm": { + "version": "0.35.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.35.2.tgz", + "integrity": "sha512-SE4kzF2mepn6z+6E7L6lsV8FzuLL6IPQdyX8ZiwROAG/G8td+hP/m7FsFPwidtrF19gvajuC9l6TxAVcsA4S7A==", + "cpu": [ + "arm" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.3.1" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-linux-arm64": { + "version": "0.35.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.35.2.tgz", + "integrity": "sha512-af12Pnd0ZGu2HfP8NayB0kk6eC/lrfbQE6HlR4jD+34wdJ1Vw9TF6TMn6ZvffT+WgqVsl0hRbmNvz2u/23VmwA==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.3.1" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-linux-ppc64": { + "version": "0.35.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.35.2.tgz", + "integrity": "sha512-hYSBm7zcNtDCozCxQHYZJiu63b/bXsgRZuOxCIBZsStMM9Vap47iFHdbX4kCvQsblPB/k+clhELpdQJHQLSHvg==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.3.1" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-linux-riscv64": { + "version": "0.35.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.35.2.tgz", + "integrity": "sha512-qQt0Kc13+Hoan/Awq/qMSQw3L+RI1NCRPgD5cUJ/1WSSmIoysLOc72jlRM3E0OHN9Yr313jgeQ2T+zW+F03QFA==", + "cpu": [ + "riscv64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.3.1" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-linux-s390x": { + "version": "0.35.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.35.2.tgz", + "integrity": "sha512-E4fLLfRPzDLlEeDaTzI98OFLcv++WL5ChLLMwPoVd0CIoZQqupBSNbOisPL5am9XsbQ9T84+iiMpUvbFtkunbA==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.3.1" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-linux-x64": { + "version": "0.35.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.35.2.tgz", + "integrity": "sha512-gi0zFJJRLswfCZmHtJdikXPOc5u7qamSOS3NHedLqLd4W8Q0NqjdBr6TTRIgsfFjqfTsHFgdfvJ9LwqSgcHiAA==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.3.1" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.35.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.35.2.tgz", + "integrity": "sha512-siWbOW1u6HFnFLrp0waKyW7VEf7jYvcDWdrXEFa8AkdAQgEvuu5Fz8/Y70w9EeqAdwDtfU012BhEHHaDqvQNzg==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.3.1" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.35.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.35.2.tgz", + "integrity": "sha512-YBqMMcjDi4QGYiSn4vNOYBhmlC4z5AXqkOUUqI2e0AFA4urNv4ESgOgwNl3K+4etQhha0twXlzeF20bbULm9Yg==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.3.1" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-win32-arm64": { + "version": "0.35.2", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.35.2.tgz", + "integrity": "sha512-BiVRYc/t6/Vl3e1hBx0hugG4oN9Pydf4fgMSpxTQJmwGUg/YoXTWHiFeRymHfCZzifxu4F4rpk/I67D0LQ20wQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-win32-ia32": { + "version": "0.35.2", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.35.2.tgz", + "integrity": "sha512-YYEhx9PImCC7T0tI8JDMi4DB9LwLCXCU5OWNYEXAxh5Q1ShKkyC6byxzoBJ3gEFDnH2lQckWuDe70G7mB2XJog==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-win32-x64": { + "version": "0.35.2", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.35.2.tgz", + "integrity": "sha512-imoOyBcoM/iiUr4J6VPpCNjPnjvP/Gks95898yB8YqoGGYmHYbOyCuNv9FMhFgtaiHFGbHW8bxKqRV6VjtXThQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/miniflare/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/miniflare/node_modules/sharp": { + "version": "0.35.2", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.35.2.tgz", + "integrity": "sha512-FVtFjtBCMiJS6yb5CX7Sop45WFMpeGw6oRKuJnXYgf/f1ms/D7LE/ZUSNxnW7rZ/dbslQWYkoqFHGPaDBtaK4w==", + "license": "Apache-2.0", + "dependencies": { + "@img/colour": "^1.1.0", + "detect-libc": "^2.1.2", + "semver": "^7.8.4" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.35.2", + "@img/sharp-darwin-x64": "0.35.2", + "@img/sharp-freebsd-wasm32": "0.35.2", + "@img/sharp-libvips-darwin-arm64": "1.3.1", + "@img/sharp-libvips-darwin-x64": "1.3.1", + "@img/sharp-libvips-linux-arm": "1.3.1", + "@img/sharp-libvips-linux-arm64": "1.3.1", + "@img/sharp-libvips-linux-ppc64": "1.3.1", + "@img/sharp-libvips-linux-riscv64": "1.3.1", + "@img/sharp-libvips-linux-s390x": "1.3.1", + "@img/sharp-libvips-linux-x64": "1.3.1", + "@img/sharp-libvips-linuxmusl-arm64": "1.3.1", + "@img/sharp-libvips-linuxmusl-x64": "1.3.1", + "@img/sharp-linux-arm": "0.35.2", + "@img/sharp-linux-arm64": "0.35.2", + "@img/sharp-linux-ppc64": "0.35.2", + "@img/sharp-linux-riscv64": "0.35.2", + "@img/sharp-linux-s390x": "0.35.2", + "@img/sharp-linux-x64": "0.35.2", + "@img/sharp-linuxmusl-arm64": "0.35.2", + "@img/sharp-linuxmusl-x64": "0.35.2", + "@img/sharp-webcontainers-wasm32": "0.35.2", + "@img/sharp-win32-arm64": "0.35.2", + "@img/sharp-win32-ia32": "0.35.2", + "@img/sharp-win32-x64": "0.35.2" + } + }, + "node_modules/miniflare/node_modules/ws": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minisearch": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.2.0.tgz", + "integrity": "sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==", + "license": "MIT" + }, "node_modules/minizlib": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", @@ -17121,9 +18181,9 @@ "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.12", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", - "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "version": "3.3.17", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.17.tgz", + "integrity": "sha512-xQLf0A3HOMlgHq0n247/LRuAOYmB7dXJ/DvAxGvsSBij45XtBSmQycu+F8ODbHwns/XyFZagyL1+J0Offw1E0g==", "funding": [ { "type": "github", @@ -17182,15 +18242,15 @@ "license": "MIT" }, "node_modules/node-mock-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.4.tgz", - "integrity": "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.5.tgz", + "integrity": "sha512-KQyt/wLjG3TAc7DOUhpqWzgd4ERxR80JOlTK5VE5R1S12IaPVN5qkj4klBce9HPG1Njuup4Sb5bljaT34lIyjw==", "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.50", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.50.tgz", - "integrity": "sha512-J6l92tKHX6w8Jy5nO1Vuc01NoIiRGi/d6qBKVxh+IQ8Cr3b6HbVNfKiF8ZpFKufTwpwxMmce2W3iQZ861ZRyTg==", + "version": "2.0.53", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.53.tgz", + "integrity": "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==", "license": "MIT", "engines": { "node": ">=18" @@ -17260,9 +18320,9 @@ } }, "node_modules/obug": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.3.tgz", - "integrity": "sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.4.tgz", + "integrity": "sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==", "funding": [ "https://github.com/sponsors/sxzz", "https://opencollective.com/debug" @@ -17409,52 +18469,52 @@ } }, "node_modules/p-limit": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-6.2.0.tgz", - "integrity": "sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-7.3.1.tgz", + "integrity": "sha512-0trZaiG7Y7kN/Egy9a8j47t9osC0Tch4PaIWd9yGF6bvmlk7muExRvGNYb8sXBwEKMoNKsbNN9P8EefuQekE4Q==", "license": "MIT", "dependencies": { - "yocto-queue": "^1.1.1" + "yocto-queue": "^1.2.1" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-queue": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.1.1.tgz", - "integrity": "sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ==", + "version": "9.3.3", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-9.3.3.tgz", + "integrity": "sha512-NXAOdnEe5FsZJfT4oK84lE1Y5cFFdWlRuOo5tww8DyNMxyRXwn39fIkUtNLKppcPC+UYU/bXujNCUGDv01y7CA==", "license": "MIT", "dependencies": { - "eventemitter3": "^5.0.1", - "p-timeout": "^6.1.2" + "eventemitter3": "^5.0.4", + "p-timeout": "^7.0.0" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-timeout": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz", - "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-7.0.1.tgz", + "integrity": "sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg==", "license": "MIT", "engines": { - "node": ">=14.16" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/package-manager-detector": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.7.0.tgz", - "integrity": "sha512-xg1eHpwYL/D/HEdWw2goFZP6vV0FH7W+PZ5rFkGjdIDLtxq7EkzBUeT3m+lndYCt8wKbmofUu1MUdMCXkCk9ZQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.8.0.tgz", + "integrity": "sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==", "license": "MIT" }, "node_modules/pagefind": { @@ -17602,9 +18662,9 @@ "license": "MIT" }, "node_modules/path-expression-matcher": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.5.0.tgz", - "integrity": "sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.6.2.tgz", + "integrity": "sha512-enSlaiat05iasnzmgNxRj8reFdj3puY2QpNgP1aPIaVfT6nn9ICuPoFlKHk8EN22HcwewshO+mN2DGbkCEOtqQ==", "funding": [ { "type": "github", @@ -17657,14 +18717,14 @@ "license": "MIT" }, "node_modules/pg": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.21.0.tgz", - "integrity": "sha512-AUP1EYJuHraQGsVoCQVIcM7TEJVGtDzxWtGFZd8rds9d+CCXlU5Js1rYgfLNvxy9iJrpHjGrRjoi/3BT9fRyiA==", + "version": "8.22.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.22.0.tgz", + "integrity": "sha512-8wih1vVIBMxoUM2oB4soJsD9tDnDpLv4OXBJ+EJzFsvycD+lfyIreC2gGHq78f8jbLLt+bvlPTFdFZfJkOuzAA==", "license": "MIT", "dependencies": { - "pg-connection-string": "^2.13.0", + "pg-connection-string": "^2.14.0", "pg-pool": "^3.14.0", - "pg-protocol": "^1.14.0", + "pg-protocol": "^1.15.0", "pg-types": "2.2.0", "pgpass": "1.0.5" }, @@ -17691,9 +18751,9 @@ "optional": true }, "node_modules/pg-connection-string": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.13.0.tgz", - "integrity": "sha512-EMnU9E2fSULdsbErBbMaXJvFeD9B4+nPcM3f+4lsiCR0BHLPrLVjv3DbyM2hgQQviKJaTWIRRTjKjWlHg3p2ig==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.14.0.tgz", + "integrity": "sha512-XwWDGcLRGCXAR8F/AM5bG7Q+A3Wm2s6QeEjlOKZLlH3UYcguiqCWKyWXVag5TLTIjR7oOJUY8kcADaZgWPyLeg==", "license": "MIT" }, "node_modules/pg-int8": { @@ -17715,9 +18775,9 @@ } }, "node_modules/pg-protocol": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.14.0.tgz", - "integrity": "sha512-n5taZ1kO3s9ngDTVxsEznOqCyToTgz0FLuPq0B33COy5pPpuWJpY3/2oRBVETuOgzdqRXfWpM9HIhp2LBBT1BA==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.15.0.tgz", + "integrity": "sha512-cq9sECI5s0+uPUXjbz8ioyPJni6RzsRib0US67i5IoTZKw8fNeYlVE7u8F4dG7vEJJtc5wdD1K189lCCUwqWTQ==", "license": "MIT" }, "node_modules/pg-types": { @@ -17758,21 +18818,21 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/picospinner": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/picospinner/-/picospinner-3.0.0.tgz", - "integrity": "sha512-lGA1TNsmy2bxvRsTI2cV01kfTwKzZjnZSDmF9llYNyMHMrU4sP87lQ5taiIKm88L3cbswjl008nwyGc3WpNvzg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/picospinner/-/picospinner-3.1.2.tgz", + "integrity": "sha512-0Z++uU8mvB0EvCPAEUq9BGiPcSravzJ+RPdXfjYlzXffqsogisiKRQqI6ctrSSJ6n985vxrgKtQ5n4sRINcJZg==", "license": "MIT", "engines": { "node": ">=18.0.0" @@ -17788,39 +18848,39 @@ } }, "node_modules/playwright": { - "version": "1.61.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.61.1.tgz", - "integrity": "sha512-DWnY5o3YbLWK4GovuAVwpqL+1VwGNdUGrRr++8j8PtQQzvAVZUIMjKQ90fY689sEJZJBbZVw1rXaOKSTitkzPQ==", + "version": "1.62.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.62.1.tgz", + "integrity": "sha512-0M+L3LAD8/nm554LOla9Ayx0j0tmFZ0FBcoQ7F1VuVHpM/XpiC8RcDzBQB8W5+hA8L22THxELzeF+2WcUzvcLg==", "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.61.1" + "playwright-core": "1.62.1" }, "bin": { "playwright": "cli.js" }, "engines": { - "node": ">=18" + "node": ">=20" }, "optionalDependencies": { "fsevents": "2.3.2" } }, "node_modules/playwright-core": { - "version": "1.61.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.61.1.tgz", - "integrity": "sha512-h7Qlt6m4REp25qvIdvbDtVmD4LqVXfpRxhORv9L0jzETM05p4fuPJ3dKyuSXQxDSbXnmS79HAgi9589lGSpLkg==", + "version": "1.62.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.62.1.tgz", + "integrity": "sha512-wPYSwEBJY9GHraISXqyqtx0na0LpO3XEX7jNDhntbex7tzUS7kLnZsOlFruFJB4Hi/rhDMjXGqHewDZ68nYZVw==", "license": "Apache-2.0", "bin": { "playwright-core": "cli.js" }, "engines": { - "node": ">=18" + "node": ">=20" } }, "node_modules/postcss": { - "version": "8.5.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.16.tgz", - "integrity": "sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==", + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", "funding": [ { "type": "opencollective", @@ -17837,7 +18897,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.12", + "nanoid": "^3.3.17", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -18001,9 +19061,9 @@ } }, "node_modules/prettier": { - "version": "3.9.5", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.5.tgz", - "integrity": "sha512-/FVl766LpUfB5vXgCYOYa0MeV/441Ia99AeICQIQFTY/Nw0roZwULcXpku5i1/m5kt/baz+s4Zogspd839HSMg==", + "version": "3.9.6", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.6.tgz", + "integrity": "sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==", "license": "MIT", "bin": { "prettier": "bin/prettier.cjs" @@ -18112,12 +19172,13 @@ } }, "node_modules/qs": { - "version": "6.15.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz", - "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==", + "version": "6.15.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", + "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.1.0" + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" }, "engines": { "node": ">=0.6" @@ -18170,12 +19231,16 @@ } }, "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.3.0.tgz", + "integrity": "sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==", "license": "MIT", "engines": { "node": ">= 0.6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/raw-body": { @@ -18194,46 +19259,30 @@ } }, "node_modules/react": { - "version": "19.2.7", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", - "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==", + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", + "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/react-dom": { - "version": "19.2.7", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz", - "integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==", + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", + "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", "license": "MIT", "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { - "react": "^19.2.7" - } - }, - "node_modules/react-error-boundary": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-3.1.4.tgz", - "integrity": "sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - }, - "peerDependencies": { - "react": ">=16.13.1" + "react": "^19.2.8" } }, "node_modules/react-hook-form": { - "version": "7.78.0", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.78.0.tgz", - "integrity": "sha512-EEZqc+N23moyzTlz61Pj+JvcXo76ICkpfOZo8JZw+sM4+wLQGh6nI2Ms+PdMOYNluFu0ghlM7B8mCzhRYtJCnA==", + "version": "7.84.0", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.84.0.tgz", + "integrity": "sha512-+hWvQP6GLco56mDwrbU4XnHix8t1z90ltZsDIrREl+jnQFQxYLX8oAzqe/Xn8nHpmoXTY5M6oEXrAhbP1qevNQ==", "license": "MIT", "engines": { "node": ">=18.0.0" @@ -18247,10 +19296,9 @@ } }, "node_modules/react-is": { - "version": "19.2.7", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.7.tgz", - "integrity": "sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A==", - "dev": true, + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.8.tgz", + "integrity": "sha512-s5un28nYxKJw5gvUHyW5PCC28CvBqLu9r3cWgzHT4Vo/5fqqkFcdRYsGcKf50WMPpjjFZS5d76fn3YCo2njKwQ==", "license": "MIT", "peer": true }, @@ -18385,9 +19433,9 @@ } }, "node_modules/recharts": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/recharts/-/recharts-3.9.2.tgz", - "integrity": "sha512-G4fy+Pk46RaXgwWMh+Nzhyo/lbFAVqXo9gtetlyehe6Ehge9CsgDuOTwQDD+i1+llaLktNBiNq4bhnGlDRXFtw==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-3.10.1.tgz", + "integrity": "sha512-QXFrvt6IVcw7eeZCoyXTwkIJAX3Dv1nyVhMicXJ47GsGDDpcN8z6o644DibE9XjpBTThtsomLKnTV6lc+cVFUA==", "license": "MIT", "peer": true, "workspaces": [ @@ -18755,9 +19803,9 @@ } }, "node_modules/remark-smartypants": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/remark-smartypants/-/remark-smartypants-3.0.2.tgz", - "integrity": "sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/remark-smartypants/-/remark-smartypants-3.0.3.tgz", + "integrity": "sha512-gCaK+ndZ0hYezlqFegHFCVh2CQemsi0Npdh1qVM9bxlUFknjkbP6VmojWhddOCrbK0PbbacmYLWfTULRiT1eWA==", "license": "MIT", "dependencies": { "retext": "^9.0.0", @@ -18795,21 +19843,22 @@ } }, "node_modules/repomix": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/repomix/-/repomix-1.14.1.tgz", - "integrity": "sha512-RQKku9nASd7LGyUVhj2Z1B4/ro6R2NcExF+bqjmLtsqDd6MdM4ltdM1nFaY+q2UWHn6pQXNBqHlx7VyRrW0MKA==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/repomix/-/repomix-1.18.0.tgz", + "integrity": "sha512-bJo4leK5eSc9jz+Hk64irE1cASZSrhZjUdOHfxjF0I/Lw8mynKEMkedESmS6fIXkV56K+RatuPtWz0k3AcmIJA==", "license": "MIT", "dependencies": { "@clack/prompts": "^0.11.0", "@modelcontextprotocol/sdk": "^1.29.0", "@repomix/strip-comments": "^2.4.2", "@repomix/tree-sitter-wasms": "^0.1.17", - "@secretlint/core": "^11.7.1", - "@secretlint/secretlint-rule-preset-recommend": "^11.7.1", - "commander": "^14.0.3", - "fast-xml-builder": "^1.2.0", + "@secretlint/core": "^13.0.4", + "@secretlint/secretlint-rule-preset-recommend": "^13.0.4", + "chokidar": "^5.0.0", + "commander": "^15.0.0", + "fast-xml-builder": "^1.3.0", "git-url-parse": "^16.1.0", - "globby": "^16.2.0", + "globby": "^16.2.2", "gpt-tokenizer": "^3.4.0", "handlebars": "^4.7.9", "iconv-lite": "^0.7.0", @@ -18821,11 +19870,11 @@ "minimatch": "^10.2.5", "picocolors": "^1.1.1", "picospinner": "^3.0.0", - "tar": "^7.5.15", - "tinyclip": "^0.1.12", + "tar": "^7.5.22", + "tinyclip": "^0.1.15", "tinypool": "^2.1.0", - "valibot": "^1.4.0", - "web-tree-sitter": "^0.26.8", + "valibot": "^1.4.2", + "web-tree-sitter": "^0.26.11", "zod": "^4.4.3" }, "bin": { @@ -18882,9 +19931,9 @@ } }, "node_modules/repomix/node_modules/readdirp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", - "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz", + "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==", "license": "MIT", "engines": { "node": ">= 20.19.0" @@ -18895,9 +19944,9 @@ } }, "node_modules/repomix/node_modules/tar": { - "version": "7.5.20", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.20.tgz", - "integrity": "sha512-9FcyK4PA6+WbzlTM9WhQm6vB5W7cP7dUiPsv1g7YDwEQnQ1CGpK3MGlKk/ITVWMk05kHZuBhmVhiv8LZoy/PFQ==", + "version": "7.5.22", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.22.tgz", + "integrity": "sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA==", "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", @@ -18929,19 +19978,10 @@ } }, "node_modules/request-light": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/request-light/-/request-light-0.7.0.tgz", - "integrity": "sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==", - "license": "MIT" - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/request-light/-/request-light-0.7.0.tgz", + "integrity": "sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==", + "license": "MIT" }, "node_modules/require-from-string": { "version": "2.0.2", @@ -19056,12 +20096,12 @@ } }, "node_modules/rolldown": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.5.tgz", - "integrity": "sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.3.tgz", + "integrity": "sha512-rn9wpmxplLf7NLNyCk9FyWh3FM43DbY8jOzCdEPzH7uflhTftRbCEpqi6Ly2osgoU8OwObtmavMbWLaWy4LX7A==", "license": "MIT", "dependencies": { - "@oxc-project/types": "=0.139.0", + "@oxc-project/types": "=0.143.0", "@rolldown/pluginutils": "^1.0.0" }, "bin": { @@ -19071,27 +20111,26 @@ "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.1.5", - "@rolldown/binding-darwin-arm64": "1.1.5", - "@rolldown/binding-darwin-x64": "1.1.5", - "@rolldown/binding-freebsd-x64": "1.1.5", - "@rolldown/binding-linux-arm-gnueabihf": "1.1.5", - "@rolldown/binding-linux-arm64-gnu": "1.1.5", - "@rolldown/binding-linux-arm64-musl": "1.1.5", - "@rolldown/binding-linux-ppc64-gnu": "1.1.5", - "@rolldown/binding-linux-s390x-gnu": "1.1.5", - "@rolldown/binding-linux-x64-gnu": "1.1.5", - "@rolldown/binding-linux-x64-musl": "1.1.5", - "@rolldown/binding-openharmony-arm64": "1.1.5", - "@rolldown/binding-wasm32-wasi": "1.1.5", - "@rolldown/binding-win32-arm64-msvc": "1.1.5", - "@rolldown/binding-win32-x64-msvc": "1.1.5" + "@rolldown/binding-android-arm64": "1.2.3", + "@rolldown/binding-darwin-arm64": "1.2.3", + "@rolldown/binding-darwin-x64": "1.2.3", + "@rolldown/binding-freebsd-x64": "1.2.3", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.3", + "@rolldown/binding-linux-arm64-gnu": "1.2.3", + "@rolldown/binding-linux-arm64-musl": "1.2.3", + "@rolldown/binding-linux-ppc64-gnu": "1.2.3", + "@rolldown/binding-linux-s390x-gnu": "1.2.3", + "@rolldown/binding-linux-x64-gnu": "1.2.3", + "@rolldown/binding-linux-x64-musl": "1.2.3", + "@rolldown/binding-openharmony-arm64": "1.2.3", + "@rolldown/binding-win32-arm64-msvc": "1.2.3", + "@rolldown/binding-win32-x64-msvc": "1.2.3" } }, "node_modules/rollup": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.2.tgz", - "integrity": "sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.4.tgz", + "integrity": "sha512-RXOqwaPsBGjMNMa4sQjDjHieHEZDFoj/Rdr46l2MU5DfEs16wHJPC2RPTPHWhNl+M3aI472LLqFkFKut4SblOg==", "license": "MIT", "dependencies": { "@types/estree": "1.0.9" @@ -19104,31 +20143,32 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.62.2", - "@rollup/rollup-android-arm64": "4.62.2", - "@rollup/rollup-darwin-arm64": "4.62.2", - "@rollup/rollup-darwin-x64": "4.62.2", - "@rollup/rollup-freebsd-arm64": "4.62.2", - "@rollup/rollup-freebsd-x64": "4.62.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.62.2", - "@rollup/rollup-linux-arm-musleabihf": "4.62.2", - "@rollup/rollup-linux-arm64-gnu": "4.62.2", - "@rollup/rollup-linux-arm64-musl": "4.62.2", - "@rollup/rollup-linux-loong64-gnu": "4.62.2", - "@rollup/rollup-linux-loong64-musl": "4.62.2", - "@rollup/rollup-linux-ppc64-gnu": "4.62.2", - "@rollup/rollup-linux-ppc64-musl": "4.62.2", - "@rollup/rollup-linux-riscv64-gnu": "4.62.2", - "@rollup/rollup-linux-riscv64-musl": "4.62.2", - "@rollup/rollup-linux-s390x-gnu": "4.62.2", - "@rollup/rollup-linux-x64-gnu": "4.62.2", - "@rollup/rollup-linux-x64-musl": "4.62.2", - "@rollup/rollup-openbsd-x64": "4.62.2", - "@rollup/rollup-openharmony-arm64": "4.62.2", - "@rollup/rollup-win32-arm64-msvc": "4.62.2", - "@rollup/rollup-win32-ia32-msvc": "4.62.2", - "@rollup/rollup-win32-x64-gnu": "4.62.2", - "@rollup/rollup-win32-x64-msvc": "4.62.2", + "@napi-rs/lzma-linux-x64-gnu": "1.5.1", + "@rollup/rollup-android-arm-eabi": "4.62.4", + "@rollup/rollup-android-arm64": "4.62.4", + "@rollup/rollup-darwin-arm64": "4.62.4", + "@rollup/rollup-darwin-x64": "4.62.4", + "@rollup/rollup-freebsd-arm64": "4.62.4", + "@rollup/rollup-freebsd-x64": "4.62.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.62.4", + "@rollup/rollup-linux-arm-musleabihf": "4.62.4", + "@rollup/rollup-linux-arm64-gnu": "4.62.4", + "@rollup/rollup-linux-arm64-musl": "4.62.4", + "@rollup/rollup-linux-loong64-gnu": "4.62.4", + "@rollup/rollup-linux-loong64-musl": "4.62.4", + "@rollup/rollup-linux-ppc64-gnu": "4.62.4", + "@rollup/rollup-linux-ppc64-musl": "4.62.4", + "@rollup/rollup-linux-riscv64-gnu": "4.62.4", + "@rollup/rollup-linux-riscv64-musl": "4.62.4", + "@rollup/rollup-linux-s390x-gnu": "4.62.4", + "@rollup/rollup-linux-x64-gnu": "4.62.4", + "@rollup/rollup-linux-x64-musl": "4.62.4", + "@rollup/rollup-openbsd-x64": "4.62.4", + "@rollup/rollup-openharmony-arm64": "4.62.4", + "@rollup/rollup-win32-arm64-msvc": "4.62.4", + "@rollup/rollup-win32-ia32-msvc": "4.62.4", + "@rollup/rollup-win32-x64-gnu": "4.62.4", + "@rollup/rollup-win32-x64-msvc": "4.62.4", "fsevents": "~2.3.2" } }, @@ -19190,9 +20230,9 @@ "license": "MIT" }, "node_modules/sax": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", - "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.1.tgz", + "integrity": "sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==", "license": "BlueOak-1.0.0", "engines": { "node": ">=11.0.0" @@ -19253,10 +20293,13 @@ } }, "node_modules/semver": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.2.tgz", - "integrity": "sha512-c8jsqUZm3omBOI66G90z1Dyw5z622G8oLG+omfsHBJf3CWQTlOcwOjvOG6wtiNfW6anKm/eA39LMwMtMez2TiQ==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, "bin": { "semver": "bin/semver.js" }, @@ -19409,14 +20452,14 @@ } }, "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" }, @@ -19552,9 +20595,9 @@ } }, "node_modules/smol-toml": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.7.0.tgz", - "integrity": "sha512-aqVvWoyO21L23mb+drl4RmMXbf6N7FdHjAhTRA9ZBL7apWBgfWC16KjrASI+1p9GAroljyMHj6fK67i0UiTNvQ==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.7.1.tgz", + "integrity": "sha512-PPlsspAZ4jbMBu5DMFhfUGDQLu/vrL4SyBROVS37x8ynnVmFIs1VPBz1Co8Xks3TvpIaZXmU85y4DrQ+UyVFoQ==", "license": "BSD-3-Clause", "engines": { "node": ">= 18" @@ -19564,12 +20607,16 @@ } }, "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "deprecated": "The work that was done in this beta branch won't be included in future versions", "license": "BSD-3-Clause", + "dependencies": { + "whatwg-url": "^7.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 8" } }, "node_modules/source-map-js": { @@ -19674,9 +20721,9 @@ "license": "MIT" }, "node_modules/string-width": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.1.tgz", - "integrity": "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz", + "integrity": "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==", "license": "MIT", "dependencies": { "get-east-asian-width": "^1.5.0", @@ -19777,12 +20824,15 @@ } }, "node_modules/supports-color": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz", - "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">=18" + "node": ">=10" }, "funding": { "url": "https://github.com/chalk/supports-color?sponsor=1" @@ -19823,9 +20873,9 @@ } }, "node_modules/tabbable": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.4.0.tgz", - "integrity": "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.5.0.tgz", + "integrity": "sha512-wieBHXygIm7OyQOu5hQlkk62/WyCFYGlWg7L6/ZCUZwx0o398Zkn4pVmMyfYhfMG8kGrj/Krt8eIk6UKC6VzwA==", "license": "MIT" }, "node_modules/tagged-tag": { @@ -19841,9 +20891,9 @@ } }, "node_modules/tailwindcss": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.2.tgz", - "integrity": "sha512-WtctNNSH8A9jlMIqxzuYumOHU5uGZyRv0Q5svQl+oEPy5w84YpBxdb7MdqyiSPQge5jTJ6zFQLq0PFygdccSBA==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.3.tgz", + "integrity": "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==", "license": "MIT" }, "node_modules/tapable": { @@ -19897,9 +20947,9 @@ } }, "node_modules/terser": { - "version": "5.48.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.48.0.tgz", - "integrity": "sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q==", + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.49.2.tgz", + "integrity": "sha512-rGbJiKeQ4WDe3EXlDAIaQcwftVfv2Q8o1awFNfvXolJYKkb1AuZY1RTOmqx4LJXZENbWZA7eIsYGHuEzHsi1nQ==", "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -20000,18 +21050,18 @@ "license": "MIT" }, "node_modules/tinyclip": { - "version": "0.1.14", - "resolved": "https://registry.npmjs.org/tinyclip/-/tinyclip-0.1.14.tgz", - "integrity": "sha512-F1oWdz8tjT17qe1d5JgDK6z03WGOhYYAN0lK3/D/fzNiy93xswLLEw7pk+3g05onhAy6Bsc6PLNUGhdgVjemMQ==", + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/tinyclip/-/tinyclip-0.1.15.tgz", + "integrity": "sha512-uo33abH+Ays0xYaDysoBt494Hb3hsEczMpcC0MwFl773pazORx4fmvKhclhR1wonUbB6vvpRsvVMwnhfqeMc+A==", "license": "MIT", "engines": { "node": "^16.14.0 || >= 17.3.0" } }, "node_modules/tinyexec": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz", - "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.0.tgz", + "integrity": "sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==", "license": "MIT", "engines": { "node": ">=18" @@ -20043,9 +21093,9 @@ } }, "node_modules/tinyrainbow": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", - "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.1.tgz", + "integrity": "sha512-yau8yJdTt989Mm0Bd/236QnzEiPf2xLLTqUZRUJOo/3CB078LSwzei343DgtJVmfJKJE3TMINY1u42SQsP6mXw==", "license": "MIT", "engines": { "node": ">=14.0.0" @@ -20064,9 +21114,9 @@ } }, "node_modules/toad-cache": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.1.tgz", - "integrity": "sha512-5DXWzE4Vz7xNHsv+xQ+MGfJYyC78Aok3tEr0MNwHoRf7vZnga1mQXZ4/Nsodld4VR6Wd+VhfmqnNrsRJyYPfrQ==", + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.4.tgz", + "integrity": "sha512-m1TdR/rvT7kgGJZhspNtXdsdYk0fddFpJJFlG5s+UkPFo6lkLoZ3YLOaovPYjq1R75NP5JfeTlSHaOsE09peCg==", "license": "MIT", "engines": { "node": ">=20" @@ -20138,9 +21188,9 @@ "license": "0BSD" }, "node_modules/tsx": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.22.4.tgz", - "integrity": "sha512-X8EX+XV4QR5xCsrgxaED954zTDfY8KqlDtskKEL0cHhyS/P8b4IFOvGDQpsC9Q1XnLq915wEfwwY/zzskCtmhg==", + "version": "4.23.9", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.9.tgz", + "integrity": "sha512-6q8uTORRGauQVjqMQnKUucLFoeXZAfw6zKvG35GLbdKWbLdeOtZ3H4mhyA5mxuUd2o2cRTskhj59nLLQseUvUw==", "license": "MIT", "dependencies": { "esbuild": "~0.28.0" @@ -20170,9 +21220,9 @@ } }, "node_modules/type-fest": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.7.0.tgz", - "integrity": "sha512-1URUxUqfHFM1c+zfSPsa3gnkO7Aq21qyH75SIduNYz4SzY964rn1X2vCMQaHSHhktiw+0kPa2iyb6PUpXqB6Vg==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.8.0.tgz", + "integrity": "sha512-YGYEVz3Fm5iy/AybuA0oyNFq7H4CgQNfRp/qfe8nurE1kuCeNm3/vfm9X4Mtl+qLyaKJUh5xrFZwogr41SMjYA==", "license": "(MIT OR CC0-1.0)", "dependencies": { "tagged-tag": "^1.0.0" @@ -20262,9 +21312,9 @@ "license": "MIT" }, "node_modules/undici": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.8.tgz", - "integrity": "sha512-6KQ/+QxK49Z/p3HO6E5ZCZWNnCasyZLa5ExaVYyvPxUwKtbCPMKELJOqh7EqOle0t9cH/7d2TaaTRRa6Nhs4YQ==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.28.0.tgz", + "integrity": "sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==", "license": "MIT", "engines": { "node": ">=20.18.1" @@ -20623,9 +21673,9 @@ } }, "node_modules/unstorage/node_modules/readdirp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", - "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz", + "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==", "license": "MIT", "engines": { "node": ">= 20.19.0" @@ -20752,9 +21802,9 @@ } }, "node_modules/valibot": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/valibot/-/valibot-1.4.1.tgz", - "integrity": "sha512-klCmFTz2jeDluy9RwX+F884TCiogtdBJ/YaxSx1EOBYXa3NXNWj8kR1jjN8rzluwojJVWWaHJ4r1U5LfICnM3g==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/valibot/-/valibot-1.4.2.tgz", + "integrity": "sha512-gjdCvJ6d3RyHAneqxMYMW9QMCwYMb3jpOO0IyHZV1bnRHFBHrX3VkIILt5XYR0WhwHiH7Mty8ovuPZ/O3gamrg==", "license": "MIT", "peerDependencies": { "typescript": ">=5" @@ -20840,23 +21890,22 @@ } }, "node_modules/vite": { - "version": "6.4.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.3.tgz", - "integrity": "sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==", + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.1.tgz", + "integrity": "sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw==", "license": "MIT", "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.4.4", - "picomatch": "^4.0.2", - "postcss": "^8.5.3", - "rollup": "^4.34.9", - "tinyglobby": "^0.2.13" + "lightningcss": "^1.33.0", + "picomatch": "^4.0.5", + "postcss": "^8.5.25", + "rolldown": "~1.2.1", + "tinyglobby": "^0.2.17" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + "node": "^20.19.0 || >=22.12.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -20865,14 +21914,15 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.4.0", + "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" @@ -20881,13 +21931,16 @@ "@types/node": { "optional": true }, - "jiti": { + "@vitejs/devtools": { "optional": true }, - "less": { + "esbuild": { "optional": true }, - "lightningcss": { + "jiti": { + "optional": true + }, + "less": { "optional": true }, "sass": { @@ -20913,18 +21966,279 @@ } } }, - "node_modules/vite/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "license": "MIT", + "node_modules/vite/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/vite/node_modules/lightningcss": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.33.0", + "lightningcss-darwin-arm64": "1.33.0", + "lightningcss-darwin-x64": "1.33.0", + "lightningcss-freebsd-x64": "1.33.0", + "lightningcss-linux-arm-gnueabihf": "1.33.0", + "lightningcss-linux-arm64-gnu": "1.33.0", + "lightningcss-linux-arm64-musl": "1.33.0", + "lightningcss-linux-x64-gnu": "1.33.0", + "lightningcss-linux-x64-musl": "1.33.0", + "lightningcss-win32-arm64-msvc": "1.33.0", + "lightningcss-win32-x64-msvc": "1.33.0" + } + }, + "node_modules/vite/node_modules/lightningcss-android-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-darwin-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-darwin-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-freebsd-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-arm64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-x64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-x64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", "optional": true, "os": [ - "darwin" + "win32" ], "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-win32-x64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", + "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, "node_modules/vitefu": { @@ -21251,12 +22565,12 @@ } }, "node_modules/vscode-languageserver-protocol": { - "version": "3.18.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.18.0.tgz", - "integrity": "sha512-Zdz+kJ12Iz6tc11xfZyEo501bBATHXrCjmMfnaR3pMnf1CoqZBKIynba3P+/bi9VEdrMbNtAVKYpKhbODvqy+Q==", + "version": "3.18.2", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.18.2.tgz", + "integrity": "sha512-XRyDbT0Pp3sSNti3JmxVEUMySWCSi1hhM+/KUlCy1hV1zmrqpM1OwO12EAki8blhmLuIMpaJrYbo0OzGVfK2Qg==", "license": "MIT", "dependencies": { - "vscode-jsonrpc": "9.0.0", + "vscode-jsonrpc": "9.0.1", "vscode-languageserver-types": "3.18.0" } }, @@ -21347,9 +22661,9 @@ } }, "node_modules/web-tree-sitter": { - "version": "0.26.9", - "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.26.9.tgz", - "integrity": "sha512-YJwSHANl6XFgeEjB8nitgj0qZYt5gkIesJ4w2srS2wcLB4GUa4xcOkM0YaMsU6WNR53YVIkDSY7Ej4pf3IXtCA==", + "version": "0.26.11", + "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.26.11.tgz", + "integrity": "sha512-Q5Dm3YTIXSXuH6FxX6RuzX2Qwpc4DPGiYMU87Wg5Z8OIStiQFiUex4zMDc0vBTw78EphaYJacncJghCHzbZptg==", "license": "MIT" }, "node_modules/webidl-conversions": { @@ -21407,9 +22721,9 @@ } }, "node_modules/webpack-sources": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.5.0.tgz", - "integrity": "sha512-HPuy+uuoTCaaoEoI1LQ3JN9+vrPBvEesnnX1jADHy728cHSMlq4wUc4afYqahq2B1mhQVZxCXOkNTnXltr+2vQ==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.5.1.tgz", + "integrity": "sha512-jyuiGJdtvY434z5bUZrjz67v76/ePNvFZTp9Mdz29IlH4+GPsgyGjiv0fKI+M7BdkU6ADjulUcKAd3tUK3WlEw==", "license": "MIT", "engines": { "node": ">=10.13.0" @@ -21509,9 +22823,9 @@ "license": "MIT" }, "node_modules/workerd": { - "version": "1.20260426.1", - "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20260426.1.tgz", - "integrity": "sha512-ELvGgN8c9oo+E6EPyecxk1TEf6/eAK4TxxQTW5mQ87C7jbjCzhMbg0P2ije49UBHV0dkBYPJcJvcklUltipl2A==", + "version": "1.20260801.1", + "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20260801.1.tgz", + "integrity": "sha512-/g9JGTyqnHtoIscpBHqKD8swE2V4StBs2i69PmLiOhH45OP95jCFICl4F1hKlgN57rqfni5LiCitttoX5OOkVA==", "hasInstallScript": true, "license": "Apache-2.0", "bin": { @@ -21521,40 +22835,41 @@ "node": ">=16" }, "optionalDependencies": { - "@cloudflare/workerd-darwin-64": "1.20260426.1", - "@cloudflare/workerd-darwin-arm64": "1.20260426.1", - "@cloudflare/workerd-linux-64": "1.20260426.1", - "@cloudflare/workerd-linux-arm64": "1.20260426.1", - "@cloudflare/workerd-windows-64": "1.20260426.1" + "@cloudflare/workerd-darwin-64": "1.20260801.1", + "@cloudflare/workerd-darwin-arm64": "1.20260801.1", + "@cloudflare/workerd-linux-64": "1.20260801.1", + "@cloudflare/workerd-linux-arm64": "1.20260801.1", + "@cloudflare/workerd-windows-64": "1.20260801.1" } }, "node_modules/wrangler": { - "version": "4.86.0", - "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.86.0.tgz", - "integrity": "sha512-9aa/gbF/HiUeeUEwyQpW5LDPBEzyt7iaE6xHwm0vk2Ly8A6J+jh03pzchqVnCCWR832mNyA28MD8oAYt0Kfvlw==", + "version": "4.119.0", + "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.119.0.tgz", + "integrity": "sha512-ookClf+zly4DTc8pBMNrwGQzZKH8IpIYTXkjDw3XS7ZvBQ5mLYH6eOvfD5BEpk3U63zTbv91WRlo1UeRSKXa0g==", "license": "MIT OR Apache-2.0", "dependencies": { - "@cloudflare/kv-asset-handler": "0.4.2", + "@cloudflare/kv-asset-handler": "0.5.0", "@cloudflare/unenv-preset": "2.16.1", "blake3-wasm": "2.1.5", - "esbuild": "0.27.3", - "miniflare": "4.20260426.0", + "esbuild": "0.28.1", + "miniflare": "5.20260801.0-alpha", "path-to-regexp": "6.3.0", "unenv": "2.0.0-rc.24", - "workerd": "1.20260426.1" + "workerd": "1.20260801.1" }, "bin": { + "cf-wrangler": "bin/cf-wrangler.js", "wrangler": "bin/wrangler.js", "wrangler2": "bin/wrangler.js" }, "engines": { - "node": ">=20.3.0" + "node": ">=22.0.0" }, "optionalDependencies": { - "fsevents": "~2.3.2" + "fsevents": "2.3.3" }, "peerDependencies": { - "@cloudflare/workers-types": "^4.20260426.1" + "@cloudflare/workers-types": "^5.20260801.1" }, "peerDependenciesMeta": { "@cloudflare/workers-types": { @@ -21606,9 +22921,9 @@ "license": "ISC" }, "node_modules/ws": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", - "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "version": "8.20.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.1.tgz", + "integrity": "sha512-It4dO0K5v//JtTXuPkfEOaI3uUN87iYPnqo/ZzqCoG3g8uhA66QUMs/SrM0YK7/NAu+r4LMh/9dq2A7k+rHs+w==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -21627,9 +22942,9 @@ } }, "node_modules/xml-naming": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.1.0.tgz", - "integrity": "sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.3.0.tgz", + "integrity": "sha512-ghig2TBE/H11aOVgmahA3MhimvkBr6JIYknH/Dhdk10nXwdbIqBJsbfMxpvFPG8bAw77gN29aQWvKpmVoPlvPQ==", "funding": [ { "type": "github", @@ -21666,13 +22981,10 @@ } }, "node_modules/yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" }, "node_modules/yaml": { "version": "2.9.0", @@ -21734,83 +23046,29 @@ } }, "node_modules/yargs": { - "version": "17.7.3", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz", - "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.1.0.tgz", + "integrity": "sha512-2rAgRKu54VsHkqI0/tYkmluGXHD4KW7yZoycuqDQ15QOTnc2VVfy0nN/1eMhnQLO00A+dwtK20xuCnc1YGeUyg==", "license": "MIT", "dependencies": { - "cliui": "^8.0.1", + "cliui": "^9.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", + "string-width": "^8.2.1", "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" + "yargs-parser": "^22.0.0" }, "engines": { - "node": ">=12" + "node": "^20.19.0 || ^22.12.0 || >=23" } }, "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", "license": "ISC", "engines": { - "node": ">=12" + "node": "^20.19.0 || ^22.12.0 || >=23" } }, "node_modules/yauzl": { @@ -21824,9 +23082,9 @@ } }, "node_modules/yjs": { - "version": "13.6.31", - "resolved": "https://registry.npmjs.org/yjs/-/yjs-13.6.31.tgz", - "integrity": "sha512-Eq+5BRfbeGyqGVrTJL3bEcr8gKkxPuyuoHmAwpk52fDb8kOVMrfVSTRPd6yiGgX5Fskb96qCRjzjbRjrL4YEnw==", + "version": "13.6.32", + "resolved": "https://registry.npmjs.org/yjs/-/yjs-13.6.32.tgz", + "integrity": "sha512-lfiJIIC4Xayt5ItynE407ehlE03pCjeOc4hkR4yxxvvNJ4kuiN25B0g+Qp8XagYz361LLL7DCzR5bvFJ81QKtQ==", "license": "MIT", "peer": true, "dependencies": { @@ -21869,9 +23127,9 @@ } }, "node_modules/yoctocolors": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", - "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.2.0.tgz", + "integrity": "sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==", "license": "MIT", "engines": { "node": ">=18" @@ -21910,9 +23168,9 @@ } }, "node_modules/zod": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", - "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" @@ -21945,142 +23203,6 @@ "type": "github", "url": "https://github.com/sponsors/wooorm" } - }, - "node_modules/libsodium-wrappers-sumo": { - "version": "0.7.15", - "resolved": "https://registry.npmjs.org/libsodium-wrappers-sumo/-/libsodium-wrappers-sumo-0.7.15.tgz", - "integrity": "sha512-aSWY8wKDZh5TC7rMvEdTHoyppVq/1dTSAeAR7H6pzd6QRT3vQWcT5pGwCotLcpPEOLXX6VvqihSPkpEhYAjANA==", - "license": "ISC", - "dependencies": { - "libsodium-sumo": "^0.7.15" - } - }, - "node_modules/libsodium-sumo": { - "version": "0.7.15", - "resolved": "https://registry.npmjs.org/libsodium-sumo/-/libsodium-sumo-0.7.15.tgz", - "integrity": "sha512-5tPmqPmq8T8Nikpm1Nqj0hBHvsLFCXvdhBFV7SGOitQPZAA6jso8XoL0r4L7vmfKXr486fiQInvErHtEvizFMw==", - "license": "ISC" - }, - "node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.2.tgz", - "integrity": "sha512-2uVLvLjgO7NZCWw01/FdqRwmA42J0BcjPMUCA+koFEOAb+zjqIP7SiFz/7zWPrKnVmSqr76Omq2ALyCuX4dhLw==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@astrojs/cloudflare": { - "version": "12.6.13", - "resolved": "https://registry.npmjs.org/@astrojs/cloudflare/-/cloudflare-12.6.13.tgz", - "integrity": "sha512-oKaCyiovyQr183r9U93787Ju1zwk+rRMgPnLTwCLckHmOUK7sltA1Gp4LSGt8oNMgqQS6jR7uRdfQ/NPul37QA==", - "license": "MIT", - "dependencies": { - "@astrojs/internal-helpers": "0.7.6", - "@astrojs/underscore-redirects": "1.0.0", - "@cloudflare/workers-types": "^4.20260116.0", - "tinyglobby": "^0.2.15", - "vite": "^6.4.1", - "wrangler": "4.59.2" - }, - "peerDependencies": { - "astro": "^5.7.0" - } - }, - "node_modules/@astrojs/mdx": { - "version": "4.3.14", - "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-4.3.14.tgz", - "integrity": "sha512-FBrqJQORVm+rkRa2TS5CjU9PBA6hkhrwLVBSS9A77gN2+iehvjq1w6yya/d0YKC7osiVorKkr3Qd9wNbl0ZkGA==", - "license": "MIT", - "dependencies": { - "@astrojs/markdown-remark": "6.3.11", - "@mdx-js/mdx": "^3.1.1", - "acorn": "^8.15.0", - "es-module-lexer": "^1.7.0", - "estree-util-visit": "^2.0.0", - "hast-util-to-html": "^9.0.5", - "piccolore": "^0.1.3", - "rehype-raw": "^7.0.0", - "remark-gfm": "^4.0.1", - "remark-smartypants": "^3.0.2", - "source-map": "^0.7.6", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.3" - }, - "engines": { - "node": "18.20.8 || ^20.3.0 || >=22.0.0" - }, - "peerDependencies": { - "astro": "^5.0.0" - } - }, - "node_modules/@vitejs/plugin-react": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", - "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.28.0", - "@babel/plugin-transform-react-jsx-self": "^7.27.1", - "@babel/plugin-transform-react-jsx-source": "^7.27.1", - "@rolldown/pluginutils": "1.0.0-beta.27", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.17.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" - } - }, - "node_modules/@astrojs/starlight": { - "version": "0.37.6", - "resolved": "https://registry.npmjs.org/@astrojs/starlight/-/starlight-0.37.6.tgz", - "integrity": "sha512-wQrKwH431q+8FsLBnNQeG+R36TMtEGxTQ2AuiVpcx9APcazvL3n7wVW8mMmYyxX0POjTnxlcWPkdMGR3Yj1L+w==", - "license": "MIT", - "dependencies": { - "@astrojs/markdown-remark": "^6.3.1", - "@astrojs/mdx": "^4.2.3", - "@astrojs/sitemap": "^3.3.0", - "@pagefind/default-ui": "^1.3.0", - "@types/hast": "^3.0.4", - "@types/js-yaml": "^4.0.9", - "@types/mdast": "^4.0.4", - "astro-expressive-code": "^0.41.1", - "bcp-47": "^2.1.0", - "hast-util-from-html": "^2.0.1", - "hast-util-select": "^6.0.2", - "hast-util-to-string": "^3.0.0", - "hastscript": "^9.0.0", - "i18next": "^23.11.5", - "js-yaml": "^4.1.0", - "klona": "^2.0.6", - "magic-string": "^0.30.17", - "mdast-util-directive": "^3.0.0", - "mdast-util-to-markdown": "^2.1.0", - "mdast-util-to-string": "^4.0.0", - "pagefind": "^1.3.0", - "rehype": "^13.0.1", - "rehype-format": "^5.0.0", - "remark-directive": "^3.0.0", - "ultrahtml": "^1.6.0", - "unified": "^11.0.5", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.2" - }, - "peerDependencies": { - "astro": "^5.5.0" - } } } } diff --git a/package.json b/package.json index 75228d6f..70a5b6c8 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#cf54b1c0312f950d291d74cee733f09e651e4ea6", - "@treeseed/sdk": "github:treeseed-ai/sdk#de8d6fa197167bdd4ec743986ff2d08dc2fa1ed1", + "@treeseed/core": "github:treeseed-ai/core#08a3b9bc6d5354eccf5c491a5dfab37bca505f33", + "@treeseed/sdk": "github:treeseed-ai/sdk#2a8bc4722d887d9360128d855885a424483a2074", "@treeseed/ui": "github:treeseed-ai/ui#2938d0959dcb2aaa97bbced633e6f75df83db90c", "react": "^19.2.5", "react-dom": "^19.2.6" From 58c8bf348873bfec880cde905f60693b9638b234 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Thu, 6 Aug 2026 12:35:33 -0400 Subject: [PATCH 081/315] build(build): fix staging performance and discussion contracts Intent: - Save hint: fix staging performance and discussion contracts Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.treedx-perf.20260805T075847Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#0812424c7e9bfea6b94fdccfcd7beb4dbbeda48d -> github:treeseed-ai/sdk#e291c99de337054c1548ac286bcd29d371024929 - dependencies.@treeseed/ui: github:treeseed-ai/ui#3b8d4074da247a9cc0ae11f912cc478b651a706d -> github:treeseed-ai/ui#2c1ec9bd909fda4a73f4f24485a2fd1abf2e56a5 - dependencies.@treeseed/core: github:treeseed-ai/core#4009f5bb356954b7a8bbeb3e7fbdf062e01b836b -> github:treeseed-ai/core#db2c141293ff4bdb3c28abd35ae2b035aa50fae9 --- package-lock.json | 135 ++++++++++++++++++++++++++++++++++++++++------ package.json | 6 +-- 2 files changed, 121 insertions(+), 20 deletions(-) diff --git a/package-lock.json b/package-lock.json index f3f80151..8a9654c1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,9 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#4009f5bb356954b7a8bbeb3e7fbdf062e01b836b", - "@treeseed/sdk": "github:treeseed-ai/sdk#0812424c7e9bfea6b94fdccfcd7beb4dbbeda48d", - "@treeseed/ui": "github:treeseed-ai/ui#3b8d4074da247a9cc0ae11f912cc478b651a706d", + "@treeseed/core": "github:treeseed-ai/core#db2c141293ff4bdb3c28abd35ae2b035aa50fae9", + "@treeseed/sdk": "github:treeseed-ai/sdk#e291c99de337054c1548ac286bcd29d371024929", + "@treeseed/ui": "github:treeseed-ai/ui#2c1ec9bd909fda4a73f4f24485a2fd1abf2e56a5", "react": "^19.2.5", "react-dom": "^19.2.6" }, @@ -6345,9 +6345,9 @@ } }, "node_modules/@rolldown/pluginutils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", "license": "MIT" }, "node_modules/@rollup/pluginutils": { @@ -7463,8 +7463,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.treedx-perf.20260805T075816Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#4009f5bb356954b7a8bbeb3e7fbdf062e01b836b", - "integrity": "sha512-NO+NjjMgiyXphamdGO4+N21Dku0F6UEZh3TZ5r+14DMH5qX4kHUJKaQJmxS7YPhLyF8oiHZpivMbaiERbEQxjg==", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#db2c141293ff4bdb3c28abd35ae2b035aa50fae9", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7475,8 +7474,8 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#0812424c7e9bfea6b94fdccfcd7beb4dbbeda48d", - "@treeseed/ui": "github:treeseed-ai/ui#3b8d4074da247a9cc0ae11f912cc478b651a706d", + "@treeseed/sdk": "github:treeseed-ai/sdk#e291c99de337054c1548ac286bcd29d371024929", + "@treeseed/ui": "github:treeseed-ai/ui#2c1ec9bd909fda4a73f4f24485a2fd1abf2e56a5", "astro": "^5.6.1", "esbuild": "^0.28.0", "katex": "^0.16.22", @@ -9480,8 +9479,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.treedx-perf.20260805T073639Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#0812424c7e9bfea6b94fdccfcd7beb4dbbeda48d", - "integrity": "sha512-/jhzubvcWsgVd5FIVEkP0MgRmPPMzHnhlW9GCNuiUJV5K0UM0Co4JwQk0TPXeiBbZxQKRIXJnI/sZi7dxE/MJQ==", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#e291c99de337054c1548ac286bcd29d371024929", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", @@ -10186,8 +10184,7 @@ }, "node_modules/@treeseed/ui": { "version": "0.12.18-dev.treedx-perf.20260806T042250Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#3b8d4074da247a9cc0ae11f912cc478b651a706d", - "integrity": "sha512-NeVNxtrackHulCaN901JmQZtaAm/SFZyGE/wSORN+PdUFxD6pXVjhsAtH6WEKLF2BER79yNpm6P5uU54mfOgeQ==", + "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#2c1ec9bd909fda4a73f4f24485a2fd1abf2e56a5", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", @@ -15669,9 +15666,10 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz", - "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", + "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", + "dev": true, "funding": [ { "type": "github", @@ -23202,6 +23200,109 @@ "type": "github", "url": "https://github.com/sponsors/wooorm" } + }, + "node_modules/@astrojs/cloudflare": { + "version": "12.6.13", + "resolved": "https://registry.npmjs.org/@astrojs/cloudflare/-/cloudflare-12.6.13.tgz", + "integrity": "sha512-oKaCyiovyQr183r9U93787Ju1zwk+rRMgPnLTwCLckHmOUK7sltA1Gp4LSGt8oNMgqQS6jR7uRdfQ/NPul37QA==", + "license": "MIT", + "dependencies": { + "@astrojs/internal-helpers": "0.7.6", + "@astrojs/underscore-redirects": "1.0.0", + "@cloudflare/workers-types": "^4.20260116.0", + "tinyglobby": "^0.2.15", + "vite": "^6.4.1", + "wrangler": "4.59.2" + }, + "peerDependencies": { + "astro": "^5.7.0" + } + }, + "node_modules/@astrojs/mdx": { + "version": "4.3.14", + "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-4.3.14.tgz", + "integrity": "sha512-FBrqJQORVm+rkRa2TS5CjU9PBA6hkhrwLVBSS9A77gN2+iehvjq1w6yya/d0YKC7osiVorKkr3Qd9wNbl0ZkGA==", + "license": "MIT", + "dependencies": { + "@astrojs/markdown-remark": "6.3.11", + "@mdx-js/mdx": "^3.1.1", + "acorn": "^8.15.0", + "es-module-lexer": "^1.7.0", + "estree-util-visit": "^2.0.0", + "hast-util-to-html": "^9.0.5", + "piccolore": "^0.1.3", + "rehype-raw": "^7.0.0", + "remark-gfm": "^4.0.1", + "remark-smartypants": "^3.0.2", + "source-map": "^0.7.6", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.3" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + }, + "peerDependencies": { + "astro": "^5.0.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/@astrojs/starlight": { + "version": "0.37.6", + "resolved": "https://registry.npmjs.org/@astrojs/starlight/-/starlight-0.37.6.tgz", + "integrity": "sha512-wQrKwH431q+8FsLBnNQeG+R36TMtEGxTQ2AuiVpcx9APcazvL3n7wVW8mMmYyxX0POjTnxlcWPkdMGR3Yj1L+w==", + "license": "MIT", + "dependencies": { + "@astrojs/markdown-remark": "^6.3.1", + "@astrojs/mdx": "^4.2.3", + "@astrojs/sitemap": "^3.3.0", + "@pagefind/default-ui": "^1.3.0", + "@types/hast": "^3.0.4", + "@types/js-yaml": "^4.0.9", + "@types/mdast": "^4.0.4", + "astro-expressive-code": "^0.41.1", + "bcp-47": "^2.1.0", + "hast-util-from-html": "^2.0.1", + "hast-util-select": "^6.0.2", + "hast-util-to-string": "^3.0.0", + "hastscript": "^9.0.0", + "i18next": "^23.11.5", + "js-yaml": "^4.1.0", + "klona": "^2.0.6", + "magic-string": "^0.30.17", + "mdast-util-directive": "^3.0.0", + "mdast-util-to-markdown": "^2.1.0", + "mdast-util-to-string": "^4.0.0", + "pagefind": "^1.3.0", + "rehype": "^13.0.1", + "rehype-format": "^5.0.0", + "remark-directive": "^3.0.0", + "ultrahtml": "^1.6.0", + "unified": "^11.0.5", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.2" + }, + "peerDependencies": { + "astro": "^5.5.0" + } } } } diff --git a/package.json b/package.json index 9151bc27..7cf38f54 100644 --- a/package.json +++ b/package.json @@ -49,9 +49,9 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#4009f5bb356954b7a8bbeb3e7fbdf062e01b836b", - "@treeseed/sdk": "github:treeseed-ai/sdk#0812424c7e9bfea6b94fdccfcd7beb4dbbeda48d", - "@treeseed/ui": "github:treeseed-ai/ui#3b8d4074da247a9cc0ae11f912cc478b651a706d", + "@treeseed/core": "github:treeseed-ai/core#db2c141293ff4bdb3c28abd35ae2b035aa50fae9", + "@treeseed/sdk": "github:treeseed-ai/sdk#e291c99de337054c1548ac286bcd29d371024929", + "@treeseed/ui": "github:treeseed-ai/ui#2c1ec9bd909fda4a73f4f24485a2fd1abf2e56a5", "react": "^19.2.5", "react-dom": "^19.2.6" }, From b5bca4e508b8ccfbfd6982328e68bae2b24ddcff Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Thu, 6 Aug 2026 14:45:34 -0400 Subject: [PATCH 082/315] build(build): resolve latest staging SDK integration conflicts Intent: - Save hint: resolve latest staging SDK integration conflicts Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.treedx-perf.20260805T075847Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#e291c99de337054c1548ac286bcd29d371024929 -> github:treeseed-ai/sdk#a3ec1ece7a9f89be84cb3d570b2dfb9b70981f36 - dependencies.@treeseed/core: github:treeseed-ai/core#db2c141293ff4bdb3c28abd35ae2b035aa50fae9 -> github:treeseed-ai/core#e417bd3b7e1c1bc771c69b8770e14d1cdb7f22ca --- package-lock.json | 146 ++++++++-------------------------------------- package.json | 4 +- 2 files changed, 25 insertions(+), 125 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8a9654c1..22e41b25 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#db2c141293ff4bdb3c28abd35ae2b035aa50fae9", - "@treeseed/sdk": "github:treeseed-ai/sdk#e291c99de337054c1548ac286bcd29d371024929", + "@treeseed/core": "github:treeseed-ai/core#e417bd3b7e1c1bc771c69b8770e14d1cdb7f22ca", + "@treeseed/sdk": "github:treeseed-ai/sdk#a3ec1ece7a9f89be84cb3d570b2dfb9b70981f36", "@treeseed/ui": "github:treeseed-ai/ui#2c1ec9bd909fda4a73f4f24485a2fd1abf2e56a5", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -6345,9 +6345,9 @@ } }, "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.27", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", - "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", "license": "MIT" }, "node_modules/@rollup/pluginutils": { @@ -7463,7 +7463,8 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.treedx-perf.20260805T075816Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#db2c141293ff4bdb3c28abd35ae2b035aa50fae9", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#e417bd3b7e1c1bc771c69b8770e14d1cdb7f22ca", + "integrity": "sha512-NqNwv9rtl5pMHOL+JMeHffkNZ85jSasrrXm1yy2WPuumo229I5sUVXOCCKtiN+CYxDhlATVw7qKEEhYrOOuN/w==", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7474,7 +7475,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#e291c99de337054c1548ac286bcd29d371024929", + "@treeseed/sdk": "github:treeseed-ai/sdk#a3ec1ece7a9f89be84cb3d570b2dfb9b70981f36", "@treeseed/ui": "github:treeseed-ai/ui#2c1ec9bd909fda4a73f4f24485a2fd1abf2e56a5", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -9479,7 +9480,8 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.treedx-perf.20260805T073639Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#e291c99de337054c1548ac286bcd29d371024929", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#a3ec1ece7a9f89be84cb3d570b2dfb9b70981f36", + "integrity": "sha512-om8HbveKGxxxPpdqvAjM98JA1F7QW722hMtFeu2yESHdFftYYXBmlUQhs6SEiB/bg9hhwzq8l0ZXUnA/vHqgWg==", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", @@ -9513,6 +9515,7 @@ "yaml": "^2.8.1" }, "bin": { + "treeseed-content-publish": "dist/scripts/content/publish-content.js", "treeseed-sdk-verify": "dist/scripts/verification/verify-driver.js" }, "engines": { @@ -10185,6 +10188,7 @@ "node_modules/@treeseed/ui": { "version": "0.12.18-dev.treedx-perf.20260806T042250Z", "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#2c1ec9bd909fda4a73f4f24485a2fd1abf2e56a5", + "integrity": "sha512-rv0wytiNWholHDd/D5yYYjIKRLlr+fDhbEE5k5sSCPFRdNt8QvQ2IMzgE1EOpQtJ7uq/bB7mdv9athjARiPQxQ==", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", @@ -12396,9 +12400,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001806", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001806.tgz", - "integrity": "sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==", + "version": "1.0.30001807", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001807.tgz", + "integrity": "sha512-daRXJ9EB/rdRgu7kV+TTl1YUKtlsMWblPl2sLnpg9DZae16QCegol6A1SmCE31Lm9mXC1sRWGt/krouH+/dl7Q==", "funding": [ { "type": "opencollective", @@ -15666,10 +15670,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", - "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", - "dev": true, + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz", + "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==", "funding": [ { "type": "github", @@ -21887,15 +21890,15 @@ } }, "node_modules/vite": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.0.tgz", - "integrity": "sha512-pn+CFpM0lwDeKwmOq1ZaBK/9sjorZcgqxki6MbY/jPEVd9vichIlmlD4HmQ5wdP5EgqQCFRaACBxMC7uEGc6lQ==", + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.1.tgz", + "integrity": "sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw==", "license": "MIT", "dependencies": { "lightningcss": "^1.33.0", "picomatch": "^4.0.5", - "postcss": "^8.5.23", - "rolldown": "~1.2.0", + "postcss": "^8.5.25", + "rolldown": "~1.2.1", "tinyglobby": "^0.2.17" }, "bin": { @@ -23200,109 +23203,6 @@ "type": "github", "url": "https://github.com/sponsors/wooorm" } - }, - "node_modules/@astrojs/cloudflare": { - "version": "12.6.13", - "resolved": "https://registry.npmjs.org/@astrojs/cloudflare/-/cloudflare-12.6.13.tgz", - "integrity": "sha512-oKaCyiovyQr183r9U93787Ju1zwk+rRMgPnLTwCLckHmOUK7sltA1Gp4LSGt8oNMgqQS6jR7uRdfQ/NPul37QA==", - "license": "MIT", - "dependencies": { - "@astrojs/internal-helpers": "0.7.6", - "@astrojs/underscore-redirects": "1.0.0", - "@cloudflare/workers-types": "^4.20260116.0", - "tinyglobby": "^0.2.15", - "vite": "^6.4.1", - "wrangler": "4.59.2" - }, - "peerDependencies": { - "astro": "^5.7.0" - } - }, - "node_modules/@astrojs/mdx": { - "version": "4.3.14", - "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-4.3.14.tgz", - "integrity": "sha512-FBrqJQORVm+rkRa2TS5CjU9PBA6hkhrwLVBSS9A77gN2+iehvjq1w6yya/d0YKC7osiVorKkr3Qd9wNbl0ZkGA==", - "license": "MIT", - "dependencies": { - "@astrojs/markdown-remark": "6.3.11", - "@mdx-js/mdx": "^3.1.1", - "acorn": "^8.15.0", - "es-module-lexer": "^1.7.0", - "estree-util-visit": "^2.0.0", - "hast-util-to-html": "^9.0.5", - "piccolore": "^0.1.3", - "rehype-raw": "^7.0.0", - "remark-gfm": "^4.0.1", - "remark-smartypants": "^3.0.2", - "source-map": "^0.7.6", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.3" - }, - "engines": { - "node": "18.20.8 || ^20.3.0 || >=22.0.0" - }, - "peerDependencies": { - "astro": "^5.0.0" - } - }, - "node_modules/@vitejs/plugin-react": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", - "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.28.0", - "@babel/plugin-transform-react-jsx-self": "^7.27.1", - "@babel/plugin-transform-react-jsx-source": "^7.27.1", - "@rolldown/pluginutils": "1.0.0-beta.27", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.17.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" - } - }, - "node_modules/@astrojs/starlight": { - "version": "0.37.6", - "resolved": "https://registry.npmjs.org/@astrojs/starlight/-/starlight-0.37.6.tgz", - "integrity": "sha512-wQrKwH431q+8FsLBnNQeG+R36TMtEGxTQ2AuiVpcx9APcazvL3n7wVW8mMmYyxX0POjTnxlcWPkdMGR3Yj1L+w==", - "license": "MIT", - "dependencies": { - "@astrojs/markdown-remark": "^6.3.1", - "@astrojs/mdx": "^4.2.3", - "@astrojs/sitemap": "^3.3.0", - "@pagefind/default-ui": "^1.3.0", - "@types/hast": "^3.0.4", - "@types/js-yaml": "^4.0.9", - "@types/mdast": "^4.0.4", - "astro-expressive-code": "^0.41.1", - "bcp-47": "^2.1.0", - "hast-util-from-html": "^2.0.1", - "hast-util-select": "^6.0.2", - "hast-util-to-string": "^3.0.0", - "hastscript": "^9.0.0", - "i18next": "^23.11.5", - "js-yaml": "^4.1.0", - "klona": "^2.0.6", - "magic-string": "^0.30.17", - "mdast-util-directive": "^3.0.0", - "mdast-util-to-markdown": "^2.1.0", - "mdast-util-to-string": "^4.0.0", - "pagefind": "^1.3.0", - "rehype": "^13.0.1", - "rehype-format": "^5.0.0", - "remark-directive": "^3.0.0", - "ultrahtml": "^1.6.0", - "unified": "^11.0.5", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.2" - }, - "peerDependencies": { - "astro": "^5.5.0" - } } } } diff --git a/package.json b/package.json index 7cf38f54..9452f809 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#db2c141293ff4bdb3c28abd35ae2b035aa50fae9", - "@treeseed/sdk": "github:treeseed-ai/sdk#e291c99de337054c1548ac286bcd29d371024929", + "@treeseed/core": "github:treeseed-ai/core#e417bd3b7e1c1bc771c69b8770e14d1cdb7f22ca", + "@treeseed/sdk": "github:treeseed-ai/sdk#a3ec1ece7a9f89be84cb3d570b2dfb9b70981f36", "@treeseed/ui": "github:treeseed-ai/ui#2c1ec9bd909fda4a73f4f24485a2fd1abf2e56a5", "react": "^19.2.5", "react-dom": "^19.2.6" From 2a2f29d28e4d466cea5d257d1473b84c60cf38eb Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Thu, 6 Aug 2026 16:18:28 -0400 Subject: [PATCH 083/315] build(build): resolve latest staging UI authoring conflicts Intent: - Save hint: resolve latest staging UI authoring conflicts Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.treedx-perf.20260805T075847Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/ui: github:treeseed-ai/ui#2c1ec9bd909fda4a73f4f24485a2fd1abf2e56a5 -> github:treeseed-ai/ui#7dfd2a809fc12a1e10dc1b763bb0ef146067abcf - dependencies.@treeseed/core: github:treeseed-ai/core#e417bd3b7e1c1bc771c69b8770e14d1cdb7f22ca -> github:treeseed-ai/core#860900108a1b203a6887cb4240c48a83ee978345 --- package-lock.json | 12 ++++++------ package.json | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 22e41b25..008faeda 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,9 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#e417bd3b7e1c1bc771c69b8770e14d1cdb7f22ca", + "@treeseed/core": "github:treeseed-ai/core#860900108a1b203a6887cb4240c48a83ee978345", "@treeseed/sdk": "github:treeseed-ai/sdk#a3ec1ece7a9f89be84cb3d570b2dfb9b70981f36", - "@treeseed/ui": "github:treeseed-ai/ui#2c1ec9bd909fda4a73f4f24485a2fd1abf2e56a5", + "@treeseed/ui": "github:treeseed-ai/ui#7dfd2a809fc12a1e10dc1b763bb0ef146067abcf", "react": "^19.2.5", "react-dom": "^19.2.6" }, @@ -7463,8 +7463,8 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.treedx-perf.20260805T075816Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#e417bd3b7e1c1bc771c69b8770e14d1cdb7f22ca", - "integrity": "sha512-NqNwv9rtl5pMHOL+JMeHffkNZ85jSasrrXm1yy2WPuumo229I5sUVXOCCKtiN+CYxDhlATVw7qKEEhYrOOuN/w==", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#860900108a1b203a6887cb4240c48a83ee978345", + "integrity": "sha512-teohBoT5BV5IPcYTVMzxIV6X8omoZd64RqnjO+l3BzY5TpAYLWzWoLHdtf1RVJziVaeMn1m7cMlQ7FFF/J0urg==", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7476,7 +7476,7 @@ "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", "@treeseed/sdk": "github:treeseed-ai/sdk#a3ec1ece7a9f89be84cb3d570b2dfb9b70981f36", - "@treeseed/ui": "github:treeseed-ai/ui#2c1ec9bd909fda4a73f4f24485a2fd1abf2e56a5", + "@treeseed/ui": "github:treeseed-ai/ui#7dfd2a809fc12a1e10dc1b763bb0ef146067abcf", "astro": "^5.6.1", "esbuild": "^0.28.0", "katex": "^0.16.22", @@ -10187,7 +10187,7 @@ }, "node_modules/@treeseed/ui": { "version": "0.12.18-dev.treedx-perf.20260806T042250Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#2c1ec9bd909fda4a73f4f24485a2fd1abf2e56a5", + "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#7dfd2a809fc12a1e10dc1b763bb0ef146067abcf", "integrity": "sha512-rv0wytiNWholHDd/D5yYYjIKRLlr+fDhbEE5k5sSCPFRdNt8QvQ2IMzgE1EOpQtJ7uq/bB7mdv9athjARiPQxQ==", "license": "Apache-2.0", "dependencies": { diff --git a/package.json b/package.json index 9452f809..710eb4e7 100644 --- a/package.json +++ b/package.json @@ -49,9 +49,9 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#e417bd3b7e1c1bc771c69b8770e14d1cdb7f22ca", + "@treeseed/core": "github:treeseed-ai/core#860900108a1b203a6887cb4240c48a83ee978345", "@treeseed/sdk": "github:treeseed-ai/sdk#a3ec1ece7a9f89be84cb3d570b2dfb9b70981f36", - "@treeseed/ui": "github:treeseed-ai/ui#2c1ec9bd909fda4a73f4f24485a2fd1abf2e56a5", + "@treeseed/ui": "github:treeseed-ai/ui#7dfd2a809fc12a1e10dc1b763bb0ef146067abcf", "react": "^19.2.5", "react-dom": "^19.2.6" }, From 7588f828ca084a4333c32d7af4a7111c47b32a52 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Thu, 6 Aug 2026 16:37:33 -0400 Subject: [PATCH 084/315] build(build): resolve latest staging UI authoring conflicts Intent: - Save hint: resolve latest staging UI authoring conflicts Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.treedx-perf.20260805T075847Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#a3ec1ece7a9f89be84cb3d570b2dfb9b70981f36 -> github:treeseed-ai/sdk#5c530f6ae8848e07aef5fc32e6f3c5873d7a3f57 - dependencies.@treeseed/core: github:treeseed-ai/core#860900108a1b203a6887cb4240c48a83ee978345 -> github:treeseed-ai/core#8bd32e721230def8e57735171ef2c0edd90d8e09 --- package-lock.json | 128 +++++++++++++++++++++++++++++++++++++++++----- package.json | 4 +- 2 files changed, 116 insertions(+), 16 deletions(-) diff --git a/package-lock.json b/package-lock.json index 008faeda..1e57ef3c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#860900108a1b203a6887cb4240c48a83ee978345", - "@treeseed/sdk": "github:treeseed-ai/sdk#a3ec1ece7a9f89be84cb3d570b2dfb9b70981f36", + "@treeseed/core": "github:treeseed-ai/core#8bd32e721230def8e57735171ef2c0edd90d8e09", + "@treeseed/sdk": "github:treeseed-ai/sdk#5c530f6ae8848e07aef5fc32e6f3c5873d7a3f57", "@treeseed/ui": "github:treeseed-ai/ui#7dfd2a809fc12a1e10dc1b763bb0ef146067abcf", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -6345,9 +6345,9 @@ } }, "node_modules/@rolldown/pluginutils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", "license": "MIT" }, "node_modules/@rollup/pluginutils": { @@ -7463,8 +7463,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.treedx-perf.20260805T075816Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#860900108a1b203a6887cb4240c48a83ee978345", - "integrity": "sha512-teohBoT5BV5IPcYTVMzxIV6X8omoZd64RqnjO+l3BzY5TpAYLWzWoLHdtf1RVJziVaeMn1m7cMlQ7FFF/J0urg==", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#8bd32e721230def8e57735171ef2c0edd90d8e09", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7475,7 +7474,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#a3ec1ece7a9f89be84cb3d570b2dfb9b70981f36", + "@treeseed/sdk": "github:treeseed-ai/sdk#5c530f6ae8848e07aef5fc32e6f3c5873d7a3f57", "@treeseed/ui": "github:treeseed-ai/ui#7dfd2a809fc12a1e10dc1b763bb0ef146067abcf", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -9480,8 +9479,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.treedx-perf.20260805T073639Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#a3ec1ece7a9f89be84cb3d570b2dfb9b70981f36", - "integrity": "sha512-om8HbveKGxxxPpdqvAjM98JA1F7QW722hMtFeu2yESHdFftYYXBmlUQhs6SEiB/bg9hhwzq8l0ZXUnA/vHqgWg==", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#5c530f6ae8848e07aef5fc32e6f3c5873d7a3f57", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", @@ -10188,7 +10186,6 @@ "node_modules/@treeseed/ui": { "version": "0.12.18-dev.treedx-perf.20260806T042250Z", "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#7dfd2a809fc12a1e10dc1b763bb0ef146067abcf", - "integrity": "sha512-rv0wytiNWholHDd/D5yYYjIKRLlr+fDhbEE5k5sSCPFRdNt8QvQ2IMzgE1EOpQtJ7uq/bB7mdv9athjARiPQxQ==", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", @@ -15670,9 +15667,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz", - "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", + "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", "funding": [ { "type": "github", @@ -23203,6 +23200,109 @@ "type": "github", "url": "https://github.com/sponsors/wooorm" } + }, + "node_modules/@astrojs/cloudflare": { + "version": "12.6.13", + "resolved": "https://registry.npmjs.org/@astrojs/cloudflare/-/cloudflare-12.6.13.tgz", + "integrity": "sha512-oKaCyiovyQr183r9U93787Ju1zwk+rRMgPnLTwCLckHmOUK7sltA1Gp4LSGt8oNMgqQS6jR7uRdfQ/NPul37QA==", + "license": "MIT", + "dependencies": { + "@astrojs/internal-helpers": "0.7.6", + "@astrojs/underscore-redirects": "1.0.0", + "@cloudflare/workers-types": "^4.20260116.0", + "tinyglobby": "^0.2.15", + "vite": "^6.4.1", + "wrangler": "4.59.2" + }, + "peerDependencies": { + "astro": "^5.7.0" + } + }, + "node_modules/@astrojs/mdx": { + "version": "4.3.14", + "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-4.3.14.tgz", + "integrity": "sha512-FBrqJQORVm+rkRa2TS5CjU9PBA6hkhrwLVBSS9A77gN2+iehvjq1w6yya/d0YKC7osiVorKkr3Qd9wNbl0ZkGA==", + "license": "MIT", + "dependencies": { + "@astrojs/markdown-remark": "6.3.11", + "@mdx-js/mdx": "^3.1.1", + "acorn": "^8.15.0", + "es-module-lexer": "^1.7.0", + "estree-util-visit": "^2.0.0", + "hast-util-to-html": "^9.0.5", + "piccolore": "^0.1.3", + "rehype-raw": "^7.0.0", + "remark-gfm": "^4.0.1", + "remark-smartypants": "^3.0.2", + "source-map": "^0.7.6", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.3" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + }, + "peerDependencies": { + "astro": "^5.0.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/@astrojs/starlight": { + "version": "0.37.6", + "resolved": "https://registry.npmjs.org/@astrojs/starlight/-/starlight-0.37.6.tgz", + "integrity": "sha512-wQrKwH431q+8FsLBnNQeG+R36TMtEGxTQ2AuiVpcx9APcazvL3n7wVW8mMmYyxX0POjTnxlcWPkdMGR3Yj1L+w==", + "license": "MIT", + "dependencies": { + "@astrojs/markdown-remark": "^6.3.1", + "@astrojs/mdx": "^4.2.3", + "@astrojs/sitemap": "^3.3.0", + "@pagefind/default-ui": "^1.3.0", + "@types/hast": "^3.0.4", + "@types/js-yaml": "^4.0.9", + "@types/mdast": "^4.0.4", + "astro-expressive-code": "^0.41.1", + "bcp-47": "^2.1.0", + "hast-util-from-html": "^2.0.1", + "hast-util-select": "^6.0.2", + "hast-util-to-string": "^3.0.0", + "hastscript": "^9.0.0", + "i18next": "^23.11.5", + "js-yaml": "^4.1.0", + "klona": "^2.0.6", + "magic-string": "^0.30.17", + "mdast-util-directive": "^3.0.0", + "mdast-util-to-markdown": "^2.1.0", + "mdast-util-to-string": "^4.0.0", + "pagefind": "^1.3.0", + "rehype": "^13.0.1", + "rehype-format": "^5.0.0", + "remark-directive": "^3.0.0", + "ultrahtml": "^1.6.0", + "unified": "^11.0.5", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.2" + }, + "peerDependencies": { + "astro": "^5.5.0" + } } } } diff --git a/package.json b/package.json index 710eb4e7..1f07bcc9 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#860900108a1b203a6887cb4240c48a83ee978345", - "@treeseed/sdk": "github:treeseed-ai/sdk#a3ec1ece7a9f89be84cb3d570b2dfb9b70981f36", + "@treeseed/core": "github:treeseed-ai/core#8bd32e721230def8e57735171ef2c0edd90d8e09", + "@treeseed/sdk": "github:treeseed-ai/sdk#5c530f6ae8848e07aef5fc32e6f3c5873d7a3f57", "@treeseed/ui": "github:treeseed-ai/ui#7dfd2a809fc12a1e10dc1b763bb0ef146067abcf", "react": "^19.2.5", "react-dom": "^19.2.6" From 01313b01f09f36b0a52ea6b5e9f8d5bc753ea7e7 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Thu, 6 Aug 2026 16:44:16 -0400 Subject: [PATCH 085/315] build(build): resolve staging update conflict in core Intent: - Save hint: resolve staging update conflict in core Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.treedx-perf.20260805T075847Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/core: github:treeseed-ai/core#8bd32e721230def8e57735171ef2c0edd90d8e09 -> github:treeseed-ai/core#6641ed2f353d0bc9ab75dcc077b8c6f8cb1c3981 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1e57ef3c..1c0f0bdd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#8bd32e721230def8e57735171ef2c0edd90d8e09", + "@treeseed/core": "github:treeseed-ai/core#6641ed2f353d0bc9ab75dcc077b8c6f8cb1c3981", "@treeseed/sdk": "github:treeseed-ai/sdk#5c530f6ae8848e07aef5fc32e6f3c5873d7a3f57", "@treeseed/ui": "github:treeseed-ai/ui#7dfd2a809fc12a1e10dc1b763bb0ef146067abcf", "react": "^19.2.5", @@ -7463,7 +7463,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.treedx-perf.20260805T075816Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#8bd32e721230def8e57735171ef2c0edd90d8e09", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#6641ed2f353d0bc9ab75dcc077b8c6f8cb1c3981", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", diff --git a/package.json b/package.json index 1f07bcc9..9fe22da4 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#8bd32e721230def8e57735171ef2c0edd90d8e09", + "@treeseed/core": "github:treeseed-ai/core#6641ed2f353d0bc9ab75dcc077b8c6f8cb1c3981", "@treeseed/sdk": "github:treeseed-ai/sdk#5c530f6ae8848e07aef5fc32e6f3c5873d7a3f57", "@treeseed/ui": "github:treeseed-ai/ui#7dfd2a809fc12a1e10dc1b763bb0ef146067abcf", "react": "^19.2.5", From 547ee48ff8ac2128de370fd0593f4bb249459d84 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Thu, 6 Aug 2026 23:12:31 -0400 Subject: [PATCH 086/315] build(docs): sync package dependency references Changes: - Updates 280 files across docs: 276, build: 2, ui: 2. - Touches docs/src/config.yaml, docs/src/content/agents/architect.mdx, docs/src/content/agents/engineer.mdx, docs/src/content/agents/releaser.mdx, docs/src/content/agents/reporter.mdx, docs/src/content/agents/researcher.mdx, .... - Plans package version/tag 0.12.59-dev.staging.20260804T171053Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#2a8bc4722d887d9360128d855885a424483a2074 -> github:treeseed-ai/sdk#c4ebba69bd0fdf908739426472d1656757b86273 - dependencies.@treeseed/ui: github:treeseed-ai/ui#2938d0959dcb2aaa97bbced633e6f75df83db90c -> github:treeseed-ai/ui#c64f2908a167383d057b83104b41dc03ea196757 - dependencies.@treeseed/core: github:treeseed-ai/core#08a3b9bc6d5354eccf5c491a5dfab37bca505f33 -> github:treeseed-ai/core#1d5b6647b046e56a833c184e61c056b97011e89f --- docs/src/config.yaml | 18 +++---- docs/src/content/agents/architect.mdx | 4 +- docs/src/content/agents/engineer.mdx | 4 +- docs/src/content/agents/releaser.mdx | 2 +- docs/src/content/agents/reporter.mdx | 2 +- docs/src/content/agents/researcher.mdx | 2 +- docs/src/content/agents/reviewer.mdx | 2 +- docs/src/content/agents/technical-writer.mdx | 2 +- docs/src/content/agents/tester.mdx | 2 +- .../content/books/accounts-and-identity.md | 5 +- docs/src/content/books/credential-security.md | 5 +- .../src/content/books/feedback-and-support.md | 5 +- .../content/books/services-and-providers.md | 5 +- docs/src/content/books/team-administration.md | 5 +- docs/src/content/groups/accept.md | 12 +++++ docs/src/content/groups/access.md | 12 +++++ docs/src/content/groups/account-id.md | 12 +++++ docs/src/content/groups/account-password.md | 12 +++++ docs/src/content/groups/accounts.md | 12 +++++ docs/src/content/groups/actions.md | 12 +++++ docs/src/content/groups/active-team.md | 12 +++++ docs/src/content/groups/activity.md | 12 +++++ docs/src/content/groups/actor.md | 12 +++++ docs/src/content/groups/administration.md | 12 +++++ docs/src/content/groups/administrator-key.md | 12 +++++ docs/src/content/groups/administrator.md | 12 +++++ docs/src/content/groups/agent.md | 12 +++++ docs/src/content/groups/ai.md | 12 +++++ docs/src/content/groups/api-token.md | 12 +++++ docs/src/content/groups/appearance.md | 12 +++++ docs/src/content/groups/architecture.md | 12 +++++ docs/src/content/groups/archive.md | 12 +++++ docs/src/content/groups/archived.md | 12 +++++ docs/src/content/groups/attachment.md | 12 +++++ docs/src/content/groups/audit.md | 12 +++++ docs/src/content/groups/authentication.md | 12 +++++ docs/src/content/groups/author.md | 12 +++++ docs/src/content/groups/authoring.md | 12 +++++ docs/src/content/groups/binding.md | 12 +++++ docs/src/content/groups/blast-radius.md | 12 +++++ docs/src/content/groups/blocker.md | 12 +++++ docs/src/content/groups/blockers.md | 12 +++++ docs/src/content/groups/books.md | 12 +++++ docs/src/content/groups/cadence.md | 12 +++++ docs/src/content/groups/capabilities.md | 12 +++++ docs/src/content/groups/capability.md | 12 +++++ docs/src/content/groups/capture.md | 12 +++++ docs/src/content/groups/change.md | 12 +++++ docs/src/content/groups/changes.md | 12 +++++ docs/src/content/groups/ciphertext.md | 12 +++++ docs/src/content/groups/cloudflare.md | 12 +++++ docs/src/content/groups/colors.md | 12 +++++ docs/src/content/groups/compromise.md | 12 +++++ docs/src/content/groups/conflict.md | 12 +++++ docs/src/content/groups/connect-service.md | 12 +++++ .../src/content/groups/connection-settings.md | 12 +++++ docs/src/content/groups/connections.md | 12 +++++ docs/src/content/groups/contact.md | 12 +++++ docs/src/content/groups/content-fields.md | 12 +++++ docs/src/content/groups/content.md | 12 +++++ docs/src/content/groups/context.md | 12 +++++ docs/src/content/groups/contrast.md | 12 +++++ docs/src/content/groups/contributor.md | 12 +++++ docs/src/content/groups/create-team.md | 12 +++++ docs/src/content/groups/credential.md | 12 +++++ docs/src/content/groups/credentials.md | 12 +++++ docs/src/content/groups/dark-mode.md | 12 +++++ docs/src/content/groups/date.md | 12 +++++ docs/src/content/groups/delete-account.md | 12 +++++ docs/src/content/groups/delete-team.md | 12 +++++ docs/src/content/groups/delete.md | 12 +++++ docs/src/content/groups/devices.md | 12 +++++ docs/src/content/groups/directory.md | 12 +++++ .../src/content/groups/discard-credentials.md | 12 +++++ docs/src/content/groups/disconnect.md | 12 +++++ docs/src/content/groups/dns.md | 12 +++++ docs/src/content/groups/email-mismatch.md | 12 +++++ docs/src/content/groups/email.md | 12 +++++ docs/src/content/groups/encryption.md | 12 +++++ docs/src/content/groups/engineering-team.md | 12 +++++ docs/src/content/groups/engineering.md | 12 +++++ docs/src/content/groups/envelope.md | 12 +++++ docs/src/content/groups/expiry.md | 12 +++++ docs/src/content/groups/export.md | 12 +++++ docs/src/content/groups/feedback.md | 12 +++++ docs/src/content/groups/filter.md | 12 +++++ .../content/groups/forgotten-passphrase.md | 12 +++++ docs/src/content/groups/github-app.md | 12 +++++ docs/src/content/groups/github.md | 12 +++++ docs/src/content/groups/google.md | 12 +++++ docs/src/content/groups/grant.md | 12 +++++ docs/src/content/groups/hashicorp-vault.md | 12 +++++ docs/src/content/groups/history.md | 12 +++++ docs/src/content/groups/hosting.md | 12 +++++ docs/src/content/groups/iana.md | 12 +++++ docs/src/content/groups/identity.md | 12 +++++ docs/src/content/groups/in-progress.md | 12 +++++ docs/src/content/groups/installation.md | 12 +++++ docs/src/content/groups/invitation.md | 12 +++++ docs/src/content/groups/ip-address.md | 12 +++++ docs/src/content/groups/irreversible.md | 12 +++++ docs/src/content/groups/issue.md | 12 +++++ docs/src/content/groups/jsonl.md | 12 +++++ docs/src/content/groups/jwt.md | 12 +++++ docs/src/content/groups/key-wrapping.md | 12 +++++ docs/src/content/groups/knowledge.md | 12 +++++ docs/src/content/groups/last-owner.md | 12 +++++ docs/src/content/groups/lead.md | 12 +++++ docs/src/content/groups/lease.md | 12 +++++ docs/src/content/groups/leave.md | 12 +++++ docs/src/content/groups/lost-access.md | 12 +++++ docs/src/content/groups/member.md | 12 +++++ docs/src/content/groups/members.md | 12 +++++ docs/src/content/groups/membership.md | 12 +++++ docs/src/content/groups/metadata.md | 12 +++++ docs/src/content/groups/name.md | 12 +++++ docs/src/content/groups/notes.md | 12 +++++ docs/src/content/groups/notifications.md | 12 +++++ docs/src/content/groups/oidc.md | 12 +++++ docs/src/content/groups/openbao.md | 12 +++++ docs/src/content/groups/organization.md | 12 +++++ docs/src/content/groups/overrides.md | 12 +++++ docs/src/content/groups/owner.md | 12 +++++ docs/src/content/groups/ownership.md | 12 +++++ docs/src/content/groups/pages.md | 12 +++++ docs/src/content/groups/pagination.md | 12 +++++ docs/src/content/groups/passphrase.md | 12 +++++ docs/src/content/groups/password.md | 12 +++++ docs/src/content/groups/permission.md | 12 +++++ docs/src/content/groups/permissions.md | 12 +++++ .../src/content/groups/personal-passphrase.md | 12 +++++ docs/src/content/groups/platform-admin.md | 12 +++++ docs/src/content/groups/primary.md | 12 +++++ docs/src/content/groups/privacy.md | 12 +++++ docs/src/content/groups/private.md | 12 +++++ docs/src/content/groups/profile.md | 12 +++++ docs/src/content/groups/projects.md | 12 +++++ docs/src/content/groups/provenance.md | 12 +++++ docs/src/content/groups/provider.md | 12 +++++ docs/src/content/groups/providers.md | 12 +++++ docs/src/content/groups/public-profile.md | 12 +++++ docs/src/content/groups/public.md | 12 +++++ docs/src/content/groups/publication.md | 12 +++++ docs/src/content/groups/r2.md | 12 +++++ docs/src/content/groups/railway.md | 12 +++++ docs/src/content/groups/read-only.md | 12 +++++ docs/src/content/groups/reauthentication.md | 12 +++++ docs/src/content/groups/recovery.md | 12 +++++ docs/src/content/groups/redact.md | 12 +++++ docs/src/content/groups/release.md | 12 +++++ docs/src/content/groups/remove.md | 12 +++++ docs/src/content/groups/reopen.md | 12 +++++ docs/src/content/groups/report.md | 12 +++++ docs/src/content/groups/reporting.md | 12 +++++ docs/src/content/groups/repositories.md | 12 +++++ docs/src/content/groups/repository.md | 12 +++++ docs/src/content/groups/research.md | 12 +++++ docs/src/content/groups/resend.md | 12 +++++ docs/src/content/groups/reset-vault.md | 12 +++++ docs/src/content/groups/resolve.md | 12 +++++ docs/src/content/groups/restore.md | 12 +++++ docs/src/content/groups/retention.md | 12 +++++ docs/src/content/groups/review.md | 12 +++++ docs/src/content/groups/revoke.md | 12 +++++ docs/src/content/groups/role.md | 12 +++++ docs/src/content/groups/roles.md | 12 +++++ docs/src/content/groups/rotate-passphrase.md | 12 +++++ docs/src/content/groups/rotate-team-key.md | 12 +++++ docs/src/content/groups/rotate-token.md | 12 +++++ docs/src/content/groups/rotation.md | 12 +++++ docs/src/content/groups/same-passphrase.md | 12 +++++ docs/src/content/groups/screenshot.md | 12 +++++ docs/src/content/groups/search.md | 12 +++++ docs/src/content/groups/secrets.md | 12 +++++ docs/src/content/groups/security.md | 12 +++++ docs/src/content/groups/service-vault.md | 12 +++++ docs/src/content/groups/services.md | 12 +++++ docs/src/content/groups/sessions.md | 12 +++++ docs/src/content/groups/settings.md | 12 +++++ docs/src/content/groups/sign-in.md | 12 +++++ docs/src/content/groups/sign-out.md | 12 +++++ docs/src/content/groups/slug.md | 12 +++++ docs/src/content/groups/sole-administrator.md | 12 +++++ docs/src/content/groups/status.md | 12 +++++ docs/src/content/groups/step-1.md | 12 +++++ docs/src/content/groups/step-2.md | 12 +++++ docs/src/content/groups/step-3.md | 12 +++++ docs/src/content/groups/suggestion.md | 12 +++++ docs/src/content/groups/support.md | 12 +++++ docs/src/content/groups/switch.md | 12 +++++ docs/src/content/groups/team-key.md | 12 +++++ docs/src/content/groups/team-overview.md | 12 +++++ docs/src/content/groups/team-settings.md | 12 +++++ docs/src/content/groups/team-vault-key.md | 12 +++++ docs/src/content/groups/teams.md | 12 +++++ docs/src/content/groups/technical-writing.md | 12 +++++ docs/src/content/groups/testing.md | 12 +++++ docs/src/content/groups/theme.md | 12 +++++ docs/src/content/groups/time-zone.md | 12 +++++ docs/src/content/groups/timestamp.md | 12 +++++ docs/src/content/groups/timezone.md | 12 +++++ docs/src/content/groups/title.md | 12 +++++ docs/src/content/groups/token.md | 12 +++++ docs/src/content/groups/traceability.md | 12 +++++ docs/src/content/groups/transfer.md | 12 +++++ docs/src/content/groups/triage.md | 12 +++++ docs/src/content/groups/username.md | 12 +++++ docs/src/content/groups/validation.md | 12 +++++ docs/src/content/groups/vault.md | 12 +++++ docs/src/content/groups/verification.md | 12 +++++ docs/src/content/groups/viewer.md | 12 +++++ docs/src/content/groups/visibility.md | 12 +++++ docs/src/content/groups/workers.md | 12 +++++ docs/src/content/groups/workflow.md | 12 +++++ docs/src/content/groups/workload-identity.md | 12 +++++ docs/src/content/groups/workspace.md | 12 +++++ docs/src/content/groups/wrapped-team-key.md | 12 +++++ docs/src/content/groups/zero-knowledge.md | 12 +++++ docs/src/content/groups/zip.md | 12 +++++ .../appearance.md | 6 +-- .../connected-identities.md | 8 ++-- .../deletion.md | 6 +-- .../treeseed-accounts-and-identity/emails.md | 4 +- .../identity.md | 8 ++-- .../notifications.md | 8 ++-- .../project-overrides.md | 6 +-- .../security.md | 6 +-- .../sessions.md | 8 ++-- .../time-zone.md | 8 ++-- .../treeseed-credential-security/grants.md | 6 +-- .../treeseed-credential-security/overview.md | 10 ++-- .../personal-key.md | 10 ++-- .../provider-credential-rotation.md | 8 ++-- .../treeseed-credential-security/recovery.md | 8 ++-- .../treeseed-credential-security/reset.md | 6 +-- .../treeseed-credential-security/rotation.md | 8 ++-- .../team-custody.md | 10 ++-- .../administration.md | 8 ++-- .../treeseed-feedback-and-support/exports.md | 8 ++-- .../treeseed-feedback-and-support/fields.md | 8 ++-- .../treeseed-feedback-and-support/privacy.md | 8 ++-- .../screenshot-privacy.md | 8 ++-- .../submitting.md | 6 +-- .../treeseed-feedback-and-support/triage.md | 10 ++-- .../activity.md | 4 +- .../capabilities.md | 6 +-- .../connect.md | 6 +-- .../connection.md | 6 +-- .../connections.md | 10 ++-- .../credentials.md | 4 +- .../disconnection.md | 6 +-- .../external-vault.md | 10 ++-- .../provider-cloudflare.md | 8 ++-- .../provider-github.md | 6 +-- .../provider-openbao.md | 10 ++-- .../provider-railway.md | 6 +-- .../providers.md | 6 +-- .../settings.md | 8 ++-- .../validation.md | 6 +-- .../treeseed-team-administration/activity.md | 4 +- .../collection.md | 6 +-- .../treeseed-team-administration/creation.md | 6 +-- .../invitation.md | 8 ++-- .../knowledge-authoring.md | 6 +-- .../treeseed-team-administration/lifecycle.md | 6 +-- .../member-search.md | 4 +- .../membership.md | 8 ++-- .../treeseed-team-administration/overview.md | 6 +-- .../treeseed-team-administration/ownership.md | 4 +- .../treeseed-team-administration/removal.md | 8 ++-- .../role-changes.md | 6 +-- .../treeseed-team-administration/roles.md | 10 ++-- .../treeseed-team-administration/settings.md | 8 ++-- .../visibility.md | 6 +-- .../notes/knowledge-authoring-traceability.md | 4 +- ...-knowledge-publication-stay-trustworthy.md | 4 +- package-lock.json | 26 +++++----- package.json | 6 +-- src/pages/app/capacity/index.astro | 48 ++++++++++++++++++- src/pages/app/knowledge/index.astro | 6 +-- 280 files changed, 2763 insertions(+), 242 deletions(-) create mode 100644 docs/src/content/groups/accept.md create mode 100644 docs/src/content/groups/access.md create mode 100644 docs/src/content/groups/account-id.md create mode 100644 docs/src/content/groups/account-password.md create mode 100644 docs/src/content/groups/accounts.md create mode 100644 docs/src/content/groups/actions.md create mode 100644 docs/src/content/groups/active-team.md create mode 100644 docs/src/content/groups/activity.md create mode 100644 docs/src/content/groups/actor.md create mode 100644 docs/src/content/groups/administration.md create mode 100644 docs/src/content/groups/administrator-key.md create mode 100644 docs/src/content/groups/administrator.md create mode 100644 docs/src/content/groups/agent.md create mode 100644 docs/src/content/groups/ai.md create mode 100644 docs/src/content/groups/api-token.md create mode 100644 docs/src/content/groups/appearance.md create mode 100644 docs/src/content/groups/architecture.md create mode 100644 docs/src/content/groups/archive.md create mode 100644 docs/src/content/groups/archived.md create mode 100644 docs/src/content/groups/attachment.md create mode 100644 docs/src/content/groups/audit.md create mode 100644 docs/src/content/groups/authentication.md create mode 100644 docs/src/content/groups/author.md create mode 100644 docs/src/content/groups/authoring.md create mode 100644 docs/src/content/groups/binding.md create mode 100644 docs/src/content/groups/blast-radius.md create mode 100644 docs/src/content/groups/blocker.md create mode 100644 docs/src/content/groups/blockers.md create mode 100644 docs/src/content/groups/books.md create mode 100644 docs/src/content/groups/cadence.md create mode 100644 docs/src/content/groups/capabilities.md create mode 100644 docs/src/content/groups/capability.md create mode 100644 docs/src/content/groups/capture.md create mode 100644 docs/src/content/groups/change.md create mode 100644 docs/src/content/groups/changes.md create mode 100644 docs/src/content/groups/ciphertext.md create mode 100644 docs/src/content/groups/cloudflare.md create mode 100644 docs/src/content/groups/colors.md create mode 100644 docs/src/content/groups/compromise.md create mode 100644 docs/src/content/groups/conflict.md create mode 100644 docs/src/content/groups/connect-service.md create mode 100644 docs/src/content/groups/connection-settings.md create mode 100644 docs/src/content/groups/connections.md create mode 100644 docs/src/content/groups/contact.md create mode 100644 docs/src/content/groups/content-fields.md create mode 100644 docs/src/content/groups/content.md create mode 100644 docs/src/content/groups/context.md create mode 100644 docs/src/content/groups/contrast.md create mode 100644 docs/src/content/groups/contributor.md create mode 100644 docs/src/content/groups/create-team.md create mode 100644 docs/src/content/groups/credential.md create mode 100644 docs/src/content/groups/credentials.md create mode 100644 docs/src/content/groups/dark-mode.md create mode 100644 docs/src/content/groups/date.md create mode 100644 docs/src/content/groups/delete-account.md create mode 100644 docs/src/content/groups/delete-team.md create mode 100644 docs/src/content/groups/delete.md create mode 100644 docs/src/content/groups/devices.md create mode 100644 docs/src/content/groups/directory.md create mode 100644 docs/src/content/groups/discard-credentials.md create mode 100644 docs/src/content/groups/disconnect.md create mode 100644 docs/src/content/groups/dns.md create mode 100644 docs/src/content/groups/email-mismatch.md create mode 100644 docs/src/content/groups/email.md create mode 100644 docs/src/content/groups/encryption.md create mode 100644 docs/src/content/groups/engineering-team.md create mode 100644 docs/src/content/groups/engineering.md create mode 100644 docs/src/content/groups/envelope.md create mode 100644 docs/src/content/groups/expiry.md create mode 100644 docs/src/content/groups/export.md create mode 100644 docs/src/content/groups/feedback.md create mode 100644 docs/src/content/groups/filter.md create mode 100644 docs/src/content/groups/forgotten-passphrase.md create mode 100644 docs/src/content/groups/github-app.md create mode 100644 docs/src/content/groups/github.md create mode 100644 docs/src/content/groups/google.md create mode 100644 docs/src/content/groups/grant.md create mode 100644 docs/src/content/groups/hashicorp-vault.md create mode 100644 docs/src/content/groups/history.md create mode 100644 docs/src/content/groups/hosting.md create mode 100644 docs/src/content/groups/iana.md create mode 100644 docs/src/content/groups/identity.md create mode 100644 docs/src/content/groups/in-progress.md create mode 100644 docs/src/content/groups/installation.md create mode 100644 docs/src/content/groups/invitation.md create mode 100644 docs/src/content/groups/ip-address.md create mode 100644 docs/src/content/groups/irreversible.md create mode 100644 docs/src/content/groups/issue.md create mode 100644 docs/src/content/groups/jsonl.md create mode 100644 docs/src/content/groups/jwt.md create mode 100644 docs/src/content/groups/key-wrapping.md create mode 100644 docs/src/content/groups/knowledge.md create mode 100644 docs/src/content/groups/last-owner.md create mode 100644 docs/src/content/groups/lead.md create mode 100644 docs/src/content/groups/lease.md create mode 100644 docs/src/content/groups/leave.md create mode 100644 docs/src/content/groups/lost-access.md create mode 100644 docs/src/content/groups/member.md create mode 100644 docs/src/content/groups/members.md create mode 100644 docs/src/content/groups/membership.md create mode 100644 docs/src/content/groups/metadata.md create mode 100644 docs/src/content/groups/name.md create mode 100644 docs/src/content/groups/notes.md create mode 100644 docs/src/content/groups/notifications.md create mode 100644 docs/src/content/groups/oidc.md create mode 100644 docs/src/content/groups/openbao.md create mode 100644 docs/src/content/groups/organization.md create mode 100644 docs/src/content/groups/overrides.md create mode 100644 docs/src/content/groups/owner.md create mode 100644 docs/src/content/groups/ownership.md create mode 100644 docs/src/content/groups/pages.md create mode 100644 docs/src/content/groups/pagination.md create mode 100644 docs/src/content/groups/passphrase.md create mode 100644 docs/src/content/groups/password.md create mode 100644 docs/src/content/groups/permission.md create mode 100644 docs/src/content/groups/permissions.md create mode 100644 docs/src/content/groups/personal-passphrase.md create mode 100644 docs/src/content/groups/platform-admin.md create mode 100644 docs/src/content/groups/primary.md create mode 100644 docs/src/content/groups/privacy.md create mode 100644 docs/src/content/groups/private.md create mode 100644 docs/src/content/groups/profile.md create mode 100644 docs/src/content/groups/projects.md create mode 100644 docs/src/content/groups/provenance.md create mode 100644 docs/src/content/groups/provider.md create mode 100644 docs/src/content/groups/providers.md create mode 100644 docs/src/content/groups/public-profile.md create mode 100644 docs/src/content/groups/public.md create mode 100644 docs/src/content/groups/publication.md create mode 100644 docs/src/content/groups/r2.md create mode 100644 docs/src/content/groups/railway.md create mode 100644 docs/src/content/groups/read-only.md create mode 100644 docs/src/content/groups/reauthentication.md create mode 100644 docs/src/content/groups/recovery.md create mode 100644 docs/src/content/groups/redact.md create mode 100644 docs/src/content/groups/release.md create mode 100644 docs/src/content/groups/remove.md create mode 100644 docs/src/content/groups/reopen.md create mode 100644 docs/src/content/groups/report.md create mode 100644 docs/src/content/groups/reporting.md create mode 100644 docs/src/content/groups/repositories.md create mode 100644 docs/src/content/groups/repository.md create mode 100644 docs/src/content/groups/research.md create mode 100644 docs/src/content/groups/resend.md create mode 100644 docs/src/content/groups/reset-vault.md create mode 100644 docs/src/content/groups/resolve.md create mode 100644 docs/src/content/groups/restore.md create mode 100644 docs/src/content/groups/retention.md create mode 100644 docs/src/content/groups/review.md create mode 100644 docs/src/content/groups/revoke.md create mode 100644 docs/src/content/groups/role.md create mode 100644 docs/src/content/groups/roles.md create mode 100644 docs/src/content/groups/rotate-passphrase.md create mode 100644 docs/src/content/groups/rotate-team-key.md create mode 100644 docs/src/content/groups/rotate-token.md create mode 100644 docs/src/content/groups/rotation.md create mode 100644 docs/src/content/groups/same-passphrase.md create mode 100644 docs/src/content/groups/screenshot.md create mode 100644 docs/src/content/groups/search.md create mode 100644 docs/src/content/groups/secrets.md create mode 100644 docs/src/content/groups/security.md create mode 100644 docs/src/content/groups/service-vault.md create mode 100644 docs/src/content/groups/services.md create mode 100644 docs/src/content/groups/sessions.md create mode 100644 docs/src/content/groups/settings.md create mode 100644 docs/src/content/groups/sign-in.md create mode 100644 docs/src/content/groups/sign-out.md create mode 100644 docs/src/content/groups/slug.md create mode 100644 docs/src/content/groups/sole-administrator.md create mode 100644 docs/src/content/groups/status.md create mode 100644 docs/src/content/groups/step-1.md create mode 100644 docs/src/content/groups/step-2.md create mode 100644 docs/src/content/groups/step-3.md create mode 100644 docs/src/content/groups/suggestion.md create mode 100644 docs/src/content/groups/support.md create mode 100644 docs/src/content/groups/switch.md create mode 100644 docs/src/content/groups/team-key.md create mode 100644 docs/src/content/groups/team-overview.md create mode 100644 docs/src/content/groups/team-settings.md create mode 100644 docs/src/content/groups/team-vault-key.md create mode 100644 docs/src/content/groups/teams.md create mode 100644 docs/src/content/groups/technical-writing.md create mode 100644 docs/src/content/groups/testing.md create mode 100644 docs/src/content/groups/theme.md create mode 100644 docs/src/content/groups/time-zone.md create mode 100644 docs/src/content/groups/timestamp.md create mode 100644 docs/src/content/groups/timezone.md create mode 100644 docs/src/content/groups/title.md create mode 100644 docs/src/content/groups/token.md create mode 100644 docs/src/content/groups/traceability.md create mode 100644 docs/src/content/groups/transfer.md create mode 100644 docs/src/content/groups/triage.md create mode 100644 docs/src/content/groups/username.md create mode 100644 docs/src/content/groups/validation.md create mode 100644 docs/src/content/groups/vault.md create mode 100644 docs/src/content/groups/verification.md create mode 100644 docs/src/content/groups/viewer.md create mode 100644 docs/src/content/groups/visibility.md create mode 100644 docs/src/content/groups/workers.md create mode 100644 docs/src/content/groups/workflow.md create mode 100644 docs/src/content/groups/workload-identity.md create mode 100644 docs/src/content/groups/workspace.md create mode 100644 docs/src/content/groups/wrapped-team-key.md create mode 100644 docs/src/content/groups/zero-knowledge.md create mode 100644 docs/src/content/groups/zip.md diff --git a/docs/src/config.yaml b/docs/src/config.yaml index e0469ddc..ec4fa68c 100644 --- a/docs/src/config.yaml +++ b/docs/src/config.yaml @@ -48,33 +48,33 @@ models: defaults: author: TreeSeed Admin Team draft: false - tags: [] + groupIds: [] questions: defaults: draft: false - tags: [] + groupIds: [] objectives: defaults: draft: false - tags: [] + groupIds: [] proposals: defaults: draft: false - tags: [] + groupIds: [] decisions: defaults: draft: false - tags: [] + groupIds: [] people: defaults: status: live - tags: [] + groupIds: [] agents: defaults: - tags: [] + groupIds: [] books: defaults: - tags: [] + groupIds: [] docs: defaults: - tags: [] + groupIds: [] diff --git a/docs/src/content/agents/architect.mdx b/docs/src/content/agents/architect.mdx index a46d7d18..960b7e1a 100644 --- a/docs/src/content/agents/architect.mdx +++ b/docs/src/content/agents/architect.mdx @@ -11,10 +11,10 @@ enabled: true description: Defines the project architecture, objectives, standards, and decision-aligned knowledge structure. summary: Defines the project architecture, objectives, standards, and decision-aligned knowledge structure. runtimeStatus: active -tags: +groupIds: - agent - - engineering-team - architecture + - engineering-team identity: purpose: Defines the project architecture, objectives, standards, and decision-aligned knowledge structure. responsibilities: diff --git a/docs/src/content/agents/engineer.mdx b/docs/src/content/agents/engineer.mdx index 0f6b1d53..50fbd02c 100644 --- a/docs/src/content/agents/engineer.mdx +++ b/docs/src/content/agents/engineer.mdx @@ -11,10 +11,10 @@ enabled: true description: Implements decision-scoped code and configuration changes without modifying tests. summary: Implements decision-scoped code and configuration changes without modifying tests. runtimeStatus: active -tags: +groupIds: - agent - - engineering-team - engineering + - engineering-team identity: purpose: Implements decision-scoped code and configuration changes without modifying tests. responsibilities: diff --git a/docs/src/content/agents/releaser.mdx b/docs/src/content/agents/releaser.mdx index a7c2acdf..b56d2058 100644 --- a/docs/src/content/agents/releaser.mdx +++ b/docs/src/content/agents/releaser.mdx @@ -11,7 +11,7 @@ enabled: true description: Verifies staged changes and coordinates reliable release from staging through TreeSeed release operations. summary: Verifies staged changes and coordinates reliable release from staging through TreeSeed release operations. runtimeStatus: active -tags: +groupIds: - agent - engineering-team - release diff --git a/docs/src/content/agents/reporter.mdx b/docs/src/content/agents/reporter.mdx index a9e1f3ce..5c3fe47e 100644 --- a/docs/src/content/agents/reporter.mdx +++ b/docs/src/content/agents/reporter.mdx @@ -11,7 +11,7 @@ enabled: true description: Deterministically summarizes workdays, capacity, graph progress, blockers, tool telemetry, and outcomes. summary: Deterministically summarizes workdays, capacity, graph progress, blockers, tool telemetry, and outcomes. runtimeStatus: active -tags: +groupIds: - agent - engineering-team - reporting diff --git a/docs/src/content/agents/researcher.mdx b/docs/src/content/agents/researcher.mdx index 7a6992a7..a1e8a8fa 100644 --- a/docs/src/content/agents/researcher.mdx +++ b/docs/src/content/agents/researcher.mdx @@ -11,7 +11,7 @@ enabled: true description: Answers questions and improves project knowledge through TreeDX-backed research content. summary: Answers questions and improves project knowledge through TreeDX-backed research content. runtimeStatus: active -tags: +groupIds: - agent - engineering-team - research diff --git a/docs/src/content/agents/reviewer.mdx b/docs/src/content/agents/reviewer.mdx index e6093b84..93e27534 100644 --- a/docs/src/content/agents/reviewer.mdx +++ b/docs/src/content/agents/reviewer.mdx @@ -11,7 +11,7 @@ enabled: true description: Reviews knowledge, proposals, deliverables, and staged work for accuracy, clarity, and risk. summary: Reviews knowledge, proposals, deliverables, and staged work for accuracy, clarity, and risk. runtimeStatus: active -tags: +groupIds: - agent - engineering-team - review diff --git a/docs/src/content/agents/technical-writer.mdx b/docs/src/content/agents/technical-writer.mdx index c73dde65..9719bdb1 100644 --- a/docs/src/content/agents/technical-writer.mdx +++ b/docs/src/content/agents/technical-writer.mdx @@ -11,7 +11,7 @@ enabled: true description: Maintains user, developer, and operator documentation for released and staged project capabilities. summary: Maintains user, developer, and operator documentation for released and staged project capabilities. runtimeStatus: active -tags: +groupIds: - agent - engineering-team - technical-writing diff --git a/docs/src/content/agents/tester.mdx b/docs/src/content/agents/tester.mdx index a24feb80..94c41e23 100644 --- a/docs/src/content/agents/tester.mdx +++ b/docs/src/content/agents/tester.mdx @@ -11,7 +11,7 @@ enabled: true description: Creates tests before implementation and verifies behavior without modifying implementation code. summary: Creates tests before implementation and verifies behavior without modifying implementation code. runtimeStatus: active -tags: +groupIds: - agent - engineering-team - testing diff --git a/docs/src/content/books/accounts-and-identity.md b/docs/src/content/books/accounts-and-identity.md index 9e77c6d8..ff268e0d 100644 --- a/docs/src/content/books/accounts-and-identity.md +++ b/docs/src/content/books/accounts-and-identity.md @@ -8,7 +8,10 @@ description: Practical guidance for creating and maintaining a secure TreeSeed i status: published visibility: authenticated order: 10 -topics: [accounts, identity, authentication] +groupIds: + - accounts + - authentication + - identity audience: [TreeSeed users] relatedBookIds: [treeseed-team-administration, treeseed-credential-security] packPolicy: allowed diff --git a/docs/src/content/books/credential-security.md b/docs/src/content/books/credential-security.md index 4327b57c..25ebec25 100644 --- a/docs/src/content/books/credential-security.md +++ b/docs/src/content/books/credential-security.md @@ -8,7 +8,10 @@ description: Security guidance for TreeSeed client-encrypted provider credential status: published visibility: authenticated order: 40 -topics: [security, credentials, encryption] +groupIds: + - credentials + - encryption + - security audience: [credential administrators, team owners] relatedBookIds: [treeseed-accounts-and-identity, treeseed-services-and-providers] packPolicy: restricted diff --git a/docs/src/content/books/feedback-and-support.md b/docs/src/content/books/feedback-and-support.md index f27b9a8c..1ef74edf 100644 --- a/docs/src/content/books/feedback-and-support.md +++ b/docs/src/content/books/feedback-and-support.md @@ -8,7 +8,10 @@ description: Guidance for users reporting issues and administrators triaging and status: published visibility: authenticated order: 50 -topics: [feedback, support, privacy] +groupIds: + - feedback + - privacy + - support audience: [TreeSeed users, platform administrators] relatedBookIds: [treeseed-accounts-and-identity, treeseed-team-administration] packPolicy: allowed diff --git a/docs/src/content/books/services-and-providers.md b/docs/src/content/books/services-and-providers.md index fdd9370d..56a444e2 100644 --- a/docs/src/content/books/services-and-providers.md +++ b/docs/src/content/books/services-and-providers.md @@ -8,7 +8,10 @@ description: Provider-specific setup and operational guidance for TreeSeed servi status: published visibility: authenticated order: 30 -topics: [services, providers, capabilities] +groupIds: + - capabilities + - providers + - services audience: [service administrators, team owners] relatedBookIds: [treeseed-team-administration, treeseed-credential-security] packPolicy: allowed diff --git a/docs/src/content/books/team-administration.md b/docs/src/content/books/team-administration.md index 82376a0f..421276b8 100644 --- a/docs/src/content/books/team-administration.md +++ b/docs/src/content/books/team-administration.md @@ -8,7 +8,10 @@ description: Role-aware operational guidance for TreeSeed teams and their admini status: published visibility: public order: 20 -topics: [teams, membership, ownership] +groupIds: + - membership + - ownership + - teams audience: [team members, team administrators] relatedBookIds: [treeseed-accounts-and-identity, treeseed-services-and-providers] packPolicy: allowed diff --git a/docs/src/content/groups/accept.md b/docs/src/content/groups/accept.md new file mode 100644 index 00000000..a601c808 --- /dev/null +++ b/docs/src/content/groups/accept.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: accept +slug: accept +name: Accept +description: Groups content and participants concerned with Accept. +classification: ontology/topic/accept +aliases: [] +status: active +--- + +# Accept diff --git a/docs/src/content/groups/access.md b/docs/src/content/groups/access.md new file mode 100644 index 00000000..0b7f60bc --- /dev/null +++ b/docs/src/content/groups/access.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: access +slug: access +name: Access +description: Groups content and participants concerned with Access. +classification: ontology/topic/access +aliases: [] +status: active +--- + +# Access diff --git a/docs/src/content/groups/account-id.md b/docs/src/content/groups/account-id.md new file mode 100644 index 00000000..f7fdb884 --- /dev/null +++ b/docs/src/content/groups/account-id.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: account-id +slug: account-id +name: Account Id +description: Groups content and participants concerned with Account Id. +classification: ontology/topic/account-id +aliases: [] +status: active +--- + +# Account Id diff --git a/docs/src/content/groups/account-password.md b/docs/src/content/groups/account-password.md new file mode 100644 index 00000000..dbcaa258 --- /dev/null +++ b/docs/src/content/groups/account-password.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: account-password +slug: account-password +name: Account Password +description: Groups content and participants concerned with Account Password. +classification: ontology/topic/account-password +aliases: [] +status: active +--- + +# Account Password diff --git a/docs/src/content/groups/accounts.md b/docs/src/content/groups/accounts.md new file mode 100644 index 00000000..a68f7058 --- /dev/null +++ b/docs/src/content/groups/accounts.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: accounts +slug: accounts +name: Accounts +description: Groups content and participants concerned with Accounts. +classification: ontology/topic/accounts +aliases: [] +status: active +--- + +# Accounts diff --git a/docs/src/content/groups/actions.md b/docs/src/content/groups/actions.md new file mode 100644 index 00000000..4e56d5ed --- /dev/null +++ b/docs/src/content/groups/actions.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: actions +slug: actions +name: Actions +description: Groups content and participants concerned with Actions. +classification: ontology/topic/actions +aliases: [] +status: active +--- + +# Actions diff --git a/docs/src/content/groups/active-team.md b/docs/src/content/groups/active-team.md new file mode 100644 index 00000000..00dc1322 --- /dev/null +++ b/docs/src/content/groups/active-team.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: active-team +slug: active-team +name: Active Team +description: Groups content and participants concerned with Active Team. +classification: ontology/topic/active-team +aliases: [] +status: active +--- + +# Active Team diff --git a/docs/src/content/groups/activity.md b/docs/src/content/groups/activity.md new file mode 100644 index 00000000..06488278 --- /dev/null +++ b/docs/src/content/groups/activity.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: activity +slug: activity +name: Activity +description: Groups content and participants concerned with Activity. +classification: ontology/topic/activity +aliases: [] +status: active +--- + +# Activity diff --git a/docs/src/content/groups/actor.md b/docs/src/content/groups/actor.md new file mode 100644 index 00000000..641854c9 --- /dev/null +++ b/docs/src/content/groups/actor.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: actor +slug: actor +name: Actor +description: Groups content and participants concerned with Actor. +classification: ontology/topic/actor +aliases: [] +status: active +--- + +# Actor diff --git a/docs/src/content/groups/administration.md b/docs/src/content/groups/administration.md new file mode 100644 index 00000000..d31619da --- /dev/null +++ b/docs/src/content/groups/administration.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: administration +slug: administration +name: Administration +description: Groups content and participants concerned with Administration. +classification: ontology/topic/administration +aliases: [] +status: active +--- + +# Administration diff --git a/docs/src/content/groups/administrator-key.md b/docs/src/content/groups/administrator-key.md new file mode 100644 index 00000000..ee800765 --- /dev/null +++ b/docs/src/content/groups/administrator-key.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: administrator-key +slug: administrator-key +name: Administrator Key +description: Groups content and participants concerned with Administrator Key. +classification: ontology/topic/administrator-key +aliases: [] +status: active +--- + +# Administrator Key diff --git a/docs/src/content/groups/administrator.md b/docs/src/content/groups/administrator.md new file mode 100644 index 00000000..6d7ac013 --- /dev/null +++ b/docs/src/content/groups/administrator.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: administrator +slug: administrator +name: Administrator +description: Groups content and participants concerned with Administrator. +classification: ontology/topic/administrator +aliases: [] +status: active +--- + +# Administrator diff --git a/docs/src/content/groups/agent.md b/docs/src/content/groups/agent.md new file mode 100644 index 00000000..ad25c161 --- /dev/null +++ b/docs/src/content/groups/agent.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: agent +slug: agent +name: Agent +description: Groups content and participants concerned with Agent. +classification: ontology/topic/agent +aliases: [] +status: active +--- + +# Agent diff --git a/docs/src/content/groups/ai.md b/docs/src/content/groups/ai.md new file mode 100644 index 00000000..52c49d1d --- /dev/null +++ b/docs/src/content/groups/ai.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: ai +slug: ai +name: AI +description: Groups content and participants concerned with AI. +classification: ontology/topic/ai +aliases: [] +status: active +--- + +# AI diff --git a/docs/src/content/groups/api-token.md b/docs/src/content/groups/api-token.md new file mode 100644 index 00000000..6c7b75c0 --- /dev/null +++ b/docs/src/content/groups/api-token.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: api-token +slug: api-token +name: API Token +description: Groups content and participants concerned with API Token. +classification: ontology/topic/api-token +aliases: [] +status: active +--- + +# API Token diff --git a/docs/src/content/groups/appearance.md b/docs/src/content/groups/appearance.md new file mode 100644 index 00000000..47125e28 --- /dev/null +++ b/docs/src/content/groups/appearance.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: appearance +slug: appearance +name: Appearance +description: Groups content and participants concerned with Appearance. +classification: ontology/topic/appearance +aliases: [] +status: active +--- + +# Appearance diff --git a/docs/src/content/groups/architecture.md b/docs/src/content/groups/architecture.md new file mode 100644 index 00000000..a2907250 --- /dev/null +++ b/docs/src/content/groups/architecture.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: architecture +slug: architecture +name: Architecture +description: Groups content and participants concerned with Architecture. +classification: ontology/topic/architecture +aliases: [] +status: active +--- + +# Architecture diff --git a/docs/src/content/groups/archive.md b/docs/src/content/groups/archive.md new file mode 100644 index 00000000..8d0b5a1e --- /dev/null +++ b/docs/src/content/groups/archive.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: archive +slug: archive +name: Archive +description: Groups content and participants concerned with Archive. +classification: ontology/topic/archive +aliases: [] +status: active +--- + +# Archive diff --git a/docs/src/content/groups/archived.md b/docs/src/content/groups/archived.md new file mode 100644 index 00000000..27aa0b89 --- /dev/null +++ b/docs/src/content/groups/archived.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: archived +slug: archived +name: Archived +description: Groups content and participants concerned with Archived. +classification: ontology/topic/archived +aliases: [] +status: active +--- + +# Archived diff --git a/docs/src/content/groups/attachment.md b/docs/src/content/groups/attachment.md new file mode 100644 index 00000000..a88491a8 --- /dev/null +++ b/docs/src/content/groups/attachment.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: attachment +slug: attachment +name: Attachment +description: Groups content and participants concerned with Attachment. +classification: ontology/topic/attachment +aliases: [] +status: active +--- + +# Attachment diff --git a/docs/src/content/groups/audit.md b/docs/src/content/groups/audit.md new file mode 100644 index 00000000..af2a64ad --- /dev/null +++ b/docs/src/content/groups/audit.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: audit +slug: audit +name: Audit +description: Groups content and participants concerned with Audit. +classification: ontology/topic/audit +aliases: [] +status: active +--- + +# Audit diff --git a/docs/src/content/groups/authentication.md b/docs/src/content/groups/authentication.md new file mode 100644 index 00000000..084a7c14 --- /dev/null +++ b/docs/src/content/groups/authentication.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: authentication +slug: authentication +name: Authentication +description: Groups content and participants concerned with Authentication. +classification: ontology/topic/authentication +aliases: [] +status: active +--- + +# Authentication diff --git a/docs/src/content/groups/author.md b/docs/src/content/groups/author.md new file mode 100644 index 00000000..00c6e79e --- /dev/null +++ b/docs/src/content/groups/author.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: author +slug: author +name: Author +description: Groups content and participants concerned with Author. +classification: ontology/topic/author +aliases: [] +status: active +--- + +# Author diff --git a/docs/src/content/groups/authoring.md b/docs/src/content/groups/authoring.md new file mode 100644 index 00000000..6d38bf14 --- /dev/null +++ b/docs/src/content/groups/authoring.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: authoring +slug: authoring +name: Authoring +description: Groups content and participants concerned with Authoring. +classification: ontology/topic/authoring +aliases: [] +status: active +--- + +# Authoring diff --git a/docs/src/content/groups/binding.md b/docs/src/content/groups/binding.md new file mode 100644 index 00000000..46decfb4 --- /dev/null +++ b/docs/src/content/groups/binding.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: binding +slug: binding +name: Binding +description: Groups content and participants concerned with Binding. +classification: ontology/topic/binding +aliases: [] +status: active +--- + +# Binding diff --git a/docs/src/content/groups/blast-radius.md b/docs/src/content/groups/blast-radius.md new file mode 100644 index 00000000..357f6626 --- /dev/null +++ b/docs/src/content/groups/blast-radius.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: blast-radius +slug: blast-radius +name: Blast Radius +description: Groups content and participants concerned with Blast Radius. +classification: ontology/topic/blast-radius +aliases: [] +status: active +--- + +# Blast Radius diff --git a/docs/src/content/groups/blocker.md b/docs/src/content/groups/blocker.md new file mode 100644 index 00000000..c3dfce60 --- /dev/null +++ b/docs/src/content/groups/blocker.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: blocker +slug: blocker +name: Blocker +description: Groups content and participants concerned with Blocker. +classification: ontology/topic/blocker +aliases: [] +status: active +--- + +# Blocker diff --git a/docs/src/content/groups/blockers.md b/docs/src/content/groups/blockers.md new file mode 100644 index 00000000..6d68dfc3 --- /dev/null +++ b/docs/src/content/groups/blockers.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: blockers +slug: blockers +name: Blockers +description: Groups content and participants concerned with Blockers. +classification: ontology/topic/blockers +aliases: [] +status: active +--- + +# Blockers diff --git a/docs/src/content/groups/books.md b/docs/src/content/groups/books.md new file mode 100644 index 00000000..9e8ce38c --- /dev/null +++ b/docs/src/content/groups/books.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: books +slug: books +name: Books +description: Groups content and participants concerned with Books. +classification: ontology/topic/books +aliases: [] +status: active +--- + +# Books diff --git a/docs/src/content/groups/cadence.md b/docs/src/content/groups/cadence.md new file mode 100644 index 00000000..577b74b7 --- /dev/null +++ b/docs/src/content/groups/cadence.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: cadence +slug: cadence +name: Cadence +description: Groups content and participants concerned with Cadence. +classification: ontology/topic/cadence +aliases: [] +status: active +--- + +# Cadence diff --git a/docs/src/content/groups/capabilities.md b/docs/src/content/groups/capabilities.md new file mode 100644 index 00000000..bd07fa93 --- /dev/null +++ b/docs/src/content/groups/capabilities.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: capabilities +slug: capabilities +name: Capabilities +description: Groups content and participants concerned with Capabilities. +classification: ontology/topic/capabilities +aliases: [] +status: active +--- + +# Capabilities diff --git a/docs/src/content/groups/capability.md b/docs/src/content/groups/capability.md new file mode 100644 index 00000000..362154be --- /dev/null +++ b/docs/src/content/groups/capability.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: capability +slug: capability +name: Capability +description: Groups content and participants concerned with Capability. +classification: ontology/topic/capability +aliases: [] +status: active +--- + +# Capability diff --git a/docs/src/content/groups/capture.md b/docs/src/content/groups/capture.md new file mode 100644 index 00000000..6f074564 --- /dev/null +++ b/docs/src/content/groups/capture.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: capture +slug: capture +name: Capture +description: Groups content and participants concerned with Capture. +classification: ontology/topic/capture +aliases: [] +status: active +--- + +# Capture diff --git a/docs/src/content/groups/change.md b/docs/src/content/groups/change.md new file mode 100644 index 00000000..b88f44b1 --- /dev/null +++ b/docs/src/content/groups/change.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: change +slug: change +name: Change +description: Groups content and participants concerned with Change. +classification: ontology/topic/change +aliases: [] +status: active +--- + +# Change diff --git a/docs/src/content/groups/changes.md b/docs/src/content/groups/changes.md new file mode 100644 index 00000000..40456ac1 --- /dev/null +++ b/docs/src/content/groups/changes.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: changes +slug: changes +name: Changes +description: Groups content and participants concerned with Changes. +classification: ontology/topic/changes +aliases: [] +status: active +--- + +# Changes diff --git a/docs/src/content/groups/ciphertext.md b/docs/src/content/groups/ciphertext.md new file mode 100644 index 00000000..62cf3c2b --- /dev/null +++ b/docs/src/content/groups/ciphertext.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: ciphertext +slug: ciphertext +name: Ciphertext +description: Groups content and participants concerned with Ciphertext. +classification: ontology/topic/ciphertext +aliases: [] +status: active +--- + +# Ciphertext diff --git a/docs/src/content/groups/cloudflare.md b/docs/src/content/groups/cloudflare.md new file mode 100644 index 00000000..ad24657c --- /dev/null +++ b/docs/src/content/groups/cloudflare.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: cloudflare +slug: cloudflare +name: Cloudflare +description: Groups content and participants concerned with Cloudflare. +classification: ontology/topic/cloudflare +aliases: [] +status: active +--- + +# Cloudflare diff --git a/docs/src/content/groups/colors.md b/docs/src/content/groups/colors.md new file mode 100644 index 00000000..6d6fe68c --- /dev/null +++ b/docs/src/content/groups/colors.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: colors +slug: colors +name: Colors +description: Groups content and participants concerned with Colors. +classification: ontology/topic/colors +aliases: [] +status: active +--- + +# Colors diff --git a/docs/src/content/groups/compromise.md b/docs/src/content/groups/compromise.md new file mode 100644 index 00000000..719f03f5 --- /dev/null +++ b/docs/src/content/groups/compromise.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: compromise +slug: compromise +name: Compromise +description: Groups content and participants concerned with Compromise. +classification: ontology/topic/compromise +aliases: [] +status: active +--- + +# Compromise diff --git a/docs/src/content/groups/conflict.md b/docs/src/content/groups/conflict.md new file mode 100644 index 00000000..5118af63 --- /dev/null +++ b/docs/src/content/groups/conflict.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: conflict +slug: conflict +name: Conflict +description: Groups content and participants concerned with Conflict. +classification: ontology/topic/conflict +aliases: [] +status: active +--- + +# Conflict diff --git a/docs/src/content/groups/connect-service.md b/docs/src/content/groups/connect-service.md new file mode 100644 index 00000000..4509bcbe --- /dev/null +++ b/docs/src/content/groups/connect-service.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: connect-service +slug: connect-service +name: Connect Service +description: Groups content and participants concerned with Connect Service. +classification: ontology/topic/connect-service +aliases: [] +status: active +--- + +# Connect Service diff --git a/docs/src/content/groups/connection-settings.md b/docs/src/content/groups/connection-settings.md new file mode 100644 index 00000000..d1428c7f --- /dev/null +++ b/docs/src/content/groups/connection-settings.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: connection-settings +slug: connection-settings +name: Connection Settings +description: Groups content and participants concerned with Connection Settings. +classification: ontology/topic/connection-settings +aliases: [] +status: active +--- + +# Connection Settings diff --git a/docs/src/content/groups/connections.md b/docs/src/content/groups/connections.md new file mode 100644 index 00000000..a649d9ab --- /dev/null +++ b/docs/src/content/groups/connections.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: connections +slug: connections +name: Connections +description: Groups content and participants concerned with Connections. +classification: ontology/topic/connections +aliases: [] +status: active +--- + +# Connections diff --git a/docs/src/content/groups/contact.md b/docs/src/content/groups/contact.md new file mode 100644 index 00000000..27bafa6e --- /dev/null +++ b/docs/src/content/groups/contact.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: contact +slug: contact +name: Contact +description: Groups content and participants concerned with Contact. +classification: ontology/topic/contact +aliases: [] +status: active +--- + +# Contact diff --git a/docs/src/content/groups/content-fields.md b/docs/src/content/groups/content-fields.md new file mode 100644 index 00000000..f29a7455 --- /dev/null +++ b/docs/src/content/groups/content-fields.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: content-fields +slug: content-fields +name: Content Fields +description: Groups content and participants concerned with Content Fields. +classification: ontology/topic/content-fields +aliases: [] +status: active +--- + +# Content Fields diff --git a/docs/src/content/groups/content.md b/docs/src/content/groups/content.md new file mode 100644 index 00000000..09d9a3ea --- /dev/null +++ b/docs/src/content/groups/content.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: content +slug: content +name: Content +description: Groups content and participants concerned with Content. +classification: ontology/topic/content +aliases: [] +status: active +--- + +# Content diff --git a/docs/src/content/groups/context.md b/docs/src/content/groups/context.md new file mode 100644 index 00000000..469bd226 --- /dev/null +++ b/docs/src/content/groups/context.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: context +slug: context +name: Context +description: Groups content and participants concerned with Context. +classification: ontology/topic/context +aliases: [] +status: active +--- + +# Context diff --git a/docs/src/content/groups/contrast.md b/docs/src/content/groups/contrast.md new file mode 100644 index 00000000..779821b3 --- /dev/null +++ b/docs/src/content/groups/contrast.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: contrast +slug: contrast +name: Contrast +description: Groups content and participants concerned with Contrast. +classification: ontology/topic/contrast +aliases: [] +status: active +--- + +# Contrast diff --git a/docs/src/content/groups/contributor.md b/docs/src/content/groups/contributor.md new file mode 100644 index 00000000..d7eb146d --- /dev/null +++ b/docs/src/content/groups/contributor.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: contributor +slug: contributor +name: Contributor +description: Groups content and participants concerned with Contributor. +classification: ontology/topic/contributor +aliases: [] +status: active +--- + +# Contributor diff --git a/docs/src/content/groups/create-team.md b/docs/src/content/groups/create-team.md new file mode 100644 index 00000000..15ca0978 --- /dev/null +++ b/docs/src/content/groups/create-team.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: create-team +slug: create-team +name: Create Team +description: Groups content and participants concerned with Create Team. +classification: ontology/topic/create-team +aliases: [] +status: active +--- + +# Create Team diff --git a/docs/src/content/groups/credential.md b/docs/src/content/groups/credential.md new file mode 100644 index 00000000..00d04aaf --- /dev/null +++ b/docs/src/content/groups/credential.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: credential +slug: credential +name: Credential +description: Groups content and participants concerned with Credential. +classification: ontology/topic/credential +aliases: [] +status: active +--- + +# Credential diff --git a/docs/src/content/groups/credentials.md b/docs/src/content/groups/credentials.md new file mode 100644 index 00000000..def78cd3 --- /dev/null +++ b/docs/src/content/groups/credentials.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: credentials +slug: credentials +name: Credentials +description: Groups content and participants concerned with Credentials. +classification: ontology/topic/credentials +aliases: [] +status: active +--- + +# Credentials diff --git a/docs/src/content/groups/dark-mode.md b/docs/src/content/groups/dark-mode.md new file mode 100644 index 00000000..7cb68f99 --- /dev/null +++ b/docs/src/content/groups/dark-mode.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: dark-mode +slug: dark-mode +name: Dark Mode +description: Groups content and participants concerned with Dark Mode. +classification: ontology/topic/dark-mode +aliases: [] +status: active +--- + +# Dark Mode diff --git a/docs/src/content/groups/date.md b/docs/src/content/groups/date.md new file mode 100644 index 00000000..6f82ea90 --- /dev/null +++ b/docs/src/content/groups/date.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: date +slug: date +name: Date +description: Groups content and participants concerned with Date. +classification: ontology/topic/date +aliases: [] +status: active +--- + +# Date diff --git a/docs/src/content/groups/delete-account.md b/docs/src/content/groups/delete-account.md new file mode 100644 index 00000000..85dc3dd1 --- /dev/null +++ b/docs/src/content/groups/delete-account.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: delete-account +slug: delete-account +name: Delete Account +description: Groups content and participants concerned with Delete Account. +classification: ontology/topic/delete-account +aliases: [] +status: active +--- + +# Delete Account diff --git a/docs/src/content/groups/delete-team.md b/docs/src/content/groups/delete-team.md new file mode 100644 index 00000000..57304286 --- /dev/null +++ b/docs/src/content/groups/delete-team.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: delete-team +slug: delete-team +name: Delete Team +description: Groups content and participants concerned with Delete Team. +classification: ontology/topic/delete-team +aliases: [] +status: active +--- + +# Delete Team diff --git a/docs/src/content/groups/delete.md b/docs/src/content/groups/delete.md new file mode 100644 index 00000000..3563b53e --- /dev/null +++ b/docs/src/content/groups/delete.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: delete +slug: delete +name: Delete +description: Groups content and participants concerned with Delete. +classification: ontology/topic/delete +aliases: [] +status: active +--- + +# Delete diff --git a/docs/src/content/groups/devices.md b/docs/src/content/groups/devices.md new file mode 100644 index 00000000..a419073f --- /dev/null +++ b/docs/src/content/groups/devices.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: devices +slug: devices +name: Devices +description: Groups content and participants concerned with Devices. +classification: ontology/topic/devices +aliases: [] +status: active +--- + +# Devices diff --git a/docs/src/content/groups/directory.md b/docs/src/content/groups/directory.md new file mode 100644 index 00000000..ea44a39b --- /dev/null +++ b/docs/src/content/groups/directory.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: directory +slug: directory +name: Directory +description: Groups content and participants concerned with Directory. +classification: ontology/topic/directory +aliases: [] +status: active +--- + +# Directory diff --git a/docs/src/content/groups/discard-credentials.md b/docs/src/content/groups/discard-credentials.md new file mode 100644 index 00000000..9360b3dc --- /dev/null +++ b/docs/src/content/groups/discard-credentials.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: discard-credentials +slug: discard-credentials +name: Discard Credentials +description: Groups content and participants concerned with Discard Credentials. +classification: ontology/topic/discard-credentials +aliases: [] +status: active +--- + +# Discard Credentials diff --git a/docs/src/content/groups/disconnect.md b/docs/src/content/groups/disconnect.md new file mode 100644 index 00000000..2c22fbb0 --- /dev/null +++ b/docs/src/content/groups/disconnect.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: disconnect +slug: disconnect +name: Disconnect +description: Groups content and participants concerned with Disconnect. +classification: ontology/topic/disconnect +aliases: [] +status: active +--- + +# Disconnect diff --git a/docs/src/content/groups/dns.md b/docs/src/content/groups/dns.md new file mode 100644 index 00000000..7b0f1af0 --- /dev/null +++ b/docs/src/content/groups/dns.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: dns +slug: dns +name: Dns +description: Groups content and participants concerned with Dns. +classification: ontology/topic/dns +aliases: [] +status: active +--- + +# Dns diff --git a/docs/src/content/groups/email-mismatch.md b/docs/src/content/groups/email-mismatch.md new file mode 100644 index 00000000..5e8aefda --- /dev/null +++ b/docs/src/content/groups/email-mismatch.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: email-mismatch +slug: email-mismatch +name: Email Mismatch +description: Groups content and participants concerned with Email Mismatch. +classification: ontology/topic/email-mismatch +aliases: [] +status: active +--- + +# Email Mismatch diff --git a/docs/src/content/groups/email.md b/docs/src/content/groups/email.md new file mode 100644 index 00000000..290d072a --- /dev/null +++ b/docs/src/content/groups/email.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: email +slug: email +name: Email +description: Groups content and participants concerned with Email. +classification: ontology/topic/email +aliases: [] +status: active +--- + +# Email diff --git a/docs/src/content/groups/encryption.md b/docs/src/content/groups/encryption.md new file mode 100644 index 00000000..e26240c1 --- /dev/null +++ b/docs/src/content/groups/encryption.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: encryption +slug: encryption +name: Encryption +description: Groups content and participants concerned with Encryption. +classification: ontology/topic/encryption +aliases: [] +status: active +--- + +# Encryption diff --git a/docs/src/content/groups/engineering-team.md b/docs/src/content/groups/engineering-team.md new file mode 100644 index 00000000..fcc642ad --- /dev/null +++ b/docs/src/content/groups/engineering-team.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: engineering-team +slug: engineering-team +name: Engineering Team +description: Groups content and participants concerned with Engineering Team. +classification: ontology/topic/engineering-team +aliases: [] +status: active +--- + +# Engineering Team diff --git a/docs/src/content/groups/engineering.md b/docs/src/content/groups/engineering.md new file mode 100644 index 00000000..0326db16 --- /dev/null +++ b/docs/src/content/groups/engineering.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: engineering +slug: engineering +name: Engineering +description: Groups content and participants concerned with Engineering. +classification: ontology/topic/engineering +aliases: [] +status: active +--- + +# Engineering diff --git a/docs/src/content/groups/envelope.md b/docs/src/content/groups/envelope.md new file mode 100644 index 00000000..3670f049 --- /dev/null +++ b/docs/src/content/groups/envelope.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: envelope +slug: envelope +name: Envelope +description: Groups content and participants concerned with Envelope. +classification: ontology/topic/envelope +aliases: [] +status: active +--- + +# Envelope diff --git a/docs/src/content/groups/expiry.md b/docs/src/content/groups/expiry.md new file mode 100644 index 00000000..ddcfbe3b --- /dev/null +++ b/docs/src/content/groups/expiry.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: expiry +slug: expiry +name: Expiry +description: Groups content and participants concerned with Expiry. +classification: ontology/topic/expiry +aliases: [] +status: active +--- + +# Expiry diff --git a/docs/src/content/groups/export.md b/docs/src/content/groups/export.md new file mode 100644 index 00000000..c56eb158 --- /dev/null +++ b/docs/src/content/groups/export.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: export +slug: export +name: Export +description: Groups content and participants concerned with Export. +classification: ontology/topic/export +aliases: [] +status: active +--- + +# Export diff --git a/docs/src/content/groups/feedback.md b/docs/src/content/groups/feedback.md new file mode 100644 index 00000000..d6860b8c --- /dev/null +++ b/docs/src/content/groups/feedback.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: feedback +slug: feedback +name: Feedback +description: Groups content and participants concerned with Feedback. +classification: ontology/topic/feedback +aliases: [] +status: active +--- + +# Feedback diff --git a/docs/src/content/groups/filter.md b/docs/src/content/groups/filter.md new file mode 100644 index 00000000..eae98ab9 --- /dev/null +++ b/docs/src/content/groups/filter.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: filter +slug: filter +name: Filter +description: Groups content and participants concerned with Filter. +classification: ontology/topic/filter +aliases: [] +status: active +--- + +# Filter diff --git a/docs/src/content/groups/forgotten-passphrase.md b/docs/src/content/groups/forgotten-passphrase.md new file mode 100644 index 00000000..26abc660 --- /dev/null +++ b/docs/src/content/groups/forgotten-passphrase.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: forgotten-passphrase +slug: forgotten-passphrase +name: Forgotten Passphrase +description: Groups content and participants concerned with Forgotten Passphrase. +classification: ontology/topic/forgotten-passphrase +aliases: [] +status: active +--- + +# Forgotten Passphrase diff --git a/docs/src/content/groups/github-app.md b/docs/src/content/groups/github-app.md new file mode 100644 index 00000000..29da0b19 --- /dev/null +++ b/docs/src/content/groups/github-app.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: github-app +slug: github-app +name: Github App +description: Groups content and participants concerned with Github App. +classification: ontology/topic/github-app +aliases: [] +status: active +--- + +# Github App diff --git a/docs/src/content/groups/github.md b/docs/src/content/groups/github.md new file mode 100644 index 00000000..53824fb1 --- /dev/null +++ b/docs/src/content/groups/github.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: github +slug: github +name: Github +description: Groups content and participants concerned with Github. +classification: ontology/topic/github +aliases: [] +status: active +--- + +# Github diff --git a/docs/src/content/groups/google.md b/docs/src/content/groups/google.md new file mode 100644 index 00000000..b30357e0 --- /dev/null +++ b/docs/src/content/groups/google.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: google +slug: google +name: Google +description: Groups content and participants concerned with Google. +classification: ontology/topic/google +aliases: [] +status: active +--- + +# Google diff --git a/docs/src/content/groups/grant.md b/docs/src/content/groups/grant.md new file mode 100644 index 00000000..7a89cfc2 --- /dev/null +++ b/docs/src/content/groups/grant.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: grant +slug: grant +name: Grant +description: Groups content and participants concerned with Grant. +classification: ontology/topic/grant +aliases: [] +status: active +--- + +# Grant diff --git a/docs/src/content/groups/hashicorp-vault.md b/docs/src/content/groups/hashicorp-vault.md new file mode 100644 index 00000000..2cff7d13 --- /dev/null +++ b/docs/src/content/groups/hashicorp-vault.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: hashicorp-vault +slug: hashicorp-vault +name: Hashicorp Vault +description: Groups content and participants concerned with Hashicorp Vault. +classification: ontology/topic/hashicorp-vault +aliases: [] +status: active +--- + +# Hashicorp Vault diff --git a/docs/src/content/groups/history.md b/docs/src/content/groups/history.md new file mode 100644 index 00000000..c39aa408 --- /dev/null +++ b/docs/src/content/groups/history.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: history +slug: history +name: History +description: Groups content and participants concerned with History. +classification: ontology/topic/history +aliases: [] +status: active +--- + +# History diff --git a/docs/src/content/groups/hosting.md b/docs/src/content/groups/hosting.md new file mode 100644 index 00000000..ab89316c --- /dev/null +++ b/docs/src/content/groups/hosting.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: hosting +slug: hosting +name: Hosting +description: Groups content and participants concerned with Hosting. +classification: ontology/topic/hosting +aliases: [] +status: active +--- + +# Hosting diff --git a/docs/src/content/groups/iana.md b/docs/src/content/groups/iana.md new file mode 100644 index 00000000..109af046 --- /dev/null +++ b/docs/src/content/groups/iana.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: iana +slug: iana +name: Iana +description: Groups content and participants concerned with Iana. +classification: ontology/topic/iana +aliases: [] +status: active +--- + +# Iana diff --git a/docs/src/content/groups/identity.md b/docs/src/content/groups/identity.md new file mode 100644 index 00000000..2970934f --- /dev/null +++ b/docs/src/content/groups/identity.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: identity +slug: identity +name: Identity +description: Groups content and participants concerned with Identity. +classification: ontology/topic/identity +aliases: [] +status: active +--- + +# Identity diff --git a/docs/src/content/groups/in-progress.md b/docs/src/content/groups/in-progress.md new file mode 100644 index 00000000..b33f53bd --- /dev/null +++ b/docs/src/content/groups/in-progress.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: in-progress +slug: in-progress +name: In Progress +description: Groups content and participants concerned with In Progress. +classification: ontology/topic/in-progress +aliases: [] +status: active +--- + +# In Progress diff --git a/docs/src/content/groups/installation.md b/docs/src/content/groups/installation.md new file mode 100644 index 00000000..00cb00ba --- /dev/null +++ b/docs/src/content/groups/installation.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: installation +slug: installation +name: Installation +description: Groups content and participants concerned with Installation. +classification: ontology/topic/installation +aliases: [] +status: active +--- + +# Installation diff --git a/docs/src/content/groups/invitation.md b/docs/src/content/groups/invitation.md new file mode 100644 index 00000000..c3d944ed --- /dev/null +++ b/docs/src/content/groups/invitation.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: invitation +slug: invitation +name: Invitation +description: Groups content and participants concerned with Invitation. +classification: ontology/topic/invitation +aliases: [] +status: active +--- + +# Invitation diff --git a/docs/src/content/groups/ip-address.md b/docs/src/content/groups/ip-address.md new file mode 100644 index 00000000..ea8d152d --- /dev/null +++ b/docs/src/content/groups/ip-address.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: ip-address +slug: ip-address +name: Ip Address +description: Groups content and participants concerned with Ip Address. +classification: ontology/topic/ip-address +aliases: [] +status: active +--- + +# Ip Address diff --git a/docs/src/content/groups/irreversible.md b/docs/src/content/groups/irreversible.md new file mode 100644 index 00000000..9ecd3003 --- /dev/null +++ b/docs/src/content/groups/irreversible.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: irreversible +slug: irreversible +name: Irreversible +description: Groups content and participants concerned with Irreversible. +classification: ontology/topic/irreversible +aliases: [] +status: active +--- + +# Irreversible diff --git a/docs/src/content/groups/issue.md b/docs/src/content/groups/issue.md new file mode 100644 index 00000000..0a9a620e --- /dev/null +++ b/docs/src/content/groups/issue.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: issue +slug: issue +name: Issue +description: Groups content and participants concerned with Issue. +classification: ontology/topic/issue +aliases: [] +status: active +--- + +# Issue diff --git a/docs/src/content/groups/jsonl.md b/docs/src/content/groups/jsonl.md new file mode 100644 index 00000000..38054a96 --- /dev/null +++ b/docs/src/content/groups/jsonl.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: jsonl +slug: jsonl +name: Jsonl +description: Groups content and participants concerned with Jsonl. +classification: ontology/topic/jsonl +aliases: [] +status: active +--- + +# Jsonl diff --git a/docs/src/content/groups/jwt.md b/docs/src/content/groups/jwt.md new file mode 100644 index 00000000..32968f3f --- /dev/null +++ b/docs/src/content/groups/jwt.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: jwt +slug: jwt +name: Jwt +description: Groups content and participants concerned with Jwt. +classification: ontology/topic/jwt +aliases: [] +status: active +--- + +# Jwt diff --git a/docs/src/content/groups/key-wrapping.md b/docs/src/content/groups/key-wrapping.md new file mode 100644 index 00000000..ee232781 --- /dev/null +++ b/docs/src/content/groups/key-wrapping.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: key-wrapping +slug: key-wrapping +name: Key Wrapping +description: Groups content and participants concerned with Key Wrapping. +classification: ontology/topic/key-wrapping +aliases: [] +status: active +--- + +# Key Wrapping diff --git a/docs/src/content/groups/knowledge.md b/docs/src/content/groups/knowledge.md new file mode 100644 index 00000000..7b6fac6d --- /dev/null +++ b/docs/src/content/groups/knowledge.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: knowledge +slug: knowledge +name: Knowledge +description: Groups content and participants concerned with Knowledge. +classification: ontology/topic/knowledge +aliases: [] +status: active +--- + +# Knowledge diff --git a/docs/src/content/groups/last-owner.md b/docs/src/content/groups/last-owner.md new file mode 100644 index 00000000..7d0461df --- /dev/null +++ b/docs/src/content/groups/last-owner.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: last-owner +slug: last-owner +name: Last Owner +description: Groups content and participants concerned with Last Owner. +classification: ontology/topic/last-owner +aliases: [] +status: active +--- + +# Last Owner diff --git a/docs/src/content/groups/lead.md b/docs/src/content/groups/lead.md new file mode 100644 index 00000000..3da9a212 --- /dev/null +++ b/docs/src/content/groups/lead.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: lead +slug: lead +name: Lead +description: Groups content and participants concerned with Lead. +classification: ontology/topic/lead +aliases: [] +status: active +--- + +# Lead diff --git a/docs/src/content/groups/lease.md b/docs/src/content/groups/lease.md new file mode 100644 index 00000000..fd649899 --- /dev/null +++ b/docs/src/content/groups/lease.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: lease +slug: lease +name: Lease +description: Groups content and participants concerned with Lease. +classification: ontology/topic/lease +aliases: [] +status: active +--- + +# Lease diff --git a/docs/src/content/groups/leave.md b/docs/src/content/groups/leave.md new file mode 100644 index 00000000..a14fcd29 --- /dev/null +++ b/docs/src/content/groups/leave.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: leave +slug: leave +name: Leave +description: Groups content and participants concerned with Leave. +classification: ontology/topic/leave +aliases: [] +status: active +--- + +# Leave diff --git a/docs/src/content/groups/lost-access.md b/docs/src/content/groups/lost-access.md new file mode 100644 index 00000000..9832ce27 --- /dev/null +++ b/docs/src/content/groups/lost-access.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: lost-access +slug: lost-access +name: Lost Access +description: Groups content and participants concerned with Lost Access. +classification: ontology/topic/lost-access +aliases: [] +status: active +--- + +# Lost Access diff --git a/docs/src/content/groups/member.md b/docs/src/content/groups/member.md new file mode 100644 index 00000000..b914c594 --- /dev/null +++ b/docs/src/content/groups/member.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: member +slug: member +name: Member +description: Groups content and participants concerned with Member. +classification: ontology/topic/member +aliases: [] +status: active +--- + +# Member diff --git a/docs/src/content/groups/members.md b/docs/src/content/groups/members.md new file mode 100644 index 00000000..7a2a15bc --- /dev/null +++ b/docs/src/content/groups/members.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: members +slug: members +name: Members +description: Groups content and participants concerned with Members. +classification: ontology/topic/members +aliases: [] +status: active +--- + +# Members diff --git a/docs/src/content/groups/membership.md b/docs/src/content/groups/membership.md new file mode 100644 index 00000000..5657a1dd --- /dev/null +++ b/docs/src/content/groups/membership.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: membership +slug: membership +name: Membership +description: Groups content and participants concerned with Membership. +classification: ontology/topic/membership +aliases: [] +status: active +--- + +# Membership diff --git a/docs/src/content/groups/metadata.md b/docs/src/content/groups/metadata.md new file mode 100644 index 00000000..c9820b17 --- /dev/null +++ b/docs/src/content/groups/metadata.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: metadata +slug: metadata +name: Metadata +description: Groups content and participants concerned with Metadata. +classification: ontology/topic/metadata +aliases: [] +status: active +--- + +# Metadata diff --git a/docs/src/content/groups/name.md b/docs/src/content/groups/name.md new file mode 100644 index 00000000..9a9d3798 --- /dev/null +++ b/docs/src/content/groups/name.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: name +slug: name +name: Name +description: Groups content and participants concerned with Name. +classification: ontology/topic/name +aliases: [] +status: active +--- + +# Name diff --git a/docs/src/content/groups/notes.md b/docs/src/content/groups/notes.md new file mode 100644 index 00000000..d5e6a2f8 --- /dev/null +++ b/docs/src/content/groups/notes.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: notes +slug: notes +name: Notes +description: Groups content and participants concerned with Notes. +classification: ontology/topic/notes +aliases: [] +status: active +--- + +# Notes diff --git a/docs/src/content/groups/notifications.md b/docs/src/content/groups/notifications.md new file mode 100644 index 00000000..77fb2705 --- /dev/null +++ b/docs/src/content/groups/notifications.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: notifications +slug: notifications +name: Notifications +description: Groups content and participants concerned with Notifications. +classification: ontology/topic/notifications +aliases: [] +status: active +--- + +# Notifications diff --git a/docs/src/content/groups/oidc.md b/docs/src/content/groups/oidc.md new file mode 100644 index 00000000..f3f4b52a --- /dev/null +++ b/docs/src/content/groups/oidc.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: oidc +slug: oidc +name: Oidc +description: Groups content and participants concerned with Oidc. +classification: ontology/topic/oidc +aliases: [] +status: active +--- + +# Oidc diff --git a/docs/src/content/groups/openbao.md b/docs/src/content/groups/openbao.md new file mode 100644 index 00000000..853c3013 --- /dev/null +++ b/docs/src/content/groups/openbao.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: openbao +slug: openbao +name: Openbao +description: Groups content and participants concerned with Openbao. +classification: ontology/topic/openbao +aliases: [] +status: active +--- + +# Openbao diff --git a/docs/src/content/groups/organization.md b/docs/src/content/groups/organization.md new file mode 100644 index 00000000..d37fae8e --- /dev/null +++ b/docs/src/content/groups/organization.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: organization +slug: organization +name: Organization +description: Groups content and participants concerned with Organization. +classification: ontology/topic/organization +aliases: [] +status: active +--- + +# Organization diff --git a/docs/src/content/groups/overrides.md b/docs/src/content/groups/overrides.md new file mode 100644 index 00000000..21d24ffa --- /dev/null +++ b/docs/src/content/groups/overrides.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: overrides +slug: overrides +name: Overrides +description: Groups content and participants concerned with Overrides. +classification: ontology/topic/overrides +aliases: [] +status: active +--- + +# Overrides diff --git a/docs/src/content/groups/owner.md b/docs/src/content/groups/owner.md new file mode 100644 index 00000000..87116e58 --- /dev/null +++ b/docs/src/content/groups/owner.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: owner +slug: owner +name: Owner +description: Groups content and participants concerned with Owner. +classification: ontology/topic/owner +aliases: [] +status: active +--- + +# Owner diff --git a/docs/src/content/groups/ownership.md b/docs/src/content/groups/ownership.md new file mode 100644 index 00000000..1e3aedc3 --- /dev/null +++ b/docs/src/content/groups/ownership.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: ownership +slug: ownership +name: Ownership +description: Groups content and participants concerned with Ownership. +classification: ontology/topic/ownership +aliases: [] +status: active +--- + +# Ownership diff --git a/docs/src/content/groups/pages.md b/docs/src/content/groups/pages.md new file mode 100644 index 00000000..bba03b94 --- /dev/null +++ b/docs/src/content/groups/pages.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: pages +slug: pages +name: Pages +description: Groups content and participants concerned with Pages. +classification: ontology/topic/pages +aliases: [] +status: active +--- + +# Pages diff --git a/docs/src/content/groups/pagination.md b/docs/src/content/groups/pagination.md new file mode 100644 index 00000000..ec176a5c --- /dev/null +++ b/docs/src/content/groups/pagination.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: pagination +slug: pagination +name: Pagination +description: Groups content and participants concerned with Pagination. +classification: ontology/topic/pagination +aliases: [] +status: active +--- + +# Pagination diff --git a/docs/src/content/groups/passphrase.md b/docs/src/content/groups/passphrase.md new file mode 100644 index 00000000..0da6d01c --- /dev/null +++ b/docs/src/content/groups/passphrase.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: passphrase +slug: passphrase +name: Passphrase +description: Groups content and participants concerned with Passphrase. +classification: ontology/topic/passphrase +aliases: [] +status: active +--- + +# Passphrase diff --git a/docs/src/content/groups/password.md b/docs/src/content/groups/password.md new file mode 100644 index 00000000..e73d9031 --- /dev/null +++ b/docs/src/content/groups/password.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: password +slug: password +name: Password +description: Groups content and participants concerned with Password. +classification: ontology/topic/password +aliases: [] +status: active +--- + +# Password diff --git a/docs/src/content/groups/permission.md b/docs/src/content/groups/permission.md new file mode 100644 index 00000000..f4187bdb --- /dev/null +++ b/docs/src/content/groups/permission.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: permission +slug: permission +name: Permission +description: Groups content and participants concerned with Permission. +classification: ontology/topic/permission +aliases: [] +status: active +--- + +# Permission diff --git a/docs/src/content/groups/permissions.md b/docs/src/content/groups/permissions.md new file mode 100644 index 00000000..d9bc8197 --- /dev/null +++ b/docs/src/content/groups/permissions.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: permissions +slug: permissions +name: Permissions +description: Groups content and participants concerned with Permissions. +classification: ontology/topic/permissions +aliases: [] +status: active +--- + +# Permissions diff --git a/docs/src/content/groups/personal-passphrase.md b/docs/src/content/groups/personal-passphrase.md new file mode 100644 index 00000000..a7de6150 --- /dev/null +++ b/docs/src/content/groups/personal-passphrase.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: personal-passphrase +slug: personal-passphrase +name: Personal Passphrase +description: Groups content and participants concerned with Personal Passphrase. +classification: ontology/topic/personal-passphrase +aliases: [] +status: active +--- + +# Personal Passphrase diff --git a/docs/src/content/groups/platform-admin.md b/docs/src/content/groups/platform-admin.md new file mode 100644 index 00000000..5f8e8532 --- /dev/null +++ b/docs/src/content/groups/platform-admin.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: platform-admin +slug: platform-admin +name: Platform Admin +description: Groups content and participants concerned with Platform Admin. +classification: ontology/topic/platform-admin +aliases: [] +status: active +--- + +# Platform Admin diff --git a/docs/src/content/groups/primary.md b/docs/src/content/groups/primary.md new file mode 100644 index 00000000..dad97890 --- /dev/null +++ b/docs/src/content/groups/primary.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: primary +slug: primary +name: Primary +description: Groups content and participants concerned with Primary. +classification: ontology/topic/primary +aliases: [] +status: active +--- + +# Primary diff --git a/docs/src/content/groups/privacy.md b/docs/src/content/groups/privacy.md new file mode 100644 index 00000000..dcb84433 --- /dev/null +++ b/docs/src/content/groups/privacy.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: privacy +slug: privacy +name: Privacy +description: Groups content and participants concerned with Privacy. +classification: ontology/topic/privacy +aliases: [] +status: active +--- + +# Privacy diff --git a/docs/src/content/groups/private.md b/docs/src/content/groups/private.md new file mode 100644 index 00000000..7f71dccf --- /dev/null +++ b/docs/src/content/groups/private.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: private +slug: private +name: Private +description: Groups content and participants concerned with Private. +classification: ontology/topic/private +aliases: [] +status: active +--- + +# Private diff --git a/docs/src/content/groups/profile.md b/docs/src/content/groups/profile.md new file mode 100644 index 00000000..98645d89 --- /dev/null +++ b/docs/src/content/groups/profile.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: profile +slug: profile +name: Profile +description: Groups content and participants concerned with Profile. +classification: ontology/topic/profile +aliases: [] +status: active +--- + +# Profile diff --git a/docs/src/content/groups/projects.md b/docs/src/content/groups/projects.md new file mode 100644 index 00000000..00eeec83 --- /dev/null +++ b/docs/src/content/groups/projects.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: projects +slug: projects +name: Projects +description: Groups content and participants concerned with Projects. +classification: ontology/topic/projects +aliases: [] +status: active +--- + +# Projects diff --git a/docs/src/content/groups/provenance.md b/docs/src/content/groups/provenance.md new file mode 100644 index 00000000..2d118c84 --- /dev/null +++ b/docs/src/content/groups/provenance.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: provenance +slug: provenance +name: Provenance +description: Groups content and participants concerned with Provenance. +classification: ontology/topic/provenance +aliases: [] +status: active +--- + +# Provenance diff --git a/docs/src/content/groups/provider.md b/docs/src/content/groups/provider.md new file mode 100644 index 00000000..546f19cf --- /dev/null +++ b/docs/src/content/groups/provider.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: provider +slug: provider +name: Provider +description: Groups content and participants concerned with Provider. +classification: ontology/topic/provider +aliases: [] +status: active +--- + +# Provider diff --git a/docs/src/content/groups/providers.md b/docs/src/content/groups/providers.md new file mode 100644 index 00000000..965ff139 --- /dev/null +++ b/docs/src/content/groups/providers.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: providers +slug: providers +name: Providers +description: Groups content and participants concerned with Providers. +classification: ontology/topic/providers +aliases: [] +status: active +--- + +# Providers diff --git a/docs/src/content/groups/public-profile.md b/docs/src/content/groups/public-profile.md new file mode 100644 index 00000000..97592f5c --- /dev/null +++ b/docs/src/content/groups/public-profile.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: public-profile +slug: public-profile +name: Public Profile +description: Groups content and participants concerned with Public Profile. +classification: ontology/topic/public-profile +aliases: [] +status: active +--- + +# Public Profile diff --git a/docs/src/content/groups/public.md b/docs/src/content/groups/public.md new file mode 100644 index 00000000..43d41bd3 --- /dev/null +++ b/docs/src/content/groups/public.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: public +slug: public +name: Public +description: Groups content and participants concerned with Public. +classification: ontology/topic/public +aliases: [] +status: active +--- + +# Public diff --git a/docs/src/content/groups/publication.md b/docs/src/content/groups/publication.md new file mode 100644 index 00000000..79a24099 --- /dev/null +++ b/docs/src/content/groups/publication.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: publication +slug: publication +name: Publication +description: Groups content and participants concerned with Publication. +classification: ontology/topic/publication +aliases: [] +status: active +--- + +# Publication diff --git a/docs/src/content/groups/r2.md b/docs/src/content/groups/r2.md new file mode 100644 index 00000000..f39a8a6b --- /dev/null +++ b/docs/src/content/groups/r2.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: r2 +slug: r2 +name: R2 +description: Groups content and participants concerned with R2. +classification: ontology/topic/r2 +aliases: [] +status: active +--- + +# R2 diff --git a/docs/src/content/groups/railway.md b/docs/src/content/groups/railway.md new file mode 100644 index 00000000..71f98f8f --- /dev/null +++ b/docs/src/content/groups/railway.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: railway +slug: railway +name: Railway +description: Groups content and participants concerned with Railway. +classification: ontology/topic/railway +aliases: [] +status: active +--- + +# Railway diff --git a/docs/src/content/groups/read-only.md b/docs/src/content/groups/read-only.md new file mode 100644 index 00000000..68ef399e --- /dev/null +++ b/docs/src/content/groups/read-only.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: read-only +slug: read-only +name: Read Only +description: Groups content and participants concerned with Read Only. +classification: ontology/topic/read-only +aliases: [] +status: active +--- + +# Read Only diff --git a/docs/src/content/groups/reauthentication.md b/docs/src/content/groups/reauthentication.md new file mode 100644 index 00000000..de76b7d8 --- /dev/null +++ b/docs/src/content/groups/reauthentication.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: reauthentication +slug: reauthentication +name: Reauthentication +description: Groups content and participants concerned with Reauthentication. +classification: ontology/topic/reauthentication +aliases: [] +status: active +--- + +# Reauthentication diff --git a/docs/src/content/groups/recovery.md b/docs/src/content/groups/recovery.md new file mode 100644 index 00000000..feb43539 --- /dev/null +++ b/docs/src/content/groups/recovery.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: recovery +slug: recovery +name: Recovery +description: Groups content and participants concerned with Recovery. +classification: ontology/topic/recovery +aliases: [] +status: active +--- + +# Recovery diff --git a/docs/src/content/groups/redact.md b/docs/src/content/groups/redact.md new file mode 100644 index 00000000..99ccb585 --- /dev/null +++ b/docs/src/content/groups/redact.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: redact +slug: redact +name: Redact +description: Groups content and participants concerned with Redact. +classification: ontology/topic/redact +aliases: [] +status: active +--- + +# Redact diff --git a/docs/src/content/groups/release.md b/docs/src/content/groups/release.md new file mode 100644 index 00000000..3ed8b151 --- /dev/null +++ b/docs/src/content/groups/release.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: release +slug: release +name: Release +description: Groups content and participants concerned with Release. +classification: ontology/topic/release +aliases: [] +status: active +--- + +# Release diff --git a/docs/src/content/groups/remove.md b/docs/src/content/groups/remove.md new file mode 100644 index 00000000..5f7ced6b --- /dev/null +++ b/docs/src/content/groups/remove.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: remove +slug: remove +name: Remove +description: Groups content and participants concerned with Remove. +classification: ontology/topic/remove +aliases: [] +status: active +--- + +# Remove diff --git a/docs/src/content/groups/reopen.md b/docs/src/content/groups/reopen.md new file mode 100644 index 00000000..5c71a7af --- /dev/null +++ b/docs/src/content/groups/reopen.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: reopen +slug: reopen +name: Reopen +description: Groups content and participants concerned with Reopen. +classification: ontology/topic/reopen +aliases: [] +status: active +--- + +# Reopen diff --git a/docs/src/content/groups/report.md b/docs/src/content/groups/report.md new file mode 100644 index 00000000..9d205028 --- /dev/null +++ b/docs/src/content/groups/report.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: report +slug: report +name: Report +description: Groups content and participants concerned with Report. +classification: ontology/topic/report +aliases: [] +status: active +--- + +# Report diff --git a/docs/src/content/groups/reporting.md b/docs/src/content/groups/reporting.md new file mode 100644 index 00000000..686ae2a6 --- /dev/null +++ b/docs/src/content/groups/reporting.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: reporting +slug: reporting +name: Reporting +description: Groups content and participants concerned with Reporting. +classification: ontology/topic/reporting +aliases: [] +status: active +--- + +# Reporting diff --git a/docs/src/content/groups/repositories.md b/docs/src/content/groups/repositories.md new file mode 100644 index 00000000..2cd7b020 --- /dev/null +++ b/docs/src/content/groups/repositories.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: repositories +slug: repositories +name: Repositories +description: Groups content and participants concerned with Repositories. +classification: ontology/topic/repositories +aliases: [] +status: active +--- + +# Repositories diff --git a/docs/src/content/groups/repository.md b/docs/src/content/groups/repository.md new file mode 100644 index 00000000..7fd795d0 --- /dev/null +++ b/docs/src/content/groups/repository.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: repository +slug: repository +name: Repository +description: Groups content and participants concerned with Repository. +classification: ontology/topic/repository +aliases: [] +status: active +--- + +# Repository diff --git a/docs/src/content/groups/research.md b/docs/src/content/groups/research.md new file mode 100644 index 00000000..6ccd4203 --- /dev/null +++ b/docs/src/content/groups/research.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: research +slug: research +name: Research +description: Groups content and participants concerned with Research. +classification: ontology/topic/research +aliases: [] +status: active +--- + +# Research diff --git a/docs/src/content/groups/resend.md b/docs/src/content/groups/resend.md new file mode 100644 index 00000000..0a38c732 --- /dev/null +++ b/docs/src/content/groups/resend.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: resend +slug: resend +name: Resend +description: Groups content and participants concerned with Resend. +classification: ontology/topic/resend +aliases: [] +status: active +--- + +# Resend diff --git a/docs/src/content/groups/reset-vault.md b/docs/src/content/groups/reset-vault.md new file mode 100644 index 00000000..604279ee --- /dev/null +++ b/docs/src/content/groups/reset-vault.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: reset-vault +slug: reset-vault +name: Reset Vault +description: Groups content and participants concerned with Reset Vault. +classification: ontology/topic/reset-vault +aliases: [] +status: active +--- + +# Reset Vault diff --git a/docs/src/content/groups/resolve.md b/docs/src/content/groups/resolve.md new file mode 100644 index 00000000..aac5e043 --- /dev/null +++ b/docs/src/content/groups/resolve.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: resolve +slug: resolve +name: Resolve +description: Groups content and participants concerned with Resolve. +classification: ontology/topic/resolve +aliases: [] +status: active +--- + +# Resolve diff --git a/docs/src/content/groups/restore.md b/docs/src/content/groups/restore.md new file mode 100644 index 00000000..cd8dffdc --- /dev/null +++ b/docs/src/content/groups/restore.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: restore +slug: restore +name: Restore +description: Groups content and participants concerned with Restore. +classification: ontology/topic/restore +aliases: [] +status: active +--- + +# Restore diff --git a/docs/src/content/groups/retention.md b/docs/src/content/groups/retention.md new file mode 100644 index 00000000..f3d7d368 --- /dev/null +++ b/docs/src/content/groups/retention.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: retention +slug: retention +name: Retention +description: Groups content and participants concerned with Retention. +classification: ontology/topic/retention +aliases: [] +status: active +--- + +# Retention diff --git a/docs/src/content/groups/review.md b/docs/src/content/groups/review.md new file mode 100644 index 00000000..415e6b3e --- /dev/null +++ b/docs/src/content/groups/review.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: review +slug: review +name: Review +description: Groups content and participants concerned with Review. +classification: ontology/topic/review +aliases: [] +status: active +--- + +# Review diff --git a/docs/src/content/groups/revoke.md b/docs/src/content/groups/revoke.md new file mode 100644 index 00000000..69ebca20 --- /dev/null +++ b/docs/src/content/groups/revoke.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: revoke +slug: revoke +name: Revoke +description: Groups content and participants concerned with Revoke. +classification: ontology/topic/revoke +aliases: [] +status: active +--- + +# Revoke diff --git a/docs/src/content/groups/role.md b/docs/src/content/groups/role.md new file mode 100644 index 00000000..59a50b2c --- /dev/null +++ b/docs/src/content/groups/role.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: role +slug: role +name: Role +description: Groups content and participants concerned with Role. +classification: ontology/topic/role +aliases: [] +status: active +--- + +# Role diff --git a/docs/src/content/groups/roles.md b/docs/src/content/groups/roles.md new file mode 100644 index 00000000..ca3707d6 --- /dev/null +++ b/docs/src/content/groups/roles.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: roles +slug: roles +name: Roles +description: Groups content and participants concerned with Roles. +classification: ontology/topic/roles +aliases: [] +status: active +--- + +# Roles diff --git a/docs/src/content/groups/rotate-passphrase.md b/docs/src/content/groups/rotate-passphrase.md new file mode 100644 index 00000000..9311b46f --- /dev/null +++ b/docs/src/content/groups/rotate-passphrase.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: rotate-passphrase +slug: rotate-passphrase +name: Rotate Passphrase +description: Groups content and participants concerned with Rotate Passphrase. +classification: ontology/topic/rotate-passphrase +aliases: [] +status: active +--- + +# Rotate Passphrase diff --git a/docs/src/content/groups/rotate-team-key.md b/docs/src/content/groups/rotate-team-key.md new file mode 100644 index 00000000..ae3c5eba --- /dev/null +++ b/docs/src/content/groups/rotate-team-key.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: rotate-team-key +slug: rotate-team-key +name: Rotate Team Key +description: Groups content and participants concerned with Rotate Team Key. +classification: ontology/topic/rotate-team-key +aliases: [] +status: active +--- + +# Rotate Team Key diff --git a/docs/src/content/groups/rotate-token.md b/docs/src/content/groups/rotate-token.md new file mode 100644 index 00000000..b3c4e5e0 --- /dev/null +++ b/docs/src/content/groups/rotate-token.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: rotate-token +slug: rotate-token +name: Rotate Token +description: Groups content and participants concerned with Rotate Token. +classification: ontology/topic/rotate-token +aliases: [] +status: active +--- + +# Rotate Token diff --git a/docs/src/content/groups/rotation.md b/docs/src/content/groups/rotation.md new file mode 100644 index 00000000..ffd80252 --- /dev/null +++ b/docs/src/content/groups/rotation.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: rotation +slug: rotation +name: Rotation +description: Groups content and participants concerned with Rotation. +classification: ontology/topic/rotation +aliases: [] +status: active +--- + +# Rotation diff --git a/docs/src/content/groups/same-passphrase.md b/docs/src/content/groups/same-passphrase.md new file mode 100644 index 00000000..2b1a2a1e --- /dev/null +++ b/docs/src/content/groups/same-passphrase.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: same-passphrase +slug: same-passphrase +name: Same Passphrase +description: Groups content and participants concerned with Same Passphrase. +classification: ontology/topic/same-passphrase +aliases: [] +status: active +--- + +# Same Passphrase diff --git a/docs/src/content/groups/screenshot.md b/docs/src/content/groups/screenshot.md new file mode 100644 index 00000000..31477f95 --- /dev/null +++ b/docs/src/content/groups/screenshot.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: screenshot +slug: screenshot +name: Screenshot +description: Groups content and participants concerned with Screenshot. +classification: ontology/topic/screenshot +aliases: [] +status: active +--- + +# Screenshot diff --git a/docs/src/content/groups/search.md b/docs/src/content/groups/search.md new file mode 100644 index 00000000..43a7c011 --- /dev/null +++ b/docs/src/content/groups/search.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: search +slug: search +name: Search +description: Groups content and participants concerned with Search. +classification: ontology/topic/search +aliases: [] +status: active +--- + +# Search diff --git a/docs/src/content/groups/secrets.md b/docs/src/content/groups/secrets.md new file mode 100644 index 00000000..5a9cef5f --- /dev/null +++ b/docs/src/content/groups/secrets.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: secrets +slug: secrets +name: Secrets +description: Groups content and participants concerned with Secrets. +classification: ontology/topic/secrets +aliases: [] +status: active +--- + +# Secrets diff --git a/docs/src/content/groups/security.md b/docs/src/content/groups/security.md new file mode 100644 index 00000000..e06bbe54 --- /dev/null +++ b/docs/src/content/groups/security.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: security +slug: security +name: Security +description: Groups content and participants concerned with Security. +classification: ontology/topic/security +aliases: [] +status: active +--- + +# Security diff --git a/docs/src/content/groups/service-vault.md b/docs/src/content/groups/service-vault.md new file mode 100644 index 00000000..dcba9fed --- /dev/null +++ b/docs/src/content/groups/service-vault.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: service-vault +slug: service-vault +name: Service Vault +description: Groups content and participants concerned with Service Vault. +classification: ontology/topic/service-vault +aliases: [] +status: active +--- + +# Service Vault diff --git a/docs/src/content/groups/services.md b/docs/src/content/groups/services.md new file mode 100644 index 00000000..2dce4e25 --- /dev/null +++ b/docs/src/content/groups/services.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: services +slug: services +name: Services +description: Groups content and participants concerned with Services. +classification: ontology/topic/services +aliases: [] +status: active +--- + +# Services diff --git a/docs/src/content/groups/sessions.md b/docs/src/content/groups/sessions.md new file mode 100644 index 00000000..f6541e7e --- /dev/null +++ b/docs/src/content/groups/sessions.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: sessions +slug: sessions +name: Sessions +description: Groups content and participants concerned with Sessions. +classification: ontology/topic/sessions +aliases: [] +status: active +--- + +# Sessions diff --git a/docs/src/content/groups/settings.md b/docs/src/content/groups/settings.md new file mode 100644 index 00000000..9579c4aa --- /dev/null +++ b/docs/src/content/groups/settings.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: settings +slug: settings +name: Settings +description: Groups content and participants concerned with Settings. +classification: ontology/topic/settings +aliases: [] +status: active +--- + +# Settings diff --git a/docs/src/content/groups/sign-in.md b/docs/src/content/groups/sign-in.md new file mode 100644 index 00000000..0762a69a --- /dev/null +++ b/docs/src/content/groups/sign-in.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: sign-in +slug: sign-in +name: Sign In +description: Groups content and participants concerned with Sign In. +classification: ontology/topic/sign-in +aliases: [] +status: active +--- + +# Sign In diff --git a/docs/src/content/groups/sign-out.md b/docs/src/content/groups/sign-out.md new file mode 100644 index 00000000..b71620c7 --- /dev/null +++ b/docs/src/content/groups/sign-out.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: sign-out +slug: sign-out +name: Sign Out +description: Groups content and participants concerned with Sign Out. +classification: ontology/topic/sign-out +aliases: [] +status: active +--- + +# Sign Out diff --git a/docs/src/content/groups/slug.md b/docs/src/content/groups/slug.md new file mode 100644 index 00000000..19fb8df2 --- /dev/null +++ b/docs/src/content/groups/slug.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: slug +slug: slug +name: Slug +description: Groups content and participants concerned with Slug. +classification: ontology/topic/slug +aliases: [] +status: active +--- + +# Slug diff --git a/docs/src/content/groups/sole-administrator.md b/docs/src/content/groups/sole-administrator.md new file mode 100644 index 00000000..5831c09a --- /dev/null +++ b/docs/src/content/groups/sole-administrator.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: sole-administrator +slug: sole-administrator +name: Sole Administrator +description: Groups content and participants concerned with Sole Administrator. +classification: ontology/topic/sole-administrator +aliases: [] +status: active +--- + +# Sole Administrator diff --git a/docs/src/content/groups/status.md b/docs/src/content/groups/status.md new file mode 100644 index 00000000..2494cc35 --- /dev/null +++ b/docs/src/content/groups/status.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: status +slug: status +name: Status +description: Groups content and participants concerned with Status. +classification: ontology/topic/status +aliases: [] +status: active +--- + +# Status diff --git a/docs/src/content/groups/step-1.md b/docs/src/content/groups/step-1.md new file mode 100644 index 00000000..e84ed20d --- /dev/null +++ b/docs/src/content/groups/step-1.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: step-1 +slug: step-1 +name: Step 1 +description: Groups content and participants concerned with Step 1. +classification: ontology/topic/step-1 +aliases: [] +status: active +--- + +# Step 1 diff --git a/docs/src/content/groups/step-2.md b/docs/src/content/groups/step-2.md new file mode 100644 index 00000000..62140346 --- /dev/null +++ b/docs/src/content/groups/step-2.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: step-2 +slug: step-2 +name: Step 2 +description: Groups content and participants concerned with Step 2. +classification: ontology/topic/step-2 +aliases: [] +status: active +--- + +# Step 2 diff --git a/docs/src/content/groups/step-3.md b/docs/src/content/groups/step-3.md new file mode 100644 index 00000000..d8e63e59 --- /dev/null +++ b/docs/src/content/groups/step-3.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: step-3 +slug: step-3 +name: Step 3 +description: Groups content and participants concerned with Step 3. +classification: ontology/topic/step-3 +aliases: [] +status: active +--- + +# Step 3 diff --git a/docs/src/content/groups/suggestion.md b/docs/src/content/groups/suggestion.md new file mode 100644 index 00000000..a6d52a5d --- /dev/null +++ b/docs/src/content/groups/suggestion.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: suggestion +slug: suggestion +name: Suggestion +description: Groups content and participants concerned with Suggestion. +classification: ontology/topic/suggestion +aliases: [] +status: active +--- + +# Suggestion diff --git a/docs/src/content/groups/support.md b/docs/src/content/groups/support.md new file mode 100644 index 00000000..545f6ad0 --- /dev/null +++ b/docs/src/content/groups/support.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: support +slug: support +name: Support +description: Groups content and participants concerned with Support. +classification: ontology/topic/support +aliases: [] +status: active +--- + +# Support diff --git a/docs/src/content/groups/switch.md b/docs/src/content/groups/switch.md new file mode 100644 index 00000000..ca5a4e7f --- /dev/null +++ b/docs/src/content/groups/switch.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: switch +slug: switch +name: Switch +description: Groups content and participants concerned with Switch. +classification: ontology/topic/switch +aliases: [] +status: active +--- + +# Switch diff --git a/docs/src/content/groups/team-key.md b/docs/src/content/groups/team-key.md new file mode 100644 index 00000000..42d824b3 --- /dev/null +++ b/docs/src/content/groups/team-key.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: team-key +slug: team-key +name: Team Key +description: Groups content and participants concerned with Team Key. +classification: ontology/topic/team-key +aliases: [] +status: active +--- + +# Team Key diff --git a/docs/src/content/groups/team-overview.md b/docs/src/content/groups/team-overview.md new file mode 100644 index 00000000..887c8c57 --- /dev/null +++ b/docs/src/content/groups/team-overview.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: team-overview +slug: team-overview +name: Team Overview +description: Groups content and participants concerned with Team Overview. +classification: ontology/topic/team-overview +aliases: [] +status: active +--- + +# Team Overview diff --git a/docs/src/content/groups/team-settings.md b/docs/src/content/groups/team-settings.md new file mode 100644 index 00000000..8e7dea4e --- /dev/null +++ b/docs/src/content/groups/team-settings.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: team-settings +slug: team-settings +name: Team Settings +description: Groups content and participants concerned with Team Settings. +classification: ontology/topic/team-settings +aliases: [] +status: active +--- + +# Team Settings diff --git a/docs/src/content/groups/team-vault-key.md b/docs/src/content/groups/team-vault-key.md new file mode 100644 index 00000000..36916bdf --- /dev/null +++ b/docs/src/content/groups/team-vault-key.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: team-vault-key +slug: team-vault-key +name: Team Vault Key +description: Groups content and participants concerned with Team Vault Key. +classification: ontology/topic/team-vault-key +aliases: [] +status: active +--- + +# Team Vault Key diff --git a/docs/src/content/groups/teams.md b/docs/src/content/groups/teams.md new file mode 100644 index 00000000..20c06eeb --- /dev/null +++ b/docs/src/content/groups/teams.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: teams +slug: teams +name: Teams +description: Groups content and participants concerned with Teams. +classification: ontology/topic/teams +aliases: [] +status: active +--- + +# Teams diff --git a/docs/src/content/groups/technical-writing.md b/docs/src/content/groups/technical-writing.md new file mode 100644 index 00000000..3af5b3b1 --- /dev/null +++ b/docs/src/content/groups/technical-writing.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: technical-writing +slug: technical-writing +name: Technical Writing +description: Groups content and participants concerned with Technical Writing. +classification: ontology/topic/technical-writing +aliases: [] +status: active +--- + +# Technical Writing diff --git a/docs/src/content/groups/testing.md b/docs/src/content/groups/testing.md new file mode 100644 index 00000000..7c8e1df9 --- /dev/null +++ b/docs/src/content/groups/testing.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: testing +slug: testing +name: Testing +description: Groups content and participants concerned with Testing. +classification: ontology/topic/testing +aliases: [] +status: active +--- + +# Testing diff --git a/docs/src/content/groups/theme.md b/docs/src/content/groups/theme.md new file mode 100644 index 00000000..f68828cb --- /dev/null +++ b/docs/src/content/groups/theme.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: theme +slug: theme +name: Theme +description: Groups content and participants concerned with Theme. +classification: ontology/topic/theme +aliases: [] +status: active +--- + +# Theme diff --git a/docs/src/content/groups/time-zone.md b/docs/src/content/groups/time-zone.md new file mode 100644 index 00000000..3edfe578 --- /dev/null +++ b/docs/src/content/groups/time-zone.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: time-zone +slug: time-zone +name: Time Zone +description: Groups content and participants concerned with Time Zone. +classification: ontology/topic/time-zone +aliases: [] +status: active +--- + +# Time Zone diff --git a/docs/src/content/groups/timestamp.md b/docs/src/content/groups/timestamp.md new file mode 100644 index 00000000..93fbd2f5 --- /dev/null +++ b/docs/src/content/groups/timestamp.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: timestamp +slug: timestamp +name: Timestamp +description: Groups content and participants concerned with Timestamp. +classification: ontology/topic/timestamp +aliases: [] +status: active +--- + +# Timestamp diff --git a/docs/src/content/groups/timezone.md b/docs/src/content/groups/timezone.md new file mode 100644 index 00000000..56b4296e --- /dev/null +++ b/docs/src/content/groups/timezone.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: timezone +slug: timezone +name: Timezone +description: Groups content and participants concerned with Timezone. +classification: ontology/topic/timezone +aliases: [] +status: active +--- + +# Timezone diff --git a/docs/src/content/groups/title.md b/docs/src/content/groups/title.md new file mode 100644 index 00000000..e67441d7 --- /dev/null +++ b/docs/src/content/groups/title.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: title +slug: title +name: Title +description: Groups content and participants concerned with Title. +classification: ontology/topic/title +aliases: [] +status: active +--- + +# Title diff --git a/docs/src/content/groups/token.md b/docs/src/content/groups/token.md new file mode 100644 index 00000000..09d0a48f --- /dev/null +++ b/docs/src/content/groups/token.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: token +slug: token +name: Token +description: Groups content and participants concerned with Token. +classification: ontology/topic/token +aliases: [] +status: active +--- + +# Token diff --git a/docs/src/content/groups/traceability.md b/docs/src/content/groups/traceability.md new file mode 100644 index 00000000..8e2ea843 --- /dev/null +++ b/docs/src/content/groups/traceability.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: traceability +slug: traceability +name: Traceability +description: Groups content and participants concerned with Traceability. +classification: ontology/topic/traceability +aliases: [] +status: active +--- + +# Traceability diff --git a/docs/src/content/groups/transfer.md b/docs/src/content/groups/transfer.md new file mode 100644 index 00000000..91bde550 --- /dev/null +++ b/docs/src/content/groups/transfer.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: transfer +slug: transfer +name: Transfer +description: Groups content and participants concerned with Transfer. +classification: ontology/topic/transfer +aliases: [] +status: active +--- + +# Transfer diff --git a/docs/src/content/groups/triage.md b/docs/src/content/groups/triage.md new file mode 100644 index 00000000..aecd2a86 --- /dev/null +++ b/docs/src/content/groups/triage.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: triage +slug: triage +name: Triage +description: Groups content and participants concerned with Triage. +classification: ontology/topic/triage +aliases: [] +status: active +--- + +# Triage diff --git a/docs/src/content/groups/username.md b/docs/src/content/groups/username.md new file mode 100644 index 00000000..d45d826a --- /dev/null +++ b/docs/src/content/groups/username.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: username +slug: username +name: Username +description: Groups content and participants concerned with Username. +classification: ontology/topic/username +aliases: [] +status: active +--- + +# Username diff --git a/docs/src/content/groups/validation.md b/docs/src/content/groups/validation.md new file mode 100644 index 00000000..8be0f0aa --- /dev/null +++ b/docs/src/content/groups/validation.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: validation +slug: validation +name: Validation +description: Groups content and participants concerned with Validation. +classification: ontology/topic/validation +aliases: [] +status: active +--- + +# Validation diff --git a/docs/src/content/groups/vault.md b/docs/src/content/groups/vault.md new file mode 100644 index 00000000..5f30097f --- /dev/null +++ b/docs/src/content/groups/vault.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: vault +slug: vault +name: Vault +description: Groups content and participants concerned with Vault. +classification: ontology/topic/vault +aliases: [] +status: active +--- + +# Vault diff --git a/docs/src/content/groups/verification.md b/docs/src/content/groups/verification.md new file mode 100644 index 00000000..47757a5f --- /dev/null +++ b/docs/src/content/groups/verification.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: verification +slug: verification +name: Verification +description: Groups content and participants concerned with Verification. +classification: ontology/topic/verification +aliases: [] +status: active +--- + +# Verification diff --git a/docs/src/content/groups/viewer.md b/docs/src/content/groups/viewer.md new file mode 100644 index 00000000..67813305 --- /dev/null +++ b/docs/src/content/groups/viewer.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: viewer +slug: viewer +name: Viewer +description: Groups content and participants concerned with Viewer. +classification: ontology/topic/viewer +aliases: [] +status: active +--- + +# Viewer diff --git a/docs/src/content/groups/visibility.md b/docs/src/content/groups/visibility.md new file mode 100644 index 00000000..21297ada --- /dev/null +++ b/docs/src/content/groups/visibility.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: visibility +slug: visibility +name: Visibility +description: Groups content and participants concerned with Visibility. +classification: ontology/topic/visibility +aliases: [] +status: active +--- + +# Visibility diff --git a/docs/src/content/groups/workers.md b/docs/src/content/groups/workers.md new file mode 100644 index 00000000..0eebaf8b --- /dev/null +++ b/docs/src/content/groups/workers.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: workers +slug: workers +name: Workers +description: Groups content and participants concerned with Workers. +classification: ontology/topic/workers +aliases: [] +status: active +--- + +# Workers diff --git a/docs/src/content/groups/workflow.md b/docs/src/content/groups/workflow.md new file mode 100644 index 00000000..f4cd11ae --- /dev/null +++ b/docs/src/content/groups/workflow.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: workflow +slug: workflow +name: Workflow +description: Groups content and participants concerned with Workflow. +classification: ontology/topic/workflow +aliases: [] +status: active +--- + +# Workflow diff --git a/docs/src/content/groups/workload-identity.md b/docs/src/content/groups/workload-identity.md new file mode 100644 index 00000000..dd38588a --- /dev/null +++ b/docs/src/content/groups/workload-identity.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: workload-identity +slug: workload-identity +name: Workload Identity +description: Groups content and participants concerned with Workload Identity. +classification: ontology/topic/workload-identity +aliases: [] +status: active +--- + +# Workload Identity diff --git a/docs/src/content/groups/workspace.md b/docs/src/content/groups/workspace.md new file mode 100644 index 00000000..9a32d8e3 --- /dev/null +++ b/docs/src/content/groups/workspace.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: workspace +slug: workspace +name: Workspace +description: Groups content and participants concerned with Workspace. +classification: ontology/topic/workspace +aliases: [] +status: active +--- + +# Workspace diff --git a/docs/src/content/groups/wrapped-team-key.md b/docs/src/content/groups/wrapped-team-key.md new file mode 100644 index 00000000..dca4e2dc --- /dev/null +++ b/docs/src/content/groups/wrapped-team-key.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: wrapped-team-key +slug: wrapped-team-key +name: Wrapped Team Key +description: Groups content and participants concerned with Wrapped Team Key. +classification: ontology/topic/wrapped-team-key +aliases: [] +status: active +--- + +# Wrapped Team Key diff --git a/docs/src/content/groups/zero-knowledge.md b/docs/src/content/groups/zero-knowledge.md new file mode 100644 index 00000000..6d826c80 --- /dev/null +++ b/docs/src/content/groups/zero-knowledge.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: zero-knowledge +slug: zero-knowledge +name: Zero Knowledge +description: Groups content and participants concerned with Zero Knowledge. +classification: ontology/topic/zero-knowledge +aliases: [] +status: active +--- + +# Zero Knowledge diff --git a/docs/src/content/groups/zip.md b/docs/src/content/groups/zip.md new file mode 100644 index 00000000..def17979 --- /dev/null +++ b/docs/src/content/groups/zip.md @@ -0,0 +1,12 @@ +--- +contract: treeseed.group/v1 +id: zip +slug: zip +name: Zip +description: Groups content and participants concerned with Zip. +classification: ontology/topic/zip +aliases: [] +status: active +--- + +# Zip diff --git a/docs/src/content/knowledge/treeseed-accounts-and-identity/appearance.md b/docs/src/content/knowledge/treeseed-accounts-and-identity/appearance.md index 92f1645e..9f599527 100644 --- a/docs/src/content/knowledge/treeseed-accounts-and-identity/appearance.md +++ b/docs/src/content/knowledge/treeseed-accounts-and-identity/appearance.md @@ -8,12 +8,12 @@ summary: Create personal themes and choose the active appearance safely. status: published visibility: authenticated order: 10 -tags: - - theme +groupIds: - appearance - colors - - dark mode - contrast + - dark-mode + - theme contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-accounts-and-identity/connected-identities.md b/docs/src/content/knowledge/treeseed-accounts-and-identity/connected-identities.md index 2f28696c..1f91015a 100644 --- a/docs/src/content/knowledge/treeseed-accounts-and-identity/connected-identities.md +++ b/docs/src/content/knowledge/treeseed-accounts-and-identity/connected-identities.md @@ -9,12 +9,12 @@ summary: Understand how external sign-in providers attach to your account and status: published visibility: authenticated order: 20 -tags: - - provider - - sign-in - - identity +groupIds: - github - google + - identity + - provider + - sign-in contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-accounts-and-identity/deletion.md b/docs/src/content/knowledge/treeseed-accounts-and-identity/deletion.md index d88822e6..69d0f147 100644 --- a/docs/src/content/knowledge/treeseed-accounts-and-identity/deletion.md +++ b/docs/src/content/knowledge/treeseed-accounts-and-identity/deletion.md @@ -9,11 +9,11 @@ summary: Understand blockers, reauthentication, confirmation, and the access status: published visibility: authenticated order: 30 -tags: - - delete account +groupIds: - blockers - - reauthentication + - delete-account - irreversible + - reauthentication contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-accounts-and-identity/emails.md b/docs/src/content/knowledge/treeseed-accounts-and-identity/emails.md index 940cc970..0bad9f91 100644 --- a/docs/src/content/knowledge/treeseed-accounts-and-identity/emails.md +++ b/docs/src/content/knowledge/treeseed-accounts-and-identity/emails.md @@ -9,11 +9,11 @@ summary: Add, verify, promote, and remove account email addresses without status: published visibility: authenticated order: 40 -tags: +groupIds: - email - - verification - primary - recovery + - verification contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-accounts-and-identity/identity.md b/docs/src/content/knowledge/treeseed-accounts-and-identity/identity.md index 367d6813..dd6989d9 100644 --- a/docs/src/content/knowledge/treeseed-accounts-and-identity/identity.md +++ b/docs/src/content/knowledge/treeseed-accounts-and-identity/identity.md @@ -9,12 +9,12 @@ summary: Understand which identity details are public, permanent, or used only status: published visibility: authenticated order: 50 -tags: - - profile - - username +groupIds: - email - - timezone - identity + - profile + - timezone + - username contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-accounts-and-identity/notifications.md b/docs/src/content/knowledge/treeseed-accounts-and-identity/notifications.md index 21fe9836..9d7592ac 100644 --- a/docs/src/content/knowledge/treeseed-accounts-and-identity/notifications.md +++ b/docs/src/content/knowledge/treeseed-accounts-and-identity/notifications.md @@ -8,12 +8,12 @@ summary: Set a default notification policy and replace it only for selected proj status: published visibility: authenticated order: 60 -tags: +groupIds: + - cadence + - email - notifications - - projects - overrides - - email - - cadence + - projects contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-accounts-and-identity/project-overrides.md b/docs/src/content/knowledge/treeseed-accounts-and-identity/project-overrides.md index 76214a68..1a329b37 100644 --- a/docs/src/content/knowledge/treeseed-accounts-and-identity/project-overrides.md +++ b/docs/src/content/knowledge/treeseed-accounts-and-identity/project-overrides.md @@ -9,11 +9,11 @@ summary: Replace the all-project notification choices for selected projects status: published visibility: authenticated order: 70 -tags: +groupIds: + - content - notifications - - projects - overrides - - content + - projects contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-accounts-and-identity/security.md b/docs/src/content/knowledge/treeseed-accounts-and-identity/security.md index 8055168c..82210425 100644 --- a/docs/src/content/knowledge/treeseed-accounts-and-identity/security.md +++ b/docs/src/content/knowledge/treeseed-accounts-and-identity/security.md @@ -9,12 +9,12 @@ summary: Manage account sign-in methods without weakening recovery or exposing status: published visibility: authenticated order: 80 -tags: +groupIds: + - email - password - provider - - email - - verification - security + - verification contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-accounts-and-identity/sessions.md b/docs/src/content/knowledge/treeseed-accounts-and-identity/sessions.md index 5a485e5b..bad71585 100644 --- a/docs/src/content/knowledge/treeseed-accounts-and-identity/sessions.md +++ b/docs/src/content/knowledge/treeseed-accounts-and-identity/sessions.md @@ -9,12 +9,12 @@ summary: Review signed-in devices, timestamps, network addresses, and safe status: published visibility: authenticated order: 90 -tags: - - sessions +groupIds: - devices + - ip-address - revoke - - ip address - - sign out + - sessions + - sign-out contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-accounts-and-identity/time-zone.md b/docs/src/content/knowledge/treeseed-accounts-and-identity/time-zone.md index 04c81cef..79ec9347 100644 --- a/docs/src/content/knowledge/treeseed-accounts-and-identity/time-zone.md +++ b/docs/src/content/knowledge/treeseed-accounts-and-identity/time-zone.md @@ -9,12 +9,12 @@ summary: Choose the IANA time zone used to format dates and times throughout status: published visibility: authenticated order: 100 -tags: - - timezone - - time zone +groupIds: - date + - iana + - time-zone - timestamp - - IANA + - timezone contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-credential-security/grants.md b/docs/src/content/knowledge/treeseed-credential-security/grants.md index cf18c542..8c9e67d2 100644 --- a/docs/src/content/knowledge/treeseed-credential-security/grants.md +++ b/docs/src/content/knowledge/treeseed-credential-security/grants.md @@ -9,11 +9,11 @@ summary: Give another administrator cryptographic access without sharing status: published visibility: authenticated order: 10 -tags: +groupIds: + - administrator - grant - revoke - - administrator - - wrapped team key + - wrapped-team-key contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-credential-security/overview.md b/docs/src/content/knowledge/treeseed-credential-security/overview.md index 4948a1f1..76664e8f 100644 --- a/docs/src/content/knowledge/treeseed-credential-security/overview.md +++ b/docs/src/content/knowledge/treeseed-credential-security/overview.md @@ -9,12 +9,12 @@ summary: Understand personal keys, team custody, encrypted credentials, and the status: published visibility: authenticated order: 20 -tags: - - service vault - - passphrase +groupIds: - encryption - - team key - - zero knowledge + - passphrase + - service-vault + - team-key + - zero-knowledge contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-credential-security/personal-key.md b/docs/src/content/knowledge/treeseed-credential-security/personal-key.md index 0c15ddb3..7406e6ac 100644 --- a/docs/src/content/knowledge/treeseed-credential-security/personal-key.md +++ b/docs/src/content/knowledge/treeseed-credential-security/personal-key.md @@ -9,11 +9,11 @@ summary: Create an administrator key protected by a personal passphrase that is status: published visibility: authenticated order: 30 -tags: - - step 1 - - personal passphrase - - administrator key - - account password +groupIds: + - account-password + - administrator-key + - personal-passphrase + - step-1 contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-credential-security/provider-credential-rotation.md b/docs/src/content/knowledge/treeseed-credential-security/provider-credential-rotation.md index 049472a4..ed8d854c 100644 --- a/docs/src/content/knowledge/treeseed-credential-security/provider-credential-rotation.md +++ b/docs/src/content/knowledge/treeseed-credential-security/provider-credential-rotation.md @@ -9,12 +9,12 @@ summary: Replace a token at its provider and then encrypt the replacement status: published visibility: team order: 40 -tags: +groupIds: + - compromise - credential - - token - - rotation - revoke - - compromise + - rotation + - token contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-credential-security/recovery.md b/docs/src/content/knowledge/treeseed-credential-security/recovery.md index 241708a4..e0736f27 100644 --- a/docs/src/content/knowledge/treeseed-credential-security/recovery.md +++ b/docs/src/content/knowledge/treeseed-credential-security/recovery.md @@ -9,11 +9,11 @@ summary: Know when another administrator can restore access and when protected status: published visibility: authenticated order: 50 -tags: - - step 3 +groupIds: + - forgotten-passphrase - recovery - - forgotten passphrase - - sole administrator + - sole-administrator + - step-3 contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-credential-security/reset.md b/docs/src/content/knowledge/treeseed-credential-security/reset.md index da62b1c7..f1f79578 100644 --- a/docs/src/content/knowledge/treeseed-credential-security/reset.md +++ b/docs/src/content/knowledge/treeseed-credential-security/reset.md @@ -9,11 +9,11 @@ summary: Permanently discard inaccessible encrypted credentials and initialize status: published visibility: authenticated order: 60 -tags: - - reset vault - - discard credentials +groupIds: + - discard-credentials - irreversible - reauthentication + - reset-vault contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-credential-security/rotation.md b/docs/src/content/knowledge/treeseed-credential-security/rotation.md index af14be44..ce07435a 100644 --- a/docs/src/content/knowledge/treeseed-credential-security/rotation.md +++ b/docs/src/content/knowledge/treeseed-credential-security/rotation.md @@ -8,10 +8,10 @@ summary: Choose the rotation that matches the material that may be exposed. status: published visibility: authenticated order: 70 -tags: - - rotate passphrase - - rotate team key - - rotate token +groupIds: + - rotate-passphrase + - rotate-team-key + - rotate-token contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-credential-security/team-custody.md b/docs/src/content/knowledge/treeseed-credential-security/team-custody.md index 5626004e..7ea5a04f 100644 --- a/docs/src/content/knowledge/treeseed-credential-security/team-custody.md +++ b/docs/src/content/knowledge/treeseed-credential-security/team-custody.md @@ -9,11 +9,11 @@ summary: Reuse the step-1 passphrase to unlock your key and wrap a new random status: published visibility: authenticated order: 80 -tags: - - step 2 - - same passphrase - - team vault key - - key wrapping +groupIds: + - key-wrapping + - same-passphrase + - step-2 + - team-vault-key contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-feedback-and-support/administration.md b/docs/src/content/knowledge/treeseed-feedback-and-support/administration.md index 9680d208..7a40314b 100644 --- a/docs/src/content/knowledge/treeseed-feedback-and-support/administration.md +++ b/docs/src/content/knowledge/treeseed-feedback-and-support/administration.md @@ -9,12 +9,12 @@ summary: Search, filter, investigate, and export feedback without exposing status: published visibility: admin order: 20 -tags: - - feedback +groupIds: - administration - - search + - feedback - filter - - platform admin + - platform-admin + - search contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-feedback-and-support/exports.md b/docs/src/content/knowledge/treeseed-feedback-and-support/exports.md index 62efc2c7..20d021b4 100644 --- a/docs/src/content/knowledge/treeseed-feedback-and-support/exports.md +++ b/docs/src/content/knowledge/treeseed-feedback-and-support/exports.md @@ -8,13 +8,13 @@ summary: Prepare bounded feedback bundles for human review and AI-assisted remed status: published visibility: admin order: 30 -tags: +groupIds: + - ai - export - - AI - - JSONL - - ZIP + - jsonl - privacy - provenance + - zip contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-feedback-and-support/fields.md b/docs/src/content/knowledge/treeseed-feedback-and-support/fields.md index 14a2187c..06723dc9 100644 --- a/docs/src/content/knowledge/treeseed-feedback-and-support/fields.md +++ b/docs/src/content/knowledge/treeseed-feedback-and-support/fields.md @@ -9,12 +9,12 @@ summary: Understand the stable identity, workflow, attribution, and Markdown status: published visibility: authenticated order: 10 -tags: - - title +groupIds: + - author + - content-fields - slug - status - - author - - content fields + - title contributors: [] relatedBookIds: [] relatedKnowledgeIds: [] diff --git a/docs/src/content/knowledge/treeseed-feedback-and-support/privacy.md b/docs/src/content/knowledge/treeseed-feedback-and-support/privacy.md index b8c923be..6bf1e82e 100644 --- a/docs/src/content/knowledge/treeseed-feedback-and-support/privacy.md +++ b/docs/src/content/knowledge/treeseed-feedback-and-support/privacy.md @@ -8,12 +8,12 @@ summary: Learn which context is stored, who can inspect it, and how retention wo status: published visibility: authenticated order: 40 -tags: - - privacy - - identity - - retention +groupIds: - audit - contact + - identity + - privacy + - retention contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-feedback-and-support/screenshot-privacy.md b/docs/src/content/knowledge/treeseed-feedback-and-support/screenshot-privacy.md index a077d7d0..98ac00d3 100644 --- a/docs/src/content/knowledge/treeseed-feedback-and-support/screenshot-privacy.md +++ b/docs/src/content/knowledge/treeseed-feedback-and-support/screenshot-privacy.md @@ -9,12 +9,12 @@ summary: Understand what the optional browser capture masks and how private status: published visibility: authenticated order: 50 -tags: - - screenshot +groupIds: + - attachment - capture - - redact - privacy - - attachment + - redact + - screenshot contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-feedback-and-support/submitting.md b/docs/src/content/knowledge/treeseed-feedback-and-support/submitting.md index 128ca05f..6f1ef31a 100644 --- a/docs/src/content/knowledge/treeseed-feedback-and-support/submitting.md +++ b/docs/src/content/knowledge/treeseed-feedback-and-support/submitting.md @@ -9,12 +9,12 @@ summary: Explain a problem or idea while TreeSeed attaches verified page and status: published visibility: authenticated order: 60 -tags: +groupIds: + - context - feedback - - report - issue + - report - suggestion - - context contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-feedback-and-support/triage.md b/docs/src/content/knowledge/treeseed-feedback-and-support/triage.md index a49c5f79..4e51174c 100644 --- a/docs/src/content/knowledge/treeseed-feedback-and-support/triage.md +++ b/docs/src/content/knowledge/treeseed-feedback-and-support/triage.md @@ -8,12 +8,12 @@ summary: Move feedback through a clear workflow and preserve useful resolution e status: published visibility: admin order: 70 -tags: - - triage - - in progress - - resolve - - reopen +groupIds: + - in-progress - notes + - reopen + - resolve + - triage contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-services-and-providers/activity.md b/docs/src/content/knowledge/treeseed-services-and-providers/activity.md index 3f5f6938..b4ca74a2 100644 --- a/docs/src/content/knowledge/treeseed-services-and-providers/activity.md +++ b/docs/src/content/knowledge/treeseed-services-and-providers/activity.md @@ -9,11 +9,11 @@ summary: Review connection changes and validation outcomes without exposing status: published visibility: team order: 10 -tags: +groupIds: - activity - audit - - validation - timestamp + - validation contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-services-and-providers/capabilities.md b/docs/src/content/knowledge/treeseed-services-and-providers/capabilities.md index 3c9e73ac..3779ecd4 100644 --- a/docs/src/content/knowledge/treeseed-services-and-providers/capabilities.md +++ b/docs/src/content/knowledge/treeseed-services-and-providers/capabilities.md @@ -9,12 +9,12 @@ summary: Enable provider-neutral capabilities independently and make them status: published visibility: team order: 20 -tags: - - capability +groupIds: - binding + - capability + - hosting - repository - workflow - - hosting contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-services-and-providers/connect.md b/docs/src/content/knowledge/treeseed-services-and-providers/connect.md index 1e540c88..488937e2 100644 --- a/docs/src/content/knowledge/treeseed-services-and-providers/connect.md +++ b/docs/src/content/knowledge/treeseed-services-and-providers/connect.md @@ -9,11 +9,11 @@ summary: Choose a provider account, enable only required capabilities, and status: published visibility: authenticated order: 30 -tags: - - connect service - - provider +groupIds: - capability + - connect-service - credentials + - provider contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-services-and-providers/connection.md b/docs/src/content/knowledge/treeseed-services-and-providers/connection.md index a38095ef..9397bb71 100644 --- a/docs/src/content/knowledge/treeseed-services-and-providers/connection.md +++ b/docs/src/content/knowledge/treeseed-services-and-providers/connection.md @@ -9,11 +9,11 @@ summary: Maintain metadata, capabilities, credential readiness, activity, status: published visibility: authenticated order: 40 -tags: - - connection settings +groupIds: - capabilities - - validation + - connection-settings - disconnect + - validation contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-services-and-providers/connections.md b/docs/src/content/knowledge/treeseed-services-and-providers/connections.md index b4742b51..63d30799 100644 --- a/docs/src/content/knowledge/treeseed-services-and-providers/connections.md +++ b/docs/src/content/knowledge/treeseed-services-and-providers/connections.md @@ -9,12 +9,12 @@ summary: Understand provider connections, capability bindings, custody status: published visibility: authenticated order: 50 -tags: - - services - - providers - - connections +groupIds: + - active-team - capabilities - - active team + - connections + - providers + - services contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-services-and-providers/credentials.md b/docs/src/content/knowledge/treeseed-services-and-providers/credentials.md index 66eb12ab..1742d8b3 100644 --- a/docs/src/content/knowledge/treeseed-services-and-providers/credentials.md +++ b/docs/src/content/knowledge/treeseed-services-and-providers/credentials.md @@ -9,12 +9,12 @@ summary: Learn what is encrypted, who can use it, and how interactive operations status: published visibility: authenticated order: 60 -tags: +groupIds: - credentials - encryption - - token - envelope - lease + - token contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-services-and-providers/disconnection.md b/docs/src/content/knowledge/treeseed-services-and-providers/disconnection.md index 36a1a609..f303063c 100644 --- a/docs/src/content/knowledge/treeseed-services-and-providers/disconnection.md +++ b/docs/src/content/knowledge/treeseed-services-and-providers/disconnection.md @@ -9,11 +9,11 @@ summary: Resolve capability consumers before removing a connection and its status: published visibility: team order: 70 -tags: - - disconnect - - delete +groupIds: - blocker - ciphertext + - delete + - disconnect contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-services-and-providers/external-vault.md b/docs/src/content/knowledge/treeseed-services-and-providers/external-vault.md index 85fd89fd..0ed00a45 100644 --- a/docs/src/content/knowledge/treeseed-services-and-providers/external-vault.md +++ b/docs/src/content/knowledge/treeseed-services-and-providers/external-vault.md @@ -9,12 +9,12 @@ summary: Configure unattended credential references without storing a long-lived status: published visibility: authenticated order: 80 -tags: - - vault - - openbao - - oidc +groupIds: - jwt - - workload identity + - oidc + - openbao + - vault + - workload-identity contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-services-and-providers/provider-cloudflare.md b/docs/src/content/knowledge/treeseed-services-and-providers/provider-cloudflare.md index 909f0fb7..b0a3de92 100644 --- a/docs/src/content/knowledge/treeseed-services-and-providers/provider-cloudflare.md +++ b/docs/src/content/knowledge/treeseed-services-and-providers/provider-cloudflare.md @@ -9,13 +9,13 @@ summary: Separate runtime, DNS, and storage tokens and restrict each one to status: published visibility: authenticated order: 90 -tags: +groupIds: + - api-token - cloudflare - - pages - - workers - dns + - pages - r2 - - api token + - workers contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-services-and-providers/provider-github.md b/docs/src/content/knowledge/treeseed-services-and-providers/provider-github.md index 53e7d87c..c275d536 100644 --- a/docs/src/content/knowledge/treeseed-services-and-providers/provider-github.md +++ b/docs/src/content/knowledge/treeseed-services-and-providers/provider-github.md @@ -9,10 +9,10 @@ summary: Use a GitHub App installation with capability-specific repository, status: published visibility: authenticated order: 100 -tags: - - github app - - installation +groupIds: - actions + - github-app + - installation - repositories - secrets contributors: [] diff --git a/docs/src/content/knowledge/treeseed-services-and-providers/provider-openbao.md b/docs/src/content/knowledge/treeseed-services-and-providers/provider-openbao.md index bb27beb6..efed840e 100644 --- a/docs/src/content/knowledge/treeseed-services-and-providers/provider-openbao.md +++ b/docs/src/content/knowledge/treeseed-services-and-providers/provider-openbao.md @@ -8,12 +8,12 @@ summary: Use workload identity and references instead of storing a reusable vaul status: published visibility: authenticated order: 110 -tags: - - openbao - - hashicorp vault - - oidc +groupIds: + - hashicorp-vault - jwt - - workload identity + - oidc + - openbao + - workload-identity contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-services-and-providers/provider-railway.md b/docs/src/content/knowledge/treeseed-services-and-providers/provider-railway.md index da9cb6ec..06ccf9bd 100644 --- a/docs/src/content/knowledge/treeseed-services-and-providers/provider-railway.md +++ b/docs/src/content/knowledge/treeseed-services-and-providers/provider-railway.md @@ -9,11 +9,11 @@ summary: Record a workspace boundary and acknowledge the broader authority of status: published visibility: authenticated order: 120 -tags: +groupIds: + - api-token + - blast-radius - railway - workspace - - api token - - blast radius contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-services-and-providers/providers.md b/docs/src/content/knowledge/treeseed-services-and-providers/providers.md index 3926662b..f49cae5d 100644 --- a/docs/src/content/knowledge/treeseed-services-and-providers/providers.md +++ b/docs/src/content/knowledge/treeseed-services-and-providers/providers.md @@ -9,12 +9,12 @@ summary: Compare supported providers without treating shared capability types as status: published visibility: authenticated order: 130 -tags: - - github +groupIds: - cloudflare - - railway + - github - openbao - permissions + - railway contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-services-and-providers/settings.md b/docs/src/content/knowledge/treeseed-services-and-providers/settings.md index 1131fc2a..932bc5f6 100644 --- a/docs/src/content/knowledge/treeseed-services-and-providers/settings.md +++ b/docs/src/content/knowledge/treeseed-services-and-providers/settings.md @@ -9,12 +9,12 @@ summary: Change readable account metadata and enabled capabilities without status: published visibility: team order: 140 -tags: - - settings +groupIds: + - account-id - metadata - - account id - - workspace - organization + - settings + - workspace contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-services-and-providers/validation.md b/docs/src/content/knowledge/treeseed-services-and-providers/validation.md index 5fec0c69..294b6772 100644 --- a/docs/src/content/knowledge/treeseed-services-and-providers/validation.md +++ b/docs/src/content/knowledge/treeseed-services-and-providers/validation.md @@ -9,11 +9,11 @@ summary: Authorize a single-use operation lease that tests a provider connection status: published visibility: team order: 150 -tags: - - validation +groupIds: + - credentials - lease - read-only - - credentials + - validation contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-team-administration/activity.md b/docs/src/content/knowledge/treeseed-team-administration/activity.md index 7bff27e3..35c5fc84 100644 --- a/docs/src/content/knowledge/treeseed-team-administration/activity.md +++ b/docs/src/content/knowledge/treeseed-team-administration/activity.md @@ -8,10 +8,10 @@ summary: Read the human-centered history of security-sensitive team changes. status: published visibility: team order: 10 -tags: +groupIds: - activity - - audit - actor + - audit - changes - history contributors: [] diff --git a/docs/src/content/knowledge/treeseed-team-administration/collection.md b/docs/src/content/knowledge/treeseed-team-administration/collection.md index e64ff393..71f1579e 100644 --- a/docs/src/content/knowledge/treeseed-team-administration/collection.md +++ b/docs/src/content/knowledge/treeseed-team-administration/collection.md @@ -9,11 +9,11 @@ summary: Choose the team that scopes daily work without changing it merely by status: published visibility: authenticated order: 20 -tags: - - teams - - active team +groupIds: + - active-team - archived - switch + - teams contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-team-administration/creation.md b/docs/src/content/knowledge/treeseed-team-administration/creation.md index 3955b88e..81adedae 100644 --- a/docs/src/content/knowledge/treeseed-team-administration/creation.md +++ b/docs/src/content/knowledge/treeseed-team-administration/creation.md @@ -8,11 +8,11 @@ summary: Create a durable team identity and become its first owner. status: published visibility: authenticated order: 30 -tags: - - create team +groupIds: + - create-team + - name - owner - visibility - - name contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-team-administration/invitation.md b/docs/src/content/knowledge/treeseed-team-administration/invitation.md index 6d0bcae6..069ba380 100644 --- a/docs/src/content/knowledge/treeseed-team-administration/invitation.md +++ b/docs/src/content/knowledge/treeseed-team-administration/invitation.md @@ -8,13 +8,13 @@ summary: Send, review, resend, revoke, and explicitly accept team invitations. status: published visibility: public order: 40 -tags: - - invitation +groupIds: - accept + - email-mismatch + - expiry + - invitation - resend - revoke - - expiry - - email mismatch contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-team-administration/knowledge-authoring.md b/docs/src/content/knowledge/treeseed-team-administration/knowledge-authoring.md index 6db025e8..91ef82aa 100644 --- a/docs/src/content/knowledge/treeseed-team-administration/knowledge-authoring.md +++ b/docs/src/content/knowledge/treeseed-team-administration/knowledge-authoring.md @@ -8,10 +8,10 @@ summary: Create repository-native books and pages through recoverable TreeDX wor status: published visibility: team order: 90 -tags: - - knowledge - - books +groupIds: - authoring + - books + - knowledge contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-team-administration/lifecycle.md b/docs/src/content/knowledge/treeseed-team-administration/lifecycle.md index 7efc8c17..20e1df4c 100644 --- a/docs/src/content/knowledge/treeseed-team-administration/lifecycle.md +++ b/docs/src/content/knowledge/treeseed-team-administration/lifecycle.md @@ -9,12 +9,12 @@ summary: Pause team activity reversibly or permanently delete it through a status: published visibility: authenticated order: 50 -tags: +groupIds: - archive - - restore - - delete team - blockers + - delete-team - password + - restore contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-team-administration/member-search.md b/docs/src/content/knowledge/treeseed-team-administration/member-search.md index dd8f9e97..f8309056 100644 --- a/docs/src/content/knowledge/treeseed-team-administration/member-search.md +++ b/docs/src/content/knowledge/treeseed-team-administration/member-search.md @@ -9,11 +9,11 @@ summary: Search and inspect the complete member directory while keeping status: published visibility: team order: 60 -tags: - - search +groupIds: - directory - member - pagination + - search contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-team-administration/membership.md b/docs/src/content/knowledge/treeseed-team-administration/membership.md index b303e5a4..cedcacbc 100644 --- a/docs/src/content/knowledge/treeseed-team-administration/membership.md +++ b/docs/src/content/knowledge/treeseed-team-administration/membership.md @@ -9,13 +9,13 @@ summary: Find team members and understand which operations require an status: published visibility: authenticated order: 70 -tags: +groupIds: + - invitation + - leave - members - - roles - ownership - - invitation - remove - - leave + - roles contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-team-administration/overview.md b/docs/src/content/knowledge/treeseed-team-administration/overview.md index ebb75a17..a026f987 100644 --- a/docs/src/content/knowledge/treeseed-team-administration/overview.md +++ b/docs/src/content/knowledge/treeseed-team-administration/overview.md @@ -9,12 +9,12 @@ summary: Read team identity, your role, owned-domain summaries, activity, and status: published visibility: authenticated order: 80 -tags: - - team overview - - permissions +groupIds: - audit + - permissions - projects - services + - team-overview contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-team-administration/ownership.md b/docs/src/content/knowledge/treeseed-team-administration/ownership.md index ff98f651..0eb44d7f 100644 --- a/docs/src/content/knowledge/treeseed-team-administration/ownership.md +++ b/docs/src/content/knowledge/treeseed-team-administration/ownership.md @@ -8,11 +8,11 @@ summary: Grant or transfer ownership without leaving a team with no accountable status: published visibility: team order: 90 -tags: +groupIds: + - last-owner - owner - ownership - transfer - - last owner contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-team-administration/removal.md b/docs/src/content/knowledge/treeseed-team-administration/removal.md index 6ec02dda..e2b8d2dd 100644 --- a/docs/src/content/knowledge/treeseed-team-administration/removal.md +++ b/docs/src/content/knowledge/treeseed-team-administration/removal.md @@ -8,11 +8,11 @@ summary: Resolve ownership and resource blockers before access is removed. status: published visibility: team order: 100 -tags: - - remove - - leave +groupIds: - blockers - - lost access + - leave + - lost-access + - remove contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-team-administration/role-changes.md b/docs/src/content/knowledge/treeseed-team-administration/role-changes.md index 6a4e49e2..d985b9a5 100644 --- a/docs/src/content/knowledge/treeseed-team-administration/role-changes.md +++ b/docs/src/content/knowledge/treeseed-team-administration/role-changes.md @@ -8,11 +8,11 @@ summary: Review how a role change affects visible controls and durable authoriza status: published visibility: team order: 110 -tags: - - role +groupIds: - access - - permission - change + - permission + - role contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-team-administration/roles.md b/docs/src/content/knowledge/treeseed-team-administration/roles.md index 43464a2b..5a6131f1 100644 --- a/docs/src/content/knowledge/treeseed-team-administration/roles.md +++ b/docs/src/content/knowledge/treeseed-team-administration/roles.md @@ -9,12 +9,12 @@ summary: Compare human-readable responsibilities and understand which status: published visibility: team order: 120 -tags: - - roles - - permissions - - owner - - lead +groupIds: - contributor + - lead + - owner + - permissions + - roles - viewer contributors: [] relatedBookIds: [] diff --git a/docs/src/content/knowledge/treeseed-team-administration/settings.md b/docs/src/content/knowledge/treeseed-team-administration/settings.md index a78f4c39..9ecf6ee3 100644 --- a/docs/src/content/knowledge/treeseed-team-administration/settings.md +++ b/docs/src/content/knowledge/treeseed-team-administration/settings.md @@ -9,12 +9,12 @@ summary: Maintain the team name, display identity, logo, summary, and profile status: published visibility: authenticated order: 130 -tags: - - team settings +groupIds: + - conflict - identity - - public profile + - public-profile + - team-settings - visibility - - conflict contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/knowledge/treeseed-team-administration/visibility.md b/docs/src/content/knowledge/treeseed-team-administration/visibility.md index 90583681..369fecdc 100644 --- a/docs/src/content/knowledge/treeseed-team-administration/visibility.md +++ b/docs/src/content/knowledge/treeseed-team-administration/visibility.md @@ -9,11 +9,11 @@ summary: Control whether the team identity profile is public without changing status: published visibility: team order: 140 -tags: - - visibility - - public +groupIds: - private - profile + - public + - visibility contributors: [] relatedBookIds: [] relatedKnowledgeIds: diff --git a/docs/src/content/notes/knowledge-authoring-traceability.md b/docs/src/content/notes/knowledge-authoring-traceability.md index f9f5bf95..95f935a5 100644 --- a/docs/src/content/notes/knowledge-authoring-traceability.md +++ b/docs/src/content/notes/knowledge-authoring-traceability.md @@ -5,10 +5,10 @@ description: Records why every published knowledge change must retain an exact r summary: Knowledge changes remain trustworthy when their authoring workspace, review, source commit, graph revision, publication manifest, and derived packs can be correlated. date: 2026-08-01 status: live -tags: +groupIds: - knowledge - - traceability - publication + - traceability author: admin-steward draft: false about: diff --git a/docs/src/content/questions/how-should-knowledge-publication-stay-trustworthy.md b/docs/src/content/questions/how-should-knowledge-publication-stay-trustworthy.md index 3196622d..f716fbbf 100644 --- a/docs/src/content/questions/how-should-knowledge-publication-stay-trustworthy.md +++ b/docs/src/content/questions/how-should-knowledge-publication-stay-trustworthy.md @@ -5,10 +5,10 @@ description: Defines the evidence boundary for repository-native knowledge autho summary: Establishes which correlated records must agree before TreeSeed treats a knowledge revision as published and pack-ready. date: 2026-08-01 status: live -tags: +groupIds: - knowledge - - review - publication + - review draft: false questionType: implementation motivation: A knowledge UI must not report success when Git, TreeDX, the published manifest, the reader, or derived packs refer to different source revisions. diff --git a/package-lock.json b/package-lock.json index 7da35a36..de4afaab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,9 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#08a3b9bc6d5354eccf5c491a5dfab37bca505f33", - "@treeseed/sdk": "github:treeseed-ai/sdk#2a8bc4722d887d9360128d855885a424483a2074", - "@treeseed/ui": "github:treeseed-ai/ui#2938d0959dcb2aaa97bbced633e6f75df83db90c", + "@treeseed/core": "github:treeseed-ai/core#1d5b6647b046e56a833c184e61c056b97011e89f", + "@treeseed/sdk": "github:treeseed-ai/sdk#c4ebba69bd0fdf908739426472d1656757b86273", + "@treeseed/ui": "github:treeseed-ai/ui#c64f2908a167383d057b83104b41dc03ea196757", "react": "^19.2.5", "react-dom": "^19.2.6" }, @@ -7463,8 +7463,8 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.staging.20260804T171000Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#08a3b9bc6d5354eccf5c491a5dfab37bca505f33", - "integrity": "sha512-zPB/vIn+gj5pMwvSFS/lv0cz63rgAYv7ZVXEdbmGDf8xOpva/mLAercg799VCH0auvg0c59HuvI8ioohFs4cng==", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#1d5b6647b046e56a833c184e61c056b97011e89f", + "integrity": "sha512-dxv/EYHXeuMv4WLzE5entoQ2IjJ9EbeYb9UynrBrUxcjoRiN9VBaCHBllKvcdSRFCtt72FUVC34zG7DxHJIiOg==", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7475,8 +7475,8 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#2a8bc4722d887d9360128d855885a424483a2074", - "@treeseed/ui": "github:treeseed-ai/ui#2938d0959dcb2aaa97bbced633e6f75df83db90c", + "@treeseed/sdk": "github:treeseed-ai/sdk#c4ebba69bd0fdf908739426472d1656757b86273", + "@treeseed/ui": "github:treeseed-ai/ui#c64f2908a167383d057b83104b41dc03ea196757", "astro": "^5.6.1", "esbuild": "^0.28.0", "katex": "^0.16.22", @@ -9480,7 +9480,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.staging.20260804T170912Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#2a8bc4722d887d9360128d855885a424483a2074", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#c4ebba69bd0fdf908739426472d1656757b86273", "integrity": "sha512-k09Lh1oqyVTTAhmn0v1o3Ec8leVWE5KxdQ2wXZZ06HG9LZ4VtsS7RnX+MO1t6uGZeK7+/lOO6B9XUFk0g/5Dig==", "license": "AGPL-3.0-only", "dependencies": { @@ -10187,8 +10187,8 @@ }, "node_modules/@treeseed/ui": { "version": "0.12.18-dev.staging.20260804T170811Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#2938d0959dcb2aaa97bbced633e6f75df83db90c", - "integrity": "sha512-AKfop1W7VDc2agSuRV8S/2eO+6+/vxa49pA3ZzWsPXe63mWzZybfd+vdWpYHxyEDx8cn6+K6Z0mgP4bj3TJsQw==", + "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#c64f2908a167383d057b83104b41dc03ea196757", + "integrity": "sha512-spKVmxmvSyyhiIOndTk/dG0pQxoYm5ZHCZZYiYLJ5+vDorSLSRkFWt/Kx7CIrve1ANR7Yl/0fUA0YjtrGjlmJw==", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", @@ -21686,9 +21686,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.0.tgz", + "integrity": "sha512-x/M6q3w4Ybp91CNaS4S69UnliqR3BzRpOT6LWbksjth0S/+jhfaPJsWjt/TewpT8j9eLIojUf5jr29WextHroA==", "funding": [ { "type": "opencollective", diff --git a/package.json b/package.json index 70a5b6c8..550cb2c9 100644 --- a/package.json +++ b/package.json @@ -49,9 +49,9 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#08a3b9bc6d5354eccf5c491a5dfab37bca505f33", - "@treeseed/sdk": "github:treeseed-ai/sdk#2a8bc4722d887d9360128d855885a424483a2074", - "@treeseed/ui": "github:treeseed-ai/ui#2938d0959dcb2aaa97bbced633e6f75df83db90c", + "@treeseed/core": "github:treeseed-ai/core#1d5b6647b046e56a833c184e61c056b97011e89f", + "@treeseed/sdk": "github:treeseed-ai/sdk#c4ebba69bd0fdf908739426472d1656757b86273", + "@treeseed/ui": "github:treeseed-ai/ui#c64f2908a167383d057b83104b41dc03ea196757", "react": "^19.2.5", "react-dom": "^19.2.6" }, diff --git a/src/pages/app/capacity/index.astro b/src/pages/app/capacity/index.astro index 5610a82b..08ad34fe 100644 --- a/src/pages/app/capacity/index.astro +++ b/src/pages/app/capacity/index.astro @@ -1,5 +1,6 @@ --- import Button from '@treeseed/ui/components/astro/forms/actions/Button.astro'; +import CapacityControlRoom from '@treeseed/ui/components/astro/capacity/CapacityControlRoom.astro'; import MetricCard from '@treeseed/ui/components/astro/data/metrics/MetricCard.astro'; import MetricGrid from '@treeseed/ui/components/astro/data/metrics/MetricGrid.astro'; import PageHeader from '@treeseed/ui/components/astro/layout/PageHeader.astro'; @@ -16,17 +17,62 @@ import { loadCommandSnapshot } from '../../../view-models/command/command-state. if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); const context = await loadAppContext(Astro); const api = new ApiClientFacade(Astro); const team = context.activeTeam; const base = team ? `/v1/teams/${encodeURIComponent(team.id)}/capacity` : ''; -const [snapshot, access] = await Promise.all([team ? loadCommandSnapshot(api, team.id) : null, team ? api.getTeamAccessSummary(team.id).catch(() => null) : null]); +const [snapshot, access, preferences, registrationKey, requestPage, membershipPage] = await Promise.all([ + team ? loadCommandSnapshot(api, team.id) : null, + team ? api.getTeamAccessSummary(team.id).catch(() => null) : null, + api.accountPreferences().catch(() => ({ timeZone: 'UTC' })), + team ? api.request('GET', `/v1/teams/${encodeURIComponent(team.id)}/capacity-registration-key`).catch(() => null) : null, + team ? api.request('GET', `/v1/teams/${encodeURIComponent(team.id)}/capacity-provider-requests?limit=100`).catch(() => null) : null, + team ? api.request('GET', `/v1/teams/${encodeURIComponent(team.id)}/capacity-provider-memberships?limit=100`).catch(() => null) : null, +]); const usagePages = team && snapshot ? await Promise.all(snapshot.projects.map((project) => api.request('GET', `${base}/usage?projectId=${encodeURIComponent(String(project.id))}&limit=100`).catch(() => null))) : []; const reservationItems = snapshot?.reservations ?? []; const usageItems = usagePages.flatMap(items); const ledgerItems = snapshot?.ledger ?? []; const canManage = Boolean((access?.roles ?? access?.access?.roles ?? []).some((role: string) => ['team_owner', 'project_lead'].includes(role))); const csrfToken = ensureCsrfToken(Astro); +const providerRequests = items(requestPage); const memberships = items(membershipPage); +const object = (value: unknown) => value && typeof value === 'object' && !Array.isArray(value) ? value as Record : {}; +const number = (...values: unknown[]) => values.map(Number).find(Number.isFinite) ?? 0; +const fleet = (snapshot?.providers ?? []).map((provider: any) => { + const native = object(provider.nativeCapacity ?? provider.capacity ?? provider.supply); const budget = object(provider.budget ?? native.budget); + const membership = memberships.find((entry: any) => String(entry.providerId) === String(provider.providerId)); + const concurrency = number(native.maxConcurrentRunners, provider.maxConcurrentRunners, object(membership?.supplyOffer).maxConcurrentRunners, 1); + return { id: String(provider.providerId ?? provider.id), name: text(provider.providerName, provider.displayName, provider.providerId, 'Capacity provider'), + providerClass: String(object(provider.metadata).providerClass ?? object(membership?.metadata).providerClass ?? 'agent'), status: String(provider.status ?? 'unknown'), + owner: object(membership?.metadata).ownerType === 'team' ? 'team owned' : 'approved provider', assignments: number(provider.activeAssignmentCount), + capabilities: Array.isArray(provider.capabilitySummary) ? provider.capabilitySummary.map(String) : Array.isArray(provider.capabilities) ? provider.capabilities.map(String) : [], + updatedAt: provider.updatedAt ?? provider.lastHeartbeatAt ?? null, + meters: [ + { label: 'Runner lanes', used: number(provider.activeAssignmentCount), reserved: number(provider.reservedAssignmentCount), total: concurrency, unit: '' }, + ...(number(budget.inputTokens, native.inputTokens) ? [{ label: 'Input tokens', used: number(provider.usedInputTokens), reserved: number(provider.reservedInputTokens), total: number(budget.inputTokens, native.inputTokens), tone: 'violet' as const }] : []), + ...(number(budget.usd, native.usd) ? [{ label: 'Cost', used: number(provider.usedUsd), reserved: number(provider.reservedUsd), total: number(budget.usd, native.usd), unit: ' USD', tone: 'amber' as const }] : []), + ], + }; +}); +const registrationBase = `/v1/teams/${encodeURIComponent(team?.id ?? '')}/capacity-registration-key`; ---
{!team ? : <> + +
+ + + {canManage ?
{['rotate','enable','disable'].map((action) =>
)}
: null} +

Secret reveal is intentionally excluded from page hydration and logs. Use the audited reveal action after step-up authentication.

+
+ + {providerRequests.map((request: any) =>
{canManage && String(request.status) === 'pending' ?
{['approve','reject'].map((action) =>
{action === 'reject' ? : null}
)}
: null}
)} + {!providerRequests.length ?

No registration requests are waiting.

: null} +
+
+ +
{memberships.map((membership: any) =>
{text(membership.teamAlias, membership.displayName, membership.providerId)}{String(membership.id)}{String(membership.status)}
{canManage ?
{(String(membership.status) === 'suspended' ? ['resume','revoke'] : ['suspend','revoke']).map((action) =>
)}
: null}
)}
+
{snapshot?.providers.map((provider) => )}{!snapshot?.providers.length ?

No provider sessions were returned.

: null}
{reservationItems.map((reservation) =>
{canManage && ['requested', 'pending'].includes(String(reservation.overrunStatus ?? reservation.overrun_status ?? '')) ?
{['approve', 'reject'].map((decision) =>
)}
: null}
)}{!reservationItems.length ?

No reservation evidence was returned.

: null}

{usageItems.length} usage records and {ledgerItems.length} ledger entries are visible in the current bounded snapshot.

}
+ diff --git a/src/pages/app/knowledge/index.astro b/src/pages/app/knowledge/index.astro index ee7f0ac1..71b58faf 100644 --- a/src/pages/app/knowledge/index.astro +++ b/src/pages/app/knowledge/index.astro @@ -63,10 +63,10 @@ const valuesFromForm = (data: FormData) => ({ title: String(data.get('title') ?? '').trim(), summary: String(data.get('summary') ?? '').trim(), visibility: String(data.get('visibility') ?? 'team'), order: Number(data.get('order') ?? 0), description: String(data.get('description') ?? '').trim(), - topics: commaList(data.get('topics')), audience: commaList(data.get('audience')), + groupIds: commaList(data.get('groupIds')), audience: commaList(data.get('audience')), editorialCoreNoteId: String(data.get('editorialCoreNoteId') ?? '').trim(), packPolicy: String(data.get('packPolicy') ?? 'allowed'), cover: { image: String(data.get('coverImage') ?? '').trim(), alt: String(data.get('coverAlt') ?? '').trim() }, - parentId: String(data.get('parentId') ?? '').trim(), tags: commaList(data.get('tags')), contributors: commaList(data.get('contributors')), + parentId: String(data.get('parentId') ?? '').trim(), contributors: commaList(data.get('contributors')), relatedBookIds: commaList(data.get('relatedBookIds')), relatedKnowledgeIds: commaList(data.get('relatedKnowledgeIds')), relatedNoteIds: commaList(data.get('relatedNoteIds')), relatedQuestionIds: commaList(data.get('relatedQuestionIds')), relatedObjectiveIds: commaList(data.get('relatedObjectiveIds')), relatedProposalIds: commaList(data.get('relatedProposalIds')), @@ -203,7 +203,7 @@ if (workspaceId) { const source = await api.request('GET', `/v1/knowledge/workspaces/${encodeURIComponent(workspaceId)}/content?path=${encodeURIComponent(sourcePath)}`); const definition = source.definition ?? {}; formValues = { ...definition, kind: source.kind, bodyMarkdown: definition.bodyMarkdown ?? '', backlinks: source.backlinks ?? [], - tags: definition.tags?.join?.(', ') ?? '', topics: definition.topics?.join?.(', ') ?? '', + groupIds: definition.groupIds?.join?.(', ') ?? '', audience: definition.audience?.join?.(', ') ?? '', relatedKnowledgeIds: definition.relatedKnowledgeIds?.join?.(', ') ?? '', guaranteeIds: definition.guaranteeIds?.join?.(', ') ?? '', audiencesPrimary: definition.audiences?.primary?.join?.(', ') ?? '', From b9ff8cef898a9b5a2573d9b61003db245d85cecd Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Fri, 7 Aug 2026 00:00:48 -0400 Subject: [PATCH 087/315] build(build): sync package dependency references Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.staging.20260804T171053Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#c4ebba69bd0fdf908739426472d1656757b86273 -> github:treeseed-ai/sdk#e77554599b2cf7d6479527d284282fdcd3fb7292 - dependencies.@treeseed/core: github:treeseed-ai/core#1d5b6647b046e56a833c184e61c056b97011e89f -> github:treeseed-ai/core#6371794c876a36c6a4e29cda9f1d8fdd9acfc583 --- package-lock.json | 12 ++++++------ package.json | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index de4afaab..d7eabf67 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#1d5b6647b046e56a833c184e61c056b97011e89f", - "@treeseed/sdk": "github:treeseed-ai/sdk#c4ebba69bd0fdf908739426472d1656757b86273", + "@treeseed/core": "github:treeseed-ai/core#6371794c876a36c6a4e29cda9f1d8fdd9acfc583", + "@treeseed/sdk": "github:treeseed-ai/sdk#e77554599b2cf7d6479527d284282fdcd3fb7292", "@treeseed/ui": "github:treeseed-ai/ui#c64f2908a167383d057b83104b41dc03ea196757", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7463,8 +7463,8 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.staging.20260804T171000Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#1d5b6647b046e56a833c184e61c056b97011e89f", - "integrity": "sha512-dxv/EYHXeuMv4WLzE5entoQ2IjJ9EbeYb9UynrBrUxcjoRiN9VBaCHBllKvcdSRFCtt72FUVC34zG7DxHJIiOg==", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#6371794c876a36c6a4e29cda9f1d8fdd9acfc583", + "integrity": "sha512-jch67EbNhcR7tfHN5xmzAI8j7i73xze3zqv6c1l2vnUMLCWLbcm0fN8wfMV6F9VaY1qqthhY7K4BBE0WFdUbYg==", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7475,7 +7475,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#c4ebba69bd0fdf908739426472d1656757b86273", + "@treeseed/sdk": "github:treeseed-ai/sdk#e77554599b2cf7d6479527d284282fdcd3fb7292", "@treeseed/ui": "github:treeseed-ai/ui#c64f2908a167383d057b83104b41dc03ea196757", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -9480,7 +9480,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.staging.20260804T170912Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#c4ebba69bd0fdf908739426472d1656757b86273", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#e77554599b2cf7d6479527d284282fdcd3fb7292", "integrity": "sha512-k09Lh1oqyVTTAhmn0v1o3Ec8leVWE5KxdQ2wXZZ06HG9LZ4VtsS7RnX+MO1t6uGZeK7+/lOO6B9XUFk0g/5Dig==", "license": "AGPL-3.0-only", "dependencies": { diff --git a/package.json b/package.json index 550cb2c9..c249895b 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#1d5b6647b046e56a833c184e61c056b97011e89f", - "@treeseed/sdk": "github:treeseed-ai/sdk#c4ebba69bd0fdf908739426472d1656757b86273", + "@treeseed/core": "github:treeseed-ai/core#6371794c876a36c6a4e29cda9f1d8fdd9acfc583", + "@treeseed/sdk": "github:treeseed-ai/sdk#e77554599b2cf7d6479527d284282fdcd3fb7292", "@treeseed/ui": "github:treeseed-ai/ui#c64f2908a167383d057b83104b41dc03ea196757", "react": "^19.2.5", "react-dom": "^19.2.6" From 23a50497bbc8878dba0d8efce67cd2f42698f17b Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Fri, 7 Aug 2026 00:32:36 -0400 Subject: [PATCH 088/315] chore(deps): update @treeseed/core and @treeseed/sdk Changes: - Update dependency pointers in package.json and package-lock.json. - Update tsx version in package-lock.json. Dependency and pointer updates: - @treeseed/sdk: github:treeseed-ai/sdk#e77554599b2cf7d6479527d284282fdcd3fb7292 -> github:treeseed-ai/sdk#e8e5d575deb40ee3a9e40501edefc5e4e4a4785e - @treeseed/core: github:treeseed-ai/core#6371794c876a36c6a4e29cda9f1d8fdd9acfc583 -> github:treeseed-ai/core#88809b65356d501e5b62aac328d5f097e5331536 --- package-lock.json | 18 +++++++++--------- package.json | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index d7eabf67..1762e087 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#6371794c876a36c6a4e29cda9f1d8fdd9acfc583", - "@treeseed/sdk": "github:treeseed-ai/sdk#e77554599b2cf7d6479527d284282fdcd3fb7292", + "@treeseed/core": "github:treeseed-ai/core#88809b65356d501e5b62aac328d5f097e5331536", + "@treeseed/sdk": "github:treeseed-ai/sdk#e8e5d575deb40ee3a9e40501edefc5e4e4a4785e", "@treeseed/ui": "github:treeseed-ai/ui#c64f2908a167383d057b83104b41dc03ea196757", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7463,8 +7463,8 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.staging.20260804T171000Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#6371794c876a36c6a4e29cda9f1d8fdd9acfc583", - "integrity": "sha512-jch67EbNhcR7tfHN5xmzAI8j7i73xze3zqv6c1l2vnUMLCWLbcm0fN8wfMV6F9VaY1qqthhY7K4BBE0WFdUbYg==", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#88809b65356d501e5b62aac328d5f097e5331536", + "integrity": "sha512-dBxk0RpaYrykcb8CQfrRj+AhDEm3uHlaK/Kd7pQgiVFpE8AzyjEGnTBtFw3jb9/sGr61civHcClRcd+6LdOD8g==", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7475,7 +7475,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#e77554599b2cf7d6479527d284282fdcd3fb7292", + "@treeseed/sdk": "github:treeseed-ai/sdk#e8e5d575deb40ee3a9e40501edefc5e4e4a4785e", "@treeseed/ui": "github:treeseed-ai/ui#c64f2908a167383d057b83104b41dc03ea196757", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -9480,7 +9480,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.staging.20260804T170912Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#e77554599b2cf7d6479527d284282fdcd3fb7292", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#e8e5d575deb40ee3a9e40501edefc5e4e4a4785e", "integrity": "sha512-k09Lh1oqyVTTAhmn0v1o3Ec8leVWE5KxdQ2wXZZ06HG9LZ4VtsS7RnX+MO1t6uGZeK7+/lOO6B9XUFk0g/5Dig==", "license": "AGPL-3.0-only", "dependencies": { @@ -21188,9 +21188,9 @@ "license": "0BSD" }, "node_modules/tsx": { - "version": "4.23.9", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.9.tgz", - "integrity": "sha512-6q8uTORRGauQVjqMQnKUucLFoeXZAfw6zKvG35GLbdKWbLdeOtZ3H4mhyA5mxuUd2o2cRTskhj59nLLQseUvUw==", + "version": "4.23.10", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.10.tgz", + "integrity": "sha512-0Vb9eKU47njkxv/6B8CRZRDsxNDT/Pz+BIU+M5jw7xL3TdzAjSxlZUxu0xFL/kLpaG3sHZ0LH2wbK1T1yo7CUQ==", "license": "MIT", "dependencies": { "esbuild": "~0.28.0" diff --git a/package.json b/package.json index c249895b..01283c4a 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#6371794c876a36c6a4e29cda9f1d8fdd9acfc583", - "@treeseed/sdk": "github:treeseed-ai/sdk#e77554599b2cf7d6479527d284282fdcd3fb7292", + "@treeseed/core": "github:treeseed-ai/core#88809b65356d501e5b62aac328d5f097e5331536", + "@treeseed/sdk": "github:treeseed-ai/sdk#e8e5d575deb40ee3a9e40501edefc5e4e4a4785e", "@treeseed/ui": "github:treeseed-ai/ui#c64f2908a167383d057b83104b41dc03ea196757", "react": "^19.2.5", "react-dom": "^19.2.6" From dc6909c72c7c632baaa308f341b68d835bb68073 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Fri, 7 Aug 2026 01:48:26 -0400 Subject: [PATCH 089/315] fix(sdk): preserve fast lock validation across staging recovery merge Intent: - Save hint: preserve fast lock validation across staging recovery merge Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.treedx-perf.20260805T075847Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#5c530f6ae8848e07aef5fc32e6f3c5873d7a3f57 -> github:treeseed-ai/sdk#079bef7be5a4cb31702a36b5098c83ad413a7cb9 - dependencies.@treeseed/core: github:treeseed-ai/core#6641ed2f353d0bc9ab75dcc077b8c6f8cb1c3981 -> github:treeseed-ai/core#f9c20e709c3f464e24a3cc29a3d5e0372a6389cf --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1c0f0bdd..2d33992f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#6641ed2f353d0bc9ab75dcc077b8c6f8cb1c3981", - "@treeseed/sdk": "github:treeseed-ai/sdk#5c530f6ae8848e07aef5fc32e6f3c5873d7a3f57", + "@treeseed/core": "github:treeseed-ai/core#f9c20e709c3f464e24a3cc29a3d5e0372a6389cf", + "@treeseed/sdk": "github:treeseed-ai/sdk#079bef7be5a4cb31702a36b5098c83ad413a7cb9", "@treeseed/ui": "github:treeseed-ai/ui#7dfd2a809fc12a1e10dc1b763bb0ef146067abcf", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7463,7 +7463,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.treedx-perf.20260805T075816Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#6641ed2f353d0bc9ab75dcc077b8c6f8cb1c3981", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#f9c20e709c3f464e24a3cc29a3d5e0372a6389cf", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7474,7 +7474,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#5c530f6ae8848e07aef5fc32e6f3c5873d7a3f57", + "@treeseed/sdk": "github:treeseed-ai/sdk#079bef7be5a4cb31702a36b5098c83ad413a7cb9", "@treeseed/ui": "github:treeseed-ai/ui#7dfd2a809fc12a1e10dc1b763bb0ef146067abcf", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -9479,7 +9479,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.treedx-perf.20260805T073639Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#5c530f6ae8848e07aef5fc32e6f3c5873d7a3f57", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#079bef7be5a4cb31702a36b5098c83ad413a7cb9", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index 9fe22da4..85eb8e85 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#6641ed2f353d0bc9ab75dcc077b8c6f8cb1c3981", - "@treeseed/sdk": "github:treeseed-ai/sdk#5c530f6ae8848e07aef5fc32e6f3c5873d7a3f57", + "@treeseed/core": "github:treeseed-ai/core#f9c20e709c3f464e24a3cc29a3d5e0372a6389cf", + "@treeseed/sdk": "github:treeseed-ai/sdk#079bef7be5a4cb31702a36b5098c83ad413a7cb9", "@treeseed/ui": "github:treeseed-ai/ui#7dfd2a809fc12a1e10dc1b763bb0ef146067abcf", "react": "^19.2.5", "react-dom": "^19.2.6" From dfcd41dcdc9ce0faad2f4c688c5f4666c31236c6 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Fri, 7 Aug 2026 01:59:04 -0400 Subject: [PATCH 090/315] fix(capacity): migrate provider manifests to current contract Intent: - Save hint: migrate provider manifests to current contract Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.treedx-perf.20260805T075847Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#079bef7be5a4cb31702a36b5098c83ad413a7cb9 -> github:treeseed-ai/sdk#a46ce9a73e7243d8fa574b75c388e3ad9e6397a3 - dependencies.@treeseed/core: github:treeseed-ai/core#f9c20e709c3f464e24a3cc29a3d5e0372a6389cf -> github:treeseed-ai/core#a5248baf0badaddfb172f68bec455269f0802e31 --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2d33992f..8c416e9c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#f9c20e709c3f464e24a3cc29a3d5e0372a6389cf", - "@treeseed/sdk": "github:treeseed-ai/sdk#079bef7be5a4cb31702a36b5098c83ad413a7cb9", + "@treeseed/core": "github:treeseed-ai/core#a5248baf0badaddfb172f68bec455269f0802e31", + "@treeseed/sdk": "github:treeseed-ai/sdk#a46ce9a73e7243d8fa574b75c388e3ad9e6397a3", "@treeseed/ui": "github:treeseed-ai/ui#7dfd2a809fc12a1e10dc1b763bb0ef146067abcf", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7463,7 +7463,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.treedx-perf.20260805T075816Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#f9c20e709c3f464e24a3cc29a3d5e0372a6389cf", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#a5248baf0badaddfb172f68bec455269f0802e31", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7474,7 +7474,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#079bef7be5a4cb31702a36b5098c83ad413a7cb9", + "@treeseed/sdk": "github:treeseed-ai/sdk#a46ce9a73e7243d8fa574b75c388e3ad9e6397a3", "@treeseed/ui": "github:treeseed-ai/ui#7dfd2a809fc12a1e10dc1b763bb0ef146067abcf", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -9479,7 +9479,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.treedx-perf.20260805T073639Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#079bef7be5a4cb31702a36b5098c83ad413a7cb9", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#a46ce9a73e7243d8fa574b75c388e3ad9e6397a3", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index 85eb8e85..904ad92e 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#f9c20e709c3f464e24a3cc29a3d5e0372a6389cf", - "@treeseed/sdk": "github:treeseed-ai/sdk#079bef7be5a4cb31702a36b5098c83ad413a7cb9", + "@treeseed/core": "github:treeseed-ai/core#a5248baf0badaddfb172f68bec455269f0802e31", + "@treeseed/sdk": "github:treeseed-ai/sdk#a46ce9a73e7243d8fa574b75c388e3ad9e6397a3", "@treeseed/ui": "github:treeseed-ai/ui#7dfd2a809fc12a1e10dc1b763bb0ef146067abcf", "react": "^19.2.5", "react-dom": "^19.2.6" From 8e5ff267ef9412d268c0da08fb37147536676302 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Fri, 7 Aug 2026 02:07:10 -0400 Subject: [PATCH 091/315] fix(core): retain integrated dependency refs across content model merge Intent: - Save hint: retain integrated dependency refs across content model merge Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.treedx-perf.20260805T075847Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/ui: github:treeseed-ai/ui#7dfd2a809fc12a1e10dc1b763bb0ef146067abcf -> github:treeseed-ai/ui#4f653c263596e710f138e8b3606d58b76729520d - dependencies.@treeseed/core: github:treeseed-ai/core#a5248baf0badaddfb172f68bec455269f0802e31 -> github:treeseed-ai/core#0a6cf3fcef286d9d00887859e1d3b64296888f4c --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8c416e9c..4064297e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,9 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#a5248baf0badaddfb172f68bec455269f0802e31", + "@treeseed/core": "github:treeseed-ai/core#0a6cf3fcef286d9d00887859e1d3b64296888f4c", "@treeseed/sdk": "github:treeseed-ai/sdk#a46ce9a73e7243d8fa574b75c388e3ad9e6397a3", - "@treeseed/ui": "github:treeseed-ai/ui#7dfd2a809fc12a1e10dc1b763bb0ef146067abcf", + "@treeseed/ui": "github:treeseed-ai/ui#4f653c263596e710f138e8b3606d58b76729520d", "react": "^19.2.5", "react-dom": "^19.2.6" }, @@ -7463,7 +7463,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.treedx-perf.20260805T075816Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#a5248baf0badaddfb172f68bec455269f0802e31", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#0a6cf3fcef286d9d00887859e1d3b64296888f4c", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7475,7 +7475,7 @@ "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", "@treeseed/sdk": "github:treeseed-ai/sdk#a46ce9a73e7243d8fa574b75c388e3ad9e6397a3", - "@treeseed/ui": "github:treeseed-ai/ui#7dfd2a809fc12a1e10dc1b763bb0ef146067abcf", + "@treeseed/ui": "github:treeseed-ai/ui#4f653c263596e710f138e8b3606d58b76729520d", "astro": "^5.6.1", "esbuild": "^0.28.0", "katex": "^0.16.22", @@ -10185,7 +10185,7 @@ }, "node_modules/@treeseed/ui": { "version": "0.12.18-dev.treedx-perf.20260806T042250Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#7dfd2a809fc12a1e10dc1b763bb0ef146067abcf", + "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#4f653c263596e710f138e8b3606d58b76729520d", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", diff --git a/package.json b/package.json index 904ad92e..4badd0a0 100644 --- a/package.json +++ b/package.json @@ -49,9 +49,9 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#a5248baf0badaddfb172f68bec455269f0802e31", + "@treeseed/core": "github:treeseed-ai/core#0a6cf3fcef286d9d00887859e1d3b64296888f4c", "@treeseed/sdk": "github:treeseed-ai/sdk#a46ce9a73e7243d8fa574b75c388e3ad9e6397a3", - "@treeseed/ui": "github:treeseed-ai/ui#7dfd2a809fc12a1e10dc1b763bb0ef146067abcf", + "@treeseed/ui": "github:treeseed-ai/ui#4f653c263596e710f138e8b3606d58b76729520d", "react": "^19.2.5", "react-dom": "^19.2.6" }, From 34d607b973888702482c202d8b829c0cd15465b7 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Fri, 7 Aug 2026 03:15:25 -0400 Subject: [PATCH 092/315] build(build): resolve root staging ownership and resumable Intent: - Save hint: resolve root staging ownership and resumable update recovery Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.treedx-perf.20260805T075847Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#a46ce9a73e7243d8fa574b75c388e3ad9e6397a3 -> github:treeseed-ai/sdk#18f6b9ec6641c80dfd8d4a94349f1f9d459903e7 - dependencies.@treeseed/core: github:treeseed-ai/core#0a6cf3fcef286d9d00887859e1d3b64296888f4c -> github:treeseed-ai/core#4b6cb9fe6b89c85565c148ca63ba0b4ea3899d5b --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index e0d55c87..d919485c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#0a6cf3fcef286d9d00887859e1d3b64296888f4c", - "@treeseed/sdk": "github:treeseed-ai/sdk#a46ce9a73e7243d8fa574b75c388e3ad9e6397a3", + "@treeseed/core": "github:treeseed-ai/core#4b6cb9fe6b89c85565c148ca63ba0b4ea3899d5b", + "@treeseed/sdk": "github:treeseed-ai/sdk#18f6b9ec6641c80dfd8d4a94349f1f9d459903e7", "@treeseed/ui": "github:treeseed-ai/ui#4f653c263596e710f138e8b3606d58b76729520d", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7463,7 +7463,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.treedx-perf.20260805T075816Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#0a6cf3fcef286d9d00887859e1d3b64296888f4c", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#4b6cb9fe6b89c85565c148ca63ba0b4ea3899d5b", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7474,7 +7474,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#a46ce9a73e7243d8fa574b75c388e3ad9e6397a3", + "@treeseed/sdk": "github:treeseed-ai/sdk#18f6b9ec6641c80dfd8d4a94349f1f9d459903e7", "@treeseed/ui": "github:treeseed-ai/ui#4f653c263596e710f138e8b3606d58b76729520d", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -9479,7 +9479,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.treedx-perf.20260805T073639Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#a46ce9a73e7243d8fa574b75c388e3ad9e6397a3", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#18f6b9ec6641c80dfd8d4a94349f1f9d459903e7", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index 4badd0a0..03ac6d4a 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#0a6cf3fcef286d9d00887859e1d3b64296888f4c", - "@treeseed/sdk": "github:treeseed-ai/sdk#a46ce9a73e7243d8fa574b75c388e3ad9e6397a3", + "@treeseed/core": "github:treeseed-ai/core#4b6cb9fe6b89c85565c148ca63ba0b4ea3899d5b", + "@treeseed/sdk": "github:treeseed-ai/sdk#18f6b9ec6641c80dfd8d4a94349f1f9d459903e7", "@treeseed/ui": "github:treeseed-ai/ui#4f653c263596e710f138e8b3606d58b76729520d", "react": "^19.2.5", "react-dom": "^19.2.6" From 54154b91906d9aba4daac9768cfad2adb8330864 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Fri, 7 Aug 2026 03:20:31 -0400 Subject: [PATCH 093/315] build(build): sync package dependency references Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.ai.20260807T070845Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#e8e5d575deb40ee3a9e40501edefc5e4e4a4785e -> github:treeseed-ai/sdk#9026440666b4ab389e2fbe023b76f640dc1da604 - dependencies.@treeseed/core: github:treeseed-ai/core#88809b65356d501e5b62aac328d5f097e5331536 -> github:treeseed-ai/core#a78b05e78b9e43b4080e2d665cac82fd3d5b8fdb --- package-lock.json | 28 ++++++++++++++-------------- package.json | 6 +++--- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1762e087..10dddd36 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,17 +1,17 @@ { "name": "@treeseed/admin", - "version": "0.12.59-dev.staging.20260804T171053Z", + "version": "0.12.59-dev.ai.20260807T070845Z", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@treeseed/admin", - "version": "0.12.59-dev.staging.20260804T171053Z", + "version": "0.12.59-dev.ai.20260807T070845Z", "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#88809b65356d501e5b62aac328d5f097e5331536", - "@treeseed/sdk": "github:treeseed-ai/sdk#e8e5d575deb40ee3a9e40501edefc5e4e4a4785e", + "@treeseed/core": "github:treeseed-ai/core#a78b05e78b9e43b4080e2d665cac82fd3d5b8fdb", + "@treeseed/sdk": "github:treeseed-ai/sdk#9026440666b4ab389e2fbe023b76f640dc1da604", "@treeseed/ui": "github:treeseed-ai/ui#c64f2908a167383d057b83104b41dc03ea196757", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7462,9 +7462,9 @@ } }, "node_modules/@treeseed/core": { - "version": "0.12.60-dev.staging.20260804T171000Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#88809b65356d501e5b62aac328d5f097e5331536", - "integrity": "sha512-dBxk0RpaYrykcb8CQfrRj+AhDEm3uHlaK/Kd7pQgiVFpE8AzyjEGnTBtFw3jb9/sGr61civHcClRcd+6LdOD8g==", + "version": "0.12.60-dev.ai.20260807T070432Z", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#a78b05e78b9e43b4080e2d665cac82fd3d5b8fdb", + "integrity": "sha512-vmcX+rpYZWDmOTmI7XISvWJaNtcAXKm3O8mZyX7eT7mFaOrjbGcV4rJPZAHMPs6lBFW7VLtXQ76Zs5Ptoy+gdQ==", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7475,7 +7475,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#e8e5d575deb40ee3a9e40501edefc5e4e4a4785e", + "@treeseed/sdk": "github:treeseed-ai/sdk#9026440666b4ab389e2fbe023b76f640dc1da604", "@treeseed/ui": "github:treeseed-ai/ui#c64f2908a167383d057b83104b41dc03ea196757", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -9479,9 +9479,9 @@ } }, "node_modules/@treeseed/sdk": { - "version": "0.12.63-dev.staging.20260804T170912Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#e8e5d575deb40ee3a9e40501edefc5e4e4a4785e", - "integrity": "sha512-k09Lh1oqyVTTAhmn0v1o3Ec8leVWE5KxdQ2wXZZ06HG9LZ4VtsS7RnX+MO1t6uGZeK7+/lOO6B9XUFk0g/5Dig==", + "version": "0.12.63-dev.ai.20260807T065948Z", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#9026440666b4ab389e2fbe023b76f640dc1da604", + "integrity": "sha512-AICKVfUd7jSvu93Rl/UlX1RELbq92IVfwhtmpu808FChVnYe0u9EGgexzqaOWw+nAlu4eiIG0Mk2bXG+nJdVFg==", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", @@ -15052,9 +15052,9 @@ } }, "node_modules/hono": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.13.0.tgz", - "integrity": "sha512-jhunvfHWxd7J5EFfSgH4xsYJzSe/lfqbUCxiyyeaQasUsXeEHXtzVid+7EOGByc5JnFa23SSFL3Y2RV/z1T+eQ==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.13.1.tgz", + "integrity": "sha512-kdJoFVv2xmayw6cY09H7AbMJMt8Jn5jdlEdXsP7AGBdF2DIptVlKlOLKXP41yPip4/a3yQPv9gVcJYI8YY04dw==", "license": "MIT", "engines": { "node": ">=16.9.0" diff --git a/package.json b/package.json index 01283c4a..6fcab40a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@treeseed/admin", - "version": "0.12.59-dev.staging.20260804T171053Z", + "version": "0.12.59-dev.ai.20260807T070845Z", "description": "Treeseed administration portal framework built on @treeseed/core and @treeseed/ui.", "license": "AGPL-3.0-only", "repository": { @@ -49,8 +49,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#88809b65356d501e5b62aac328d5f097e5331536", - "@treeseed/sdk": "github:treeseed-ai/sdk#e8e5d575deb40ee3a9e40501edefc5e4e4a4785e", + "@treeseed/core": "github:treeseed-ai/core#a78b05e78b9e43b4080e2d665cac82fd3d5b8fdb", + "@treeseed/sdk": "github:treeseed-ai/sdk#9026440666b4ab389e2fbe023b76f640dc1da604", "@treeseed/ui": "github:treeseed-ai/ui#c64f2908a167383d057b83104b41dc03ea196757", "react": "^19.2.5", "react-dom": "^19.2.6" From e5707c758ce5bf31f634fceae3d4dc64bacfdb87 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Fri, 7 Aug 2026 04:01:39 -0400 Subject: [PATCH 094/315] build(build): sync package dependency references Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.ai.20260807T070845Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#9026440666b4ab389e2fbe023b76f640dc1da604 -> github:treeseed-ai/sdk#333195de6b59fb2fd0bbfc25b4a058cb63b70b1d - dependencies.@treeseed/core: github:treeseed-ai/core#a78b05e78b9e43b4080e2d665cac82fd3d5b8fdb -> github:treeseed-ai/core#9bb9b63fc9a322a4769126a11e2ea780e6c55078 --- package-lock.json | 12 ++++++------ package.json | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 10dddd36..5b7c5400 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#a78b05e78b9e43b4080e2d665cac82fd3d5b8fdb", - "@treeseed/sdk": "github:treeseed-ai/sdk#9026440666b4ab389e2fbe023b76f640dc1da604", + "@treeseed/core": "github:treeseed-ai/core#9bb9b63fc9a322a4769126a11e2ea780e6c55078", + "@treeseed/sdk": "github:treeseed-ai/sdk#333195de6b59fb2fd0bbfc25b4a058cb63b70b1d", "@treeseed/ui": "github:treeseed-ai/ui#c64f2908a167383d057b83104b41dc03ea196757", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7463,8 +7463,8 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.ai.20260807T070432Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#a78b05e78b9e43b4080e2d665cac82fd3d5b8fdb", - "integrity": "sha512-vmcX+rpYZWDmOTmI7XISvWJaNtcAXKm3O8mZyX7eT7mFaOrjbGcV4rJPZAHMPs6lBFW7VLtXQ76Zs5Ptoy+gdQ==", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#9bb9b63fc9a322a4769126a11e2ea780e6c55078", + "integrity": "sha512-JNF4SFKrXjRKQa0YKF0jD4S2f4qyWEFQ0HsTYpwTuxJobGaPtZBTD841P0q8FAtr+wkKF+B6h/b9nPLY9gvhRQ==", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7475,7 +7475,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#9026440666b4ab389e2fbe023b76f640dc1da604", + "@treeseed/sdk": "github:treeseed-ai/sdk#333195de6b59fb2fd0bbfc25b4a058cb63b70b1d", "@treeseed/ui": "github:treeseed-ai/ui#c64f2908a167383d057b83104b41dc03ea196757", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -9480,7 +9480,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.ai.20260807T065948Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#9026440666b4ab389e2fbe023b76f640dc1da604", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#333195de6b59fb2fd0bbfc25b4a058cb63b70b1d", "integrity": "sha512-AICKVfUd7jSvu93Rl/UlX1RELbq92IVfwhtmpu808FChVnYe0u9EGgexzqaOWw+nAlu4eiIG0Mk2bXG+nJdVFg==", "license": "AGPL-3.0-only", "dependencies": { diff --git a/package.json b/package.json index 6fcab40a..20fba7d1 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#a78b05e78b9e43b4080e2d665cac82fd3d5b8fdb", - "@treeseed/sdk": "github:treeseed-ai/sdk#9026440666b4ab389e2fbe023b76f640dc1da604", + "@treeseed/core": "github:treeseed-ai/core#9bb9b63fc9a322a4769126a11e2ea780e6c55078", + "@treeseed/sdk": "github:treeseed-ai/sdk#333195de6b59fb2fd0bbfc25b4a058cb63b70b1d", "@treeseed/ui": "github:treeseed-ai/ui#c64f2908a167383d057b83104b41dc03ea196757", "react": "^19.2.5", "react-dom": "^19.2.6" From 51c7b8b7570c28a16ad52fd5c8add62dae7680be Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Fri, 7 Aug 2026 05:31:44 -0400 Subject: [PATCH 095/315] build(build): sync package dependency references Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.ai.20260807T070845Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#333195de6b59fb2fd0bbfc25b4a058cb63b70b1d -> github:treeseed-ai/sdk#f00601d0ef0a9908716f615e056ca5f7917b9b03 - dependencies.@treeseed/core: github:treeseed-ai/core#9bb9b63fc9a322a4769126a11e2ea780e6c55078 -> github:treeseed-ai/core#626f2f73681ff17b00405fb0a79be9474397d99e --- package-lock.json | 18 +++++++++--------- package.json | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5b7c5400..028d1e60 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#9bb9b63fc9a322a4769126a11e2ea780e6c55078", - "@treeseed/sdk": "github:treeseed-ai/sdk#333195de6b59fb2fd0bbfc25b4a058cb63b70b1d", + "@treeseed/core": "github:treeseed-ai/core#626f2f73681ff17b00405fb0a79be9474397d99e", + "@treeseed/sdk": "github:treeseed-ai/sdk#f00601d0ef0a9908716f615e056ca5f7917b9b03", "@treeseed/ui": "github:treeseed-ai/ui#c64f2908a167383d057b83104b41dc03ea196757", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7463,8 +7463,8 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.ai.20260807T070432Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#9bb9b63fc9a322a4769126a11e2ea780e6c55078", - "integrity": "sha512-JNF4SFKrXjRKQa0YKF0jD4S2f4qyWEFQ0HsTYpwTuxJobGaPtZBTD841P0q8FAtr+wkKF+B6h/b9nPLY9gvhRQ==", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#626f2f73681ff17b00405fb0a79be9474397d99e", + "integrity": "sha512-aq+YtpWMScqw8Iu7vCRpXmBwL+6Ed4P5ANcOrgTwbLTgmIoq3LZ7PTFczVd/gJcVuyBUetcgLlqihz3hpybOSA==", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7475,7 +7475,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#333195de6b59fb2fd0bbfc25b4a058cb63b70b1d", + "@treeseed/sdk": "github:treeseed-ai/sdk#f00601d0ef0a9908716f615e056ca5f7917b9b03", "@treeseed/ui": "github:treeseed-ai/ui#c64f2908a167383d057b83104b41dc03ea196757", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -9480,7 +9480,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.ai.20260807T065948Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#333195de6b59fb2fd0bbfc25b4a058cb63b70b1d", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#f00601d0ef0a9908716f615e056ca5f7917b9b03", "integrity": "sha512-AICKVfUd7jSvu93Rl/UlX1RELbq92IVfwhtmpu808FChVnYe0u9EGgexzqaOWw+nAlu4eiIG0Mk2bXG+nJdVFg==", "license": "AGPL-3.0-only", "dependencies": { @@ -12400,9 +12400,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001807", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001807.tgz", - "integrity": "sha512-daRXJ9EB/rdRgu7kV+TTl1YUKtlsMWblPl2sLnpg9DZae16QCegol6A1SmCE31Lm9mXC1sRWGt/krouH+/dl7Q==", + "version": "1.0.30001809", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001809.tgz", + "integrity": "sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ==", "funding": [ { "type": "opencollective", diff --git a/package.json b/package.json index 20fba7d1..f318f461 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#9bb9b63fc9a322a4769126a11e2ea780e6c55078", - "@treeseed/sdk": "github:treeseed-ai/sdk#333195de6b59fb2fd0bbfc25b4a058cb63b70b1d", + "@treeseed/core": "github:treeseed-ai/core#626f2f73681ff17b00405fb0a79be9474397d99e", + "@treeseed/sdk": "github:treeseed-ai/sdk#f00601d0ef0a9908716f615e056ca5f7917b9b03", "@treeseed/ui": "github:treeseed-ai/ui#c64f2908a167383d057b83104b41dc03ea196757", "react": "^19.2.5", "react-dom": "^19.2.6" From b38b9a88a5c6cd54b37fc8aa12c4a28b0373fceb Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Fri, 7 Aug 2026 10:27:29 -0400 Subject: [PATCH 096/315] chore(deps): update dependencies Changes: - Update package.json and package-lock.json with updated dependency versions and git pointers. Dependency and pointer updates: - @treeseed/sdk: github:treeseed-ai/sdk#f00601d0ef0a9908716f615e056ca5f7917b9b03 -> github:treeseed-ai/sdk#2bec9ec3acf06a99f0a20c38421d81d934a676fb - @treeseed/core: github:treeseed-ai/core#626f2f73681ff17b00405fb0a79be9474397d99e -> github:treeseed-ai/core#c20ef9b6b6b75021913e58d190378661623c0be0 --- package-lock.json | 52 +++++++++++++++++++++++------------------------ package.json | 4 ++-- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/package-lock.json b/package-lock.json index 028d1e60..247a4710 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#626f2f73681ff17b00405fb0a79be9474397d99e", - "@treeseed/sdk": "github:treeseed-ai/sdk#f00601d0ef0a9908716f615e056ca5f7917b9b03", + "@treeseed/core": "github:treeseed-ai/core#c20ef9b6b6b75021913e58d190378661623c0be0", + "@treeseed/sdk": "github:treeseed-ai/sdk#2bec9ec3acf06a99f0a20c38421d81d934a676fb", "@treeseed/ui": "github:treeseed-ai/ui#c64f2908a167383d057b83104b41dc03ea196757", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7463,8 +7463,8 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.ai.20260807T070432Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#626f2f73681ff17b00405fb0a79be9474397d99e", - "integrity": "sha512-aq+YtpWMScqw8Iu7vCRpXmBwL+6Ed4P5ANcOrgTwbLTgmIoq3LZ7PTFczVd/gJcVuyBUetcgLlqihz3hpybOSA==", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#c20ef9b6b6b75021913e58d190378661623c0be0", + "integrity": "sha512-aOI0S7qsl/wA1e2vMTLwWdg9hpBj2d3KkU64R7LmIjfOmnlCwsK9q+MhJeApfFpN8WJ3v0jmvp7Le5weGF/1gQ==", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7475,7 +7475,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#f00601d0ef0a9908716f615e056ca5f7917b9b03", + "@treeseed/sdk": "github:treeseed-ai/sdk#2bec9ec3acf06a99f0a20c38421d81d934a676fb", "@treeseed/ui": "github:treeseed-ai/ui#c64f2908a167383d057b83104b41dc03ea196757", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -9480,7 +9480,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.ai.20260807T065948Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#f00601d0ef0a9908716f615e056ca5f7917b9b03", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#2bec9ec3acf06a99f0a20c38421d81d934a676fb", "integrity": "sha512-AICKVfUd7jSvu93Rl/UlX1RELbq92IVfwhtmpu808FChVnYe0u9EGgexzqaOWw+nAlu4eiIG0Mk2bXG+nJdVFg==", "license": "AGPL-3.0-only", "dependencies": { @@ -14523,9 +14523,9 @@ "license": "BSD-2-Clause" }, "node_modules/globby": { - "version": "16.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-16.2.2.tgz", - "integrity": "sha512-NLvV9ubZ6NDsJaOpKPy3cQeJpKi9DcWiyCiFUpJPA0YihRqiE6RWaLUmgNNPr8MgPpLZjnBjSmou7uZBRJv9wA==", + "version": "16.2.3", + "resolved": "https://registry.npmjs.org/globby/-/globby-16.2.3.tgz", + "integrity": "sha512-VZX7TV7jmd/pn71vdnLKtgwy1IWqc3KjI9x1/UtPkwoKk5fKrNLY30ltDe3cAM5xruIN7YuuaulFt133jRrKZg==", "license": "MIT", "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", @@ -17521,14 +17521,14 @@ } }, "node_modules/miniflare": { - "version": "5.20260801.0-alpha", - "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-5.20260801.0-alpha.tgz", - "integrity": "sha512-AfMrnQbJg81ESsGkGhOkHBtwTqCG+mosR+3GE+qDrhF1I/ieIvgg3ICxNyBvgHBZ3iapy6cysBQHNPykkzrfgw==", + "version": "5.20260801.1-alpha", + "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-5.20260801.1-alpha.tgz", + "integrity": "sha512-BHPVzIDA6mbx7LefxpvkXW7DHx9FKB9GorZatbnrrFTt3CVMU8zuUpbgyCuebwDKcTTOZos43ta8GQ0eMVEpxA==", "license": "MIT", "dependencies": { "@cspotcode/source-map-support": "0.8.1", "sharp": "0.35.2", - "undici": "7.28.0", + "undici": "7.29.0", "workerd": "1.20260801.1", "ws": "8.21.0", "youch": "4.1.0-beta.10" @@ -19003,9 +19003,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.4.tgz", - "integrity": "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==", + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.5.tgz", + "integrity": "sha512-KvvtD7SrlBP7dlgkBghEE3r84CABm5SmV2aNcG4oCA+qDnJ/tvKonFVvwWAyyWUEwxuNawdfEAZKP9zM3oZ2Uw==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -21188,9 +21188,9 @@ "license": "0BSD" }, "node_modules/tsx": { - "version": "4.23.10", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.10.tgz", - "integrity": "sha512-0Vb9eKU47njkxv/6B8CRZRDsxNDT/Pz+BIU+M5jw7xL3TdzAjSxlZUxu0xFL/kLpaG3sHZ0LH2wbK1T1yo7CUQ==", + "version": "4.23.11", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.11.tgz", + "integrity": "sha512-Ry2oTEUnhBdeEdWIztY8kf3/nBGnPnjMLVGL0YfdRXMORuPER5NlKmayqxtxRxwB1xBN+RivRaJfe7PM1rtiyw==", "license": "MIT", "dependencies": { "esbuild": "~0.28.0" @@ -21312,9 +21312,9 @@ "license": "MIT" }, "node_modules/undici": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.28.0.tgz", - "integrity": "sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.29.0.tgz", + "integrity": "sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==", "license": "MIT", "engines": { "node": ">=20.18.1" @@ -22843,16 +22843,16 @@ } }, "node_modules/wrangler": { - "version": "4.119.0", - "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.119.0.tgz", - "integrity": "sha512-ookClf+zly4DTc8pBMNrwGQzZKH8IpIYTXkjDw3XS7ZvBQ5mLYH6eOvfD5BEpk3U63zTbv91WRlo1UeRSKXa0g==", + "version": "4.120.0", + "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.120.0.tgz", + "integrity": "sha512-cBmu/MeaB/fPacC0JpATs4duTOCagBxrZo+vBzuTX06tLzwSyAHE1drlHUZ8rP0VqVz1fy3ReGYTiHdKkoHltg==", "license": "MIT OR Apache-2.0", "dependencies": { "@cloudflare/kv-asset-handler": "0.5.0", "@cloudflare/unenv-preset": "2.16.1", "blake3-wasm": "2.1.5", "esbuild": "0.28.1", - "miniflare": "5.20260801.0-alpha", + "miniflare": "5.20260801.1-alpha", "path-to-regexp": "6.3.0", "unenv": "2.0.0-rc.24", "workerd": "1.20260801.1" diff --git a/package.json b/package.json index f318f461..e57363da 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#626f2f73681ff17b00405fb0a79be9474397d99e", - "@treeseed/sdk": "github:treeseed-ai/sdk#f00601d0ef0a9908716f615e056ca5f7917b9b03", + "@treeseed/core": "github:treeseed-ai/core#c20ef9b6b6b75021913e58d190378661623c0be0", + "@treeseed/sdk": "github:treeseed-ai/sdk#2bec9ec3acf06a99f0a20c38421d81d934a676fb", "@treeseed/ui": "github:treeseed-ai/ui#c64f2908a167383d057b83104b41dc03ea196757", "react": "^19.2.5", "react-dom": "^19.2.6" From f5dc66b15f8c50bd56bef7d4fadee767f78352b9 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Fri, 7 Aug 2026 11:28:59 -0400 Subject: [PATCH 097/315] build(build): sync package dependency references Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.ai.20260807T070845Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#2bec9ec3acf06a99f0a20c38421d81d934a676fb -> github:treeseed-ai/sdk#3defbae534109c38076954ceb3f1ae3190fe7882 - dependencies.@treeseed/core: github:treeseed-ai/core#c20ef9b6b6b75021913e58d190378661623c0be0 -> github:treeseed-ai/core#c65f8500f9708916c56da2b0ae46666fb2b77b44 --- package-lock.json | 12 ++++++------ package.json | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 247a4710..4bf999df 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#c20ef9b6b6b75021913e58d190378661623c0be0", - "@treeseed/sdk": "github:treeseed-ai/sdk#2bec9ec3acf06a99f0a20c38421d81d934a676fb", + "@treeseed/core": "github:treeseed-ai/core#c65f8500f9708916c56da2b0ae46666fb2b77b44", + "@treeseed/sdk": "github:treeseed-ai/sdk#3defbae534109c38076954ceb3f1ae3190fe7882", "@treeseed/ui": "github:treeseed-ai/ui#c64f2908a167383d057b83104b41dc03ea196757", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7463,8 +7463,8 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.ai.20260807T070432Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#c20ef9b6b6b75021913e58d190378661623c0be0", - "integrity": "sha512-aOI0S7qsl/wA1e2vMTLwWdg9hpBj2d3KkU64R7LmIjfOmnlCwsK9q+MhJeApfFpN8WJ3v0jmvp7Le5weGF/1gQ==", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#c65f8500f9708916c56da2b0ae46666fb2b77b44", + "integrity": "sha512-InOpZXtQhADUEsB1HhpHxOdyMnuvxckOx0EmmZIwofKFVcGmbbwNvJx//YEqHD4htyugqYZpbK+6H72x41TiEA==", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7475,7 +7475,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#2bec9ec3acf06a99f0a20c38421d81d934a676fb", + "@treeseed/sdk": "github:treeseed-ai/sdk#3defbae534109c38076954ceb3f1ae3190fe7882", "@treeseed/ui": "github:treeseed-ai/ui#c64f2908a167383d057b83104b41dc03ea196757", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -9480,7 +9480,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.ai.20260807T065948Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#2bec9ec3acf06a99f0a20c38421d81d934a676fb", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#3defbae534109c38076954ceb3f1ae3190fe7882", "integrity": "sha512-AICKVfUd7jSvu93Rl/UlX1RELbq92IVfwhtmpu808FChVnYe0u9EGgexzqaOWw+nAlu4eiIG0Mk2bXG+nJdVFg==", "license": "AGPL-3.0-only", "dependencies": { diff --git a/package.json b/package.json index e57363da..a4adb004 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#c20ef9b6b6b75021913e58d190378661623c0be0", - "@treeseed/sdk": "github:treeseed-ai/sdk#2bec9ec3acf06a99f0a20c38421d81d934a676fb", + "@treeseed/core": "github:treeseed-ai/core#c65f8500f9708916c56da2b0ae46666fb2b77b44", + "@treeseed/sdk": "github:treeseed-ai/sdk#3defbae534109c38076954ceb3f1ae3190fe7882", "@treeseed/ui": "github:treeseed-ai/ui#c64f2908a167383d057b83104b41dc03ea196757", "react": "^19.2.5", "react-dom": "^19.2.6" From 4f50583ec599df65a18008cb73b751a5adbafdaa Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Fri, 7 Aug 2026 12:18:20 -0400 Subject: [PATCH 098/315] build(build): add persistent session events and preserve realtime shell Intent: - Save hint: add persistent session events and preserve realtime shell islands Changes: - Updates 4 files across build: 2, ui: 2. - Touches package-lock.json, package.json, src/layouts/AppLayout.astro, src/pages/v1/[...all].ts. - Plans package version/tag 0.12.59-dev.treedx-perf.20260805T075847Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#18f6b9ec6641c80dfd8d4a94349f1f9d459903e7 -> github:treeseed-ai/sdk#e83ac8d4974b542bd92e60be401893f58bb7885a - dependencies.@treeseed/ui: github:treeseed-ai/ui#4f653c263596e710f138e8b3606d58b76729520d -> github:treeseed-ai/ui#a1ccf8ab43b52a40eaea8960743bee222ccb0a09 - dependencies.@treeseed/core: github:treeseed-ai/core#4b6cb9fe6b89c85565c148ca63ba0b4ea3899d5b -> github:treeseed-ai/core#3a8fe6c084b3f13a3a49f5759180349f9f33fa03 --- package-lock.json | 16 ++++++++-------- package.json | 6 +++--- src/layouts/AppLayout.astro | 6 ++++-- src/pages/v1/[...all].ts | 1 + 4 files changed, 16 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index d919485c..24649c1d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,9 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#4b6cb9fe6b89c85565c148ca63ba0b4ea3899d5b", - "@treeseed/sdk": "github:treeseed-ai/sdk#18f6b9ec6641c80dfd8d4a94349f1f9d459903e7", - "@treeseed/ui": "github:treeseed-ai/ui#4f653c263596e710f138e8b3606d58b76729520d", + "@treeseed/core": "github:treeseed-ai/core#3a8fe6c084b3f13a3a49f5759180349f9f33fa03", + "@treeseed/sdk": "github:treeseed-ai/sdk#e83ac8d4974b542bd92e60be401893f58bb7885a", + "@treeseed/ui": "github:treeseed-ai/ui#a1ccf8ab43b52a40eaea8960743bee222ccb0a09", "react": "^19.2.5", "react-dom": "^19.2.6" }, @@ -7463,7 +7463,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.treedx-perf.20260805T075816Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#4b6cb9fe6b89c85565c148ca63ba0b4ea3899d5b", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#3a8fe6c084b3f13a3a49f5759180349f9f33fa03", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7474,8 +7474,8 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#18f6b9ec6641c80dfd8d4a94349f1f9d459903e7", - "@treeseed/ui": "github:treeseed-ai/ui#4f653c263596e710f138e8b3606d58b76729520d", + "@treeseed/sdk": "github:treeseed-ai/sdk#e83ac8d4974b542bd92e60be401893f58bb7885a", + "@treeseed/ui": "github:treeseed-ai/ui#a1ccf8ab43b52a40eaea8960743bee222ccb0a09", "astro": "^5.6.1", "esbuild": "^0.28.0", "katex": "^0.16.22", @@ -9479,7 +9479,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.treedx-perf.20260805T073639Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#18f6b9ec6641c80dfd8d4a94349f1f9d459903e7", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#e83ac8d4974b542bd92e60be401893f58bb7885a", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", @@ -10185,7 +10185,7 @@ }, "node_modules/@treeseed/ui": { "version": "0.12.18-dev.treedx-perf.20260806T042250Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#4f653c263596e710f138e8b3606d58b76729520d", + "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#a1ccf8ab43b52a40eaea8960743bee222ccb0a09", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", diff --git a/package.json b/package.json index 03ac6d4a..aae9ad65 100644 --- a/package.json +++ b/package.json @@ -49,9 +49,9 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#4b6cb9fe6b89c85565c148ca63ba0b4ea3899d5b", - "@treeseed/sdk": "github:treeseed-ai/sdk#18f6b9ec6641c80dfd8d4a94349f1f9d459903e7", - "@treeseed/ui": "github:treeseed-ai/ui#4f653c263596e710f138e8b3606d58b76729520d", + "@treeseed/core": "github:treeseed-ai/core#3a8fe6c084b3f13a3a49f5759180349f9f33fa03", + "@treeseed/sdk": "github:treeseed-ai/sdk#e83ac8d4974b542bd92e60be401893f58bb7885a", + "@treeseed/ui": "github:treeseed-ai/ui#a1ccf8ab43b52a40eaea8960743bee222ccb0a09", "react": "^19.2.5", "react-dom": "^19.2.6" }, diff --git a/src/layouts/AppLayout.astro b/src/layouts/AppLayout.astro index 6395feba..ae0a5056 100644 --- a/src/layouts/AppLayout.astro +++ b/src/layouts/AppLayout.astro @@ -52,10 +52,11 @@ const { const appearance = await resolveAuthenticatedThemePreference(Astro); const api = createApiFacade(Astro); -const [personalThemes, preferences] = await Promise.all([ +const [personalThemes, loadedPreferences] = await Promise.all([ api.personalThemes().catch(() => []), - suppliedTimeZone ? Promise.resolve({ timeZone: suppliedTimeZone }) : api.accountPreferences().catch(() => ({ timeZone: 'UTC' })), + api.accountPreferences().catch(() => ({ timeZone: suppliedTimeZone ?? 'UTC', realTimeUpdates: true, realTimePollingIntervalSeconds: 5 as const })), ]); +const preferences = { ...loadedPreferences, ...(suppliedTimeZone ? { timeZone: suppliedTimeZone } : {}) }; const customSchemes = Object.fromEntries(personalThemes.flatMap((theme) => { try { return [[theme.schemeId, compileGuidedThemePalette(theme.palette, theme.baseScheme)]]; } catch { return []; } })); @@ -93,6 +94,7 @@ const discussionContext = principal && activeTeam ? { teamId: activeTeam.id, identityLabel: principal.displayName ?? 'Current account', endpoint: '/v1/discussions', + realtime: { endpoint: '/v1/session/events', enabled: preferences.realTimeUpdates !== false }, } : undefined; --- diff --git a/src/pages/v1/[...all].ts b/src/pages/v1/[...all].ts index 6749002a..4a1cfac4 100644 --- a/src/pages/v1/[...all].ts +++ b/src/pages/v1/[...all].ts @@ -105,6 +105,7 @@ export const ALL: APIRoute = async (context) => { headers, body, redirect: 'manual', + signal: context.request.signal, }); const responseHeaders = new Headers(); From d4e96db1ff5e91a3cddd9320f6d31d4fc4cc13bf Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Fri, 7 Aug 2026 13:01:40 -0400 Subject: [PATCH 099/315] build(build): reconcile clean shared fixture aliases after canonical Intent: - Save hint: reconcile clean shared fixture aliases after canonical commits Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.treedx-perf.20260805T075847Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#e83ac8d4974b542bd92e60be401893f58bb7885a -> github:treeseed-ai/sdk#0e4bf6ab8ce7756a596e60209c2b0cf367304258 - dependencies.@treeseed/core: github:treeseed-ai/core#3a8fe6c084b3f13a3a49f5759180349f9f33fa03 -> github:treeseed-ai/core#877e79ae6af437a6871258aaf7233dbb7a62a9d9 --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 24649c1d..ce15395a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#3a8fe6c084b3f13a3a49f5759180349f9f33fa03", - "@treeseed/sdk": "github:treeseed-ai/sdk#e83ac8d4974b542bd92e60be401893f58bb7885a", + "@treeseed/core": "github:treeseed-ai/core#877e79ae6af437a6871258aaf7233dbb7a62a9d9", + "@treeseed/sdk": "github:treeseed-ai/sdk#0e4bf6ab8ce7756a596e60209c2b0cf367304258", "@treeseed/ui": "github:treeseed-ai/ui#a1ccf8ab43b52a40eaea8960743bee222ccb0a09", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7463,7 +7463,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.treedx-perf.20260805T075816Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#3a8fe6c084b3f13a3a49f5759180349f9f33fa03", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#877e79ae6af437a6871258aaf7233dbb7a62a9d9", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7474,7 +7474,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#e83ac8d4974b542bd92e60be401893f58bb7885a", + "@treeseed/sdk": "github:treeseed-ai/sdk#0e4bf6ab8ce7756a596e60209c2b0cf367304258", "@treeseed/ui": "github:treeseed-ai/ui#a1ccf8ab43b52a40eaea8960743bee222ccb0a09", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -9479,7 +9479,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.treedx-perf.20260805T073639Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#e83ac8d4974b542bd92e60be401893f58bb7885a", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#0e4bf6ab8ce7756a596e60209c2b0cf367304258", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index aae9ad65..db340e23 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#3a8fe6c084b3f13a3a49f5759180349f9f33fa03", - "@treeseed/sdk": "github:treeseed-ai/sdk#e83ac8d4974b542bd92e60be401893f58bb7885a", + "@treeseed/core": "github:treeseed-ai/core#877e79ae6af437a6871258aaf7233dbb7a62a9d9", + "@treeseed/sdk": "github:treeseed-ai/sdk#0e4bf6ab8ce7756a596e60209c2b0cf367304258", "@treeseed/ui": "github:treeseed-ai/ui#a1ccf8ab43b52a40eaea8960743bee222ccb0a09", "react": "^19.2.5", "react-dom": "^19.2.6" From fbf823a8c337949ddf435a458081d7d185facc1c Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Fri, 7 Aug 2026 13:59:22 -0400 Subject: [PATCH 100/315] build(build): fix packaged persistent session island resolution Intent: - Save hint: fix packaged persistent session island resolution Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.treedx-perf.20260805T075847Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/ui: github:treeseed-ai/ui#a1ccf8ab43b52a40eaea8960743bee222ccb0a09 -> github:treeseed-ai/ui#bc2d8ba09164cfb1e4bf9ce85a4222010eb29080 - dependencies.@treeseed/core: github:treeseed-ai/core#877e79ae6af437a6871258aaf7233dbb7a62a9d9 -> github:treeseed-ai/core#4390ddffd57f3d86f247800459bd1fdcef4b8db5 --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index ce15395a..bda50d74 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,9 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#877e79ae6af437a6871258aaf7233dbb7a62a9d9", + "@treeseed/core": "github:treeseed-ai/core#4390ddffd57f3d86f247800459bd1fdcef4b8db5", "@treeseed/sdk": "github:treeseed-ai/sdk#0e4bf6ab8ce7756a596e60209c2b0cf367304258", - "@treeseed/ui": "github:treeseed-ai/ui#a1ccf8ab43b52a40eaea8960743bee222ccb0a09", + "@treeseed/ui": "github:treeseed-ai/ui#bc2d8ba09164cfb1e4bf9ce85a4222010eb29080", "react": "^19.2.5", "react-dom": "^19.2.6" }, @@ -7463,7 +7463,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.treedx-perf.20260805T075816Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#877e79ae6af437a6871258aaf7233dbb7a62a9d9", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#4390ddffd57f3d86f247800459bd1fdcef4b8db5", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7475,7 +7475,7 @@ "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", "@treeseed/sdk": "github:treeseed-ai/sdk#0e4bf6ab8ce7756a596e60209c2b0cf367304258", - "@treeseed/ui": "github:treeseed-ai/ui#a1ccf8ab43b52a40eaea8960743bee222ccb0a09", + "@treeseed/ui": "github:treeseed-ai/ui#bc2d8ba09164cfb1e4bf9ce85a4222010eb29080", "astro": "^5.6.1", "esbuild": "^0.28.0", "katex": "^0.16.22", @@ -10185,7 +10185,7 @@ }, "node_modules/@treeseed/ui": { "version": "0.12.18-dev.treedx-perf.20260806T042250Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#a1ccf8ab43b52a40eaea8960743bee222ccb0a09", + "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#bc2d8ba09164cfb1e4bf9ce85a4222010eb29080", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", diff --git a/package.json b/package.json index db340e23..196f7b24 100644 --- a/package.json +++ b/package.json @@ -49,9 +49,9 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#877e79ae6af437a6871258aaf7233dbb7a62a9d9", + "@treeseed/core": "github:treeseed-ai/core#4390ddffd57f3d86f247800459bd1fdcef4b8db5", "@treeseed/sdk": "github:treeseed-ai/sdk#0e4bf6ab8ce7756a596e60209c2b0cf367304258", - "@treeseed/ui": "github:treeseed-ai/ui#a1ccf8ab43b52a40eaea8960743bee222ccb0a09", + "@treeseed/ui": "github:treeseed-ai/ui#bc2d8ba09164cfb1e4bf9ce85a4222010eb29080", "react": "^19.2.5", "react-dom": "^19.2.6" }, From 67c90a74ee0ed31288782935aada7d792f922c25 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Fri, 7 Aug 2026 15:26:32 -0400 Subject: [PATCH 101/315] build(build): sync package dependency references Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.ai.20260807T070845Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#3defbae534109c38076954ceb3f1ae3190fe7882 -> github:treeseed-ai/sdk#925ff8a531ab4880670cb6e5645a3ec744a87c4a - dependencies.@treeseed/core: github:treeseed-ai/core#c65f8500f9708916c56da2b0ae46666fb2b77b44 -> github:treeseed-ai/core#de8f664eb9ae34dfcf092eac08cde027af28707d --- package-lock.json | 20 ++++++++++---------- package.json | 4 ++-- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4bf999df..d676e195 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#c65f8500f9708916c56da2b0ae46666fb2b77b44", - "@treeseed/sdk": "github:treeseed-ai/sdk#3defbae534109c38076954ceb3f1ae3190fe7882", + "@treeseed/core": "github:treeseed-ai/core#de8f664eb9ae34dfcf092eac08cde027af28707d", + "@treeseed/sdk": "github:treeseed-ai/sdk#925ff8a531ab4880670cb6e5645a3ec744a87c4a", "@treeseed/ui": "github:treeseed-ai/ui#c64f2908a167383d057b83104b41dc03ea196757", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7463,8 +7463,8 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.ai.20260807T070432Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#c65f8500f9708916c56da2b0ae46666fb2b77b44", - "integrity": "sha512-InOpZXtQhADUEsB1HhpHxOdyMnuvxckOx0EmmZIwofKFVcGmbbwNvJx//YEqHD4htyugqYZpbK+6H72x41TiEA==", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#de8f664eb9ae34dfcf092eac08cde027af28707d", + "integrity": "sha512-xlBKqbXKqSQpT5BLLaYBugljCuTEFPYsJ7XM5y2MoQBLE9fAwA46DcwskOsFFEP5q9QAqkXWFLN8Fp9OtZYPTQ==", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7475,7 +7475,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#3defbae534109c38076954ceb3f1ae3190fe7882", + "@treeseed/sdk": "github:treeseed-ai/sdk#925ff8a531ab4880670cb6e5645a3ec744a87c4a", "@treeseed/ui": "github:treeseed-ai/ui#c64f2908a167383d057b83104b41dc03ea196757", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -9480,8 +9480,8 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.ai.20260807T065948Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#3defbae534109c38076954ceb3f1ae3190fe7882", - "integrity": "sha512-AICKVfUd7jSvu93Rl/UlX1RELbq92IVfwhtmpu808FChVnYe0u9EGgexzqaOWw+nAlu4eiIG0Mk2bXG+nJdVFg==", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#925ff8a531ab4880670cb6e5645a3ec744a87c4a", + "integrity": "sha512-x21xprEz957QnpqGr8A8DzkFhFPqfOKDbW27R11ckfpy1OZ23CNCIRD27h+XDz2G7TsP2nqVjeEU1vvsm4g5lQ==", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", @@ -18181,9 +18181,9 @@ "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.17", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.17.tgz", - "integrity": "sha512-xQLf0A3HOMlgHq0n247/LRuAOYmB7dXJ/DvAxGvsSBij45XtBSmQycu+F8ODbHwns/XyFZagyL1+J0Offw1E0g==", + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", "funding": [ { "type": "github", diff --git a/package.json b/package.json index a4adb004..2bd2b72a 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#c65f8500f9708916c56da2b0ae46666fb2b77b44", - "@treeseed/sdk": "github:treeseed-ai/sdk#3defbae534109c38076954ceb3f1ae3190fe7882", + "@treeseed/core": "github:treeseed-ai/core#de8f664eb9ae34dfcf092eac08cde027af28707d", + "@treeseed/sdk": "github:treeseed-ai/sdk#925ff8a531ab4880670cb6e5645a3ec744a87c4a", "@treeseed/ui": "github:treeseed-ai/ui#c64f2908a167383d057b83104b41dc03ea196757", "react": "^19.2.5", "react-dom": "^19.2.6" From e140c577ca100db4aa491dc65e08b7a352adf9ed Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Fri, 7 Aug 2026 15:29:37 -0400 Subject: [PATCH 102/315] build(build): fix standalone Astro component prop typing Intent: - Save hint: fix standalone Astro component prop typing Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.treedx-perf.20260805T075847Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/ui: github:treeseed-ai/ui#bc2d8ba09164cfb1e4bf9ce85a4222010eb29080 -> github:treeseed-ai/ui#8a836aaf3326f477d1aa6807d1da88da0a56d9d4 - dependencies.@treeseed/core: github:treeseed-ai/core#4390ddffd57f3d86f247800459bd1fdcef4b8db5 -> github:treeseed-ai/core#91fbcf5b289372a7f0796175b2db151c413339cf --- package-lock.json | 186 +++++++++++----------------------------------- package.json | 4 +- 2 files changed, 45 insertions(+), 145 deletions(-) diff --git a/package-lock.json b/package-lock.json index bda50d74..76b995db 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,9 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#4390ddffd57f3d86f247800459bd1fdcef4b8db5", + "@treeseed/core": "github:treeseed-ai/core#91fbcf5b289372a7f0796175b2db151c413339cf", "@treeseed/sdk": "github:treeseed-ai/sdk#0e4bf6ab8ce7756a596e60209c2b0cf367304258", - "@treeseed/ui": "github:treeseed-ai/ui#bc2d8ba09164cfb1e4bf9ce85a4222010eb29080", + "@treeseed/ui": "github:treeseed-ai/ui#8a836aaf3326f477d1aa6807d1da88da0a56d9d4", "react": "^19.2.5", "react-dom": "^19.2.6" }, @@ -6345,9 +6345,9 @@ } }, "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.27", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", - "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", "license": "MIT" }, "node_modules/@rollup/pluginutils": { @@ -7463,7 +7463,8 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.treedx-perf.20260805T075816Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#4390ddffd57f3d86f247800459bd1fdcef4b8db5", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#91fbcf5b289372a7f0796175b2db151c413339cf", + "integrity": "sha512-YOMwZrcUKAgkW50v/vTFZYltWA/UKDmEbj7bwb++lba92Wt9uPXLve/DNGKVarwmSMzhgUSS1c/YX0RBR0dNeg==", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7475,7 +7476,7 @@ "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", "@treeseed/sdk": "github:treeseed-ai/sdk#0e4bf6ab8ce7756a596e60209c2b0cf367304258", - "@treeseed/ui": "github:treeseed-ai/ui#bc2d8ba09164cfb1e4bf9ce85a4222010eb29080", + "@treeseed/ui": "github:treeseed-ai/ui#8a836aaf3326f477d1aa6807d1da88da0a56d9d4", "astro": "^5.6.1", "esbuild": "^0.28.0", "katex": "^0.16.22", @@ -9480,6 +9481,7 @@ "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.treedx-perf.20260805T073639Z", "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#0e4bf6ab8ce7756a596e60209c2b0cf367304258", + "integrity": "sha512-a/h2rv58PcZH5ZTrnbhLU4Is7H2Rv9pR6wooakR/96wNbYMXcUiGaJXk7SuTLcm6vR7kgj3QCNscnCUqvVKcmg==", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", @@ -10185,7 +10187,8 @@ }, "node_modules/@treeseed/ui": { "version": "0.12.18-dev.treedx-perf.20260806T042250Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#bc2d8ba09164cfb1e4bf9ce85a4222010eb29080", + "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#8a836aaf3326f477d1aa6807d1da88da0a56d9d4", + "integrity": "sha512-dbGYSkTNO+fCI8kIaoB6FKsVfh0dv3UZcLy4UXi8/GNgXyjeMkFBORfIUBl+S72sLfFux4ukCEZwhR3DLyPVrg==", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", @@ -12397,9 +12400,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001807", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001807.tgz", - "integrity": "sha512-daRXJ9EB/rdRgu7kV+TTl1YUKtlsMWblPl2sLnpg9DZae16QCegol6A1SmCE31Lm9mXC1sRWGt/krouH+/dl7Q==", + "version": "1.0.30001809", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001809.tgz", + "integrity": "sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ==", "funding": [ { "type": "opencollective", @@ -14520,9 +14523,9 @@ "license": "BSD-2-Clause" }, "node_modules/globby": { - "version": "16.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-16.2.2.tgz", - "integrity": "sha512-NLvV9ubZ6NDsJaOpKPy3cQeJpKi9DcWiyCiFUpJPA0YihRqiE6RWaLUmgNNPr8MgPpLZjnBjSmou7uZBRJv9wA==", + "version": "16.2.3", + "resolved": "https://registry.npmjs.org/globby/-/globby-16.2.3.tgz", + "integrity": "sha512-VZX7TV7jmd/pn71vdnLKtgwy1IWqc3KjI9x1/UtPkwoKk5fKrNLY30ltDe3cAM5xruIN7YuuaulFt133jRrKZg==", "license": "MIT", "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", @@ -15049,9 +15052,9 @@ } }, "node_modules/hono": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.13.0.tgz", - "integrity": "sha512-jhunvfHWxd7J5EFfSgH4xsYJzSe/lfqbUCxiyyeaQasUsXeEHXtzVid+7EOGByc5JnFa23SSFL3Y2RV/z1T+eQ==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.13.1.tgz", + "integrity": "sha512-kdJoFVv2xmayw6cY09H7AbMJMt8Jn5jdlEdXsP7AGBdF2DIptVlKlOLKXP41yPip4/a3yQPv9gVcJYI8YY04dw==", "license": "MIT", "engines": { "node": ">=16.9.0" @@ -15667,9 +15670,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", - "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz", + "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==", "funding": [ { "type": "github", @@ -17518,14 +17521,14 @@ } }, "node_modules/miniflare": { - "version": "5.20260801.0-alpha", - "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-5.20260801.0-alpha.tgz", - "integrity": "sha512-AfMrnQbJg81ESsGkGhOkHBtwTqCG+mosR+3GE+qDrhF1I/ieIvgg3ICxNyBvgHBZ3iapy6cysBQHNPykkzrfgw==", + "version": "5.20260801.1-alpha", + "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-5.20260801.1-alpha.tgz", + "integrity": "sha512-BHPVzIDA6mbx7LefxpvkXW7DHx9FKB9GorZatbnrrFTt3CVMU8zuUpbgyCuebwDKcTTOZos43ta8GQ0eMVEpxA==", "license": "MIT", "dependencies": { "@cspotcode/source-map-support": "0.8.1", "sharp": "0.35.2", - "undici": "7.28.0", + "undici": "7.29.0", "workerd": "1.20260801.1", "ws": "8.21.0", "youch": "4.1.0-beta.10" @@ -18178,9 +18181,9 @@ "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.17", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.17.tgz", - "integrity": "sha512-xQLf0A3HOMlgHq0n247/LRuAOYmB7dXJ/DvAxGvsSBij45XtBSmQycu+F8ODbHwns/XyFZagyL1+J0Offw1E0g==", + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", "funding": [ { "type": "github", @@ -19000,9 +19003,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.4.tgz", - "integrity": "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==", + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.5.tgz", + "integrity": "sha512-KvvtD7SrlBP7dlgkBghEE3r84CABm5SmV2aNcG4oCA+qDnJ/tvKonFVvwWAyyWUEwxuNawdfEAZKP9zM3oZ2Uw==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -21185,9 +21188,9 @@ "license": "0BSD" }, "node_modules/tsx": { - "version": "4.23.10", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.10.tgz", - "integrity": "sha512-0Vb9eKU47njkxv/6B8CRZRDsxNDT/Pz+BIU+M5jw7xL3TdzAjSxlZUxu0xFL/kLpaG3sHZ0LH2wbK1T1yo7CUQ==", + "version": "4.23.11", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.11.tgz", + "integrity": "sha512-Ry2oTEUnhBdeEdWIztY8kf3/nBGnPnjMLVGL0YfdRXMORuPER5NlKmayqxtxRxwB1xBN+RivRaJfe7PM1rtiyw==", "license": "MIT", "dependencies": { "esbuild": "~0.28.0" @@ -21309,9 +21312,9 @@ "license": "MIT" }, "node_modules/undici": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.28.0.tgz", - "integrity": "sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.29.0.tgz", + "integrity": "sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==", "license": "MIT", "engines": { "node": ">=20.18.1" @@ -22840,16 +22843,16 @@ } }, "node_modules/wrangler": { - "version": "4.119.0", - "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.119.0.tgz", - "integrity": "sha512-ookClf+zly4DTc8pBMNrwGQzZKH8IpIYTXkjDw3XS7ZvBQ5mLYH6eOvfD5BEpk3U63zTbv91WRlo1UeRSKXa0g==", + "version": "4.120.0", + "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.120.0.tgz", + "integrity": "sha512-cBmu/MeaB/fPacC0JpATs4duTOCagBxrZo+vBzuTX06tLzwSyAHE1drlHUZ8rP0VqVz1fy3ReGYTiHdKkoHltg==", "license": "MIT OR Apache-2.0", "dependencies": { "@cloudflare/kv-asset-handler": "0.5.0", "@cloudflare/unenv-preset": "2.16.1", "blake3-wasm": "2.1.5", "esbuild": "0.28.1", - "miniflare": "5.20260801.0-alpha", + "miniflare": "5.20260801.1-alpha", "path-to-regexp": "6.3.0", "unenv": "2.0.0-rc.24", "workerd": "1.20260801.1" @@ -23200,109 +23203,6 @@ "type": "github", "url": "https://github.com/sponsors/wooorm" } - }, - "node_modules/@astrojs/cloudflare": { - "version": "12.6.13", - "resolved": "https://registry.npmjs.org/@astrojs/cloudflare/-/cloudflare-12.6.13.tgz", - "integrity": "sha512-oKaCyiovyQr183r9U93787Ju1zwk+rRMgPnLTwCLckHmOUK7sltA1Gp4LSGt8oNMgqQS6jR7uRdfQ/NPul37QA==", - "license": "MIT", - "dependencies": { - "@astrojs/internal-helpers": "0.7.6", - "@astrojs/underscore-redirects": "1.0.0", - "@cloudflare/workers-types": "^4.20260116.0", - "tinyglobby": "^0.2.15", - "vite": "^6.4.1", - "wrangler": "4.59.2" - }, - "peerDependencies": { - "astro": "^5.7.0" - } - }, - "node_modules/@astrojs/mdx": { - "version": "4.3.14", - "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-4.3.14.tgz", - "integrity": "sha512-FBrqJQORVm+rkRa2TS5CjU9PBA6hkhrwLVBSS9A77gN2+iehvjq1w6yya/d0YKC7osiVorKkr3Qd9wNbl0ZkGA==", - "license": "MIT", - "dependencies": { - "@astrojs/markdown-remark": "6.3.11", - "@mdx-js/mdx": "^3.1.1", - "acorn": "^8.15.0", - "es-module-lexer": "^1.7.0", - "estree-util-visit": "^2.0.0", - "hast-util-to-html": "^9.0.5", - "piccolore": "^0.1.3", - "rehype-raw": "^7.0.0", - "remark-gfm": "^4.0.1", - "remark-smartypants": "^3.0.2", - "source-map": "^0.7.6", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.3" - }, - "engines": { - "node": "18.20.8 || ^20.3.0 || >=22.0.0" - }, - "peerDependencies": { - "astro": "^5.0.0" - } - }, - "node_modules/@vitejs/plugin-react": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", - "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.28.0", - "@babel/plugin-transform-react-jsx-self": "^7.27.1", - "@babel/plugin-transform-react-jsx-source": "^7.27.1", - "@rolldown/pluginutils": "1.0.0-beta.27", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.17.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" - } - }, - "node_modules/@astrojs/starlight": { - "version": "0.37.6", - "resolved": "https://registry.npmjs.org/@astrojs/starlight/-/starlight-0.37.6.tgz", - "integrity": "sha512-wQrKwH431q+8FsLBnNQeG+R36TMtEGxTQ2AuiVpcx9APcazvL3n7wVW8mMmYyxX0POjTnxlcWPkdMGR3Yj1L+w==", - "license": "MIT", - "dependencies": { - "@astrojs/markdown-remark": "^6.3.1", - "@astrojs/mdx": "^4.2.3", - "@astrojs/sitemap": "^3.3.0", - "@pagefind/default-ui": "^1.3.0", - "@types/hast": "^3.0.4", - "@types/js-yaml": "^4.0.9", - "@types/mdast": "^4.0.4", - "astro-expressive-code": "^0.41.1", - "bcp-47": "^2.1.0", - "hast-util-from-html": "^2.0.1", - "hast-util-select": "^6.0.2", - "hast-util-to-string": "^3.0.0", - "hastscript": "^9.0.0", - "i18next": "^23.11.5", - "js-yaml": "^4.1.0", - "klona": "^2.0.6", - "magic-string": "^0.30.17", - "mdast-util-directive": "^3.0.0", - "mdast-util-to-markdown": "^2.1.0", - "mdast-util-to-string": "^4.0.0", - "pagefind": "^1.3.0", - "rehype": "^13.0.1", - "rehype-format": "^5.0.0", - "remark-directive": "^3.0.0", - "ultrahtml": "^1.6.0", - "unified": "^11.0.5", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.2" - }, - "peerDependencies": { - "astro": "^5.5.0" - } } } } diff --git a/package.json b/package.json index 196f7b24..9bc2fe78 100644 --- a/package.json +++ b/package.json @@ -49,9 +49,9 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#4390ddffd57f3d86f247800459bd1fdcef4b8db5", + "@treeseed/core": "github:treeseed-ai/core#91fbcf5b289372a7f0796175b2db151c413339cf", "@treeseed/sdk": "github:treeseed-ai/sdk#0e4bf6ab8ce7756a596e60209c2b0cf367304258", - "@treeseed/ui": "github:treeseed-ai/ui#bc2d8ba09164cfb1e4bf9ce85a4222010eb29080", + "@treeseed/ui": "github:treeseed-ai/ui#8a836aaf3326f477d1aa6807d1da88da0a56d9d4", "react": "^19.2.5", "react-dom": "^19.2.6" }, From 3d3db6d48464cc36004ca9372e94694cd521efa9 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Fri, 7 Aug 2026 16:58:55 -0400 Subject: [PATCH 103/315] build(build): fix standalone Astro component prop typing Intent: - Save hint: fix standalone Astro component prop typing Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.treedx-perf.20260805T075847Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#0e4bf6ab8ce7756a596e60209c2b0cf367304258 -> github:treeseed-ai/sdk#0dff604411da0e035c9aafa2bf3eba9d33f13b6e - dependencies.@treeseed/core: github:treeseed-ai/core#91fbcf5b289372a7f0796175b2db151c413339cf -> github:treeseed-ai/core#f57e13f4326989e11a91890aa1078b578f63875f --- package-lock.json | 128 +++++++++++++++++++++++++++++++++++++++++----- package.json | 4 +- 2 files changed, 116 insertions(+), 16 deletions(-) diff --git a/package-lock.json b/package-lock.json index 76b995db..a79c198f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#91fbcf5b289372a7f0796175b2db151c413339cf", - "@treeseed/sdk": "github:treeseed-ai/sdk#0e4bf6ab8ce7756a596e60209c2b0cf367304258", + "@treeseed/core": "github:treeseed-ai/core#f57e13f4326989e11a91890aa1078b578f63875f", + "@treeseed/sdk": "github:treeseed-ai/sdk#0dff604411da0e035c9aafa2bf3eba9d33f13b6e", "@treeseed/ui": "github:treeseed-ai/ui#8a836aaf3326f477d1aa6807d1da88da0a56d9d4", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -6345,9 +6345,9 @@ } }, "node_modules/@rolldown/pluginutils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", "license": "MIT" }, "node_modules/@rollup/pluginutils": { @@ -7463,8 +7463,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.treedx-perf.20260805T075816Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#91fbcf5b289372a7f0796175b2db151c413339cf", - "integrity": "sha512-YOMwZrcUKAgkW50v/vTFZYltWA/UKDmEbj7bwb++lba92Wt9uPXLve/DNGKVarwmSMzhgUSS1c/YX0RBR0dNeg==", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#f57e13f4326989e11a91890aa1078b578f63875f", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7475,7 +7474,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#0e4bf6ab8ce7756a596e60209c2b0cf367304258", + "@treeseed/sdk": "github:treeseed-ai/sdk#0dff604411da0e035c9aafa2bf3eba9d33f13b6e", "@treeseed/ui": "github:treeseed-ai/ui#8a836aaf3326f477d1aa6807d1da88da0a56d9d4", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -9480,8 +9479,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.treedx-perf.20260805T073639Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#0e4bf6ab8ce7756a596e60209c2b0cf367304258", - "integrity": "sha512-a/h2rv58PcZH5ZTrnbhLU4Is7H2Rv9pR6wooakR/96wNbYMXcUiGaJXk7SuTLcm6vR7kgj3QCNscnCUqvVKcmg==", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#0dff604411da0e035c9aafa2bf3eba9d33f13b6e", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", @@ -10188,7 +10186,6 @@ "node_modules/@treeseed/ui": { "version": "0.12.18-dev.treedx-perf.20260806T042250Z", "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#8a836aaf3326f477d1aa6807d1da88da0a56d9d4", - "integrity": "sha512-dbGYSkTNO+fCI8kIaoB6FKsVfh0dv3UZcLy4UXi8/GNgXyjeMkFBORfIUBl+S72sLfFux4ukCEZwhR3DLyPVrg==", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", @@ -15670,9 +15667,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz", - "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", + "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", "funding": [ { "type": "github", @@ -23203,6 +23200,109 @@ "type": "github", "url": "https://github.com/sponsors/wooorm" } + }, + "node_modules/@astrojs/cloudflare": { + "version": "12.6.13", + "resolved": "https://registry.npmjs.org/@astrojs/cloudflare/-/cloudflare-12.6.13.tgz", + "integrity": "sha512-oKaCyiovyQr183r9U93787Ju1zwk+rRMgPnLTwCLckHmOUK7sltA1Gp4LSGt8oNMgqQS6jR7uRdfQ/NPul37QA==", + "license": "MIT", + "dependencies": { + "@astrojs/internal-helpers": "0.7.6", + "@astrojs/underscore-redirects": "1.0.0", + "@cloudflare/workers-types": "^4.20260116.0", + "tinyglobby": "^0.2.15", + "vite": "^6.4.1", + "wrangler": "4.59.2" + }, + "peerDependencies": { + "astro": "^5.7.0" + } + }, + "node_modules/@astrojs/mdx": { + "version": "4.3.14", + "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-4.3.14.tgz", + "integrity": "sha512-FBrqJQORVm+rkRa2TS5CjU9PBA6hkhrwLVBSS9A77gN2+iehvjq1w6yya/d0YKC7osiVorKkr3Qd9wNbl0ZkGA==", + "license": "MIT", + "dependencies": { + "@astrojs/markdown-remark": "6.3.11", + "@mdx-js/mdx": "^3.1.1", + "acorn": "^8.15.0", + "es-module-lexer": "^1.7.0", + "estree-util-visit": "^2.0.0", + "hast-util-to-html": "^9.0.5", + "piccolore": "^0.1.3", + "rehype-raw": "^7.0.0", + "remark-gfm": "^4.0.1", + "remark-smartypants": "^3.0.2", + "source-map": "^0.7.6", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.3" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + }, + "peerDependencies": { + "astro": "^5.0.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/@astrojs/starlight": { + "version": "0.37.6", + "resolved": "https://registry.npmjs.org/@astrojs/starlight/-/starlight-0.37.6.tgz", + "integrity": "sha512-wQrKwH431q+8FsLBnNQeG+R36TMtEGxTQ2AuiVpcx9APcazvL3n7wVW8mMmYyxX0POjTnxlcWPkdMGR3Yj1L+w==", + "license": "MIT", + "dependencies": { + "@astrojs/markdown-remark": "^6.3.1", + "@astrojs/mdx": "^4.2.3", + "@astrojs/sitemap": "^3.3.0", + "@pagefind/default-ui": "^1.3.0", + "@types/hast": "^3.0.4", + "@types/js-yaml": "^4.0.9", + "@types/mdast": "^4.0.4", + "astro-expressive-code": "^0.41.1", + "bcp-47": "^2.1.0", + "hast-util-from-html": "^2.0.1", + "hast-util-select": "^6.0.2", + "hast-util-to-string": "^3.0.0", + "hastscript": "^9.0.0", + "i18next": "^23.11.5", + "js-yaml": "^4.1.0", + "klona": "^2.0.6", + "magic-string": "^0.30.17", + "mdast-util-directive": "^3.0.0", + "mdast-util-to-markdown": "^2.1.0", + "mdast-util-to-string": "^4.0.0", + "pagefind": "^1.3.0", + "rehype": "^13.0.1", + "rehype-format": "^5.0.0", + "remark-directive": "^3.0.0", + "ultrahtml": "^1.6.0", + "unified": "^11.0.5", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.2" + }, + "peerDependencies": { + "astro": "^5.5.0" + } } } } diff --git a/package.json b/package.json index 9bc2fe78..e092ea3f 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#91fbcf5b289372a7f0796175b2db151c413339cf", - "@treeseed/sdk": "github:treeseed-ai/sdk#0e4bf6ab8ce7756a596e60209c2b0cf367304258", + "@treeseed/core": "github:treeseed-ai/core#f57e13f4326989e11a91890aa1078b578f63875f", + "@treeseed/sdk": "github:treeseed-ai/sdk#0dff604411da0e035c9aafa2bf3eba9d33f13b6e", "@treeseed/ui": "github:treeseed-ai/ui#8a836aaf3326f477d1aa6807d1da88da0a56d9d4", "react": "^19.2.5", "react-dom": "^19.2.6" From 7fa2198b1915986e091811cb9d657b6b2c9b6c6f Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Fri, 7 Aug 2026 17:58:24 -0400 Subject: [PATCH 104/315] chore(deps): update @treeseed/core and @treeseed/sdk pointers Changes: - Update package.json and package-lock.json to point to new commits for @treeseed/core and @treeseed/sdk. Dependency and pointer updates: - @treeseed/sdk: github:treeseed-ai/sdk#e8e5d575deb40ee3a9e40501edefc5e4e4a4785e -> github:treeseed-ai/sdk#951a53bc170ec595c3999aefd96b7248373d81f8 - @treeseed/core: github:treeseed-ai/core#88809b65356d501e5b62aac328d5f097e5331536 -> github:treeseed-ai/core#6229f7658af49630da58d0fac883681adbb3ea70 --- package-lock.json | 13 +++++-------- package.json | 4 ++-- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1762e087..828454f2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#88809b65356d501e5b62aac328d5f097e5331536", - "@treeseed/sdk": "github:treeseed-ai/sdk#e8e5d575deb40ee3a9e40501edefc5e4e4a4785e", + "@treeseed/core": "github:treeseed-ai/core#6229f7658af49630da58d0fac883681adbb3ea70", + "@treeseed/sdk": "github:treeseed-ai/sdk#951a53bc170ec595c3999aefd96b7248373d81f8", "@treeseed/ui": "github:treeseed-ai/ui#c64f2908a167383d057b83104b41dc03ea196757", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7463,8 +7463,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.staging.20260804T171000Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#88809b65356d501e5b62aac328d5f097e5331536", - "integrity": "sha512-dBxk0RpaYrykcb8CQfrRj+AhDEm3uHlaK/Kd7pQgiVFpE8AzyjEGnTBtFw3jb9/sGr61civHcClRcd+6LdOD8g==", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#6229f7658af49630da58d0fac883681adbb3ea70", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7475,7 +7474,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#e8e5d575deb40ee3a9e40501edefc5e4e4a4785e", + "@treeseed/sdk": "github:treeseed-ai/sdk#951a53bc170ec595c3999aefd96b7248373d81f8", "@treeseed/ui": "github:treeseed-ai/ui#c64f2908a167383d057b83104b41dc03ea196757", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -9480,8 +9479,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.staging.20260804T170912Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#e8e5d575deb40ee3a9e40501edefc5e4e4a4785e", - "integrity": "sha512-k09Lh1oqyVTTAhmn0v1o3Ec8leVWE5KxdQ2wXZZ06HG9LZ4VtsS7RnX+MO1t6uGZeK7+/lOO6B9XUFk0g/5Dig==", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#951a53bc170ec595c3999aefd96b7248373d81f8", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", @@ -10188,7 +10186,6 @@ "node_modules/@treeseed/ui": { "version": "0.12.18-dev.staging.20260804T170811Z", "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#c64f2908a167383d057b83104b41dc03ea196757", - "integrity": "sha512-spKVmxmvSyyhiIOndTk/dG0pQxoYm5ZHCZZYiYLJ5+vDorSLSRkFWt/Kx7CIrve1ANR7Yl/0fUA0YjtrGjlmJw==", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", diff --git a/package.json b/package.json index 01283c4a..6a5c2320 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#88809b65356d501e5b62aac328d5f097e5331536", - "@treeseed/sdk": "github:treeseed-ai/sdk#e8e5d575deb40ee3a9e40501edefc5e4e4a4785e", + "@treeseed/core": "github:treeseed-ai/core#6229f7658af49630da58d0fac883681adbb3ea70", + "@treeseed/sdk": "github:treeseed-ai/sdk#951a53bc170ec595c3999aefd96b7248373d81f8", "@treeseed/ui": "github:treeseed-ai/ui#c64f2908a167383d057b83104b41dc03ea196757", "react": "^19.2.5", "react-dom": "^19.2.6" From cfaa1740f827d0dad6e63887409453cc33004eb0 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Fri, 7 Aug 2026 18:52:47 -0400 Subject: [PATCH 105/315] build(build): register capacity control components in public UI catalog Intent: - Save hint: register capacity control components in public UI catalog Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.treedx-perf.20260805T075847Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/ui: github:treeseed-ai/ui#8a836aaf3326f477d1aa6807d1da88da0a56d9d4 -> github:treeseed-ai/ui#a1793dd77ed94ca5495a855892bb5569c8179aed - dependencies.@treeseed/core: github:treeseed-ai/core#f57e13f4326989e11a91890aa1078b578f63875f -> github:treeseed-ai/core#0259acd4ce15562ea2f7e1337f2b3bd9c84aea24 --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index a79c198f..0e3792d2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,9 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#f57e13f4326989e11a91890aa1078b578f63875f", + "@treeseed/core": "github:treeseed-ai/core#0259acd4ce15562ea2f7e1337f2b3bd9c84aea24", "@treeseed/sdk": "github:treeseed-ai/sdk#0dff604411da0e035c9aafa2bf3eba9d33f13b6e", - "@treeseed/ui": "github:treeseed-ai/ui#8a836aaf3326f477d1aa6807d1da88da0a56d9d4", + "@treeseed/ui": "github:treeseed-ai/ui#a1793dd77ed94ca5495a855892bb5569c8179aed", "react": "^19.2.5", "react-dom": "^19.2.6" }, @@ -7463,7 +7463,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.treedx-perf.20260805T075816Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#f57e13f4326989e11a91890aa1078b578f63875f", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#0259acd4ce15562ea2f7e1337f2b3bd9c84aea24", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7475,7 +7475,7 @@ "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", "@treeseed/sdk": "github:treeseed-ai/sdk#0dff604411da0e035c9aafa2bf3eba9d33f13b6e", - "@treeseed/ui": "github:treeseed-ai/ui#8a836aaf3326f477d1aa6807d1da88da0a56d9d4", + "@treeseed/ui": "github:treeseed-ai/ui#a1793dd77ed94ca5495a855892bb5569c8179aed", "astro": "^5.6.1", "esbuild": "^0.28.0", "katex": "^0.16.22", @@ -10185,7 +10185,7 @@ }, "node_modules/@treeseed/ui": { "version": "0.12.18-dev.treedx-perf.20260806T042250Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#8a836aaf3326f477d1aa6807d1da88da0a56d9d4", + "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#a1793dd77ed94ca5495a855892bb5569c8179aed", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", diff --git a/package.json b/package.json index e092ea3f..82fb59c7 100644 --- a/package.json +++ b/package.json @@ -49,9 +49,9 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#f57e13f4326989e11a91890aa1078b578f63875f", + "@treeseed/core": "github:treeseed-ai/core#0259acd4ce15562ea2f7e1337f2b3bd9c84aea24", "@treeseed/sdk": "github:treeseed-ai/sdk#0dff604411da0e035c9aafa2bf3eba9d33f13b6e", - "@treeseed/ui": "github:treeseed-ai/ui#8a836aaf3326f477d1aa6807d1da88da0a56d9d4", + "@treeseed/ui": "github:treeseed-ai/ui#a1793dd77ed94ca5495a855892bb5569c8179aed", "react": "^19.2.5", "react-dom": "^19.2.6" }, From 44377d845c675edb558fd86530802f3196573db8 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Fri, 7 Aug 2026 21:03:29 -0400 Subject: [PATCH 106/315] build(build): enforce complete atomic dependency lock resolution Intent: - Save hint: enforce complete atomic dependency lock resolution Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.treedx-perf.20260805T075847Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#0dff604411da0e035c9aafa2bf3eba9d33f13b6e -> github:treeseed-ai/sdk#7e4c485293777d02a59ea487f464e72599f806b0 - dependencies.@treeseed/core: github:treeseed-ai/core#0259acd4ce15562ea2f7e1337f2b3bd9c84aea24 -> github:treeseed-ai/core#705c74c08f36cdd2cc462d89eb2b7b04bf557847 --- package-lock.json | 42 +++++++++++++++++------------------------- package.json | 4 ++-- 2 files changed, 19 insertions(+), 27 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0e3792d2..fafecd08 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#0259acd4ce15562ea2f7e1337f2b3bd9c84aea24", - "@treeseed/sdk": "github:treeseed-ai/sdk#0dff604411da0e035c9aafa2bf3eba9d33f13b6e", + "@treeseed/core": "github:treeseed-ai/core#705c74c08f36cdd2cc462d89eb2b7b04bf557847", + "@treeseed/sdk": "github:treeseed-ai/sdk#7e4c485293777d02a59ea487f464e72599f806b0", "@treeseed/ui": "github:treeseed-ai/ui#a1793dd77ed94ca5495a855892bb5569c8179aed", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -1249,13 +1249,6 @@ "node": ">=16" } }, - "node_modules/@cloudflare/workers-types": { - "version": "5.20260804.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-5.20260804.1.tgz", - "integrity": "sha512-B1dwxpN6e5RZXZkE5zpZj+ooNeNZ1mwavLIyHDYe10ojhlGTwDfe8sAl7R1mMXc1cyIsbr+jKVdvmMEyVcdTdg==", - "extraneous": true, - "license": "MIT OR Apache-2.0" - }, "node_modules/@codemirror/autocomplete": { "version": "6.20.3", "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.20.3.tgz", @@ -6344,12 +6337,6 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.27", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", - "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", - "license": "MIT" - }, "node_modules/@rollup/pluginutils": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.4.0.tgz", @@ -7463,7 +7450,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.treedx-perf.20260805T075816Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#0259acd4ce15562ea2f7e1337f2b3bd9c84aea24", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#705c74c08f36cdd2cc462d89eb2b7b04bf557847", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7474,7 +7461,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#0dff604411da0e035c9aafa2bf3eba9d33f13b6e", + "@treeseed/sdk": "github:treeseed-ai/sdk#7e4c485293777d02a59ea487f464e72599f806b0", "@treeseed/ui": "github:treeseed-ai/ui#a1793dd77ed94ca5495a855892bb5569c8179aed", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -9479,7 +9466,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.treedx-perf.20260805T073639Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#0dff604411da0e035c9aafa2bf3eba9d33f13b6e", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#7e4c485293777d02a59ea487f464e72599f806b0", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", @@ -9609,13 +9596,6 @@ "node": ">=16" } }, - "node_modules/@treeseed/sdk/node_modules/@cloudflare/workers-types": { - "version": "4.20260702.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20260702.1.tgz", - "integrity": "sha512-mOhf5TUEB1m2vPrxtqoIGfz0fUC9xyxRDx5gWHy5s+OCo6dcV+g7wI1R7gYCMFohhqF/2y2xeKVwMwCJjfn/WA==", - "extraneous": true, - "license": "MIT OR Apache-2.0" - }, "node_modules/@treeseed/sdk/node_modules/@esbuild/aix-ppc64": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", @@ -20124,6 +20104,12 @@ "@rolldown/binding-win32-x64-msvc": "1.2.3" } }, + "node_modules/rolldown/node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "license": "MIT" + }, "node_modules/rollup": { "version": "4.62.4", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.4.tgz", @@ -23265,6 +23251,12 @@ "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "license": "MIT" + }, "node_modules/@astrojs/starlight": { "version": "0.37.6", "resolved": "https://registry.npmjs.org/@astrojs/starlight/-/starlight-0.37.6.tgz", diff --git a/package.json b/package.json index 82fb59c7..d82f3f7a 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#0259acd4ce15562ea2f7e1337f2b3bd9c84aea24", - "@treeseed/sdk": "github:treeseed-ai/sdk#0dff604411da0e035c9aafa2bf3eba9d33f13b6e", + "@treeseed/core": "github:treeseed-ai/core#705c74c08f36cdd2cc462d89eb2b7b04bf557847", + "@treeseed/sdk": "github:treeseed-ai/sdk#7e4c485293777d02a59ea487f464e72599f806b0", "@treeseed/ui": "github:treeseed-ai/ui#a1793dd77ed94ca5495a855892bb5569c8179aed", "react": "^19.2.5", "react-dom": "^19.2.6" From e9068de5534c6cbf299f00342ea580ab8fa7a88a Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Sat, 8 Aug 2026 00:46:10 -0400 Subject: [PATCH 107/315] build(deps): update dependencies Changes: - Update `package.json` and `package-lock.json` Dependency and pointer updates: - `@treeseed/core`: github:treeseed-ai/core#3f2f33c36bb803e879e9c9549389076d27bad168 -> github:treeseed-ai/core#e7de0a971aebb35e5a2315c5a432d872ab254861 --- package-lock.json | 16 ++++++++-------- package.json | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index d676e195..d5e145c9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#de8f664eb9ae34dfcf092eac08cde027af28707d", + "@treeseed/core": "github:treeseed-ai/core#e7de0a971aebb35e5a2315c5a432d872ab254861", "@treeseed/sdk": "github:treeseed-ai/sdk#925ff8a531ab4880670cb6e5645a3ec744a87c4a", "@treeseed/ui": "github:treeseed-ai/ui#c64f2908a167383d057b83104b41dc03ea196757", "react": "^19.2.5", @@ -1250,9 +1250,9 @@ } }, "node_modules/@cloudflare/workers-types": { - "version": "5.20260804.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-5.20260804.1.tgz", - "integrity": "sha512-B1dwxpN6e5RZXZkE5zpZj+ooNeNZ1mwavLIyHDYe10ojhlGTwDfe8sAl7R1mMXc1cyIsbr+jKVdvmMEyVcdTdg==", + "version": "5.20260808.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-5.20260808.1.tgz", + "integrity": "sha512-DN7G9SMyeOq031YhQexoExFAK78ms74cFiFF1teDlTK4+LjHgIc5Z8VbvXQtcCIP//o38btxzxW0b9MGPA83CA==", "extraneous": true, "license": "MIT OR Apache-2.0" }, @@ -7463,7 +7463,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.ai.20260807T070432Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#de8f664eb9ae34dfcf092eac08cde027af28707d", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#e7de0a971aebb35e5a2315c5a432d872ab254861", "integrity": "sha512-xlBKqbXKqSQpT5BLLaYBugljCuTEFPYsJ7XM5y2MoQBLE9fAwA46DcwskOsFFEP5q9QAqkXWFLN8Fp9OtZYPTQ==", "license": "AGPL-3.0-only", "dependencies": { @@ -19280,9 +19280,9 @@ } }, "node_modules/react-hook-form": { - "version": "7.84.0", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.84.0.tgz", - "integrity": "sha512-+hWvQP6GLco56mDwrbU4XnHix8t1z90ltZsDIrREl+jnQFQxYLX8oAzqe/Xn8nHpmoXTY5M6oEXrAhbP1qevNQ==", + "version": "7.85.0", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.85.0.tgz", + "integrity": "sha512-U2MTriFXnclmV4rOE20p2DcRFv5WEg3FIcBFOKcOLFHDVvGIMPvLTkTWefUsonmlaVy23khVDxDWym6uJVGOzw==", "license": "MIT", "engines": { "node": ">=18.0.0" diff --git a/package.json b/package.json index 2bd2b72a..54c88324 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#de8f664eb9ae34dfcf092eac08cde027af28707d", + "@treeseed/core": "github:treeseed-ai/core#e7de0a971aebb35e5a2315c5a432d872ab254861", "@treeseed/sdk": "github:treeseed-ai/sdk#925ff8a531ab4880670cb6e5645a3ec744a87c4a", "@treeseed/ui": "github:treeseed-ai/ui#c64f2908a167383d057b83104b41dc03ea196757", "react": "^19.2.5", From eb125840c041fbf5da71295b98ee88e476932d3d Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Sat, 8 Aug 2026 01:26:16 -0400 Subject: [PATCH 108/315] build(build): Allow updates to skip task-only packages absent Intent: - Save hint: Allow updates to skip task-only packages absent from source topology Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.ai.20260807T070845Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#925ff8a531ab4880670cb6e5645a3ec744a87c4a -> github:treeseed-ai/sdk#f698a46b70ce06ba5a76f45eaf6138180cf3c4d8 - dependencies.@treeseed/core: github:treeseed-ai/core#e7de0a971aebb35e5a2315c5a432d872ab254861 -> github:treeseed-ai/core#ff49d31c17962d685581d12766727a763d389aa9 --- package-lock.json | 12 ++++++------ package.json | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index d5e145c9..322b4cff 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#e7de0a971aebb35e5a2315c5a432d872ab254861", - "@treeseed/sdk": "github:treeseed-ai/sdk#925ff8a531ab4880670cb6e5645a3ec744a87c4a", + "@treeseed/core": "github:treeseed-ai/core#ff49d31c17962d685581d12766727a763d389aa9", + "@treeseed/sdk": "github:treeseed-ai/sdk#f698a46b70ce06ba5a76f45eaf6138180cf3c4d8", "@treeseed/ui": "github:treeseed-ai/ui#c64f2908a167383d057b83104b41dc03ea196757", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7463,8 +7463,8 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.ai.20260807T070432Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#e7de0a971aebb35e5a2315c5a432d872ab254861", - "integrity": "sha512-xlBKqbXKqSQpT5BLLaYBugljCuTEFPYsJ7XM5y2MoQBLE9fAwA46DcwskOsFFEP5q9QAqkXWFLN8Fp9OtZYPTQ==", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#ff49d31c17962d685581d12766727a763d389aa9", + "integrity": "sha512-IiDg4kwH1jtSj/xkwzM+HXpj9kehbDQMSzWb/eChk+lOcFd00i4EoX6Kq2LyrxusRiKiMXnu+Z7kaCvjotZ3+g==", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7475,7 +7475,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#925ff8a531ab4880670cb6e5645a3ec744a87c4a", + "@treeseed/sdk": "github:treeseed-ai/sdk#f698a46b70ce06ba5a76f45eaf6138180cf3c4d8", "@treeseed/ui": "github:treeseed-ai/ui#c64f2908a167383d057b83104b41dc03ea196757", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -9480,7 +9480,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.ai.20260807T065948Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#925ff8a531ab4880670cb6e5645a3ec744a87c4a", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#f698a46b70ce06ba5a76f45eaf6138180cf3c4d8", "integrity": "sha512-x21xprEz957QnpqGr8A8DzkFhFPqfOKDbW27R11ckfpy1OZ23CNCIRD27h+XDz2G7TsP2nqVjeEU1vvsm4g5lQ==", "license": "AGPL-3.0-only", "dependencies": { diff --git a/package.json b/package.json index 54c88324..e3c9ccfa 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#e7de0a971aebb35e5a2315c5a432d872ab254861", - "@treeseed/sdk": "github:treeseed-ai/sdk#925ff8a531ab4880670cb6e5645a3ec744a87c4a", + "@treeseed/core": "github:treeseed-ai/core#ff49d31c17962d685581d12766727a763d389aa9", + "@treeseed/sdk": "github:treeseed-ai/sdk#f698a46b70ce06ba5a76f45eaf6138180cf3c4d8", "@treeseed/ui": "github:treeseed-ai/ui#c64f2908a167383d057b83104b41dc03ea196757", "react": "^19.2.5", "react-dom": "^19.2.6" From d57937eae4d2e5e91a590c4fe960e88c6272e201 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Sat, 8 Aug 2026 01:45:14 -0400 Subject: [PATCH 109/315] build(build): Resolve SDK staging update conflicts Intent: - Save hint: Resolve SDK staging update conflicts Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.ai.20260807T070845Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#f698a46b70ce06ba5a76f45eaf6138180cf3c4d8 -> github:treeseed-ai/sdk#e364486a48f332795b48c98b68b6188467f251cf - dependencies.@treeseed/core: github:treeseed-ai/core#ff49d31c17962d685581d12766727a763d389aa9 -> github:treeseed-ai/core#c8264413ce0ed160841bcbdd1c659d4818ccfcd1 --- package-lock.json | 45 ++++++++++++++------------------------------- package.json | 4 ++-- 2 files changed, 16 insertions(+), 33 deletions(-) diff --git a/package-lock.json b/package-lock.json index 322b4cff..4d8f5134 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#ff49d31c17962d685581d12766727a763d389aa9", - "@treeseed/sdk": "github:treeseed-ai/sdk#f698a46b70ce06ba5a76f45eaf6138180cf3c4d8", + "@treeseed/core": "github:treeseed-ai/core#c8264413ce0ed160841bcbdd1c659d4818ccfcd1", + "@treeseed/sdk": "github:treeseed-ai/sdk#e364486a48f332795b48c98b68b6188467f251cf", "@treeseed/ui": "github:treeseed-ai/ui#c64f2908a167383d057b83104b41dc03ea196757", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -1249,13 +1249,6 @@ "node": ">=16" } }, - "node_modules/@cloudflare/workers-types": { - "version": "5.20260808.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-5.20260808.1.tgz", - "integrity": "sha512-DN7G9SMyeOq031YhQexoExFAK78ms74cFiFF1teDlTK4+LjHgIc5Z8VbvXQtcCIP//o38btxzxW0b9MGPA83CA==", - "extraneous": true, - "license": "MIT OR Apache-2.0" - }, "node_modules/@codemirror/autocomplete": { "version": "6.20.3", "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.20.3.tgz", @@ -6344,12 +6337,6 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", - "license": "MIT" - }, "node_modules/@rollup/pluginutils": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.4.0.tgz", @@ -7463,8 +7450,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.ai.20260807T070432Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#ff49d31c17962d685581d12766727a763d389aa9", - "integrity": "sha512-IiDg4kwH1jtSj/xkwzM+HXpj9kehbDQMSzWb/eChk+lOcFd00i4EoX6Kq2LyrxusRiKiMXnu+Z7kaCvjotZ3+g==", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#c8264413ce0ed160841bcbdd1c659d4818ccfcd1", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7475,7 +7461,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#f698a46b70ce06ba5a76f45eaf6138180cf3c4d8", + "@treeseed/sdk": "github:treeseed-ai/sdk#e364486a48f332795b48c98b68b6188467f251cf", "@treeseed/ui": "github:treeseed-ai/ui#c64f2908a167383d057b83104b41dc03ea196757", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -9480,8 +9466,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.ai.20260807T065948Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#f698a46b70ce06ba5a76f45eaf6138180cf3c4d8", - "integrity": "sha512-x21xprEz957QnpqGr8A8DzkFhFPqfOKDbW27R11ckfpy1OZ23CNCIRD27h+XDz2G7TsP2nqVjeEU1vvsm4g5lQ==", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#e364486a48f332795b48c98b68b6188467f251cf", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", @@ -9611,13 +9596,6 @@ "node": ">=16" } }, - "node_modules/@treeseed/sdk/node_modules/@cloudflare/workers-types": { - "version": "4.20260702.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20260702.1.tgz", - "integrity": "sha512-mOhf5TUEB1m2vPrxtqoIGfz0fUC9xyxRDx5gWHy5s+OCo6dcV+g7wI1R7gYCMFohhqF/2y2xeKVwMwCJjfn/WA==", - "extraneous": true, - "license": "MIT OR Apache-2.0" - }, "node_modules/@treeseed/sdk/node_modules/@esbuild/aix-ppc64": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", @@ -10188,7 +10166,6 @@ "node_modules/@treeseed/ui": { "version": "0.12.18-dev.staging.20260804T170811Z", "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#c64f2908a167383d057b83104b41dc03ea196757", - "integrity": "sha512-spKVmxmvSyyhiIOndTk/dG0pQxoYm5ZHCZZYiYLJ5+vDorSLSRkFWt/Kx7CIrve1ANR7Yl/0fUA0YjtrGjlmJw==", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", @@ -15670,9 +15647,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz", - "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", + "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", "funding": [ { "type": "github", @@ -20127,6 +20104,12 @@ "@rolldown/binding-win32-x64-msvc": "1.2.3" } }, + "node_modules/rolldown/node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "license": "MIT" + }, "node_modules/rollup": { "version": "4.62.4", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.4.tgz", diff --git a/package.json b/package.json index e3c9ccfa..a7625919 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#ff49d31c17962d685581d12766727a763d389aa9", - "@treeseed/sdk": "github:treeseed-ai/sdk#f698a46b70ce06ba5a76f45eaf6138180cf3c4d8", + "@treeseed/core": "github:treeseed-ai/core#c8264413ce0ed160841bcbdd1c659d4818ccfcd1", + "@treeseed/sdk": "github:treeseed-ai/sdk#e364486a48f332795b48c98b68b6188467f251cf", "@treeseed/ui": "github:treeseed-ai/ui#c64f2908a167383d057b83104b41dc03ea196757", "react": "^19.2.5", "react-dom": "^19.2.6" From ed6b92cf3b565afe79442be360dd5ee685576363 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Sat, 8 Aug 2026 01:54:09 -0400 Subject: [PATCH 110/315] build(build): Resolve Core staging update conflicts Intent: - Save hint: Resolve Core staging update conflicts Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.ai.20260807T070845Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/ui: github:treeseed-ai/ui#c64f2908a167383d057b83104b41dc03ea196757 -> github:treeseed-ai/ui#a1793dd77ed94ca5495a855892bb5569c8179aed - dependencies.@treeseed/core: github:treeseed-ai/core#c8264413ce0ed160841bcbdd1c659d4818ccfcd1 -> github:treeseed-ai/core#340122a95a264c40bde6aa6c81f0d394e0cb995a --- package-lock.json | 12 ++++++------ package.json | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4d8f5134..6ba0962c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,9 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#c8264413ce0ed160841bcbdd1c659d4818ccfcd1", + "@treeseed/core": "github:treeseed-ai/core#340122a95a264c40bde6aa6c81f0d394e0cb995a", "@treeseed/sdk": "github:treeseed-ai/sdk#e364486a48f332795b48c98b68b6188467f251cf", - "@treeseed/ui": "github:treeseed-ai/ui#c64f2908a167383d057b83104b41dc03ea196757", + "@treeseed/ui": "github:treeseed-ai/ui#a1793dd77ed94ca5495a855892bb5569c8179aed", "react": "^19.2.5", "react-dom": "^19.2.6" }, @@ -7450,7 +7450,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.ai.20260807T070432Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#c8264413ce0ed160841bcbdd1c659d4818ccfcd1", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#340122a95a264c40bde6aa6c81f0d394e0cb995a", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7462,7 +7462,7 @@ "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", "@treeseed/sdk": "github:treeseed-ai/sdk#e364486a48f332795b48c98b68b6188467f251cf", - "@treeseed/ui": "github:treeseed-ai/ui#c64f2908a167383d057b83104b41dc03ea196757", + "@treeseed/ui": "github:treeseed-ai/ui#a1793dd77ed94ca5495a855892bb5569c8179aed", "astro": "^5.6.1", "esbuild": "^0.28.0", "katex": "^0.16.22", @@ -10164,8 +10164,8 @@ } }, "node_modules/@treeseed/ui": { - "version": "0.12.18-dev.staging.20260804T170811Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#c64f2908a167383d057b83104b41dc03ea196757", + "version": "0.12.18-dev.treedx-perf.20260806T042250Z", + "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#a1793dd77ed94ca5495a855892bb5569c8179aed", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", diff --git a/package.json b/package.json index a7625919..0329afae 100644 --- a/package.json +++ b/package.json @@ -49,9 +49,9 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#c8264413ce0ed160841bcbdd1c659d4818ccfcd1", + "@treeseed/core": "github:treeseed-ai/core#340122a95a264c40bde6aa6c81f0d394e0cb995a", "@treeseed/sdk": "github:treeseed-ai/sdk#e364486a48f332795b48c98b68b6188467f251cf", - "@treeseed/ui": "github:treeseed-ai/ui#c64f2908a167383d057b83104b41dc03ea196757", + "@treeseed/ui": "github:treeseed-ai/ui#a1793dd77ed94ca5495a855892bb5569c8179aed", "react": "^19.2.5", "react-dom": "^19.2.6" }, From 125f60d59f9a46841cd439e02259de8632e84711 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Sat, 8 Aug 2026 02:44:45 -0400 Subject: [PATCH 111/315] build(build): sync package dependency references Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.ai.20260807T070845Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#e364486a48f332795b48c98b68b6188467f251cf -> github:treeseed-ai/sdk#fa498d44fb5c61235d13aef87e836884dd61cf82 - dependencies.@treeseed/core: github:treeseed-ai/core#340122a95a264c40bde6aa6c81f0d394e0cb995a -> github:treeseed-ai/core#4fc8533f15858b26cb47daa1f3a2625a409a4422 --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6ba0962c..6d9cb78a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#340122a95a264c40bde6aa6c81f0d394e0cb995a", - "@treeseed/sdk": "github:treeseed-ai/sdk#e364486a48f332795b48c98b68b6188467f251cf", + "@treeseed/core": "github:treeseed-ai/core#4fc8533f15858b26cb47daa1f3a2625a409a4422", + "@treeseed/sdk": "github:treeseed-ai/sdk#fa498d44fb5c61235d13aef87e836884dd61cf82", "@treeseed/ui": "github:treeseed-ai/ui#a1793dd77ed94ca5495a855892bb5569c8179aed", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7450,7 +7450,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.ai.20260807T070432Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#340122a95a264c40bde6aa6c81f0d394e0cb995a", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#4fc8533f15858b26cb47daa1f3a2625a409a4422", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7461,7 +7461,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#e364486a48f332795b48c98b68b6188467f251cf", + "@treeseed/sdk": "github:treeseed-ai/sdk#fa498d44fb5c61235d13aef87e836884dd61cf82", "@treeseed/ui": "github:treeseed-ai/ui#a1793dd77ed94ca5495a855892bb5569c8179aed", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -9466,7 +9466,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.ai.20260807T065948Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#e364486a48f332795b48c98b68b6188467f251cf", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#fa498d44fb5c61235d13aef87e836884dd61cf82", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index 0329afae..8d4226cd 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#340122a95a264c40bde6aa6c81f0d394e0cb995a", - "@treeseed/sdk": "github:treeseed-ai/sdk#e364486a48f332795b48c98b68b6188467f251cf", + "@treeseed/core": "github:treeseed-ai/core#4fc8533f15858b26cb47daa1f3a2625a409a4422", + "@treeseed/sdk": "github:treeseed-ai/sdk#fa498d44fb5c61235d13aef87e836884dd61cf82", "@treeseed/ui": "github:treeseed-ai/ui#a1793dd77ed94ca5495a855892bb5569c8179aed", "react": "^19.2.5", "react-dom": "^19.2.6" From 972690ace3bbdec0897e1f2f39d3df7c46064c96 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Sat, 8 Aug 2026 08:20:31 -0400 Subject: [PATCH 112/315] feat(admin): enable standalone site deployment and update documentation Changes: - Add `astro.config.ts` to support standalone site builds with custom output directory `.treeseed/app-dist`. - Update `README.md` to include instructions for running the standalone site and clarify the package's role as an administration portal. - Update `docs/treeseed.site.yaml` with new domain and URL configurations. - Add a new guarantee `deploy-standalone-admin-site.guarantee.yaml` to document the standalone deployment journey. - Update `package.json` and `package-lock.json` to downgrade `astro` from `^6.4.5` to `^5.6.1` and adjust peer dependencies. - Add `tests/contract/package/admin-package.test.ts` to cover package metadata. - Update `src/config.yaml`, `src/content.config.ts`, `src/manifest.yaml`, `treeseed.package.yaml`, and `treeseed.site.yaml`. Dependency and pointer updates: - @treeseed/sdk: github:treeseed-ai/sdk#fa498d44fb5c61235d13aef87e836884dd61cf82 -> github:treeseed-ai/sdk#3de64cac067330ede86875631459f9e20dbce1dc - @treeseed/core: github:treeseed-ai/core#4fc8533f15858b26cb47daa1f3a2625a409a4422 -> github:treeseed-ai/core#9a2bbcc14fd231928af7df3f67db16b0a7f6a53b --- README.md | 20 +- astro.config.ts | 13 + docs/treeseed.site.yaml | 8 +- ...eploy-standalone-admin-site.guarantee.yaml | 29 + package-lock.json | 4224 ++++++++--------- package.json | 15 +- public/logo.svg | 7 + src/config.yaml | 56 + src/content.config.ts | 7 + src/manifest.yaml | 32 + tests/contract/package/admin-package.test.ts | 19 + treeseed.package.yaml | 15 +- treeseed.site.yaml | 64 + 13 files changed, 2150 insertions(+), 2359 deletions(-) create mode 100644 astro.config.ts create mode 100644 guarantees/project/site/deploy-standalone-admin-site.guarantee.yaml create mode 100644 public/logo.svg create mode 100644 src/config.yaml create mode 100644 src/content.config.ts create mode 100644 src/manifest.yaml create mode 100644 treeseed.site.yaml diff --git a/README.md b/README.md index d5d5bec0..d5959625 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,28 @@ # @treeseed/admin -`@treeseed/admin` is the distributable AGPLv3 identity and team administration layer for Treeseed sites. Its rendered surface includes authentication, account management, team management, active-team selection, invitations, and public user/team knowledge profiles. +`@treeseed/admin` is the distributable AGPLv3 administration portal and independently deployable management site for Treeseed. Its rendered surface includes authentication, account and team management, projects, capacity, agent work, knowledge operations, and service connections. The removed pre-redesign surface is archived in the root [legacy route inventory](../../docs/legacy-routes.md). The redesign direction is described in [ui-redesign.md](../../docs/ui-redesign.md). -## Install and compose +## Run the standalone site + +The repository owns a root `treeseed.site.yaml` and can run without Market: + +```bash +npm run dev +npm run build:app +npm run preview +``` + +The app uses the open TreeSeed API through its configured HTTP connection. Runtime content comes from the team-scoped R2 overlay through TreeDX; the site does not require a checked-out content repository. The npm library output remains in `dist`, while the deployable Cloudflare application is built separately under `.treeseed/app-dist`. + +## Install and compose as a library ```bash npm install @treeseed/admin @treeseed/core @treeseed/ui @treeseed/sdk ``` -Add `@treeseed/admin/plugin` to the host `treeseed.site.yaml`, use the config helper from `@treeseed/admin/config`, and delegate host middleware to `@treeseed/admin/middleware`. Admin does not own a hostable site manifest; the host app owns deployment and environment configuration. +Add `@treeseed/admin/plugin` to another host's `treeseed.site.yaml`, use the config helper from `@treeseed/admin/config`, and delegate host middleware to `@treeseed/admin/middleware`. Market may consume these public package surfaces, but it is not the owner of Admin's standalone deployment. ## Current route surface @@ -52,4 +64,4 @@ npm test npm run release:verify ``` -`verify.yml`, the manual `release-gate.yml`, and `publish.yml` remain package-owned. Hosted deployment is suspended; the package must not contain a push-triggered `deploy.yml`. +`verify.yml`, the manual `release-gate.yml`, and `publish.yml` remain package-owned. Hosted deployment is suspended while the reviewed OpenTofu deployment design is completed; the package must not contain a push-triggered `deploy.yml`. diff --git a/astro.config.ts b/astro.config.ts new file mode 100644 index 00000000..b644d6e6 --- /dev/null +++ b/astro.config.ts @@ -0,0 +1,13 @@ +import { dirname } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const tenantRoot = dirname(fileURLToPath(import.meta.url)); +process.env.TREESEED_TENANT_ROOT = tenantRoot; +process.chdir(tenantRoot); + +const { createTenantSite } = await import('@treeseed/core/config'); + +export default { + ...createTenantSite(), + outDir: '.treeseed/app-dist', +}; diff --git a/docs/treeseed.site.yaml b/docs/treeseed.site.yaml index b8cfd61a..497b840a 100644 --- a/docs/treeseed.site.yaml +++ b/docs/treeseed.site.yaml @@ -1,6 +1,6 @@ name: TreeSeed Admin Knowledge Hub slug: treeseed-admin-docs -siteUrl: https://admin.treeseed.ai +siteUrl: https://admin.docs.treeseed.dev contactEmail: hello@treeseed.email hosting: kind: self_hosted_project @@ -24,15 +24,15 @@ surfaces: enabled: true provider: cloudflare rootDir: . - publicBaseUrl: https://admin.treeseed.ai + publicBaseUrl: https://admin.docs.treeseed.dev localBaseUrl: http://127.0.0.1:4321 local: runtime: local environments: staging: - domain: admin-docs-staging.treeseed.ai + domain: admin.docs.preview.treeseed.dev prod: - domain: admin.treeseed.ai + domain: admin.docs.treeseed.dev providers: agents: execution: codex diff --git a/guarantees/project/site/deploy-standalone-admin-site.guarantee.yaml b/guarantees/project/site/deploy-standalone-admin-site.guarantee.yaml new file mode 100644 index 00000000..795481d5 --- /dev/null +++ b/guarantees/project/site/deploy-standalone-admin-site.guarantee.yaml @@ -0,0 +1,29 @@ +schemaVersion: treeseed.guarantee/v1 +id: guarantee.project.site.deploy-standalone-admin-site.754 +journeyIndex: 754 +type: project +subtype: site +journey: Deploy standalone Admin site +ownerPackage: "@treeseed/admin" +surface: admin-ui +summary: Run Admin independently from Market against the public API and TreeDX-backed R2 content runtime. +status: planned +dependencies: { journeys: [], guarantees: [] } +actors: { allowed: [platform_admin], forbidden: [unauthorized_user] } +devices: { required: [desktop_chromium] } +gates: [future] +preconditions: + fixtures: [integrated_treeseed_project] + notes: [Hosted deployment remains suspended pending reviewed OpenTofu acceptance.] +api: + required: true + verifierRefs: [] +content: + required: true + verifierRefs: [] +audit: { required: false, verifierRefs: [] } +negativeCases: [] +evidence: { required: [guarantee_report] } +notes: + - Package metadata is covered by tests/contract/package/admin-package.test.ts and npm run release:verify. + - Activation still requires isolated GitHub and Cloudflare reconciliation, deployed route, API, and R2 overlay evidence. diff --git a/package-lock.json b/package-lock.json index 6d9cb78a..23a9c925 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#4fc8533f15858b26cb47daa1f3a2625a409a4422", - "@treeseed/sdk": "github:treeseed-ai/sdk#fa498d44fb5c61235d13aef87e836884dd61cf82", + "@treeseed/core": "github:treeseed-ai/core#9a2bbcc14fd231928af7df3f67db16b0a7f6a53b", + "@treeseed/sdk": "github:treeseed-ai/sdk#3de64cac067330ede86875631459f9e20dbce1dc", "@treeseed/ui": "github:treeseed-ai/ui#a1793dd77ed94ca5495a855892bb5569c8179aed", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -20,7 +20,7 @@ "@types/node": "^24.6.0", "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", - "astro": "^6.4.5", + "astro": "^5.6.1", "esbuild": "^0.28.0", "tsx": "^4.21.0", "typescript": "^5.9.3", @@ -30,7 +30,7 @@ "node": ">=22" }, "peerDependencies": { - "astro": "^5.0.0 || ^6.0.0" + "astro": "^5.0.0" } }, "node_modules/@alcalzone/ansi-tokenize": { @@ -770,15 +770,17 @@ } }, "node_modules/@astrojs/telemetry": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.3.2.tgz", - "integrity": "sha512-j8DNruA8ors99Al39RYZPJK4DC1bKkoNm93mAMuBhY9TCNC4R8n1q7ovFnJ5qhGh5Lsh7pa1gpQVpYpsJPeTHQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.3.0.tgz", + "integrity": "sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ==", "license": "MIT", "dependencies": { - "ci-info": "^4.4.0", + "ci-info": "^4.2.0", + "debug": "^4.4.0", + "dlv": "^1.1.3", "dset": "^3.1.4", - "is-docker": "^4.0.0", - "is-wsl": "^3.1.1", + "is-docker": "^3.0.0", + "is-wsl": "^3.1.0", "which-pm-runs": "^1.1.0" }, "engines": { @@ -1117,34 +1119,6 @@ "node": ">=18" } }, - "node_modules/@clack/core": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/@clack/core/-/core-1.4.3.tgz", - "integrity": "sha512-/kr3UWNtdJfxZtPgDqUOmG2pvwlmcLGheex5yiZKdwbzZJxhV+HMNR9QNmyY5cGwTNV6LrR7Jtp+KjhUAP1qBQ==", - "license": "MIT", - "dependencies": { - "fast-wrap-ansi": "^0.2.0", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 20.12.0" - } - }, - "node_modules/@clack/prompts": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-1.7.0.tgz", - "integrity": "sha512-y7/yvZ2TPAnR9+jnc00klvNNLkJiXFFrQA/hlLCcxA9a2A4zQIOimyFQ9XfwYKiGD1fb5GY8vbKIIgO8d5Tb2A==", - "license": "MIT", - "dependencies": { - "@clack/core": "1.4.3", - "fast-string-width": "^3.0.2", - "fast-wrap-ansi": "^0.2.0", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 20.12.0" - } - }, "node_modules/@cloudflare/kv-asset-handler": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.5.0.tgz", @@ -7024,33 +6998,6 @@ "@shikijs/types": "3.23.0" } }, - "node_modules/@shikijs/primitive": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.4.2.tgz", - "integrity": "sha512-l6fQQKsOMlz72n38fztmSgZ76MO6KSWuw8o+GJ+FhmqrpC9pIOJNQNXGgbb5yX2AwpzlEHwsaLPnk/8o4Fm+rA==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "4.4.2", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.5" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@shikijs/primitive/node_modules/@shikijs/types": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.4.2.tgz", - "integrity": "sha512-PFYitV4vpDr/iPCIhnHp+Q4ftic5N5VeNJ3KQ1O8gn3h2ar8qgwMAXF7tq4m1CWaMS60fV4VqF6vfnWH4F7vqQ==", - "license": "MIT", - "dependencies": { - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.5" - }, - "engines": { - "node": ">=20" - } - }, "node_modules/@shikijs/themes": { "version": "3.23.0", "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.23.0.tgz", @@ -7450,7 +7397,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.ai.20260807T070432Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#4fc8533f15858b26cb47daa1f3a2625a409a4422", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#9a2bbcc14fd231928af7df3f67db16b0a7f6a53b", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7461,7 +7408,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#fa498d44fb5c61235d13aef87e836884dd61cf82", + "@treeseed/sdk": "github:treeseed-ai/sdk#3de64cac067330ede86875631459f9e20dbce1dc", "@treeseed/ui": "github:treeseed-ai/ui#a1793dd77ed94ca5495a855892bb5569c8179aed", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -7646,24 +7593,6 @@ "astro": "^5.5.0" } }, - "node_modules/@treeseed/core/node_modules/@astrojs/telemetry": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.3.0.tgz", - "integrity": "sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ==", - "license": "MIT", - "dependencies": { - "ci-info": "^4.2.0", - "debug": "^4.4.0", - "dlv": "^1.1.3", - "dset": "^3.1.4", - "is-docker": "^3.0.0", - "is-wsl": "^3.1.0", - "which-pm-runs": "^1.1.0" - }, - "engines": { - "node": "18.20.8 || ^20.3.0 || >=22.0.0" - } - }, "node_modules/@treeseed/core/node_modules/@cloudflare/kv-asset-handler": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.4.2.tgz", @@ -8190,322 +8119,279 @@ "node": ">=18" } }, - "node_modules/@treeseed/core/node_modules/astro": { - "version": "5.18.2", - "resolved": "https://registry.npmjs.org/astro/-/astro-5.18.2.tgz", - "integrity": "sha512-TnFwLnAXty5MXKPDGuKXqK4AMBXG+FH6RUdK7Oyc3gyfNoFIthT+4eRbzOK43bdRlLaZuxgciDSjgtggZ3OtGQ==", - "license": "MIT", - "dependencies": { - "@astrojs/compiler": "^2.13.0", - "@astrojs/internal-helpers": "0.7.6", - "@astrojs/markdown-remark": "6.3.11", - "@astrojs/telemetry": "3.3.0", - "@capsizecss/unpack": "^4.0.0", - "@oslojs/encoding": "^1.1.0", - "@rollup/pluginutils": "^5.3.0", - "acorn": "^8.15.0", - "aria-query": "^5.3.2", - "axobject-query": "^4.1.0", - "boxen": "8.0.1", - "ci-info": "^4.3.1", - "clsx": "^2.1.1", - "common-ancestor-path": "^1.0.1", - "cookie": "^1.1.1", - "cssesc": "^3.0.0", - "debug": "^4.4.3", - "deterministic-object-hash": "^2.0.2", - "devalue": "^5.6.2", - "diff": "^8.0.3", - "dlv": "^1.1.3", - "dset": "^3.1.4", - "es-module-lexer": "^1.7.0", - "esbuild": "^0.27.3", - "estree-walker": "^3.0.3", - "flattie": "^1.1.1", - "fontace": "~0.4.0", - "github-slugger": "^2.0.0", - "html-escaper": "3.0.3", - "http-cache-semantics": "^4.2.0", - "import-meta-resolve": "^4.2.0", - "js-yaml": "^4.1.1", - "magic-string": "^0.30.21", - "magicast": "^0.5.1", - "mrmime": "^2.0.1", - "neotraverse": "^0.6.18", - "p-limit": "^6.2.0", - "p-queue": "^8.1.1", - "package-manager-detector": "^1.6.0", - "piccolore": "^0.1.3", - "picomatch": "^4.0.3", - "prompts": "^2.4.2", - "rehype": "^13.0.2", - "semver": "^7.7.3", - "shiki": "^3.21.0", - "smol-toml": "^1.6.0", - "svgo": "^4.0.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tsconfck": "^3.1.6", - "ultrahtml": "^1.6.0", - "unifont": "~0.7.3", - "unist-util-visit": "^5.0.0", - "unstorage": "^1.17.4", - "vfile": "^6.0.3", - "vite": "^6.4.1", - "vitefu": "^1.1.1", - "xxhash-wasm": "^1.1.0", - "yargs-parser": "^21.1.1", - "yocto-spinner": "^0.2.3", - "zod": "^3.25.76", - "zod-to-json-schema": "^3.25.1", - "zod-to-ts": "^1.2.0" - }, - "bin": { - "astro": "astro.js" - }, - "engines": { - "node": "18.20.8 || ^20.3.0 || >=22.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/astrodotbuild" - }, - "optionalDependencies": { - "sharp": "^0.34.0" - } + "node_modules/@treeseed/core/node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "license": "MIT" }, - "node_modules/@treeseed/core/node_modules/astro/node_modules/@esbuild/aix-ppc64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", - "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", - "cpu": [ - "ppc64" - ], + "node_modules/@treeseed/core/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, "license": "MIT", "optional": true, "os": [ - "aix" + "darwin" ], "engines": { - "node": ">=18" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/@treeseed/core/node_modules/astro/node_modules/@esbuild/android-arm": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", - "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", - "cpu": [ - "arm" - ], + "node_modules/@treeseed/core/node_modules/miniflare": { + "version": "4.20260114.0", + "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20260114.0.tgz", + "integrity": "sha512-QwHT7S6XqGdQxIvql1uirH/7/i3zDEt0B/YBXTYzMfJtVCR4+ue3KPkU+Bl0zMxvpgkvjh9+eCHhJbKEqya70A==", "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "@cspotcode/source-map-support": "0.8.1", + "sharp": "^0.34.5", + "undici": "7.14.0", + "workerd": "1.20260114.0", + "ws": "8.18.0", + "youch": "4.1.0-beta.10", + "zod": "^3.25.76" + }, + "bin": { + "miniflare": "bootstrap.js" + }, "engines": { - "node": ">=18" + "node": ">=18.0.0" } }, - "node_modules/@treeseed/core/node_modules/astro/node_modules/@esbuild/android-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", - "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } + "node_modules/@treeseed/core/node_modules/path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "license": "MIT" }, - "node_modules/@treeseed/core/node_modules/astro/node_modules/@esbuild/android-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", - "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "node_modules/@treeseed/core/node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "license": "BSD-3-Clause", "engines": { - "node": ">=18" + "node": ">= 12" } }, - "node_modules/@treeseed/core/node_modules/astro/node_modules/@esbuild/darwin-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", - "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", - "cpu": [ - "arm64" - ], + "node_modules/@treeseed/core/node_modules/undici": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.14.0.tgz", + "integrity": "sha512-Vqs8HTzjpQXZeXdpsfChQTlafcMQaaIwnGwLam1wudSSjlJeQ3bw1j+TLPePgrCnCpUXx7Ba5Pdpf5OBih62NQ==", "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], "engines": { - "node": ">=18" + "node": ">=20.18.1" } }, - "node_modules/@treeseed/core/node_modules/astro/node_modules/@esbuild/darwin-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", - "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", - "cpu": [ - "x64" - ], + "node_modules/@treeseed/core/node_modules/vite": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.3.tgz", + "integrity": "sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==", "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, "engines": { - "node": ">=18" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } } }, - "node_modules/@treeseed/core/node_modules/astro/node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", - "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", + "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", "cpu": [ - "arm64" + "ppc64" ], "license": "MIT", "optional": true, "os": [ - "freebsd" + "aix" ], "engines": { "node": ">=18" } }, - "node_modules/@treeseed/core/node_modules/astro/node_modules/@esbuild/freebsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", - "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", + "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", "cpu": [ - "x64" + "arm" ], "license": "MIT", "optional": true, "os": [ - "freebsd" + "android" ], "engines": { "node": ">=18" } }, - "node_modules/@treeseed/core/node_modules/astro/node_modules/@esbuild/linux-arm": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", - "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", + "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", "cpu": [ - "arm" + "arm64" ], "license": "MIT", "optional": true, "os": [ - "linux" + "android" ], "engines": { "node": ">=18" } }, - "node_modules/@treeseed/core/node_modules/astro/node_modules/@esbuild/linux-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", - "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", + "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", "cpu": [ - "arm64" + "x64" ], "license": "MIT", "optional": true, "os": [ - "linux" + "android" ], "engines": { "node": ">=18" } }, - "node_modules/@treeseed/core/node_modules/astro/node_modules/@esbuild/linux-ia32": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", - "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", + "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", "cpu": [ - "ia32" + "arm64" ], "license": "MIT", "optional": true, "os": [ - "linux" + "darwin" ], "engines": { "node": ">=18" } }, - "node_modules/@treeseed/core/node_modules/astro/node_modules/@esbuild/linux-loong64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", - "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", + "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", "cpu": [ - "loong64" + "x64" ], "license": "MIT", "optional": true, "os": [ - "linux" + "darwin" ], "engines": { "node": ">=18" } }, - "node_modules/@treeseed/core/node_modules/astro/node_modules/@esbuild/linux-mips64el": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", - "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", + "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", "cpu": [ - "mips64el" + "arm64" ], "license": "MIT", "optional": true, "os": [ - "linux" + "freebsd" ], "engines": { "node": ">=18" } }, - "node_modules/@treeseed/core/node_modules/astro/node_modules/@esbuild/linux-ppc64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", - "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", + "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", "cpu": [ - "ppc64" + "x64" ], "license": "MIT", "optional": true, "os": [ - "linux" + "freebsd" ], "engines": { "node": ">=18" } }, - "node_modules/@treeseed/core/node_modules/astro/node_modules/@esbuild/linux-riscv64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", - "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", + "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", "cpu": [ - "riscv64" + "arm" ], "license": "MIT", "optional": true, @@ -8516,12 +8402,12 @@ "node": ">=18" } }, - "node_modules/@treeseed/core/node_modules/astro/node_modules/@esbuild/linux-s390x": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", - "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", + "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", "cpu": [ - "s390x" + "arm64" ], "license": "MIT", "optional": true, @@ -8532,12 +8418,12 @@ "node": ">=18" } }, - "node_modules/@treeseed/core/node_modules/astro/node_modules/@esbuild/linux-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", - "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", + "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", "cpu": [ - "x64" + "ia32" ], "license": "MIT", "optional": true, @@ -8548,533 +8434,562 @@ "node": ">=18" } }, - "node_modules/@treeseed/core/node_modules/astro/node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", - "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", + "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", "cpu": [ - "arm64" + "loong64" ], "license": "MIT", "optional": true, "os": [ - "netbsd" + "linux" ], "engines": { "node": ">=18" } }, - "node_modules/@treeseed/core/node_modules/astro/node_modules/@esbuild/netbsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", - "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", + "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", "cpu": [ - "x64" + "mips64el" ], "license": "MIT", "optional": true, "os": [ - "netbsd" + "linux" ], "engines": { "node": ">=18" } }, - "node_modules/@treeseed/core/node_modules/astro/node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", - "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", + "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", "cpu": [ - "arm64" + "ppc64" ], "license": "MIT", "optional": true, "os": [ - "openbsd" + "linux" ], "engines": { "node": ">=18" } }, - "node_modules/@treeseed/core/node_modules/astro/node_modules/@esbuild/openbsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", - "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", + "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", "cpu": [ - "x64" + "riscv64" ], "license": "MIT", "optional": true, "os": [ - "openbsd" + "linux" ], "engines": { "node": ">=18" } }, - "node_modules/@treeseed/core/node_modules/astro/node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", - "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", + "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", "cpu": [ - "arm64" + "s390x" ], "license": "MIT", "optional": true, "os": [ - "openharmony" + "linux" ], "engines": { "node": ">=18" } }, - "node_modules/@treeseed/core/node_modules/astro/node_modules/@esbuild/sunos-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", - "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", + "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", "cpu": [ "x64" ], "license": "MIT", "optional": true, "os": [ - "sunos" + "linux" ], "engines": { "node": ">=18" } }, - "node_modules/@treeseed/core/node_modules/astro/node_modules/@esbuild/win32-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", - "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", + "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", "cpu": [ "arm64" ], "license": "MIT", "optional": true, "os": [ - "win32" + "netbsd" ], "engines": { "node": ">=18" } }, - "node_modules/@treeseed/core/node_modules/astro/node_modules/@esbuild/win32-ia32": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", - "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", + "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", "cpu": [ - "ia32" + "x64" ], "license": "MIT", "optional": true, "os": [ - "win32" + "netbsd" ], "engines": { "node": ">=18" } }, - "node_modules/@treeseed/core/node_modules/astro/node_modules/@esbuild/win32-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz", - "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", + "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", "cpu": [ - "x64" + "arm64" ], "license": "MIT", "optional": true, "os": [ - "win32" + "openbsd" ], "engines": { "node": ">=18" } }, - "node_modules/@treeseed/core/node_modules/astro/node_modules/esbuild": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz", - "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", - "hasInstallScript": true, + "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, + "optional": true, + "os": [ + "openbsd" + ], "engines": { "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.7", - "@esbuild/android-arm": "0.27.7", - "@esbuild/android-arm64": "0.27.7", - "@esbuild/android-x64": "0.27.7", - "@esbuild/darwin-arm64": "0.27.7", - "@esbuild/darwin-x64": "0.27.7", - "@esbuild/freebsd-arm64": "0.27.7", - "@esbuild/freebsd-x64": "0.27.7", - "@esbuild/linux-arm": "0.27.7", - "@esbuild/linux-arm64": "0.27.7", - "@esbuild/linux-ia32": "0.27.7", - "@esbuild/linux-loong64": "0.27.7", - "@esbuild/linux-mips64el": "0.27.7", - "@esbuild/linux-ppc64": "0.27.7", - "@esbuild/linux-riscv64": "0.27.7", - "@esbuild/linux-s390x": "0.27.7", - "@esbuild/linux-x64": "0.27.7", - "@esbuild/netbsd-arm64": "0.27.7", - "@esbuild/netbsd-x64": "0.27.7", - "@esbuild/openbsd-arm64": "0.27.7", - "@esbuild/openbsd-x64": "0.27.7", - "@esbuild/openharmony-arm64": "0.27.7", - "@esbuild/sunos-x64": "0.27.7", - "@esbuild/win32-arm64": "0.27.7", - "@esbuild/win32-ia32": "0.27.7", - "@esbuild/win32-x64": "0.27.7" } }, - "node_modules/@treeseed/core/node_modules/common-ancestor-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", - "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", - "license": "ISC" - }, - "node_modules/@treeseed/core/node_modules/es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", - "license": "MIT" - }, - "node_modules/@treeseed/core/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@treeseed/core/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, + "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], "license": "MIT", "optional": true, "os": [ - "darwin" + "sunos" ], "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=18" } }, - "node_modules/@treeseed/core/node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "node_modules/@treeseed/core/node_modules/miniflare": { - "version": "4.20260114.0", - "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20260114.0.tgz", - "integrity": "sha512-QwHT7S6XqGdQxIvql1uirH/7/i3zDEt0B/YBXTYzMfJtVCR4+ue3KPkU+Bl0zMxvpgkvjh9+eCHhJbKEqya70A==", + "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], "license": "MIT", - "dependencies": { - "@cspotcode/source-map-support": "0.8.1", - "sharp": "^0.34.5", - "undici": "7.14.0", - "workerd": "1.20260114.0", - "ws": "8.18.0", - "youch": "4.1.0-beta.10", - "zod": "^3.25.76" - }, - "bin": { - "miniflare": "bootstrap.js" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=18.0.0" + "node": ">=18" } }, - "node_modules/@treeseed/core/node_modules/p-limit": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-6.2.0.tgz", - "integrity": "sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==", + "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "yocto-queue": "^1.1.1" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@treeseed/core/node_modules/p-queue": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.1.1.tgz", - "integrity": "sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ==", + "node_modules/@treeseed/core/node_modules/vite/node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "hasInstallScript": true, "license": "MIT", - "dependencies": { - "eventemitter3": "^5.0.1", - "p-timeout": "^6.1.2" + "bin": { + "esbuild": "bin/esbuild" }, "engines": { "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" } }, - "node_modules/@treeseed/core/node_modules/p-timeout": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz", - "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==", - "license": "MIT", + "node_modules/@treeseed/core/node_modules/workerd": { + "version": "1.20260114.0", + "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20260114.0.tgz", + "integrity": "sha512-kTJ+jNdIllOzWuVA3NRQRvywP0T135zdCjAE2dAUY1BFbxM6fmMZV8BbskEoQ4hAODVQUfZQmyGctcwvVCKxFA==", + "hasInstallScript": true, + "license": "Apache-2.0", + "bin": { + "workerd": "bin/workerd" + }, "engines": { - "node": ">=14.16" + "node": ">=16" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "optionalDependencies": { + "@cloudflare/workerd-darwin-64": "1.20260114.0", + "@cloudflare/workerd-darwin-arm64": "1.20260114.0", + "@cloudflare/workerd-linux-64": "1.20260114.0", + "@cloudflare/workerd-linux-arm64": "1.20260114.0", + "@cloudflare/workerd-windows-64": "1.20260114.0" } }, - "node_modules/@treeseed/core/node_modules/path-to-regexp": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", - "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", - "license": "MIT" - }, - "node_modules/@treeseed/core/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@treeseed/core/node_modules/source-map": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", - "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">= 12" - } - }, - "node_modules/@treeseed/core/node_modules/undici": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.14.0.tgz", - "integrity": "sha512-Vqs8HTzjpQXZeXdpsfChQTlafcMQaaIwnGwLam1wudSSjlJeQ3bw1j+TLPePgrCnCpUXx7Ba5Pdpf5OBih62NQ==", - "license": "MIT", - "engines": { - "node": ">=20.18.1" - } - }, - "node_modules/@treeseed/core/node_modules/vite": { - "version": "6.4.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.3.tgz", - "integrity": "sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==", + "node_modules/@treeseed/core/node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.4.4", - "picomatch": "^4.0.2", - "postcss": "^8.5.3", - "rollup": "^4.34.9", - "tinyglobby": "^0.2.13" - }, - "bin": { - "vite": "bin/vite.js" - }, "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" + "node": ">=10.0.0" }, "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "jiti": ">=1.21.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { + "bufferutil": { "optional": true }, - "yaml": { + "utf-8-validate": { "optional": true } } }, - "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/aix-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", - "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], + "node_modules/@treeseed/sdk": { + "version": "0.12.63-dev.ai.20260807T065948Z", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#3de64cac067330ede86875631459f9e20dbce1dc", + "license": "AGPL-3.0-only", + "dependencies": { + "@github/copilot": "1.0.39", + "@github/copilot-language-server": "1.480.0", + "@github/copilot-sdk": "0.3.0", + "@remotion/bundler": "4.0.477", + "@remotion/renderer": "4.0.477", + "drizzle-orm": "^0.45.2", + "esbuild": "^0.28.0", + "extract-zip": "2.0.1", + "github-slugger": "^2.0.0", + "hono": "^4.8.2", + "ink": "^7.0.0", + "libsodium-wrappers": "0.7.15", + "libsodium-wrappers-sumo": "0.7.15", + "mdast-util-to-string": "^4.0.0", + "minisearch": "^7.2.0", + "octokit": "^5.0.3", + "pg": "^8.21.0", + "playwright": "^1.60.0", + "railway": "3.4.1", + "react": "^19.2.5", + "remark-mdx": "^3.1.1", + "remark-parse": "^11.0.0", + "remotion": "4.0.477", + "repomix": "^1.13.1", + "tar": "7.5.13", + "typescript": "^5.9.3", + "unified": "^11.0.5", + "wrangler": "4.86.0", + "yaml": "^2.8.1" + }, + "bin": { + "treeseed-content-publish": "dist/scripts/content/publish-content.js", + "treeseed-sdk-verify": "dist/scripts/verification/verify-driver.js" + }, "engines": { - "node": ">=18" + "node": ">=22" } }, - "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", - "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "node_modules/@treeseed/sdk/node_modules/@cloudflare/kv-asset-handler": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.4.2.tgz", + "integrity": "sha512-SIOD2DxrRRwQ+jgzlXCqoEFiKOFqaPjhnNTGKXSRLvp1HiOvapLaFG2kEr9dYQTYe8rKrd9uvDUzmAITeNyaHQ==", + "license": "MIT OR Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@treeseed/sdk/node_modules/@cloudflare/workerd-darwin-64": { + "version": "1.20260426.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20260426.1.tgz", + "integrity": "sha512-Ch7DqsmYzSQRTY87pZpsGsFVz9VVBnLPnCBOHxKt1HH25a7oMu1w1PbPWqVmE0VerCLsj/TScX7Ob3v6E14TZw==", "cpu": [ - "arm" + "x64" ], - "license": "MIT", + "license": "Apache-2.0", "optional": true, "os": [ - "android" + "darwin" ], "engines": { - "node": ">=18" + "node": ">=16" } }, - "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", - "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "node_modules/@treeseed/sdk/node_modules/@cloudflare/workerd-darwin-arm64": { + "version": "1.20260426.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20260426.1.tgz", + "integrity": "sha512-0m0U8vaPRH25SpKjbSyRql6gmPe4rCsETRV2WW0qBnuMdKNr5Vh5/Uez80xVrfiCCRMTULGeg63Nqg2vg6CDOA==", "cpu": [ "arm64" ], - "license": "MIT", + "license": "Apache-2.0", "optional": true, "os": [ - "android" + "darwin" ], "engines": { - "node": ">=18" + "node": ">=16" } }, - "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", - "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "node_modules/@treeseed/sdk/node_modules/@cloudflare/workerd-linux-64": { + "version": "1.20260426.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20260426.1.tgz", + "integrity": "sha512-C8LlC8uSYzg49y51n++75esxZmMp+Uz1OKHHA/4lkv6rjOTbcHQJuEwSLppjybVIXpv7A8MBhbu9iyCTvyv1mw==", "cpu": [ "x64" ], - "license": "MIT", + "license": "Apache-2.0", "optional": true, "os": [ - "android" + "linux" ], "engines": { - "node": ">=18" + "node": ">=16" } }, - "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", - "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "node_modules/@treeseed/sdk/node_modules/@cloudflare/workerd-linux-arm64": { + "version": "1.20260426.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20260426.1.tgz", + "integrity": "sha512-ESVp/OIFMAqjQsa8BOP2BQQz5Vpfv6ncN6lNnIuNeOgsISQBdYk+LA60bwQHMud9tvmnSYtONp1zkZ8OQz+x6w==", "cpu": [ "arm64" ], - "license": "MIT", + "license": "Apache-2.0", "optional": true, "os": [ - "darwin" + "linux" ], "engines": { - "node": ">=18" + "node": ">=16" } }, - "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", - "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "node_modules/@treeseed/sdk/node_modules/@cloudflare/workerd-windows-64": { + "version": "1.20260426.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20260426.1.tgz", + "integrity": "sha512-d3Xj/IjINRgNVwH+eKhpUn4xkkcEewbWXbOvBlapiirKWh5zl9m0Epi3qOqmjyRYK6MICqIGXg4qZBEt0lxudw==", "cpu": [ "x64" ], - "license": "MIT", + "license": "Apache-2.0", "optional": true, "os": [ - "darwin" + "win32" ], "engines": { - "node": ">=18" + "node": ">=16" } }, - "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", - "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "node_modules/@treeseed/sdk/node_modules/@esbuild/aix-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", "cpu": [ - "arm64" + "ppc64" ], "license": "MIT", "optional": true, "os": [ - "freebsd" + "aix" ], "engines": { "node": ">=18" } }, - "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", - "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "node_modules/@treeseed/sdk/node_modules/@esbuild/android-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", "cpu": [ - "x64" + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@treeseed/sdk/node_modules/@esbuild/android-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@treeseed/sdk/node_modules/@esbuild/android-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@treeseed/sdk/node_modules/@esbuild/darwin-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@treeseed/sdk/node_modules/@esbuild/darwin-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@treeseed/sdk/node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + "cpu": [ + "arm64" ], "license": "MIT", "optional": true, @@ -9085,10 +9000,26 @@ "node": ">=18" } }, - "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", - "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "node_modules/@treeseed/sdk/node_modules/@esbuild/freebsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@treeseed/sdk/node_modules/@esbuild/linux-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", "cpu": [ "arm" ], @@ -9101,10 +9032,10 @@ "node": ">=18" } }, - "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", - "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "node_modules/@treeseed/sdk/node_modules/@esbuild/linux-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", "cpu": [ "arm64" ], @@ -9117,10 +9048,10 @@ "node": ">=18" } }, - "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", - "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "node_modules/@treeseed/sdk/node_modules/@esbuild/linux-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", "cpu": [ "ia32" ], @@ -9133,10 +9064,10 @@ "node": ">=18" } }, - "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", - "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "node_modules/@treeseed/sdk/node_modules/@esbuild/linux-loong64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", "cpu": [ "loong64" ], @@ -9149,10 +9080,10 @@ "node": ">=18" } }, - "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", - "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "node_modules/@treeseed/sdk/node_modules/@esbuild/linux-mips64el": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", "cpu": [ "mips64el" ], @@ -9165,10 +9096,10 @@ "node": ">=18" } }, - "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", - "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "node_modules/@treeseed/sdk/node_modules/@esbuild/linux-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", "cpu": [ "ppc64" ], @@ -9181,10 +9112,10 @@ "node": ">=18" } }, - "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", - "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "node_modules/@treeseed/sdk/node_modules/@esbuild/linux-riscv64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", "cpu": [ "riscv64" ], @@ -9197,10 +9128,10 @@ "node": ">=18" } }, - "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", - "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "node_modules/@treeseed/sdk/node_modules/@esbuild/linux-s390x": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", "cpu": [ "s390x" ], @@ -9213,10 +9144,10 @@ "node": ">=18" } }, - "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", - "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "node_modules/@treeseed/sdk/node_modules/@esbuild/linux-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", "cpu": [ "x64" ], @@ -9229,10 +9160,10 @@ "node": ">=18" } }, - "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", - "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "node_modules/@treeseed/sdk/node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", "cpu": [ "arm64" ], @@ -9245,10 +9176,10 @@ "node": ">=18" } }, - "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", - "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "node_modules/@treeseed/sdk/node_modules/@esbuild/netbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", "cpu": [ "x64" ], @@ -9261,10 +9192,10 @@ "node": ">=18" } }, - "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", - "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "node_modules/@treeseed/sdk/node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", "cpu": [ "arm64" ], @@ -9277,10 +9208,10 @@ "node": ">=18" } }, - "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", - "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "node_modules/@treeseed/sdk/node_modules/@esbuild/openbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", "cpu": [ "x64" ], @@ -9293,10 +9224,10 @@ "node": ">=18" } }, - "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", - "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "node_modules/@treeseed/sdk/node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", "cpu": [ "arm64" ], @@ -9309,10 +9240,10 @@ "node": ">=18" } }, - "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", - "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "node_modules/@treeseed/sdk/node_modules/@esbuild/sunos-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", "cpu": [ "x64" ], @@ -9325,10 +9256,10 @@ "node": ">=18" } }, - "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", - "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "node_modules/@treeseed/sdk/node_modules/@esbuild/win32-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", "cpu": [ "arm64" ], @@ -9341,10 +9272,10 @@ "node": ">=18" } }, - "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", - "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "node_modules/@treeseed/sdk/node_modules/@esbuild/win32-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", "cpu": [ "ia32" ], @@ -9357,10 +9288,10 @@ "node": ">=18" } }, - "node_modules/@treeseed/core/node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", - "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "node_modules/@treeseed/sdk/node_modules/@esbuild/win32-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", "cpu": [ "x64" ], @@ -9373,51 +9304,45 @@ "node": ">=18" } }, - "node_modules/@treeseed/core/node_modules/vite/node_modules/esbuild": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", - "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", - "hasInstallScript": true, + "node_modules/@treeseed/sdk/node_modules/miniflare": { + "version": "4.20260426.0", + "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20260426.0.tgz", + "integrity": "sha512-KM+v76d04qT+NsPfVKVQEgnnuLNE3uzCCl2QKMTJ5OXor5JbBm1vpkQwQ+l7o5ELCrZ74RnyKhJKLiJyUA39Tw==", "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.12", - "@esbuild/android-arm": "0.25.12", - "@esbuild/android-arm64": "0.25.12", - "@esbuild/android-x64": "0.25.12", - "@esbuild/darwin-arm64": "0.25.12", - "@esbuild/darwin-x64": "0.25.12", - "@esbuild/freebsd-arm64": "0.25.12", - "@esbuild/freebsd-x64": "0.25.12", - "@esbuild/linux-arm": "0.25.12", - "@esbuild/linux-arm64": "0.25.12", - "@esbuild/linux-ia32": "0.25.12", - "@esbuild/linux-loong64": "0.25.12", - "@esbuild/linux-mips64el": "0.25.12", - "@esbuild/linux-ppc64": "0.25.12", - "@esbuild/linux-riscv64": "0.25.12", - "@esbuild/linux-s390x": "0.25.12", - "@esbuild/linux-x64": "0.25.12", - "@esbuild/netbsd-arm64": "0.25.12", - "@esbuild/netbsd-x64": "0.25.12", - "@esbuild/openbsd-arm64": "0.25.12", - "@esbuild/openbsd-x64": "0.25.12", - "@esbuild/openharmony-arm64": "0.25.12", - "@esbuild/sunos-x64": "0.25.12", - "@esbuild/win32-arm64": "0.25.12", - "@esbuild/win32-ia32": "0.25.12", - "@esbuild/win32-x64": "0.25.12" + "dependencies": { + "@cspotcode/source-map-support": "0.8.1", + "sharp": "^0.34.5", + "undici": "7.24.8", + "workerd": "1.20260426.1", + "ws": "8.18.0", + "youch": "4.1.0-beta.10" + }, + "bin": { + "miniflare": "bootstrap.js" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@treeseed/core/node_modules/workerd": { - "version": "1.20260114.0", - "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20260114.0.tgz", - "integrity": "sha512-kTJ+jNdIllOzWuVA3NRQRvywP0T135zdCjAE2dAUY1BFbxM6fmMZV8BbskEoQ4hAODVQUfZQmyGctcwvVCKxFA==", + "node_modules/@treeseed/sdk/node_modules/path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "license": "MIT" + }, + "node_modules/@treeseed/sdk/node_modules/undici": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.8.tgz", + "integrity": "sha512-6KQ/+QxK49Z/p3HO6E5ZCZWNnCasyZLa5ExaVYyvPxUwKtbCPMKELJOqh7EqOle0t9cH/7d2TaaTRRa6Nhs4YQ==", + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/@treeseed/sdk/node_modules/workerd": { + "version": "1.20260426.1", + "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20260426.1.tgz", + "integrity": "sha512-ELvGgN8c9oo+E6EPyecxk1TEf6/eAK4TxxQTW5mQ87C7jbjCzhMbg0P2ije49UBHV0dkBYPJcJvcklUltipl2A==", "hasInstallScript": true, "license": "Apache-2.0", "bin": { @@ -9427,14 +9352,89 @@ "node": ">=16" }, "optionalDependencies": { - "@cloudflare/workerd-darwin-64": "1.20260114.0", - "@cloudflare/workerd-darwin-arm64": "1.20260114.0", - "@cloudflare/workerd-linux-64": "1.20260114.0", - "@cloudflare/workerd-linux-arm64": "1.20260114.0", - "@cloudflare/workerd-windows-64": "1.20260114.0" + "@cloudflare/workerd-darwin-64": "1.20260426.1", + "@cloudflare/workerd-darwin-arm64": "1.20260426.1", + "@cloudflare/workerd-linux-64": "1.20260426.1", + "@cloudflare/workerd-linux-arm64": "1.20260426.1", + "@cloudflare/workerd-windows-64": "1.20260426.1" } }, - "node_modules/@treeseed/core/node_modules/ws": { + "node_modules/@treeseed/sdk/node_modules/wrangler": { + "version": "4.86.0", + "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.86.0.tgz", + "integrity": "sha512-9aa/gbF/HiUeeUEwyQpW5LDPBEzyt7iaE6xHwm0vk2Ly8A6J+jh03pzchqVnCCWR832mNyA28MD8oAYt0Kfvlw==", + "license": "MIT OR Apache-2.0", + "dependencies": { + "@cloudflare/kv-asset-handler": "0.4.2", + "@cloudflare/unenv-preset": "2.16.1", + "blake3-wasm": "2.1.5", + "esbuild": "0.27.3", + "miniflare": "4.20260426.0", + "path-to-regexp": "6.3.0", + "unenv": "2.0.0-rc.24", + "workerd": "1.20260426.1" + }, + "bin": { + "wrangler": "bin/wrangler.js", + "wrangler2": "bin/wrangler.js" + }, + "engines": { + "node": ">=20.3.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@cloudflare/workers-types": "^4.20260426.1" + }, + "peerDependenciesMeta": { + "@cloudflare/workers-types": { + "optional": true + } + } + }, + "node_modules/@treeseed/sdk/node_modules/wrangler/node_modules/esbuild": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" + } + }, + "node_modules/@treeseed/sdk/node_modules/ws": { "version": "8.18.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", @@ -9455,769 +9455,61 @@ } } }, - "node_modules/@treeseed/core/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/@treeseed/sdk": { - "version": "0.12.63-dev.ai.20260807T065948Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#fa498d44fb5c61235d13aef87e836884dd61cf82", - "license": "AGPL-3.0-only", + "node_modules/@treeseed/ui": { + "version": "0.12.18-dev.treedx-perf.20260806T042250Z", + "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#a1793dd77ed94ca5495a855892bb5569c8179aed", + "license": "Apache-2.0", "dependencies": { - "@github/copilot": "1.0.39", - "@github/copilot-language-server": "1.480.0", - "@github/copilot-sdk": "0.3.0", - "@remotion/bundler": "4.0.477", - "@remotion/renderer": "4.0.477", - "drizzle-orm": "^0.45.2", - "esbuild": "^0.28.0", - "extract-zip": "2.0.1", - "github-slugger": "^2.0.0", - "hono": "^4.8.2", - "ink": "^7.0.0", - "libsodium-wrappers": "0.7.15", - "libsodium-wrappers-sumo": "0.7.15", - "mdast-util-to-string": "^4.0.0", - "minisearch": "^7.2.0", - "octokit": "^5.0.3", - "pg": "^8.21.0", - "playwright": "^1.60.0", - "railway": "3.4.1", - "react": "^19.2.5", - "remark-mdx": "^3.1.1", + "@codemirror/lang-markdown": "^6.5.0", + "@codemirror/language": "^6.12.3", + "@codemirror/view": "^6.43.0", + "@lezer/highlight": "^1.2.3", + "@mdxeditor/editor": "^4.0.2", + "codemirror": "^6.0.2", + "rehype-stringify": "^10.0.1", + "remark-gfm": "^4.0.1", "remark-parse": "^11.0.0", - "remotion": "4.0.477", - "repomix": "^1.13.1", - "tar": "7.5.13", - "typescript": "^5.9.3", + "remark-rehype": "^11.1.2", "unified": "^11.0.5", - "wrangler": "4.86.0", "yaml": "^2.8.1" }, - "bin": { - "treeseed-content-publish": "dist/scripts/content/publish-content.js", - "treeseed-sdk-verify": "dist/scripts/verification/verify-driver.js" - }, "engines": { "node": ">=22" + }, + "peerDependencies": { + "astro": "^5.0.0 || ^6.0.0", + "react": "^18.3.0 || ^19.0.0", + "react-dom": "^18.3.0 || ^19.0.0", + "recharts": "^3.0.0" } }, - "node_modules/@treeseed/sdk/node_modules/@cloudflare/kv-asset-handler": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.4.2.tgz", - "integrity": "sha512-SIOD2DxrRRwQ+jgzlXCqoEFiKOFqaPjhnNTGKXSRLvp1HiOvapLaFG2kEr9dYQTYe8rKrd9uvDUzmAITeNyaHQ==", - "license": "MIT OR Apache-2.0", - "engines": { - "node": ">=18.0.0" + "node_modules/@tybys/wasm-util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", + "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" } }, - "node_modules/@treeseed/sdk/node_modules/@cloudflare/workerd-darwin-64": { - "version": "1.20260426.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20260426.1.tgz", - "integrity": "sha512-Ch7DqsmYzSQRTY87pZpsGsFVz9VVBnLPnCBOHxKt1HH25a7oMu1w1PbPWqVmE0VerCLsj/TScX7Ob3v6E14TZw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=16" - } - }, - "node_modules/@treeseed/sdk/node_modules/@cloudflare/workerd-darwin-arm64": { - "version": "1.20260426.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20260426.1.tgz", - "integrity": "sha512-0m0U8vaPRH25SpKjbSyRql6gmPe4rCsETRV2WW0qBnuMdKNr5Vh5/Uez80xVrfiCCRMTULGeg63Nqg2vg6CDOA==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=16" - } - }, - "node_modules/@treeseed/sdk/node_modules/@cloudflare/workerd-linux-64": { - "version": "1.20260426.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20260426.1.tgz", - "integrity": "sha512-C8LlC8uSYzg49y51n++75esxZmMp+Uz1OKHHA/4lkv6rjOTbcHQJuEwSLppjybVIXpv7A8MBhbu9iyCTvyv1mw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=16" - } - }, - "node_modules/@treeseed/sdk/node_modules/@cloudflare/workerd-linux-arm64": { - "version": "1.20260426.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20260426.1.tgz", - "integrity": "sha512-ESVp/OIFMAqjQsa8BOP2BQQz5Vpfv6ncN6lNnIuNeOgsISQBdYk+LA60bwQHMud9tvmnSYtONp1zkZ8OQz+x6w==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=16" - } - }, - "node_modules/@treeseed/sdk/node_modules/@cloudflare/workerd-windows-64": { - "version": "1.20260426.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20260426.1.tgz", - "integrity": "sha512-d3Xj/IjINRgNVwH+eKhpUn4xkkcEewbWXbOvBlapiirKWh5zl9m0Epi3qOqmjyRYK6MICqIGXg4qZBEt0lxudw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=16" - } - }, - "node_modules/@treeseed/sdk/node_modules/@esbuild/aix-ppc64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", - "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@treeseed/sdk/node_modules/@esbuild/android-arm": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", - "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@treeseed/sdk/node_modules/@esbuild/android-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", - "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@treeseed/sdk/node_modules/@esbuild/android-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", - "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@treeseed/sdk/node_modules/@esbuild/darwin-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", - "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@treeseed/sdk/node_modules/@esbuild/darwin-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", - "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@treeseed/sdk/node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", - "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@treeseed/sdk/node_modules/@esbuild/freebsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", - "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@treeseed/sdk/node_modules/@esbuild/linux-arm": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", - "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@treeseed/sdk/node_modules/@esbuild/linux-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", - "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@treeseed/sdk/node_modules/@esbuild/linux-ia32": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", - "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@treeseed/sdk/node_modules/@esbuild/linux-loong64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", - "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@treeseed/sdk/node_modules/@esbuild/linux-mips64el": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", - "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", - "cpu": [ - "mips64el" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@treeseed/sdk/node_modules/@esbuild/linux-ppc64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", - "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@treeseed/sdk/node_modules/@esbuild/linux-riscv64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", - "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@treeseed/sdk/node_modules/@esbuild/linux-s390x": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", - "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@treeseed/sdk/node_modules/@esbuild/linux-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", - "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@treeseed/sdk/node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", - "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@treeseed/sdk/node_modules/@esbuild/netbsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", - "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@treeseed/sdk/node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", - "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@treeseed/sdk/node_modules/@esbuild/openbsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", - "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@treeseed/sdk/node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", - "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@treeseed/sdk/node_modules/@esbuild/sunos-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", - "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@treeseed/sdk/node_modules/@esbuild/win32-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", - "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@treeseed/sdk/node_modules/@esbuild/win32-ia32": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", - "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@treeseed/sdk/node_modules/@esbuild/win32-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", - "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@treeseed/sdk/node_modules/miniflare": { - "version": "4.20260426.0", - "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20260426.0.tgz", - "integrity": "sha512-KM+v76d04qT+NsPfVKVQEgnnuLNE3uzCCl2QKMTJ5OXor5JbBm1vpkQwQ+l7o5ELCrZ74RnyKhJKLiJyUA39Tw==", - "license": "MIT", - "dependencies": { - "@cspotcode/source-map-support": "0.8.1", - "sharp": "^0.34.5", - "undici": "7.24.8", - "workerd": "1.20260426.1", - "ws": "8.18.0", - "youch": "4.1.0-beta.10" - }, - "bin": { - "miniflare": "bootstrap.js" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@treeseed/sdk/node_modules/path-to-regexp": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", - "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", - "license": "MIT" - }, - "node_modules/@treeseed/sdk/node_modules/undici": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.8.tgz", - "integrity": "sha512-6KQ/+QxK49Z/p3HO6E5ZCZWNnCasyZLa5ExaVYyvPxUwKtbCPMKELJOqh7EqOle0t9cH/7d2TaaTRRa6Nhs4YQ==", - "license": "MIT", - "engines": { - "node": ">=20.18.1" - } - }, - "node_modules/@treeseed/sdk/node_modules/workerd": { - "version": "1.20260426.1", - "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20260426.1.tgz", - "integrity": "sha512-ELvGgN8c9oo+E6EPyecxk1TEf6/eAK4TxxQTW5mQ87C7jbjCzhMbg0P2ije49UBHV0dkBYPJcJvcklUltipl2A==", - "hasInstallScript": true, - "license": "Apache-2.0", - "bin": { - "workerd": "bin/workerd" - }, - "engines": { - "node": ">=16" - }, - "optionalDependencies": { - "@cloudflare/workerd-darwin-64": "1.20260426.1", - "@cloudflare/workerd-darwin-arm64": "1.20260426.1", - "@cloudflare/workerd-linux-64": "1.20260426.1", - "@cloudflare/workerd-linux-arm64": "1.20260426.1", - "@cloudflare/workerd-windows-64": "1.20260426.1" - } - }, - "node_modules/@treeseed/sdk/node_modules/wrangler": { - "version": "4.86.0", - "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.86.0.tgz", - "integrity": "sha512-9aa/gbF/HiUeeUEwyQpW5LDPBEzyt7iaE6xHwm0vk2Ly8A6J+jh03pzchqVnCCWR832mNyA28MD8oAYt0Kfvlw==", - "license": "MIT OR Apache-2.0", - "dependencies": { - "@cloudflare/kv-asset-handler": "0.4.2", - "@cloudflare/unenv-preset": "2.16.1", - "blake3-wasm": "2.1.5", - "esbuild": "0.27.3", - "miniflare": "4.20260426.0", - "path-to-regexp": "6.3.0", - "unenv": "2.0.0-rc.24", - "workerd": "1.20260426.1" - }, - "bin": { - "wrangler": "bin/wrangler.js", - "wrangler2": "bin/wrangler.js" - }, - "engines": { - "node": ">=20.3.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@cloudflare/workers-types": "^4.20260426.1" - }, - "peerDependenciesMeta": { - "@cloudflare/workers-types": { - "optional": true - } - } - }, - "node_modules/@treeseed/sdk/node_modules/wrangler/node_modules/esbuild": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", - "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.3", - "@esbuild/android-arm": "0.27.3", - "@esbuild/android-arm64": "0.27.3", - "@esbuild/android-x64": "0.27.3", - "@esbuild/darwin-arm64": "0.27.3", - "@esbuild/darwin-x64": "0.27.3", - "@esbuild/freebsd-arm64": "0.27.3", - "@esbuild/freebsd-x64": "0.27.3", - "@esbuild/linux-arm": "0.27.3", - "@esbuild/linux-arm64": "0.27.3", - "@esbuild/linux-ia32": "0.27.3", - "@esbuild/linux-loong64": "0.27.3", - "@esbuild/linux-mips64el": "0.27.3", - "@esbuild/linux-ppc64": "0.27.3", - "@esbuild/linux-riscv64": "0.27.3", - "@esbuild/linux-s390x": "0.27.3", - "@esbuild/linux-x64": "0.27.3", - "@esbuild/netbsd-arm64": "0.27.3", - "@esbuild/netbsd-x64": "0.27.3", - "@esbuild/openbsd-arm64": "0.27.3", - "@esbuild/openbsd-x64": "0.27.3", - "@esbuild/openharmony-arm64": "0.27.3", - "@esbuild/sunos-x64": "0.27.3", - "@esbuild/win32-arm64": "0.27.3", - "@esbuild/win32-ia32": "0.27.3", - "@esbuild/win32-x64": "0.27.3" - } - }, - "node_modules/@treeseed/sdk/node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@treeseed/ui": { - "version": "0.12.18-dev.treedx-perf.20260806T042250Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#a1793dd77ed94ca5495a855892bb5569c8179aed", - "license": "Apache-2.0", - "dependencies": { - "@codemirror/lang-markdown": "^6.5.0", - "@codemirror/language": "^6.12.3", - "@codemirror/view": "^6.43.0", - "@lezer/highlight": "^1.2.3", - "@mdxeditor/editor": "^4.0.2", - "codemirror": "^6.0.2", - "rehype-stringify": "^10.0.1", - "remark-gfm": "^4.0.1", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.1.2", - "unified": "^11.0.5", - "yaml": "^2.8.1" - }, - "engines": { - "node": ">=22" - }, - "peerDependencies": { - "astro": "^5.0.0 || ^6.0.0", - "react": "^18.3.0 || ^19.0.0", - "react-dom": "^18.3.0 || ^19.0.0", - "recharts": "^3.0.0" - } - }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", - "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@types/aws-lambda": { - "version": "8.10.162", - "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.162.tgz", - "integrity": "sha512-Fn658grtLOci1oxi1391vvDWJRKNGWRSqfxRkmN/Iy3c0tQH1USMKEXcPYHLvope+ZgTFocx9FRQJx1muBL6qw==", - "license": "MIT" - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" + "node_modules/@types/aws-lambda": { + "version": "8.10.162", + "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.162.tgz", + "integrity": "sha512-Fn658grtLOci1oxi1391vvDWJRKNGWRSqfxRkmN/Iy3c0tQH1USMKEXcPYHLvope+ZgTFocx9FRQJx1muBL6qw==", + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" } }, "node_modules/@types/babel__generator": { @@ -10843,716 +10135,1157 @@ "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "license": "Apache-2.0" + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-draft-04": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "license": "MIT", + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-i18n": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/ajv-i18n/-/ajv-i18n-4.2.0.tgz", + "integrity": "sha512-v/ei2UkCEeuKNXh8RToiFsUclmU+G57LO1Oo22OagNMENIw+Yb8eMwvHu7Vn9fmkjJyv6XclhJ8TbuigSglPkg==", + "license": "MIT", + "peerDependencies": { + "ajv": "^8.0.0-beta.0" + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "license": "ISC", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-escapes": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", + "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-api-error": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@xtuc/long": "4.2.2" + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "license": "BSD-3-Clause" + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "license": "Apache-2.0" + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" }, - "node_modules/accepts": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", "license": "MIT", "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" + "tslib": "^2.0.0" }, "engines": { - "node": ">= 0.6" + "node": ">=10" } }, - "node_modules/acorn": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", - "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "license": "Apache-2.0", "engines": { - "node": ">=0.4.0" + "node": ">= 0.4" } }, - "node_modules/acorn-import-phases": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", - "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "node_modules/array-iterate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-2.0.1.tgz", + "integrity": "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==", "license": "MIT", - "engines": { - "node": ">=10.13.0" - }, - "peerDependencies": { - "acorn": "^8.14.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "engines": { + "node": ">=12" } }, - "node_modules/ajv": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", - "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "node_modules/astring": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "bin": { + "astring": "bin/astring" } }, - "node_modules/ajv-draft-04": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", - "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "node_modules/astro": { + "version": "5.18.2", + "resolved": "https://registry.npmjs.org/astro/-/astro-5.18.2.tgz", + "integrity": "sha512-TnFwLnAXty5MXKPDGuKXqK4AMBXG+FH6RUdK7Oyc3gyfNoFIthT+4eRbzOK43bdRlLaZuxgciDSjgtggZ3OtGQ==", "license": "MIT", - "peerDependencies": { - "ajv": "^8.5.0" + "dependencies": { + "@astrojs/compiler": "^2.13.0", + "@astrojs/internal-helpers": "0.7.6", + "@astrojs/markdown-remark": "6.3.11", + "@astrojs/telemetry": "3.3.0", + "@capsizecss/unpack": "^4.0.0", + "@oslojs/encoding": "^1.1.0", + "@rollup/pluginutils": "^5.3.0", + "acorn": "^8.15.0", + "aria-query": "^5.3.2", + "axobject-query": "^4.1.0", + "boxen": "8.0.1", + "ci-info": "^4.3.1", + "clsx": "^2.1.1", + "common-ancestor-path": "^1.0.1", + "cookie": "^1.1.1", + "cssesc": "^3.0.0", + "debug": "^4.4.3", + "deterministic-object-hash": "^2.0.2", + "devalue": "^5.6.2", + "diff": "^8.0.3", + "dlv": "^1.1.3", + "dset": "^3.1.4", + "es-module-lexer": "^1.7.0", + "esbuild": "^0.27.3", + "estree-walker": "^3.0.3", + "flattie": "^1.1.1", + "fontace": "~0.4.0", + "github-slugger": "^2.0.0", + "html-escaper": "3.0.3", + "http-cache-semantics": "^4.2.0", + "import-meta-resolve": "^4.2.0", + "js-yaml": "^4.1.1", + "magic-string": "^0.30.21", + "magicast": "^0.5.1", + "mrmime": "^2.0.1", + "neotraverse": "^0.6.18", + "p-limit": "^6.2.0", + "p-queue": "^8.1.1", + "package-manager-detector": "^1.6.0", + "piccolore": "^0.1.3", + "picomatch": "^4.0.3", + "prompts": "^2.4.2", + "rehype": "^13.0.2", + "semver": "^7.7.3", + "shiki": "^3.21.0", + "smol-toml": "^1.6.0", + "svgo": "^4.0.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tsconfck": "^3.1.6", + "ultrahtml": "^1.6.0", + "unifont": "~0.7.3", + "unist-util-visit": "^5.0.0", + "unstorage": "^1.17.4", + "vfile": "^6.0.3", + "vite": "^6.4.1", + "vitefu": "^1.1.1", + "xxhash-wasm": "^1.1.0", + "yargs-parser": "^21.1.1", + "yocto-spinner": "^0.2.3", + "zod": "^3.25.76", + "zod-to-json-schema": "^3.25.1", + "zod-to-ts": "^1.2.0" + }, + "bin": { + "astro": "astro.js" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0" }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/astrodotbuild" + }, + "optionalDependencies": { + "sharp": "^0.34.0" } }, - "node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "node_modules/astro-expressive-code": { + "version": "0.41.7", + "resolved": "https://registry.npmjs.org/astro-expressive-code/-/astro-expressive-code-0.41.7.tgz", + "integrity": "sha512-hUpogGc6DdAd+I7pPXsctyYPRBJDK7Q7d06s4cyP0Vz3OcbziP3FNzN0jZci1BpCvLn9675DvS7B9ctKKX64JQ==", "license": "MIT", "dependencies": { - "ajv": "^8.0.0" + "rehype-expressive-code": "^0.41.7" }, "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } + "astro": "^4.0.0-beta || ^5.0.0-beta || ^3.3.0 || ^6.0.0-beta" } }, - "node_modules/ajv-i18n": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/ajv-i18n/-/ajv-i18n-4.2.0.tgz", - "integrity": "sha512-v/ei2UkCEeuKNXh8RToiFsUclmU+G57LO1Oo22OagNMENIw+Yb8eMwvHu7Vn9fmkjJyv6XclhJ8TbuigSglPkg==", + "node_modules/astro/node_modules/@esbuild/aix-ppc64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", + "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", + "cpu": [ + "ppc64" + ], "license": "MIT", - "peerDependencies": { - "ajv": "^8.0.0-beta.0" + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" } }, - "node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "node_modules/astro/node_modules/@esbuild/android-arm": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", + "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", + "cpu": [ + "arm" + ], "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" } }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "license": "ISC", - "dependencies": { - "string-width": "^4.1.0" + "node_modules/astro/node_modules/@esbuild/android-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", + "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" } }, - "node_modules/ansi-align/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/astro/node_modules/@esbuild/android-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", + "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", + "cpu": [ + "x64" + ], "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/ansi-align/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/astro/node_modules/@esbuild/darwin-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", + "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", + "cpu": [ + "arm64" + ], "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/ansi-align/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/astro/node_modules/@esbuild/darwin-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", + "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/ansi-align/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/astro/node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", + "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/ansi-escapes": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", - "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", + "node_modules/astro/node_modules/@esbuild/freebsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", + "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "environment": "^1.0.0" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "node_modules/astro/node_modules/@esbuild/linux-arm": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", + "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", + "cpu": [ + "arm" + ], "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "node": ">=18" } }, - "node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "node_modules/astro/node_modules/@esbuild/linux-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", + "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", + "cpu": [ + "arm64" + ], "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=18" } }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, + "node_modules/astro/node_modules/@esbuild/linux-ia32": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", + "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 8" + "node": ">=18" } }, - "node_modules/anymatch/node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "node_modules/astro/node_modules/@esbuild/linux-loong64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", + "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", + "cpu": [ + "loong64" + ], "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "node": ">=18" } }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "license": "MIT" - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, - "node_modules/aria-hidden": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", - "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "node_modules/astro/node_modules/@esbuild/linux-mips64el": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", + "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", + "cpu": [ + "mips64el" + ], "license": "MIT", - "dependencies": { - "tslib": "^2.0.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10" + "node": ">=18" } }, - "node_modules/aria-query": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", - "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", - "license": "Apache-2.0", + "node_modules/astro/node_modules/@esbuild/linux-ppc64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", + "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.4" + "node": ">=18" } }, - "node_modules/array-iterate": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-2.0.1.tgz", - "integrity": "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==", + "node_modules/astro/node_modules/@esbuild/linux-riscv64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", + "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", + "cpu": [ + "riscv64" + ], "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "node_modules/astro/node_modules/@esbuild/linux-s390x": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", + "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", + "cpu": [ + "s390x" + ], "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/astring": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", - "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", + "node_modules/astro/node_modules/@esbuild/linux-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", + "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", + "cpu": [ + "x64" + ], "license": "MIT", - "bin": { - "astring": "bin/astring" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/astro": { - "version": "6.4.8", - "resolved": "https://registry.npmjs.org/astro/-/astro-6.4.8.tgz", - "integrity": "sha512-KK5lX90uU9EeVaTjINyj3sy9/NFXVa59aowaqbWBDDKLXZh4rr7GwIaCFYVetE22MJtsCNFerQXn0vlCLmpP/Q==", + "node_modules/astro/node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", + "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "@astrojs/compiler": "^4.0.0", - "@astrojs/internal-helpers": "0.10.0", - "@astrojs/markdown-remark": "7.2.0", - "@astrojs/telemetry": "3.3.2", - "@capsizecss/unpack": "^4.0.0", - "@clack/prompts": "^1.1.0", - "@oslojs/encoding": "^1.1.0", - "@rollup/pluginutils": "^5.3.0", - "aria-query": "^5.3.2", - "axobject-query": "^4.1.0", - "ci-info": "^4.4.0", - "clsx": "^2.1.1", - "common-ancestor-path": "^2.0.0", - "cookie": "^1.1.1", - "devalue": "^5.8.1", - "diff": "^8.0.3", - "dset": "^3.1.4", - "es-module-lexer": "^2.0.0", - "esbuild": "^0.27.3", - "flattie": "^1.1.1", - "fontace": "~0.4.1", - "get-tsconfig": "5.0.0-beta.4", - "github-slugger": "^2.0.0", - "html-escaper": "3.0.3", - "http-cache-semantics": "^4.2.0", - "js-yaml": "^4.1.1", - "jsonc-parser": "^3.3.1", - "magic-string": "^0.30.21", - "magicast": "^0.5.2", - "mrmime": "^2.0.1", - "neotraverse": "^0.6.18", - "obug": "^2.1.1", - "p-limit": "^7.3.0", - "p-queue": "^9.1.0", - "package-manager-detector": "^1.6.0", - "piccolore": "^0.1.3", - "picomatch": "^4.0.4", - "rehype": "^13.0.2", - "semver": "^7.7.4", - "shiki": "^4.0.2", - "smol-toml": "^1.6.0", - "svgo": "^4.0.1", - "tinyclip": "^0.1.12", - "tinyexec": "^1.0.4", - "tinyglobby": "^0.2.15", - "ultrahtml": "^1.6.0", - "unifont": "~0.7.4", - "unist-util-visit": "^5.1.0", - "unstorage": "^1.17.5", - "vfile": "^6.0.3", - "vite": "^7.3.2", - "vitefu": "^1.1.2", - "xxhash-wasm": "^1.1.0", - "yargs-parser": "^22.0.0", - "zod": "^4.3.6" - }, - "bin": { - "astro": "bin/astro.mjs" - }, + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">=22.12.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/astrodotbuild" - }, - "optionalDependencies": { - "sharp": "^0.34.0" + "node": ">=18" } }, - "node_modules/astro-expressive-code": { - "version": "0.41.7", - "resolved": "https://registry.npmjs.org/astro-expressive-code/-/astro-expressive-code-0.41.7.tgz", - "integrity": "sha512-hUpogGc6DdAd+I7pPXsctyYPRBJDK7Q7d06s4cyP0Vz3OcbziP3FNzN0jZci1BpCvLn9675DvS7B9ctKKX64JQ==", + "node_modules/astro/node_modules/@esbuild/netbsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", + "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "rehype-expressive-code": "^0.41.7" - }, - "peerDependencies": { - "astro": "^4.0.0-beta || ^5.0.0-beta || ^3.3.0 || ^6.0.0-beta" + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/astro/node_modules/@astrojs/compiler": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-4.0.0.tgz", - "integrity": "sha512-eouss7G8ygdZqHuke033VMcVw5HTZUu+PXd/h06DGDUg/jt5btPYPqh66ENWw/mU78rBrf/oeC4oqoBwMtDMNA==", - "license": "MIT" - }, - "node_modules/astro/node_modules/@astrojs/internal-helpers": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.10.0.tgz", - "integrity": "sha512-Ry2R3VPeIN4uPCSA4xQc+e+vsJXkalKpEbDc07hV+a/o5Bs2N/s/uDcPJH/05L19DKh9tAy7e6JM3YZ6Cxfezw==", + "node_modules/astro/node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", + "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.4", - "@types/mdast": "^4.0.4", - "js-yaml": "^4.1.1", - "picomatch": "^4.0.4", - "retext-smartypants": "^6.2.0", - "shiki": "^4.0.2", - "smol-toml": "^1.6.0", - "unified": "^11.0.5" + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/astro/node_modules/@astrojs/markdown-remark": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-7.2.0.tgz", - "integrity": "sha512-+YxmVQu1Bd+MFfSzjq1rOJvD9+nIOJzz5YIIhdIH01RrxRkKbyKoEgyIqP3yv51MhzMDgd79QaPv+kCVPT8vHw==", + "node_modules/astro/node_modules/@esbuild/openbsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", + "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@astrojs/internal-helpers": "0.10.0", - "@astrojs/prism": "4.0.2", - "github-slugger": "^2.0.0", - "hast-util-from-html": "^2.0.3", - "hast-util-to-text": "^4.0.2", - "mdast-util-definitions": "^6.0.0", - "rehype-raw": "^7.0.0", - "rehype-stringify": "^10.0.1", - "remark-gfm": "^4.0.1", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.1.2", - "remark-smartypants": "^3.0.2", - "unified": "^11.0.5", - "unist-util-remove-position": "^5.0.0", - "unist-util-visit": "^5.1.0", - "unist-util-visit-parents": "^6.0.2", - "vfile": "^6.0.3" + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/astro/node_modules/@astrojs/prism": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-4.0.2.tgz", - "integrity": "sha512-KTivpmnz6lDsC6o9H4+DNm2SrE/GHzw8cNAvEJwAvUT+eoaEnn/4NtbDNfRRaxaJHdp15gf+tfHAWiXR4wB3BA==", + "node_modules/astro/node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", + "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "prismjs": "^1.30.0" - }, + "optional": true, + "os": [ + "openharmony" + ], "engines": { - "node": ">=22.12.0" + "node": ">=18" } }, - "node_modules/astro/node_modules/@esbuild/aix-ppc64": { + "node_modules/astro/node_modules/@esbuild/sunos-x64": { "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", - "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", + "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", "cpu": [ - "ppc64" + "x64" ], "license": "MIT", "optional": true, "os": [ - "aix" + "sunos" ], "engines": { "node": ">=18" } }, - "node_modules/astro/node_modules/@esbuild/android-arm": { + "node_modules/astro/node_modules/@esbuild/win32-arm64": { "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", - "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", + "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", "cpu": [ - "arm" + "arm64" ], "license": "MIT", "optional": true, "os": [ - "android" + "win32" ], "engines": { "node": ">=18" } }, - "node_modules/astro/node_modules/@esbuild/android-arm64": { + "node_modules/astro/node_modules/@esbuild/win32-ia32": { "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", - "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", + "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", "cpu": [ - "arm64" + "ia32" ], "license": "MIT", "optional": true, "os": [ - "android" + "win32" ], "engines": { "node": ">=18" } }, - "node_modules/astro/node_modules/@esbuild/android-x64": { + "node_modules/astro/node_modules/@esbuild/win32-x64": { "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", - "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz", + "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", "cpu": [ "x64" ], "license": "MIT", "optional": true, "os": [ - "android" + "win32" ], "engines": { "node": ">=18" } }, - "node_modules/astro/node_modules/@esbuild/darwin-arm64": { + "node_modules/astro/node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "license": "MIT" + }, + "node_modules/astro/node_modules/esbuild": { "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", - "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", - "cpu": [ - "arm64" - ], + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz", + "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.7", + "@esbuild/android-arm": "0.27.7", + "@esbuild/android-arm64": "0.27.7", + "@esbuild/android-x64": "0.27.7", + "@esbuild/darwin-arm64": "0.27.7", + "@esbuild/darwin-x64": "0.27.7", + "@esbuild/freebsd-arm64": "0.27.7", + "@esbuild/freebsd-x64": "0.27.7", + "@esbuild/linux-arm": "0.27.7", + "@esbuild/linux-arm64": "0.27.7", + "@esbuild/linux-ia32": "0.27.7", + "@esbuild/linux-loong64": "0.27.7", + "@esbuild/linux-mips64el": "0.27.7", + "@esbuild/linux-ppc64": "0.27.7", + "@esbuild/linux-riscv64": "0.27.7", + "@esbuild/linux-s390x": "0.27.7", + "@esbuild/linux-x64": "0.27.7", + "@esbuild/netbsd-arm64": "0.27.7", + "@esbuild/netbsd-x64": "0.27.7", + "@esbuild/openbsd-arm64": "0.27.7", + "@esbuild/openbsd-x64": "0.27.7", + "@esbuild/openharmony-arm64": "0.27.7", + "@esbuild/sunos-x64": "0.27.7", + "@esbuild/win32-arm64": "0.27.7", + "@esbuild/win32-ia32": "0.27.7", + "@esbuild/win32-x64": "0.27.7" + } + }, + "node_modules/astro/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/astro/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, "license": "MIT", "optional": true, "os": [ "darwin" ], "engines": { - "node": ">=18" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/astro/node_modules/@esbuild/darwin-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", - "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", + "node_modules/astro/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/astro/node_modules/vite": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.3.tgz", + "integrity": "sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==", + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/astro/node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", "cpu": [ - "x64" + "ppc64" ], "license": "MIT", "optional": true, "os": [ - "darwin" + "aix" ], "engines": { "node": ">=18" } }, - "node_modules/astro/node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", - "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", + "node_modules/astro/node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", "cpu": [ - "arm64" + "arm" ], "license": "MIT", "optional": true, "os": [ - "freebsd" + "android" ], "engines": { "node": ">=18" } }, - "node_modules/astro/node_modules/@esbuild/freebsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", - "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", + "node_modules/astro/node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", "cpu": [ - "x64" + "arm64" ], "license": "MIT", "optional": true, "os": [ - "freebsd" + "android" ], "engines": { "node": ">=18" } }, - "node_modules/astro/node_modules/@esbuild/linux-arm": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", - "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", + "node_modules/astro/node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", "cpu": [ - "arm" + "x64" ], "license": "MIT", "optional": true, "os": [ - "linux" + "android" ], "engines": { "node": ">=18" } }, - "node_modules/astro/node_modules/@esbuild/linux-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", - "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", + "node_modules/astro/node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", "cpu": [ "arm64" ], "license": "MIT", "optional": true, "os": [ - "linux" + "darwin" ], "engines": { "node": ">=18" } }, - "node_modules/astro/node_modules/@esbuild/linux-ia32": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", - "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", + "node_modules/astro/node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", "cpu": [ - "ia32" + "x64" ], "license": "MIT", "optional": true, "os": [ - "linux" + "darwin" ], "engines": { "node": ">=18" } }, - "node_modules/astro/node_modules/@esbuild/linux-loong64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", - "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", + "node_modules/astro/node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", "cpu": [ - "loong64" + "arm64" ], "license": "MIT", "optional": true, "os": [ - "linux" + "freebsd" ], "engines": { "node": ">=18" } }, - "node_modules/astro/node_modules/@esbuild/linux-mips64el": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", - "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", + "node_modules/astro/node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", "cpu": [ - "mips64el" + "x64" ], "license": "MIT", "optional": true, "os": [ - "linux" + "freebsd" ], "engines": { "node": ">=18" } }, - "node_modules/astro/node_modules/@esbuild/linux-ppc64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", - "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", + "node_modules/astro/node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", "cpu": [ - "ppc64" + "arm" ], "license": "MIT", "optional": true, @@ -11563,12 +11296,12 @@ "node": ">=18" } }, - "node_modules/astro/node_modules/@esbuild/linux-riscv64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", - "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", + "node_modules/astro/node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", "cpu": [ - "riscv64" + "arm64" ], "license": "MIT", "optional": true, @@ -11579,12 +11312,12 @@ "node": ">=18" } }, - "node_modules/astro/node_modules/@esbuild/linux-s390x": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", - "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", + "node_modules/astro/node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", "cpu": [ - "s390x" + "ia32" ], "license": "MIT", "optional": true, @@ -11595,12 +11328,12 @@ "node": ">=18" } }, - "node_modules/astro/node_modules/@esbuild/linux-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", - "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", + "node_modules/astro/node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", "cpu": [ - "x64" + "loong64" ], "license": "MIT", "optional": true, @@ -11611,397 +11344,278 @@ "node": ">=18" } }, - "node_modules/astro/node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", - "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", + "node_modules/astro/node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", "cpu": [ - "arm64" + "mips64el" ], "license": "MIT", "optional": true, "os": [ - "netbsd" + "linux" ], "engines": { "node": ">=18" } }, - "node_modules/astro/node_modules/@esbuild/netbsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", - "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", + "node_modules/astro/node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", "cpu": [ - "x64" + "ppc64" ], "license": "MIT", "optional": true, "os": [ - "netbsd" + "linux" ], "engines": { "node": ">=18" } }, - "node_modules/astro/node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", - "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", + "node_modules/astro/node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", "cpu": [ - "arm64" + "riscv64" ], "license": "MIT", "optional": true, "os": [ - "openbsd" + "linux" ], "engines": { "node": ">=18" } }, - "node_modules/astro/node_modules/@esbuild/openbsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", - "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", + "node_modules/astro/node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", "cpu": [ - "x64" + "s390x" ], "license": "MIT", "optional": true, "os": [ - "openbsd" + "linux" ], "engines": { "node": ">=18" } }, - "node_modules/astro/node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", - "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", + "node_modules/astro/node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", "cpu": [ - "arm64" + "x64" ], "license": "MIT", "optional": true, "os": [ - "openharmony" + "linux" ], "engines": { "node": ">=18" } }, - "node_modules/astro/node_modules/@esbuild/sunos-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", - "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", + "node_modules/astro/node_modules/vite/node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", "cpu": [ - "x64" + "arm64" ], "license": "MIT", "optional": true, "os": [ - "sunos" + "netbsd" ], "engines": { "node": ">=18" } }, - "node_modules/astro/node_modules/@esbuild/win32-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", - "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", + "node_modules/astro/node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", "cpu": [ - "arm64" + "x64" ], "license": "MIT", "optional": true, "os": [ - "win32" + "netbsd" ], "engines": { "node": ">=18" } }, - "node_modules/astro/node_modules/@esbuild/win32-ia32": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", - "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", + "node_modules/astro/node_modules/vite/node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", "cpu": [ - "ia32" + "arm64" ], "license": "MIT", "optional": true, "os": [ - "win32" + "openbsd" ], "engines": { "node": ">=18" } }, - "node_modules/astro/node_modules/@esbuild/win32-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz", - "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", + "node_modules/astro/node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", "cpu": [ "x64" ], "license": "MIT", "optional": true, "os": [ - "win32" + "openbsd" ], "engines": { "node": ">=18" } }, - "node_modules/astro/node_modules/@shikijs/core": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.4.2.tgz", - "integrity": "sha512-StyzbAyxg2/tBGf78gwbBkGyeQ73lf8UiJArFaQhTQIDqQOCKPCQFanvrs4/Yv3Yfyc+ONInJM6K+FMIf+P+kA==", - "license": "MIT", - "dependencies": { - "@shikijs/primitive": "4.4.2", - "@shikijs/types": "4.4.2", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.5", - "hast-util-to-html": "^9.0.5" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/astro/node_modules/@shikijs/engine-javascript": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.4.2.tgz", - "integrity": "sha512-MnIkeqWdVPUWsxlx8gKLVCJFTsqrQJgpTPBPpQwaFeJ56lOnJxj5aN2LUFnfxUEcvOQuNocmbaMnVrCEln6rkw==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "4.4.2", - "@shikijs/vscode-textmate": "^10.0.2", - "oniguruma-to-es": "^4.3.6" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/astro/node_modules/@shikijs/engine-oniguruma": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.4.2.tgz", - "integrity": "sha512-GLhowz1+jixjz+wiZ3wMnOn1jTxiFCGl2PkXufivbnwPHKuyw1AYqu5/hbWhZZ2oAb0NP05WUJhYeigY14drnw==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "4.4.2", - "@shikijs/vscode-textmate": "^10.0.2" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/astro/node_modules/@shikijs/langs": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.4.2.tgz", - "integrity": "sha512-8DfeusD+Zdv/eYIDdXyJTUnSMHt+aAWjAOCXV20HNGAHRlInXpG8wh421v6B91WOm9TFwRLN+b/LG5F2NAIojg==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "4.4.2" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/astro/node_modules/@shikijs/themes": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.4.2.tgz", - "integrity": "sha512-H0CFoL07ddDC2Dd6EdrPYNkRhUR6YCkJlnuYFceYYUJJA5TIm2b5B33qqiDYryBExgbKMndFJPb2u1gTuqO37g==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "4.4.2" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/astro/node_modules/@shikijs/types": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.4.2.tgz", - "integrity": "sha512-PFYitV4vpDr/iPCIhnHp+Q4ftic5N5VeNJ3KQ1O8gn3h2ar8qgwMAXF7tq4m1CWaMS60fV4VqF6vfnWH4F7vqQ==", - "license": "MIT", - "dependencies": { - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.5" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/astro/node_modules/esbuild": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz", - "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.7", - "@esbuild/android-arm": "0.27.7", - "@esbuild/android-arm64": "0.27.7", - "@esbuild/android-x64": "0.27.7", - "@esbuild/darwin-arm64": "0.27.7", - "@esbuild/darwin-x64": "0.27.7", - "@esbuild/freebsd-arm64": "0.27.7", - "@esbuild/freebsd-x64": "0.27.7", - "@esbuild/linux-arm": "0.27.7", - "@esbuild/linux-arm64": "0.27.7", - "@esbuild/linux-ia32": "0.27.7", - "@esbuild/linux-loong64": "0.27.7", - "@esbuild/linux-mips64el": "0.27.7", - "@esbuild/linux-ppc64": "0.27.7", - "@esbuild/linux-riscv64": "0.27.7", - "@esbuild/linux-s390x": "0.27.7", - "@esbuild/linux-x64": "0.27.7", - "@esbuild/netbsd-arm64": "0.27.7", - "@esbuild/netbsd-x64": "0.27.7", - "@esbuild/openbsd-arm64": "0.27.7", - "@esbuild/openbsd-x64": "0.27.7", - "@esbuild/openharmony-arm64": "0.27.7", - "@esbuild/sunos-x64": "0.27.7", - "@esbuild/win32-arm64": "0.27.7", - "@esbuild/win32-ia32": "0.27.7", - "@esbuild/win32-x64": "0.27.7" + "node_modules/astro/node_modules/vite/node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" } }, - "node_modules/astro/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, + "node_modules/astro/node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], "license": "MIT", "optional": true, "os": [ - "darwin" + "sunos" ], "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=18" } }, - "node_modules/astro/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, + "node_modules/astro/node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=10" + "node": ">=18" } }, - "node_modules/astro/node_modules/shiki": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.4.2.tgz", - "integrity": "sha512-P8F/dFhRevaw2uSdeIYlq/5SXZNY85DPtmXQ947gD1Zj2JqO5AkNvVVBar0Me9JkFx3uzVud/qOtP5ek9NEQGA==", + "node_modules/astro/node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], "license": "MIT", - "dependencies": { - "@shikijs/core": "4.4.2", - "@shikijs/engine-javascript": "4.4.2", - "@shikijs/engine-oniguruma": "4.4.2", - "@shikijs/langs": "4.4.2", - "@shikijs/themes": "4.4.2", - "@shikijs/types": "4.4.2", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.5" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=20" + "node": ">=18" } }, - "node_modules/astro/node_modules/vite": { - "version": "7.3.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.6.tgz", - "integrity": "sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==", + "node_modules/astro/node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/vite/node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "hasInstallScript": true, "license": "MIT", - "dependencies": { - "esbuild": "^0.27.0 || ^0.28.0", - "fdir": "^6.5.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" - }, "bin": { - "vite": "bin/vite.js" + "esbuild": "bin/esbuild" }, "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" + "node": ">=18" }, "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "lightningcss": "^1.21.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" } }, - "node_modules/astro/node_modules/zod": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", - "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" + "node_modules/astro/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" } }, "node_modules/auto-bind": { @@ -12696,13 +12310,10 @@ } }, "node_modules/common-ancestor-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-2.0.0.tgz", - "integrity": "sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">= 18" - } + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", + "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", + "license": "ISC" }, "node_modules/compute-scroll-into-view": { "version": "2.0.4", @@ -14131,21 +13742,6 @@ "node": ">=8.6.0" } }, - "node_modules/fast-string-truncated-width": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fast-string-truncated-width/-/fast-string-truncated-width-3.0.3.tgz", - "integrity": "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==", - "license": "MIT" - }, - "node_modules/fast-string-width": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/fast-string-width/-/fast-string-width-3.0.2.tgz", - "integrity": "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==", - "license": "MIT", - "dependencies": { - "fast-string-truncated-width": "^3.0.2" - } - }, "node_modules/fast-uri": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.5.tgz", @@ -14162,15 +13758,6 @@ ], "license": "BSD-3-Clause" }, - "node_modules/fast-wrap-ansi": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/fast-wrap-ansi/-/fast-wrap-ansi-0.2.2.tgz", - "integrity": "sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==", - "license": "MIT", - "dependencies": { - "fast-string-width": "^3.0.2" - } - }, "node_modules/fast-xml-builder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.3.0.tgz", @@ -14441,21 +14028,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-tsconfig": { - "version": "5.0.0-beta.4", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-5.0.0-beta.4.tgz", - "integrity": "sha512-7nF7C9fIPFEMHgEMEfgIlO9wDdZ8CyHw27rWciFZfHvHDReIiPhsYuzPRXsfvBCqFy1l8RRyyWV7QLM+ZhUJsQ==", - "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "engines": { - "node": ">=20.20.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, "node_modules/git-up": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/git-up/-/git-up-8.1.1.tgz", @@ -15396,15 +14968,15 @@ } }, "node_modules/is-docker": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-4.0.0.tgz", - "integrity": "sha512-LHE+wROyG/Y/0ZnbktRCoTix2c1RhgWaZraMZ8o1Q7zCh0VSrICJQO5oqIIISrcSBtrXv0o233w1IYwsWCjTzA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", "license": "MIT", "bin": { "is-docker": "cli.js" }, "engines": { - "node": ">=20" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -15489,21 +15061,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-inside-container/node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -18446,43 +18003,43 @@ } }, "node_modules/p-limit": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-7.3.1.tgz", - "integrity": "sha512-0trZaiG7Y7kN/Egy9a8j47t9osC0Tch4PaIWd9yGF6bvmlk7muExRvGNYb8sXBwEKMoNKsbNN9P8EefuQekE4Q==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-6.2.0.tgz", + "integrity": "sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==", "license": "MIT", "dependencies": { - "yocto-queue": "^1.2.1" + "yocto-queue": "^1.1.1" }, "engines": { - "node": ">=20" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-queue": { - "version": "9.3.3", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-9.3.3.tgz", - "integrity": "sha512-NXAOdnEe5FsZJfT4oK84lE1Y5cFFdWlRuOo5tww8DyNMxyRXwn39fIkUtNLKppcPC+UYU/bXujNCUGDv01y7CA==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.1.1.tgz", + "integrity": "sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ==", "license": "MIT", "dependencies": { - "eventemitter3": "^5.0.4", - "p-timeout": "^7.0.0" + "eventemitter3": "^5.0.1", + "p-timeout": "^6.1.2" }, "engines": { - "node": ">=20" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-timeout": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-7.0.1.tgz", - "integrity": "sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg==", + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz", + "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==", "license": "MIT", "engines": { - "node": ">=20" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -19976,15 +19533,6 @@ "license": "MIT", "peer": true }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, "node_modules/restore-cursor": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", diff --git a/package.json b/package.json index 8d4226cd..fdf026c9 100644 --- a/package.json +++ b/package.json @@ -30,11 +30,14 @@ "check:file-architecture": "node --import tsx ./scripts/check-file-architecture.ts", "setup": "npm install", "setup:ci": "npm ci --workspaces=false", - "build": "npm run build:dist", + "build": "npm run build:dist && npm run build:app", "build:dist": "node --import tsx ./scripts/build-dist.ts", + "build:app": "node ./node_modules/astro/astro.js build --config astro.config.ts", + "dev": "node ./node_modules/astro/astro.js dev --config astro.config.ts --port 4322", + "preview": "node ./node_modules/astro/astro.js preview --config astro.config.ts --port 4322", "prepare": "node --import tsx ./scripts/prepare.ts", "prepack": "npm run build:dist", - "check": "npm run check:file-lengths && npm run build:dist && tsc --noEmit", + "check": "npm run check:file-lengths && npm run build:dist && tsc --noEmit && node ./node_modules/astro/astro.js check --root .", "test": "npm run test:unit", "test:unit": "vitest run --config ./vitest.config.ts", "lint": "npm run check", @@ -49,20 +52,20 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#4fc8533f15858b26cb47daa1f3a2625a409a4422", - "@treeseed/sdk": "github:treeseed-ai/sdk#fa498d44fb5c61235d13aef87e836884dd61cf82", + "@treeseed/core": "github:treeseed-ai/core#9a2bbcc14fd231928af7df3f67db16b0a7f6a53b", + "@treeseed/sdk": "github:treeseed-ai/sdk#3de64cac067330ede86875631459f9e20dbce1dc", "@treeseed/ui": "github:treeseed-ai/ui#a1793dd77ed94ca5495a855892bb5569c8179aed", "react": "^19.2.5", "react-dom": "^19.2.6" }, "peerDependencies": { - "astro": "^5.0.0 || ^6.0.0" + "astro": "^5.0.0" }, "devDependencies": { "@types/node": "^24.6.0", "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", - "astro": "^6.4.5", + "astro": "^5.6.1", "esbuild": "^0.28.0", "tsx": "^4.21.0", "typescript": "^5.9.3", diff --git a/public/logo.svg b/public/logo.svg new file mode 100644 index 00000000..37d2d0cc --- /dev/null +++ b/public/logo.svg @@ -0,0 +1,7 @@ + + TreeSeed + + + + + diff --git a/src/config.yaml b/src/config.yaml new file mode 100644 index 00000000..8ffce42b --- /dev/null +++ b/src/config.yaml @@ -0,0 +1,56 @@ +site: + logo: + src: /logo.svg + alt: TreeSeed Admin logo + name: TreeSeed Admin + statement: Grow what you know + siteUrl: https://admin.treeseed.dev + githubRepository: https://github.com/treeseed-ai/admin + discordLink: https://discord.gg/example + headerMenu: [] + footerMenu: + - label: Project + items: + - label: Repository + href: https://github.com/treeseed-ai/admin + summary: Private and real-time administration for TreeSeed teams, projects, capacity, and knowledge. + projectStage: Standalone management portal + projectStageDetail: Connects to the open TreeSeed API and TreeDX-backed R2 content runtime without Market composition. + forms: {} + emailNotifications: + contactRouting: {} + subscribeRecipients: [] + theme: + defaultScheme: fern + defaultMode: system + schemes: + fern: + light: + accent: "#4f7d4e" + accentStrong: "#2f5a35" + accentSoft: "#dcebd6" + dark: + accent: "#8bbb75" + accentStrong: "#b9e69e" + accentSoft: "#20351f" +models: + pages: + defaults: { pageLayout: article, stage: admin, audience: [] } + notes: + defaults: { author: TreeSeed Admin Team, draft: false, groupIds: [] } + questions: + defaults: { draft: false, groupIds: [] } + objectives: + defaults: { draft: false, groupIds: [] } + proposals: + defaults: { draft: false, groupIds: [] } + decisions: + defaults: { draft: false, groupIds: [] } + people: + defaults: { status: live, groupIds: [] } + agents: + defaults: { groupIds: [] } + books: + defaults: { groupIds: [] } + docs: + defaults: { groupIds: [] } diff --git a/src/content.config.ts b/src/content.config.ts new file mode 100644 index 00000000..489d6b6e --- /dev/null +++ b/src/content.config.ts @@ -0,0 +1,7 @@ +import { fileURLToPath } from 'node:url'; + +process.env.TREESEED_TENANT_ROOT ??= fileURLToPath(new URL('../', import.meta.url)); + +const { createTenantCollections } = await import('@treeseed/core/content-config'); + +export const collections = createTenantCollections(); diff --git a/src/manifest.yaml b/src/manifest.yaml new file mode 100644 index 00000000..cbec5235 --- /dev/null +++ b/src/manifest.yaml @@ -0,0 +1,32 @@ +id: treeseed-admin +siteConfigPath: ./src/config.yaml +content: + docs: ./src/content/knowledge + pages: ./src/content/pages + notes: ./src/content/notes + questions: ./src/content/questions + objectives: ./src/content/objectives + proposals: ./src/content/proposals + decisions: ./src/content/decisions + people: ./src/content/people + agents: ./src/content/agents + discussions: ./src/content/discussions + discussion_messages: ./src/content/discussion-messages + discussion_events: ./src/content/discussion-events + groups: ./src/content/groups + group_edges: ./src/content/group-edges + books: ./src/content/books +features: + docs: true + books: true + notes: true + questions: true + objectives: true + proposals: true + decisions: true + agents: true + forms: false +site: + models: + workdays: + rendered: false diff --git a/tests/contract/package/admin-package.test.ts b/tests/contract/package/admin-package.test.ts index 99e7e963..cd5be16a 100644 --- a/tests/contract/package/admin-package.test.ts +++ b/tests/contract/package/admin-package.test.ts @@ -330,4 +330,23 @@ describe('@treeseed/admin identity and team surface', () => { expect(existsSync('.github/workflows/deploy.yml')).toBe(false); expect(readFileSync('.github/workflows/release-gate.yml', 'utf8')).not.toContain('trsd hosting apply'); }); + + it('owns a standalone site with one source-first plugin composition', () => { + const site = readFileSync('treeseed.site.yaml', 'utf8'); + const manifest = readFileSync('treeseed.package.yaml', 'utf8'); + const packageJson = readFileSync('package.json', 'utf8'); + expect(site).toContain('siteUrl: https://admin.treeseed.dev'); + expect(site).toContain('bucketName: treeseed-admin-content'); + expect(site).toContain('buildOutputDir: .treeseed/app-dist'); + expect(site).toContain('package: "@treeseed/core/plugin-default"'); + expect(site).toContain('package: "@treeseed/admin/plugin"'); + expect(manifest).toContain('type: web-application'); + expect(manifest).toContain('topology: split_site_content'); + expect(manifest).toContain('contentRuntimeSource: r2_preview_overlay'); + expect(packageJson).toContain('"build:app"'); + expect(existsSync('astro.config.ts')).toBe(true); + expect(existsSync('src/content.config.ts')).toBe(true); + expect(existsSync('src/manifest.yaml')).toBe(true); + expect(existsSync('src/config.yaml')).toBe(true); + }); }); diff --git a/treeseed.package.yaml b/treeseed.package.yaml index bff3281d..c0f2ac5c 100644 --- a/treeseed.package.yaml +++ b/treeseed.package.yaml @@ -1,10 +1,10 @@ id: "@treeseed/admin" name: TreeSeed Admin kind: node-typescript -type: node-library +type: web-application repository: treeseed-ai/admin publishTarget: npm -capabilities: { save: true, verify: true, publish: true, deploy: false, localOnly: false } +capabilities: { save: true, verify: true, publish: true, deploy: true, localOnly: false } workflowTemplateVersion: "1" githubEnvironments: - production @@ -20,12 +20,13 @@ artifacts: releaseGate: workflow: verify.yml projectArchitecture: - topology: single_repository_site + topology: split_site_content rootPath: . - sitePath: docs - contentPath: docs/src/content - contentRuntimeSource: r2_published_manifest - localContentMaterialization: existing_path + sitePath: . + contentRuntimeSource: r2_preview_overlay + localContentMaterialization: none + requiresLocalContentForCi: false + requiresLocalContentForDeploy: false contentPublishTarget: kind: cloudflare_r2 prefix: packages/admin diff --git a/treeseed.site.yaml b/treeseed.site.yaml new file mode 100644 index 00000000..1aa35f39 --- /dev/null +++ b/treeseed.site.yaml @@ -0,0 +1,64 @@ +name: TreeSeed Admin +slug: treeseed-admin +siteUrl: https://admin.treeseed.dev +contactEmail: hello@treeseed.email +hosting: + kind: self_hosted_project + registration: none + teamId: treeseed + projectId: admin +hub: + mode: treeseed_hosted +runtime: + mode: treeseed_managed + registration: none +cloudflare: + workerName: treeseed-admin + d1Binding: SITE_DATA_DB + pages: + projectName: treeseed-admin + productionBranch: main + stagingBranch: staging + buildOutputDir: .treeseed/app-dist + r2: + bucketName: treeseed-admin-content + manifestKeyTemplate: content/admin/{environment}/channels/current.json + previewRootTemplate: content/admin/previews + previewTtlHours: 168 +surfaces: + web: + enabled: true + provider: cloudflare + rootDir: . + publicBaseUrl: https://admin.treeseed.dev + localBaseUrl: http://127.0.0.1:4322 + local: + runtime: local + environments: + staging: + domain: admin.preview.treeseed.dev + prod: + domain: admin.treeseed.dev +connections: + api: + proxyPrefix: /v1 + localBaseUrl: http://127.0.0.1:3000 + environments: + staging: + baseUrl: https://api.preview.treeseed.dev + prod: + baseUrl: https://api.treeseed.dev +plugins: + - package: "@treeseed/core/plugin-default" + - package: "@treeseed/admin/plugin" +providers: + deploy: cloudflare + dns: cloudflare-dns + content: + serving: published_runtime + runtime: team_scoped_r2_overlay + publish: team_scoped_r2_overlay + docs: default + site: default +turnstile: + enabled: true From b23896925fc409f50f94108ed9710ce50d08259a Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Sun, 9 Aug 2026 10:11:30 -0400 Subject: [PATCH 113/315] refactor(agent-lab): rename Agent Lab to Agent Atlas Changes: - Update `monitor-agent-lab.guarantee.yaml` summary, negative cases, and notes to reflect Agent Atlas. - Update `@treeseed/core`, `@treeseed/sdk`, and `@treeseed/ui` dependency commits in `package.json` and `package-lock.json`. - Update `miniflare`, `undici`, `wrangler`, and `js-yaml` versions in `package-lock.json`. - Remove `@cloudflare/workers-types` and `@rolldown/pluginutils` from `package-lock.json`. --- .../monitor-agent-lab.guarantee.yaml | 6 +- package-lock.json | 76 ++++++++----------- package.json | 6 +- src/pages/app/work/index.astro | 29 ++----- src/view-models/agent-lab/agent-lab-frame.ts | 13 +++- 5 files changed, 53 insertions(+), 77 deletions(-) diff --git a/guarantees/work/agent-lab/monitor-agent-lab.guarantee.yaml b/guarantees/work/agent-lab/monitor-agent-lab.guarantee.yaml index 61d19f92..c424044d 100644 --- a/guarantees/work/agent-lab/monitor-agent-lab.guarantee.yaml +++ b/guarantees/work/agent-lab/monitor-agent-lab.guarantee.yaml @@ -6,7 +6,7 @@ subtype: agent-lab journey: "Monitor the team Agent Lab" ownerPackage: "@treeseed/admin" surface: admin-ui -summary: "A team member sees one compact, responsive, revisioned Agent Lab and can inspect an agent as designed intent, assignment-time state, or observed forensic activity; the anatomy workbench edits only human intent while generated identity, class linkage, repository placement, and operational status remain locked system facts." +summary: "A team member sees one responsive, revisioned Agent Atlas for live operation and immutable historical replay, can inspect designed, assigned, and observed evidence, and can carry validated context into Discussion without granting historical state current mutation authority." status: planned dependencies: { journeys: [738], guarantees: [guarantee.work.command.monitor-team-operations.033] } actors: { allowed: [authenticated_user, team_owner, project_lead], forbidden: [unauthorized_user] } @@ -16,6 +16,6 @@ preconditions: { fixtures: [integrated_treeseed_project], notes: ["An active tea api: { required: false, verifierRefs: [] } content: { required: false, verifierRefs: [] } audit: { required: false, verifierRefs: [] } -negativeCases: ["Snapshot mode makes no background requests.", "Closed charts do not poll.", "Stale responses and cursor corrections cannot restore removed records.", "Generated identity and runtime status cannot be edited as design intent.", "Provider supply cannot be widened from an agent definition.", "Polling does not reset the selected anatomy region or close cascading note and question overlays.", "Advanced forensic fields never displace the primary human-readable content by default."] +negativeCases: ["Historical playback never substitutes current agent definitions.", "Live events never force a historical cursor to the live edge.", "Absent recorded progress is never fabricated.", "A new topology revision never applies an incompatible saved viewport.", "Generated identity and runtime status cannot be edited as design intent.", "Provider supply cannot be widened from an agent definition.", "Historical Discussion context cannot authorize current execution.", "Advanced forensic fields never displace the primary human-readable content by default."] evidence: { required: [guarantee_report] } -notes: ["Planned while the accelerated anatomy design is iterated; activate after light/dark, idle/running/waiting/degraded, narrow, keyboard navigation, intent compilation, conflict, and TreeDX commit scenes produce repeatable evidence."] +notes: ["The reusable Atlas implementation is present but remains planned until standard/research, expanded/compact vitals, replay, signal/event/assignment overlays, authoring conflicts, Discussion context, and production-shaped workday scenes produce repeatable evidence."] diff --git a/package-lock.json b/package-lock.json index 828454f2..d4b59364 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,9 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#6229f7658af49630da58d0fac883681adbb3ea70", - "@treeseed/sdk": "github:treeseed-ai/sdk#951a53bc170ec595c3999aefd96b7248373d81f8", - "@treeseed/ui": "github:treeseed-ai/ui#c64f2908a167383d057b83104b41dc03ea196757", + "@treeseed/core": "github:treeseed-ai/core#de946a36fe1aedaf2905d11e54456ad98be8df7f", + "@treeseed/sdk": "github:treeseed-ai/sdk#850ec8d20a4dbbff5bdd5e89f726eab84a7fc3b0", + "@treeseed/ui": "github:treeseed-ai/ui#0c20eceb18cdbdfba20ab17d1b7c26719359753b", "react": "^19.2.5", "react-dom": "^19.2.6" }, @@ -1249,13 +1249,6 @@ "node": ">=16" } }, - "node_modules/@cloudflare/workers-types": { - "version": "5.20260804.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-5.20260804.1.tgz", - "integrity": "sha512-B1dwxpN6e5RZXZkE5zpZj+ooNeNZ1mwavLIyHDYe10ojhlGTwDfe8sAl7R1mMXc1cyIsbr+jKVdvmMEyVcdTdg==", - "extraneous": true, - "license": "MIT OR Apache-2.0" - }, "node_modules/@codemirror/autocomplete": { "version": "6.20.3", "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.20.3.tgz", @@ -6344,12 +6337,6 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", - "license": "MIT" - }, "node_modules/@rollup/pluginutils": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.4.0.tgz", @@ -7462,8 +7449,8 @@ } }, "node_modules/@treeseed/core": { - "version": "0.12.60-dev.staging.20260804T171000Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#6229f7658af49630da58d0fac883681adbb3ea70", + "version": "0.12.60-dev.treedx-perf.20260805T075816Z", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#de946a36fe1aedaf2905d11e54456ad98be8df7f", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7474,8 +7461,8 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#951a53bc170ec595c3999aefd96b7248373d81f8", - "@treeseed/ui": "github:treeseed-ai/ui#c64f2908a167383d057b83104b41dc03ea196757", + "@treeseed/sdk": "github:treeseed-ai/sdk#850ec8d20a4dbbff5bdd5e89f726eab84a7fc3b0", + "@treeseed/ui": "github:treeseed-ai/ui#0c20eceb18cdbdfba20ab17d1b7c26719359753b", "astro": "^5.6.1", "esbuild": "^0.28.0", "katex": "^0.16.22", @@ -9478,8 +9465,8 @@ } }, "node_modules/@treeseed/sdk": { - "version": "0.12.63-dev.staging.20260804T170912Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#951a53bc170ec595c3999aefd96b7248373d81f8", + "version": "0.12.63-dev.staging.20260809T134225Z", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#850ec8d20a4dbbff5bdd5e89f726eab84a7fc3b0", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", @@ -9609,13 +9596,6 @@ "node": ">=16" } }, - "node_modules/@treeseed/sdk/node_modules/@cloudflare/workers-types": { - "version": "4.20260702.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20260702.1.tgz", - "integrity": "sha512-mOhf5TUEB1m2vPrxtqoIGfz0fUC9xyxRDx5gWHy5s+OCo6dcV+g7wI1R7gYCMFohhqF/2y2xeKVwMwCJjfn/WA==", - "extraneous": true, - "license": "MIT OR Apache-2.0" - }, "node_modules/@treeseed/sdk/node_modules/@esbuild/aix-ppc64": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", @@ -10184,8 +10164,8 @@ } }, "node_modules/@treeseed/ui": { - "version": "0.12.18-dev.staging.20260804T170811Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#c64f2908a167383d057b83104b41dc03ea196757", + "version": "0.12.18-dev.staging.20260809T135255Z", + "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#0c20eceb18cdbdfba20ab17d1b7c26719359753b", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", @@ -15667,9 +15647,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz", - "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", + "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", "funding": [ { "type": "github", @@ -17518,14 +17498,14 @@ } }, "node_modules/miniflare": { - "version": "5.20260801.0-alpha", - "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-5.20260801.0-alpha.tgz", - "integrity": "sha512-AfMrnQbJg81ESsGkGhOkHBtwTqCG+mosR+3GE+qDrhF1I/ieIvgg3ICxNyBvgHBZ3iapy6cysBQHNPykkzrfgw==", + "version": "5.20260801.1-alpha", + "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-5.20260801.1-alpha.tgz", + "integrity": "sha512-BHPVzIDA6mbx7LefxpvkXW7DHx9FKB9GorZatbnrrFTt3CVMU8zuUpbgyCuebwDKcTTOZos43ta8GQ0eMVEpxA==", "license": "MIT", "dependencies": { "@cspotcode/source-map-support": "0.8.1", "sharp": "0.35.2", - "undici": "7.28.0", + "undici": "7.29.0", "workerd": "1.20260801.1", "ws": "8.21.0", "youch": "4.1.0-beta.10" @@ -20124,6 +20104,12 @@ "@rolldown/binding-win32-x64-msvc": "1.2.3" } }, + "node_modules/rolldown/node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "license": "MIT" + }, "node_modules/rollup": { "version": "4.62.4", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.4.tgz", @@ -21309,9 +21295,9 @@ "license": "MIT" }, "node_modules/undici": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.28.0.tgz", - "integrity": "sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.29.0.tgz", + "integrity": "sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==", "license": "MIT", "engines": { "node": ">=20.18.1" @@ -22840,16 +22826,16 @@ } }, "node_modules/wrangler": { - "version": "4.119.0", - "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.119.0.tgz", - "integrity": "sha512-ookClf+zly4DTc8pBMNrwGQzZKH8IpIYTXkjDw3XS7ZvBQ5mLYH6eOvfD5BEpk3U63zTbv91WRlo1UeRSKXa0g==", + "version": "4.120.0", + "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.120.0.tgz", + "integrity": "sha512-cBmu/MeaB/fPacC0JpATs4duTOCagBxrZo+vBzuTX06tLzwSyAHE1drlHUZ8rP0VqVz1fy3ReGYTiHdKkoHltg==", "license": "MIT OR Apache-2.0", "dependencies": { "@cloudflare/kv-asset-handler": "0.5.0", "@cloudflare/unenv-preset": "2.16.1", "blake3-wasm": "2.1.5", "esbuild": "0.28.1", - "miniflare": "5.20260801.0-alpha", + "miniflare": "5.20260801.1-alpha", "path-to-regexp": "6.3.0", "unenv": "2.0.0-rc.24", "workerd": "1.20260801.1" diff --git a/package.json b/package.json index 6a5c2320..c0257cdb 100644 --- a/package.json +++ b/package.json @@ -49,9 +49,9 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#6229f7658af49630da58d0fac883681adbb3ea70", - "@treeseed/sdk": "github:treeseed-ai/sdk#951a53bc170ec595c3999aefd96b7248373d81f8", - "@treeseed/ui": "github:treeseed-ai/ui#c64f2908a167383d057b83104b41dc03ea196757", + "@treeseed/core": "github:treeseed-ai/core#de946a36fe1aedaf2905d11e54456ad98be8df7f", + "@treeseed/sdk": "github:treeseed-ai/sdk#850ec8d20a4dbbff5bdd5e89f726eab84a7fc3b0", + "@treeseed/ui": "github:treeseed-ai/ui#0c20eceb18cdbdfba20ab17d1b7c26719359753b", "react": "^19.2.5", "react-dom": "^19.2.6" }, diff --git a/src/pages/app/work/index.astro b/src/pages/app/work/index.astro index b2ab1407..9c2d56e9 100644 --- a/src/pages/app/work/index.astro +++ b/src/pages/app/work/index.astro @@ -1,12 +1,12 @@ --- -import { MetricHistoryDashboard } from '@treeseed/ui/components/react/OperationsMonitor'; +import { AgentAtlasWorkspace } from '@treeseed/ui/components/react/AgentAtlas'; +import '@treeseed/ui/styles/agent-atlas.css'; import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; import AgentLabChrome from '../../../components/agent-lab/AgentLabChrome.astro'; import TreeseedAppLayout from '../../../layouts/AppLayout.astro'; -import { ensureCsrfToken } from '../../../lib/auth/support/csrf.ts'; import { ApiClientFacade } from '../../../lib/market/api-client.ts'; import { loadAppContext } from '../../../view-models/app-access.ts'; -import { agentLabMetricDestinations, loadAgentLabFrame } from '../../../view-models/agent-lab/agent-lab-frame.ts'; +import { loadAgentLabFrame } from '../../../view-models/agent-lab/agent-lab-frame.ts'; if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); const app = await loadAppContext(Astro); @@ -18,33 +18,18 @@ const [frame, access] = await Promise.all([ app.activeTeam ? api.getTeamAccessSummary(app.activeTeam.id).catch(() => null) : null, ]); const canManage = Boolean((access?.roles ?? access?.access?.roles ?? []).some((role: string) => ['team_owner', 'project_lead'].includes(role))); -const labels: Record = { agents: 'Agents', workdays: 'Workdays', systemEvents: 'System events', assignments: 'Assignments', executions: 'Executions', artifacts: 'Artifacts', passed: 'Passed', failed: 'Failed', running: 'Running' }; -const selected = new URLSearchParams(); -if (frame?.overview.workdayContext.selectedDate) selected.set('date', frame.overview.workdayContext.selectedDate); -if (frame?.overview.workdayContext.selectedWorkdayId) selected.set('workday', frame.overview.workdayContext.selectedWorkdayId); -const metrics = frame?.overview.metrics.map((metric) => { - const destination = agentLabMetricDestinations[metric.key as keyof typeof agentLabMetricDestinations]; - return { ...metric, label: labels[metric.key] ?? metric.key, href: `${destination}${destination.includes('?') ? '&' : '?'}${selected}`, tone: metric.key === 'failed' && metric.value ? 'danger' as const : metric.key === 'running' && metric.value ? 'positive' as const : 'default' as const }; -}) ?? []; -const csrfToken = ensureCsrfToken(Astro); ---
{frame ? <> - : }
diff --git a/src/view-models/agent-lab/agent-lab-frame.ts b/src/view-models/agent-lab/agent-lab-frame.ts index 444a2684..10f7531c 100644 --- a/src/view-models/agent-lab/agent-lab-frame.ts +++ b/src/view-models/agent-lab/agent-lab-frame.ts @@ -1,4 +1,4 @@ -import { agentLabMetricKeys, type AgentLabActivityInterval, type AgentLabDelta, type AgentLabMetricPoint, type AgentLabOverview } from '@treeseed/sdk/agent-capacity'; +import { agentLabMetricKeys, type AgentAtlasProjection, type AgentLabActivityInterval, type AgentLabDelta, type AgentLabMetricPoint, type AgentLabOverview } from '@treeseed/sdk/agent-capacity'; import type { AccountPreferences } from '@treeseed/sdk/account-contracts'; import type { ApiClientFacade } from '../../lib/market/api-client.ts'; @@ -16,22 +16,27 @@ function fallbackOverview(team: { id: string; name?: string; slug?: string }, ti metrics: agentLabMetricKeys.map((key) => ({ key, value: 0, secondary: 'Unavailable', semantic: key === 'agents' ? 'configured' : ['workdays', 'systemEvents'].includes(key) ? 'exact-total' : key === 'running' ? 'instantaneous' : 'cumulative', observedAt: now.toISOString() })) }; } +function fallbackAtlas(teamId:string,overview:AgentLabOverview):AgentAtlasProjection{return{revision:'server-snapshot-unavailable',generatedAt:overview.generatedAt,timeZone:overview.timeZone,scope:{teamId,selectedDate:overview.workdayContext.selectedDate,workdayIds:[],projectIds:[],groupIds:[],agentIds:[],activityProfiles:[],sizingMetric:'activity'},topologies:[],nodeStates:[],assignments:[],activity:[],playback:{mode:'live',startedAt:overview.operatingDay.start,endedAt:overview.operatingDay.end,liveEdgeAt:overview.generatedAt,cursor:{cursor:null,observedAt:overview.generatedAt,positions:{}}},alerts:[{id:'atlas-unavailable',severity:'warning',message:'The Agent Atlas projection is temporarily unavailable.'}]}} + export async function loadAgentLabFrame(api: ApiClientFacade, team: { id: string; name?: string; slug?: string }, preferences: AccountPreferences, selection: { date?: string | null; workday?: string | null } = {}) { const base = `/v1/teams/${encodeURIComponent(team.id)}/agent-lab`; const query = new URLSearchParams(); if (selection.date) query.set('date', selection.date); if (selection.workday) query.set('workday', selection.workday); const suffix = query.size ? `?${query}` : ''; - const [overview, activity, series, allocation] = await Promise.all([ - api.request('GET', `${base}/overview${suffix}`).catch(() => fallbackOverview(team, preferences.timeZone)), + const overview=await api.request('GET', `${base}/overview${suffix}`).catch(() => fallbackOverview(team, preferences.timeZone)) as AgentLabOverview; + const [activity, series, allocation,atlas] = await Promise.all([ api.request('GET', `${base}/activity${suffix}`).catch(() => ({ revision: 'unavailable', generatedAt: new Date().toISOString(), cursor: null, upserts: [], removedIds: [] })), api.request('GET', `${base}/metric-series${suffix}`).catch(() => ({ revision: 'unavailable', generatedAt: new Date().toISOString(), cursor: null, upserts: [], removedIds: [] })), api.request('GET', `${base}/allocation${suffix}`).catch(() => ({ revision: 'unavailable', generatedAt: new Date().toISOString(), canManage: false, activeAllocationSetId: null, time: { availableSeconds: null, requestedSeconds: 0, reservedSeconds: 0, activeSeconds: 0, elapsedSeconds: 0, releasedSeconds: 0, remainingSeconds: null, overrunSeconds: 0 }, projects: [], agentClasses: [], workdayTime: [] })), + api.request('GET', `${base}/atlas${suffix}`).catch(()=>fallbackAtlas(team.id,overview)), ]); return { - overview: overview as AgentLabOverview, + overview, + atlas:atlas as AgentAtlasProjection, activity: activity as AgentLabDelta, series: series as AgentLabDelta, allocation, endpoints: { overview: `${base}/overview${suffix}`, activity: `${base}/activity${suffix}`, metricSeries: `${base}/metric-series${suffix}`, allocation: `${base}/allocation${suffix}` }, + atlasEndpoints:{projection:`${base}/atlas${suffix}`,delta:`${base}/atlas/delta${suffix}`,stream:`${base}/atlas/events/stream${suffix}`,detail:`${base}/atlas/details`,assignmentGraphs:`${base}/atlas/assignment-graphs`,viewState:`${base}/view-state`,createAgent:`/app/work/build?create=agent`,createGroup:`/app/work/build?create=group`}, targetEndpoint: `${base}/targets`, preference: { enabled: preferences.realTimeUpdates, intervalSeconds: preferences.realTimePollingIntervalSeconds }, }; From 9b4bfc622ef80fe81c104b69601e8750d40a287b Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Sun, 9 Aug 2026 10:23:35 -0400 Subject: [PATCH 114/315] build(admin): update dependencies and version Changes: - Update version in package.json and package-lock.json - Remove unused package entries from package-lock.json Dependency and pointer updates: - @treeseed/sdk: github:treeseed-ai/sdk#850ec8d20a4dbbff5bdd5e89f726eab84a7fc3b0 -> github:treeseed-ai/sdk#45f3e68880310d97ecb914b95cccd3311871f974 - @treeseed/core: github:treeseed-ai/core#de946a36fe1aedaf2905d11e54456ad98be8df7f -> github:treeseed-ai/core#35100850827c7c8297d1164cc60e0738c094bab8 --- package-lock.json | 125 +++------------------------------------------- package.json | 6 +-- 2 files changed, 11 insertions(+), 120 deletions(-) diff --git a/package-lock.json b/package-lock.json index ee560e96..4e05934f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,17 +1,17 @@ { "name": "@treeseed/admin", - "version": "0.12.59-dev.treedx-perf.20260805T075847Z", + "version": "0.12.59-dev.staging.20260809T142301Z", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@treeseed/admin", - "version": "0.12.59-dev.treedx-perf.20260805T075847Z", + "version": "0.12.59-dev.staging.20260809T142301Z", "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#de946a36fe1aedaf2905d11e54456ad98be8df7f", - "@treeseed/sdk": "github:treeseed-ai/sdk#850ec8d20a4dbbff5bdd5e89f726eab84a7fc3b0", + "@treeseed/core": "github:treeseed-ai/core#35100850827c7c8297d1164cc60e0738c094bab8", + "@treeseed/sdk": "github:treeseed-ai/sdk#45f3e68880310d97ecb914b95cccd3311871f974", "@treeseed/ui": "github:treeseed-ai/ui#0c20eceb18cdbdfba20ab17d1b7c26719359753b", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7449,8 +7449,8 @@ } }, "node_modules/@treeseed/core": { - "version": "0.12.60-dev.treedx-perf.20260805T075816Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#de946a36fe1aedaf2905d11e54456ad98be8df7f", + "version": "0.12.60-dev.staging.20260809T142231Z", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#35100850827c7c8297d1164cc60e0738c094bab8", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7461,7 +7461,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#850ec8d20a4dbbff5bdd5e89f726eab84a7fc3b0", + "@treeseed/sdk": "github:treeseed-ai/sdk#45f3e68880310d97ecb914b95cccd3311871f974", "@treeseed/ui": "github:treeseed-ai/ui#0c20eceb18cdbdfba20ab17d1b7c26719359753b", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -9466,7 +9466,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.staging.20260809T134225Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#850ec8d20a4dbbff5bdd5e89f726eab84a7fc3b0", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#45f3e68880310d97ecb914b95cccd3311871f974", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", @@ -23186,115 +23186,6 @@ "type": "github", "url": "https://github.com/sponsors/wooorm" } - }, - "node_modules/@astrojs/cloudflare": { - "version": "12.6.13", - "resolved": "https://registry.npmjs.org/@astrojs/cloudflare/-/cloudflare-12.6.13.tgz", - "integrity": "sha512-oKaCyiovyQr183r9U93787Ju1zwk+rRMgPnLTwCLckHmOUK7sltA1Gp4LSGt8oNMgqQS6jR7uRdfQ/NPul37QA==", - "license": "MIT", - "dependencies": { - "@astrojs/internal-helpers": "0.7.6", - "@astrojs/underscore-redirects": "1.0.0", - "@cloudflare/workers-types": "^4.20260116.0", - "tinyglobby": "^0.2.15", - "vite": "^6.4.1", - "wrangler": "4.59.2" - }, - "peerDependencies": { - "astro": "^5.7.0" - } - }, - "node_modules/@astrojs/mdx": { - "version": "4.3.14", - "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-4.3.14.tgz", - "integrity": "sha512-FBrqJQORVm+rkRa2TS5CjU9PBA6hkhrwLVBSS9A77gN2+iehvjq1w6yya/d0YKC7osiVorKkr3Qd9wNbl0ZkGA==", - "license": "MIT", - "dependencies": { - "@astrojs/markdown-remark": "6.3.11", - "@mdx-js/mdx": "^3.1.1", - "acorn": "^8.15.0", - "es-module-lexer": "^1.7.0", - "estree-util-visit": "^2.0.0", - "hast-util-to-html": "^9.0.5", - "piccolore": "^0.1.3", - "rehype-raw": "^7.0.0", - "remark-gfm": "^4.0.1", - "remark-smartypants": "^3.0.2", - "source-map": "^0.7.6", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.3" - }, - "engines": { - "node": "18.20.8 || ^20.3.0 || >=22.0.0" - }, - "peerDependencies": { - "astro": "^5.0.0" - } - }, - "node_modules/@vitejs/plugin-react": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", - "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.28.0", - "@babel/plugin-transform-react-jsx-self": "^7.27.1", - "@babel/plugin-transform-react-jsx-source": "^7.27.1", - "@rolldown/pluginutils": "1.0.0-beta.27", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.17.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.27", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", - "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", - "license": "MIT" - }, - "node_modules/@astrojs/starlight": { - "version": "0.37.6", - "resolved": "https://registry.npmjs.org/@astrojs/starlight/-/starlight-0.37.6.tgz", - "integrity": "sha512-wQrKwH431q+8FsLBnNQeG+R36TMtEGxTQ2AuiVpcx9APcazvL3n7wVW8mMmYyxX0POjTnxlcWPkdMGR3Yj1L+w==", - "license": "MIT", - "dependencies": { - "@astrojs/markdown-remark": "^6.3.1", - "@astrojs/mdx": "^4.2.3", - "@astrojs/sitemap": "^3.3.0", - "@pagefind/default-ui": "^1.3.0", - "@types/hast": "^3.0.4", - "@types/js-yaml": "^4.0.9", - "@types/mdast": "^4.0.4", - "astro-expressive-code": "^0.41.1", - "bcp-47": "^2.1.0", - "hast-util-from-html": "^2.0.1", - "hast-util-select": "^6.0.2", - "hast-util-to-string": "^3.0.0", - "hastscript": "^9.0.0", - "i18next": "^23.11.5", - "js-yaml": "^4.1.0", - "klona": "^2.0.6", - "magic-string": "^0.30.17", - "mdast-util-directive": "^3.0.0", - "mdast-util-to-markdown": "^2.1.0", - "mdast-util-to-string": "^4.0.0", - "pagefind": "^1.3.0", - "rehype": "^13.0.1", - "rehype-format": "^5.0.0", - "remark-directive": "^3.0.0", - "ultrahtml": "^1.6.0", - "unified": "^11.0.5", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.2" - }, - "peerDependencies": { - "astro": "^5.5.0" - } } } } diff --git a/package.json b/package.json index 9ed40ab2..56d06a0b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@treeseed/admin", - "version": "0.12.59-dev.treedx-perf.20260805T075847Z", + "version": "0.12.59-dev.staging.20260809T142301Z", "description": "Treeseed administration portal framework built on @treeseed/core and @treeseed/ui.", "license": "AGPL-3.0-only", "repository": { @@ -49,8 +49,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#de946a36fe1aedaf2905d11e54456ad98be8df7f", - "@treeseed/sdk": "github:treeseed-ai/sdk#850ec8d20a4dbbff5bdd5e89f726eab84a7fc3b0", + "@treeseed/core": "github:treeseed-ai/core#35100850827c7c8297d1164cc60e0738c094bab8", + "@treeseed/sdk": "github:treeseed-ai/sdk#45f3e68880310d97ecb914b95cccd3311871f974", "@treeseed/ui": "github:treeseed-ai/ui#0c20eceb18cdbdfba20ab17d1b7c26719359753b", "react": "^19.2.5", "react-dom": "^19.2.6" From 4697e18a94cb0c50423866c932f127ff1214e985 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Sun, 9 Aug 2026 10:38:38 -0400 Subject: [PATCH 115/315] build(build): sync package dependency references Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.staging.20260809T142301Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#45f3e68880310d97ecb914b95cccd3311871f974 -> github:treeseed-ai/sdk#d5f9a77797b535a42ce67dddf8e41fa2bf441b3e - dependencies.@treeseed/core: github:treeseed-ai/core#35100850827c7c8297d1164cc60e0738c094bab8 -> github:treeseed-ai/core#9d1ed7e104a595407929ed472ed9b74c658d8190 --- package-lock.json | 119 ++++++++++++++++++++++++++++++++++++++++++++-- package.json | 4 +- 2 files changed, 116 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4e05934f..331cae2d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#35100850827c7c8297d1164cc60e0738c094bab8", - "@treeseed/sdk": "github:treeseed-ai/sdk#45f3e68880310d97ecb914b95cccd3311871f974", + "@treeseed/core": "github:treeseed-ai/core#9d1ed7e104a595407929ed472ed9b74c658d8190", + "@treeseed/sdk": "github:treeseed-ai/sdk#d5f9a77797b535a42ce67dddf8e41fa2bf441b3e", "@treeseed/ui": "github:treeseed-ai/ui#0c20eceb18cdbdfba20ab17d1b7c26719359753b", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7450,7 +7450,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.staging.20260809T142231Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#35100850827c7c8297d1164cc60e0738c094bab8", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#9d1ed7e104a595407929ed472ed9b74c658d8190", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7461,7 +7461,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#45f3e68880310d97ecb914b95cccd3311871f974", + "@treeseed/sdk": "github:treeseed-ai/sdk#d5f9a77797b535a42ce67dddf8e41fa2bf441b3e", "@treeseed/ui": "github:treeseed-ai/ui#0c20eceb18cdbdfba20ab17d1b7c26719359753b", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -9466,7 +9466,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.staging.20260809T134225Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#45f3e68880310d97ecb914b95cccd3311871f974", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#d5f9a77797b535a42ce67dddf8e41fa2bf441b3e", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", @@ -23186,6 +23186,115 @@ "type": "github", "url": "https://github.com/sponsors/wooorm" } + }, + "node_modules/@astrojs/cloudflare": { + "version": "12.6.13", + "resolved": "https://registry.npmjs.org/@astrojs/cloudflare/-/cloudflare-12.6.13.tgz", + "integrity": "sha512-oKaCyiovyQr183r9U93787Ju1zwk+rRMgPnLTwCLckHmOUK7sltA1Gp4LSGt8oNMgqQS6jR7uRdfQ/NPul37QA==", + "license": "MIT", + "dependencies": { + "@astrojs/internal-helpers": "0.7.6", + "@astrojs/underscore-redirects": "1.0.0", + "@cloudflare/workers-types": "^4.20260116.0", + "tinyglobby": "^0.2.15", + "vite": "^6.4.1", + "wrangler": "4.59.2" + }, + "peerDependencies": { + "astro": "^5.7.0" + } + }, + "node_modules/@astrojs/mdx": { + "version": "4.3.14", + "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-4.3.14.tgz", + "integrity": "sha512-FBrqJQORVm+rkRa2TS5CjU9PBA6hkhrwLVBSS9A77gN2+iehvjq1w6yya/d0YKC7osiVorKkr3Qd9wNbl0ZkGA==", + "license": "MIT", + "dependencies": { + "@astrojs/markdown-remark": "6.3.11", + "@mdx-js/mdx": "^3.1.1", + "acorn": "^8.15.0", + "es-module-lexer": "^1.7.0", + "estree-util-visit": "^2.0.0", + "hast-util-to-html": "^9.0.5", + "piccolore": "^0.1.3", + "rehype-raw": "^7.0.0", + "remark-gfm": "^4.0.1", + "remark-smartypants": "^3.0.2", + "source-map": "^0.7.6", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.3" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + }, + "peerDependencies": { + "astro": "^5.0.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "license": "MIT" + }, + "node_modules/@astrojs/starlight": { + "version": "0.37.6", + "resolved": "https://registry.npmjs.org/@astrojs/starlight/-/starlight-0.37.6.tgz", + "integrity": "sha512-wQrKwH431q+8FsLBnNQeG+R36TMtEGxTQ2AuiVpcx9APcazvL3n7wVW8mMmYyxX0POjTnxlcWPkdMGR3Yj1L+w==", + "license": "MIT", + "dependencies": { + "@astrojs/markdown-remark": "^6.3.1", + "@astrojs/mdx": "^4.2.3", + "@astrojs/sitemap": "^3.3.0", + "@pagefind/default-ui": "^1.3.0", + "@types/hast": "^3.0.4", + "@types/js-yaml": "^4.0.9", + "@types/mdast": "^4.0.4", + "astro-expressive-code": "^0.41.1", + "bcp-47": "^2.1.0", + "hast-util-from-html": "^2.0.1", + "hast-util-select": "^6.0.2", + "hast-util-to-string": "^3.0.0", + "hastscript": "^9.0.0", + "i18next": "^23.11.5", + "js-yaml": "^4.1.0", + "klona": "^2.0.6", + "magic-string": "^0.30.17", + "mdast-util-directive": "^3.0.0", + "mdast-util-to-markdown": "^2.1.0", + "mdast-util-to-string": "^4.0.0", + "pagefind": "^1.3.0", + "rehype": "^13.0.1", + "rehype-format": "^5.0.0", + "remark-directive": "^3.0.0", + "ultrahtml": "^1.6.0", + "unified": "^11.0.5", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.2" + }, + "peerDependencies": { + "astro": "^5.5.0" + } } } } diff --git a/package.json b/package.json index 56d06a0b..30bf2533 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#35100850827c7c8297d1164cc60e0738c094bab8", - "@treeseed/sdk": "github:treeseed-ai/sdk#45f3e68880310d97ecb914b95cccd3311871f974", + "@treeseed/core": "github:treeseed-ai/core#9d1ed7e104a595407929ed472ed9b74c658d8190", + "@treeseed/sdk": "github:treeseed-ai/sdk#d5f9a77797b535a42ce67dddf8e41fa2bf441b3e", "@treeseed/ui": "github:treeseed-ai/ui#0c20eceb18cdbdfba20ab17d1b7c26719359753b", "react": "^19.2.5", "react-dom": "^19.2.6" From 5975e3ef4b91035a7201b4383e5cab93f38338f9 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Sun, 9 Aug 2026 11:20:47 -0400 Subject: [PATCH 116/315] build(build): resolve staging update conflict Intent: - Save hint: resolve staging update conflict Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.ai.20260807T070845Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#3de64cac067330ede86875631459f9e20dbce1dc -> github:treeseed-ai/sdk#227284ebbc32730e3d086718c77579e5be5c7bed - dependencies.@treeseed/core: github:treeseed-ai/core#9a2bbcc14fd231928af7df3f67db16b0a7f6a53b -> github:treeseed-ai/core#7afac131b72af6bda1288c22455c2fa1b4bd46dd --- package-lock.json | 140 ++++++++++++++++++++++++++++++++++++++++++++-- package.json | 4 +- 2 files changed, 137 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 23a9c925..124548e0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#9a2bbcc14fd231928af7df3f67db16b0a7f6a53b", - "@treeseed/sdk": "github:treeseed-ai/sdk#3de64cac067330ede86875631459f9e20dbce1dc", + "@treeseed/core": "github:treeseed-ai/core#7afac131b72af6bda1288c22455c2fa1b4bd46dd", + "@treeseed/sdk": "github:treeseed-ai/sdk#227284ebbc32730e3d086718c77579e5be5c7bed", "@treeseed/ui": "github:treeseed-ai/ui#a1793dd77ed94ca5495a855892bb5569c8179aed", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7397,7 +7397,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.ai.20260807T070432Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#9a2bbcc14fd231928af7df3f67db16b0a7f6a53b", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#7afac131b72af6bda1288c22455c2fa1b4bd46dd", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7408,7 +7408,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#3de64cac067330ede86875631459f9e20dbce1dc", + "@treeseed/sdk": "github:treeseed-ai/sdk#227284ebbc32730e3d086718c77579e5be5c7bed", "@treeseed/ui": "github:treeseed-ai/ui#a1793dd77ed94ca5495a855892bb5569c8179aed", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8758,7 +8758,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.ai.20260807T065948Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#3de64cac067330ede86875631459f9e20dbce1dc", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#227284ebbc32730e3d086718c77579e5be5c7bed", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", @@ -22734,6 +22734,136 @@ "type": "github", "url": "https://github.com/sponsors/wooorm" } + }, + "node_modules/@clack/prompts": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-0.11.0.tgz", + "integrity": "sha512-pMN5FcrEw9hUkZA4f+zLlzivQSeQf5dRGJjSUbvVYDLvpKCdQx5OaknvKzgbtXOizhP+SJJJjqEbOe55uKKfAw==", + "license": "MIT", + "dependencies": { + "@clack/core": "0.5.0", + "picocolors": "^1.0.0", + "sisteransi": "^1.0.5" + } + }, + "node_modules/@clack/core": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@clack/core/-/core-0.5.0.tgz", + "integrity": "sha512-p3y0FIOwaYRUPRcMO7+dlmLh8PSRcrjuTndsiA0WAFbWES0mLZlrjVoBRZ9DzkPFJZG6KGkJmoEAY0ZcVWTkow==", + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "sisteransi": "^1.0.5" + } + }, + "node_modules/@astrojs/cloudflare": { + "version": "12.6.13", + "resolved": "https://registry.npmjs.org/@astrojs/cloudflare/-/cloudflare-12.6.13.tgz", + "integrity": "sha512-oKaCyiovyQr183r9U93787Ju1zwk+rRMgPnLTwCLckHmOUK7sltA1Gp4LSGt8oNMgqQS6jR7uRdfQ/NPul37QA==", + "license": "MIT", + "dependencies": { + "@astrojs/internal-helpers": "0.7.6", + "@astrojs/underscore-redirects": "1.0.0", + "@cloudflare/workers-types": "^4.20260116.0", + "tinyglobby": "^0.2.15", + "vite": "^6.4.1", + "wrangler": "4.59.2" + }, + "peerDependencies": { + "astro": "^5.7.0" + } + }, + "node_modules/@astrojs/mdx": { + "version": "4.3.14", + "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-4.3.14.tgz", + "integrity": "sha512-FBrqJQORVm+rkRa2TS5CjU9PBA6hkhrwLVBSS9A77gN2+iehvjq1w6yya/d0YKC7osiVorKkr3Qd9wNbl0ZkGA==", + "license": "MIT", + "dependencies": { + "@astrojs/markdown-remark": "6.3.11", + "@mdx-js/mdx": "^3.1.1", + "acorn": "^8.15.0", + "es-module-lexer": "^1.7.0", + "estree-util-visit": "^2.0.0", + "hast-util-to-html": "^9.0.5", + "piccolore": "^0.1.3", + "rehype-raw": "^7.0.0", + "remark-gfm": "^4.0.1", + "remark-smartypants": "^3.0.2", + "source-map": "^0.7.6", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.3" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + }, + "peerDependencies": { + "astro": "^5.0.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "license": "MIT" + }, + "node_modules/@astrojs/starlight": { + "version": "0.37.6", + "resolved": "https://registry.npmjs.org/@astrojs/starlight/-/starlight-0.37.6.tgz", + "integrity": "sha512-wQrKwH431q+8FsLBnNQeG+R36TMtEGxTQ2AuiVpcx9APcazvL3n7wVW8mMmYyxX0POjTnxlcWPkdMGR3Yj1L+w==", + "license": "MIT", + "dependencies": { + "@astrojs/markdown-remark": "^6.3.1", + "@astrojs/mdx": "^4.2.3", + "@astrojs/sitemap": "^3.3.0", + "@pagefind/default-ui": "^1.3.0", + "@types/hast": "^3.0.4", + "@types/js-yaml": "^4.0.9", + "@types/mdast": "^4.0.4", + "astro-expressive-code": "^0.41.1", + "bcp-47": "^2.1.0", + "hast-util-from-html": "^2.0.1", + "hast-util-select": "^6.0.2", + "hast-util-to-string": "^3.0.0", + "hastscript": "^9.0.0", + "i18next": "^23.11.5", + "js-yaml": "^4.1.0", + "klona": "^2.0.6", + "magic-string": "^0.30.17", + "mdast-util-directive": "^3.0.0", + "mdast-util-to-markdown": "^2.1.0", + "mdast-util-to-string": "^4.0.0", + "pagefind": "^1.3.0", + "rehype": "^13.0.1", + "rehype-format": "^5.0.0", + "remark-directive": "^3.0.0", + "ultrahtml": "^1.6.0", + "unified": "^11.0.5", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.2" + }, + "peerDependencies": { + "astro": "^5.5.0" + } } } } diff --git a/package.json b/package.json index fdf026c9..be479e25 100644 --- a/package.json +++ b/package.json @@ -52,8 +52,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#9a2bbcc14fd231928af7df3f67db16b0a7f6a53b", - "@treeseed/sdk": "github:treeseed-ai/sdk#3de64cac067330ede86875631459f9e20dbce1dc", + "@treeseed/core": "github:treeseed-ai/core#7afac131b72af6bda1288c22455c2fa1b4bd46dd", + "@treeseed/sdk": "github:treeseed-ai/sdk#227284ebbc32730e3d086718c77579e5be5c7bed", "@treeseed/ui": "github:treeseed-ai/ui#a1793dd77ed94ca5495a855892bb5569c8179aed", "react": "^19.2.5", "react-dom": "^19.2.6" From 75500f959bc5e02e9b9929c8f0b26061d4e0ddd7 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Sun, 9 Aug 2026 11:31:06 -0400 Subject: [PATCH 117/315] build(deps): update @treeseed/core and @treeseed/sdk pointers Intent: - resolve staging update conflict Changes: - Update package.json and package-lock.json Dependency and pointer updates: - @treeseed/sdk: github:treeseed-ai/sdk#227284ebbc32730e3d086718c77579e5be5c7bed -> github:treeseed-ai/sdk#25b8f1c8d42fb9152b31a1f541d1903b4fd157ba - @treeseed/core: github:treeseed-ai/core#7afac131b72af6bda1288c22455c2fa1b4bd46dd -> github:treeseed-ai/core#204d8bc34fb80de9bdb794eb220b6350b26159c8 --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 124548e0..ef0b105e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#7afac131b72af6bda1288c22455c2fa1b4bd46dd", - "@treeseed/sdk": "github:treeseed-ai/sdk#227284ebbc32730e3d086718c77579e5be5c7bed", + "@treeseed/core": "github:treeseed-ai/core#204d8bc34fb80de9bdb794eb220b6350b26159c8", + "@treeseed/sdk": "github:treeseed-ai/sdk#25b8f1c8d42fb9152b31a1f541d1903b4fd157ba", "@treeseed/ui": "github:treeseed-ai/ui#a1793dd77ed94ca5495a855892bb5569c8179aed", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7397,7 +7397,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.ai.20260807T070432Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#7afac131b72af6bda1288c22455c2fa1b4bd46dd", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#204d8bc34fb80de9bdb794eb220b6350b26159c8", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7408,7 +7408,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#227284ebbc32730e3d086718c77579e5be5c7bed", + "@treeseed/sdk": "github:treeseed-ai/sdk#25b8f1c8d42fb9152b31a1f541d1903b4fd157ba", "@treeseed/ui": "github:treeseed-ai/ui#a1793dd77ed94ca5495a855892bb5569c8179aed", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8758,7 +8758,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.ai.20260807T065948Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#227284ebbc32730e3d086718c77579e5be5c7bed", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#25b8f1c8d42fb9152b31a1f541d1903b4fd157ba", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index be479e25..6ecbf07c 100644 --- a/package.json +++ b/package.json @@ -52,8 +52,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#7afac131b72af6bda1288c22455c2fa1b4bd46dd", - "@treeseed/sdk": "github:treeseed-ai/sdk#227284ebbc32730e3d086718c77579e5be5c7bed", + "@treeseed/core": "github:treeseed-ai/core#204d8bc34fb80de9bdb794eb220b6350b26159c8", + "@treeseed/sdk": "github:treeseed-ai/sdk#25b8f1c8d42fb9152b31a1f541d1903b4fd157ba", "@treeseed/ui": "github:treeseed-ai/ui#a1793dd77ed94ca5495a855892bb5569c8179aed", "react": "^19.2.5", "react-dom": "^19.2.6" From 6c7e20277d227fba03ddf24923cf8577d238bddb Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Sun, 9 Aug 2026 11:37:23 -0400 Subject: [PATCH 118/315] build(build): resolve update conflict Intent: - Save hint: resolve update conflict Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.ai.20260807T070845Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/ui: github:treeseed-ai/ui#a1793dd77ed94ca5495a855892bb5569c8179aed -> github:treeseed-ai/ui#0c20eceb18cdbdfba20ab17d1b7c26719359753b - dependencies.@treeseed/core: github:treeseed-ai/core#204d8bc34fb80de9bdb794eb220b6350b26159c8 -> github:treeseed-ai/core#d0029e0f3b285763a0ab9edc854bddd8d5840309 --- package-lock.json | 12 ++++++------ package.json | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index ef0b105e..2caa0470 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,9 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#204d8bc34fb80de9bdb794eb220b6350b26159c8", + "@treeseed/core": "github:treeseed-ai/core#d0029e0f3b285763a0ab9edc854bddd8d5840309", "@treeseed/sdk": "github:treeseed-ai/sdk#25b8f1c8d42fb9152b31a1f541d1903b4fd157ba", - "@treeseed/ui": "github:treeseed-ai/ui#a1793dd77ed94ca5495a855892bb5569c8179aed", + "@treeseed/ui": "github:treeseed-ai/ui#0c20eceb18cdbdfba20ab17d1b7c26719359753b", "react": "^19.2.5", "react-dom": "^19.2.6" }, @@ -7397,7 +7397,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.ai.20260807T070432Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#204d8bc34fb80de9bdb794eb220b6350b26159c8", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#d0029e0f3b285763a0ab9edc854bddd8d5840309", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7409,7 +7409,7 @@ "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", "@treeseed/sdk": "github:treeseed-ai/sdk#25b8f1c8d42fb9152b31a1f541d1903b4fd157ba", - "@treeseed/ui": "github:treeseed-ai/ui#a1793dd77ed94ca5495a855892bb5569c8179aed", + "@treeseed/ui": "github:treeseed-ai/ui#0c20eceb18cdbdfba20ab17d1b7c26719359753b", "astro": "^5.6.1", "esbuild": "^0.28.0", "katex": "^0.16.22", @@ -9456,8 +9456,8 @@ } }, "node_modules/@treeseed/ui": { - "version": "0.12.18-dev.treedx-perf.20260806T042250Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#a1793dd77ed94ca5495a855892bb5569c8179aed", + "version": "0.12.18-dev.staging.20260809T135255Z", + "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#0c20eceb18cdbdfba20ab17d1b7c26719359753b", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", diff --git a/package.json b/package.json index 6ecbf07c..68bf678d 100644 --- a/package.json +++ b/package.json @@ -52,9 +52,9 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#204d8bc34fb80de9bdb794eb220b6350b26159c8", + "@treeseed/core": "github:treeseed-ai/core#d0029e0f3b285763a0ab9edc854bddd8d5840309", "@treeseed/sdk": "github:treeseed-ai/sdk#25b8f1c8d42fb9152b31a1f541d1903b4fd157ba", - "@treeseed/ui": "github:treeseed-ai/ui#a1793dd77ed94ca5495a855892bb5569c8179aed", + "@treeseed/ui": "github:treeseed-ai/ui#0c20eceb18cdbdfba20ab17d1b7c26719359753b", "react": "^19.2.5", "react-dom": "^19.2.6" }, From 5d1ab25c85eabd54abb38f6e8d53aa6b89f963b7 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Sun, 9 Aug 2026 12:17:32 -0400 Subject: [PATCH 119/315] build(docs): Migrate agent execution requirements after staging Intent: - Save hint: Migrate agent execution requirements after staging update Changes: - Updates 10 files across docs: 8, build: 2. - Touches docs/src/content/agents/architect.mdx, docs/src/content/agents/engineer.mdx, docs/src/content/agents/releaser.mdx, docs/src/content/agents/reporter.mdx, docs/src/content/agents/researcher.mdx, docs/src/content/agents/reviewer.mdx, .... - Plans package version/tag 0.12.59-dev.ai.20260807T070845Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#25b8f1c8d42fb9152b31a1f541d1903b4fd157ba -> github:treeseed-ai/sdk#c5a8d76378446992e51c49f266f0ca6ff93ac80d - dependencies.@treeseed/core: github:treeseed-ai/core#d0029e0f3b285763a0ab9edc854bddd8d5840309 -> github:treeseed-ai/core#22c1bd6a62fce4fc09b028f7db56a4934daa6f73 --- docs/src/content/agents/architect.mdx | 16 ++++++++-------- docs/src/content/agents/engineer.mdx | 16 ++++++++-------- docs/src/content/agents/releaser.mdx | 16 ++++++++-------- docs/src/content/agents/reporter.mdx | 4 ++-- docs/src/content/agents/researcher.mdx | 16 ++++++++-------- docs/src/content/agents/reviewer.mdx | 16 ++++++++-------- docs/src/content/agents/technical-writer.mdx | 16 ++++++++-------- docs/src/content/agents/tester.mdx | 16 ++++++++-------- package-lock.json | 10 +++++----- package.json | 4 ++-- 10 files changed, 65 insertions(+), 65 deletions(-) diff --git a/docs/src/content/agents/architect.mdx b/docs/src/content/agents/architect.mdx index 960b7e1a..3becb3e0 100644 --- a/docs/src/content/agents/architect.mdx +++ b/docs/src/content/agents/architect.mdx @@ -109,8 +109,8 @@ activityProfiles: defaultAnswerPolicy: kind: team-human execution: - providerPreference: - - codex + requiredCapabilities: + - agent-execution maxRuntimeSeconds: 1800 maxRetries: 2 verificationRequired: false @@ -178,8 +178,8 @@ activityProfiles: defaultAnswerPolicy: kind: team-human execution: - providerPreference: - - codex + requiredCapabilities: + - agent-execution maxRuntimeSeconds: 1800 maxRetries: 2 verificationRequired: false @@ -247,8 +247,8 @@ activityProfiles: defaultAnswerPolicy: kind: team-human execution: - providerPreference: - - codex + requiredCapabilities: + - agent-execution maxRuntimeSeconds: 1800 maxRetries: 2 verificationRequired: false @@ -324,8 +324,8 @@ activityProfiles: defaultAnswerPolicy: kind: team-human execution: - providerPreference: - - codex + requiredCapabilities: + - agent-execution maxRuntimeSeconds: 1800 maxRetries: 2 verificationRequired: false diff --git a/docs/src/content/agents/engineer.mdx b/docs/src/content/agents/engineer.mdx index 50fbd02c..7a07baaa 100644 --- a/docs/src/content/agents/engineer.mdx +++ b/docs/src/content/agents/engineer.mdx @@ -108,8 +108,8 @@ activityProfiles: defaultAnswerPolicy: kind: human-or-agent execution: - providerPreference: - - codex + requiredCapabilities: + - agent-execution maxRuntimeSeconds: 1800 maxRetries: 2 verificationRequired: true @@ -177,8 +177,8 @@ activityProfiles: defaultAnswerPolicy: kind: human-or-agent execution: - providerPreference: - - codex + requiredCapabilities: + - agent-execution maxRuntimeSeconds: 1800 maxRetries: 2 verificationRequired: false @@ -246,8 +246,8 @@ activityProfiles: defaultAnswerPolicy: kind: human-or-agent execution: - providerPreference: - - codex + requiredCapabilities: + - agent-execution maxRuntimeSeconds: 1800 maxRetries: 2 verificationRequired: false @@ -331,8 +331,8 @@ activityProfiles: defaultAnswerPolicy: kind: human-or-agent execution: - providerPreference: - - codex + requiredCapabilities: + - agent-execution maxRuntimeSeconds: 1800 maxRetries: 2 verificationRequired: true diff --git a/docs/src/content/agents/releaser.mdx b/docs/src/content/agents/releaser.mdx index b56d2058..54b2f5ea 100644 --- a/docs/src/content/agents/releaser.mdx +++ b/docs/src/content/agents/releaser.mdx @@ -112,8 +112,8 @@ activityProfiles: defaultAnswerPolicy: kind: team-human execution: - providerPreference: - - codex + requiredCapabilities: + - agent-execution maxRuntimeSeconds: 1800 maxRetries: 2 verificationRequired: false @@ -181,8 +181,8 @@ activityProfiles: defaultAnswerPolicy: kind: team-human execution: - providerPreference: - - codex + requiredCapabilities: + - agent-execution maxRuntimeSeconds: 1800 maxRetries: 2 verificationRequired: false @@ -250,8 +250,8 @@ activityProfiles: defaultAnswerPolicy: kind: team-human execution: - providerPreference: - - codex + requiredCapabilities: + - agent-execution maxRuntimeSeconds: 1800 maxRetries: 2 verificationRequired: false @@ -330,8 +330,8 @@ activityProfiles: defaultAnswerPolicy: kind: team-human execution: - providerPreference: - - codex + requiredCapabilities: + - agent-execution maxRuntimeSeconds: 1800 maxRetries: 2 verificationRequired: false diff --git a/docs/src/content/agents/reporter.mdx b/docs/src/content/agents/reporter.mdx index 5c3fe47e..1276e5bd 100644 --- a/docs/src/content/agents/reporter.mdx +++ b/docs/src/content/agents/reporter.mdx @@ -101,8 +101,8 @@ activityProfiles: modelMutations: - workday_report:create execution: - providerPreference: - - codex + requiredCapabilities: + - agent-execution maxRuntimeSeconds: 1800 maxRetries: 2 verificationRequired: false diff --git a/docs/src/content/agents/researcher.mdx b/docs/src/content/agents/researcher.mdx index a1e8a8fa..b9ea77d5 100644 --- a/docs/src/content/agents/researcher.mdx +++ b/docs/src/content/agents/researcher.mdx @@ -109,8 +109,8 @@ activityProfiles: defaultAnswerPolicy: kind: human-or-agent execution: - providerPreference: - - codex + requiredCapabilities: + - agent-execution maxRuntimeSeconds: 1800 maxRetries: 2 verificationRequired: false @@ -178,8 +178,8 @@ activityProfiles: defaultAnswerPolicy: kind: human-or-agent execution: - providerPreference: - - codex + requiredCapabilities: + - agent-execution maxRuntimeSeconds: 1800 maxRetries: 2 verificationRequired: false @@ -247,8 +247,8 @@ activityProfiles: defaultAnswerPolicy: kind: human-or-agent execution: - providerPreference: - - codex + requiredCapabilities: + - agent-execution maxRuntimeSeconds: 1800 maxRetries: 2 verificationRequired: false @@ -324,8 +324,8 @@ activityProfiles: defaultAnswerPolicy: kind: human-or-agent execution: - providerPreference: - - codex + requiredCapabilities: + - agent-execution maxRuntimeSeconds: 1800 maxRetries: 2 verificationRequired: false diff --git a/docs/src/content/agents/reviewer.mdx b/docs/src/content/agents/reviewer.mdx index 93e27534..92ff5d34 100644 --- a/docs/src/content/agents/reviewer.mdx +++ b/docs/src/content/agents/reviewer.mdx @@ -109,8 +109,8 @@ activityProfiles: defaultAnswerPolicy: kind: human-or-agent execution: - providerPreference: - - codex + requiredCapabilities: + - agent-execution maxRuntimeSeconds: 1800 maxRetries: 2 verificationRequired: false @@ -178,8 +178,8 @@ activityProfiles: defaultAnswerPolicy: kind: human-or-agent execution: - providerPreference: - - codex + requiredCapabilities: + - agent-execution maxRuntimeSeconds: 1800 maxRetries: 2 verificationRequired: false @@ -247,8 +247,8 @@ activityProfiles: defaultAnswerPolicy: kind: human-or-agent execution: - providerPreference: - - codex + requiredCapabilities: + - agent-execution maxRuntimeSeconds: 1800 maxRetries: 2 verificationRequired: false @@ -325,8 +325,8 @@ activityProfiles: defaultAnswerPolicy: kind: human-or-agent execution: - providerPreference: - - codex + requiredCapabilities: + - agent-execution maxRuntimeSeconds: 1800 maxRetries: 2 verificationRequired: false diff --git a/docs/src/content/agents/technical-writer.mdx b/docs/src/content/agents/technical-writer.mdx index 9719bdb1..d115e488 100644 --- a/docs/src/content/agents/technical-writer.mdx +++ b/docs/src/content/agents/technical-writer.mdx @@ -108,8 +108,8 @@ activityProfiles: defaultAnswerPolicy: kind: human-or-agent execution: - providerPreference: - - codex + requiredCapabilities: + - agent-execution maxRuntimeSeconds: 1800 maxRetries: 2 verificationRequired: false @@ -177,8 +177,8 @@ activityProfiles: defaultAnswerPolicy: kind: human-or-agent execution: - providerPreference: - - codex + requiredCapabilities: + - agent-execution maxRuntimeSeconds: 1800 maxRetries: 2 verificationRequired: false @@ -246,8 +246,8 @@ activityProfiles: defaultAnswerPolicy: kind: human-or-agent execution: - providerPreference: - - codex + requiredCapabilities: + - agent-execution maxRuntimeSeconds: 1800 maxRetries: 2 verificationRequired: false @@ -322,8 +322,8 @@ activityProfiles: defaultAnswerPolicy: kind: human-or-agent execution: - providerPreference: - - codex + requiredCapabilities: + - agent-execution maxRuntimeSeconds: 1800 maxRetries: 2 verificationRequired: false diff --git a/docs/src/content/agents/tester.mdx b/docs/src/content/agents/tester.mdx index 94c41e23..da5be42c 100644 --- a/docs/src/content/agents/tester.mdx +++ b/docs/src/content/agents/tester.mdx @@ -108,8 +108,8 @@ activityProfiles: defaultAnswerPolicy: kind: human-or-agent execution: - providerPreference: - - codex + requiredCapabilities: + - agent-execution maxRuntimeSeconds: 1800 maxRetries: 2 verificationRequired: true @@ -177,8 +177,8 @@ activityProfiles: defaultAnswerPolicy: kind: human-or-agent execution: - providerPreference: - - codex + requiredCapabilities: + - agent-execution maxRuntimeSeconds: 1800 maxRetries: 2 verificationRequired: false @@ -246,8 +246,8 @@ activityProfiles: defaultAnswerPolicy: kind: human-or-agent execution: - providerPreference: - - codex + requiredCapabilities: + - agent-execution maxRuntimeSeconds: 1800 maxRetries: 2 verificationRequired: false @@ -331,8 +331,8 @@ activityProfiles: defaultAnswerPolicy: kind: human-or-agent execution: - providerPreference: - - codex + requiredCapabilities: + - agent-execution maxRuntimeSeconds: 1800 maxRetries: 2 verificationRequired: true diff --git a/package-lock.json b/package-lock.json index 2caa0470..fdbf1dc2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#d0029e0f3b285763a0ab9edc854bddd8d5840309", - "@treeseed/sdk": "github:treeseed-ai/sdk#25b8f1c8d42fb9152b31a1f541d1903b4fd157ba", + "@treeseed/core": "github:treeseed-ai/core#22c1bd6a62fce4fc09b028f7db56a4934daa6f73", + "@treeseed/sdk": "github:treeseed-ai/sdk#c5a8d76378446992e51c49f266f0ca6ff93ac80d", "@treeseed/ui": "github:treeseed-ai/ui#0c20eceb18cdbdfba20ab17d1b7c26719359753b", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7397,7 +7397,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.ai.20260807T070432Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#d0029e0f3b285763a0ab9edc854bddd8d5840309", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#22c1bd6a62fce4fc09b028f7db56a4934daa6f73", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7408,7 +7408,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#25b8f1c8d42fb9152b31a1f541d1903b4fd157ba", + "@treeseed/sdk": "github:treeseed-ai/sdk#c5a8d76378446992e51c49f266f0ca6ff93ac80d", "@treeseed/ui": "github:treeseed-ai/ui#0c20eceb18cdbdfba20ab17d1b7c26719359753b", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8758,7 +8758,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.ai.20260807T065948Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#25b8f1c8d42fb9152b31a1f541d1903b4fd157ba", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#c5a8d76378446992e51c49f266f0ca6ff93ac80d", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index 68bf678d..ffbe7aff 100644 --- a/package.json +++ b/package.json @@ -52,8 +52,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#d0029e0f3b285763a0ab9edc854bddd8d5840309", - "@treeseed/sdk": "github:treeseed-ai/sdk#25b8f1c8d42fb9152b31a1f541d1903b4fd157ba", + "@treeseed/core": "github:treeseed-ai/core#22c1bd6a62fce4fc09b028f7db56a4934daa6f73", + "@treeseed/sdk": "github:treeseed-ai/sdk#c5a8d76378446992e51c49f266f0ca6ff93ac80d", "@treeseed/ui": "github:treeseed-ai/ui#0c20eceb18cdbdfba20ab17d1b7c26719359753b", "react": "^19.2.5", "react-dom": "^19.2.6" From 8f9e2d512f01b5c2ce044d377da157dc386c0ddf Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Sun, 9 Aug 2026 12:34:19 -0400 Subject: [PATCH 120/315] build(build): Support initial staging promotion for new package Intent: - Save hint: Support initial staging promotion for new package repositories Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.ai.20260807T070845Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#c5a8d76378446992e51c49f266f0ca6ff93ac80d -> github:treeseed-ai/sdk#c76726319d081ad08cb70be9581f93f97bd53243 - dependencies.@treeseed/ui: github:treeseed-ai/ui#0c20eceb18cdbdfba20ab17d1b7c26719359753b -> github:treeseed-ai/ui#4e46b5dc7b1c548128f13962269bc569c94c9cad - dependencies.@treeseed/core: github:treeseed-ai/core#22c1bd6a62fce4fc09b028f7db56a4934daa6f73 -> github:treeseed-ai/core#1e5776d8496db2653b562a101e432e84e6072075 --- package-lock.json | 16 ++++++++-------- package.json | 6 +++--- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index fdbf1dc2..21e6604d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,9 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#22c1bd6a62fce4fc09b028f7db56a4934daa6f73", - "@treeseed/sdk": "github:treeseed-ai/sdk#c5a8d76378446992e51c49f266f0ca6ff93ac80d", - "@treeseed/ui": "github:treeseed-ai/ui#0c20eceb18cdbdfba20ab17d1b7c26719359753b", + "@treeseed/core": "github:treeseed-ai/core#1e5776d8496db2653b562a101e432e84e6072075", + "@treeseed/sdk": "github:treeseed-ai/sdk#c76726319d081ad08cb70be9581f93f97bd53243", + "@treeseed/ui": "github:treeseed-ai/ui#4e46b5dc7b1c548128f13962269bc569c94c9cad", "react": "^19.2.5", "react-dom": "^19.2.6" }, @@ -7397,7 +7397,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.ai.20260807T070432Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#22c1bd6a62fce4fc09b028f7db56a4934daa6f73", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#1e5776d8496db2653b562a101e432e84e6072075", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7408,8 +7408,8 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#c5a8d76378446992e51c49f266f0ca6ff93ac80d", - "@treeseed/ui": "github:treeseed-ai/ui#0c20eceb18cdbdfba20ab17d1b7c26719359753b", + "@treeseed/sdk": "github:treeseed-ai/sdk#c76726319d081ad08cb70be9581f93f97bd53243", + "@treeseed/ui": "github:treeseed-ai/ui#4e46b5dc7b1c548128f13962269bc569c94c9cad", "astro": "^5.6.1", "esbuild": "^0.28.0", "katex": "^0.16.22", @@ -8758,7 +8758,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.ai.20260807T065948Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#c5a8d76378446992e51c49f266f0ca6ff93ac80d", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#c76726319d081ad08cb70be9581f93f97bd53243", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", @@ -9457,7 +9457,7 @@ }, "node_modules/@treeseed/ui": { "version": "0.12.18-dev.staging.20260809T135255Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#0c20eceb18cdbdfba20ab17d1b7c26719359753b", + "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#4e46b5dc7b1c548128f13962269bc569c94c9cad", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", diff --git a/package.json b/package.json index ffbe7aff..107093e2 100644 --- a/package.json +++ b/package.json @@ -52,9 +52,9 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#22c1bd6a62fce4fc09b028f7db56a4934daa6f73", - "@treeseed/sdk": "github:treeseed-ai/sdk#c5a8d76378446992e51c49f266f0ca6ff93ac80d", - "@treeseed/ui": "github:treeseed-ai/ui#0c20eceb18cdbdfba20ab17d1b7c26719359753b", + "@treeseed/core": "github:treeseed-ai/core#1e5776d8496db2653b562a101e432e84e6072075", + "@treeseed/sdk": "github:treeseed-ai/sdk#c76726319d081ad08cb70be9581f93f97bd53243", + "@treeseed/ui": "github:treeseed-ai/ui#4e46b5dc7b1c548128f13962269bc569c94c9cad", "react": "^19.2.5", "react-dom": "^19.2.6" }, From a8458c4c0859d08085586a23289fd7004d7bee1e Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Sun, 9 Aug 2026 20:25:36 -0400 Subject: [PATCH 121/315] build(build): reconcile standalone admin and guide integration contracts Intent: - Save hint: reconcile standalone admin and guide integration contracts Changes: - Updates 4 files across build: 2, config: 1, tests: 1. - Touches package-lock.json, package.json, tests/contract/package/admin-package.test.ts, treeseed.package.yaml. - Plans package version/tag 0.12.59-dev.fix-ai-staging-verification.20260810T002524Z for @treeseed/admin. --- package-lock.json | 4 ++-- package.json | 2 +- tests/contract/package/admin-package.test.ts | 6 ++++-- treeseed.package.yaml | 11 +++++------ 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index 21e6604d..674826c7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@treeseed/admin", - "version": "0.12.59-dev.ai.20260807T070845Z", + "version": "0.12.59-dev.fix-ai-staging-verification.20260810T002524Z", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@treeseed/admin", - "version": "0.12.59-dev.ai.20260807T070845Z", + "version": "0.12.59-dev.fix-ai-staging-verification.20260810T002524Z", "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", diff --git a/package.json b/package.json index 107093e2..02c891f7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@treeseed/admin", - "version": "0.12.59-dev.ai.20260807T070845Z", + "version": "0.12.59-dev.fix-ai-staging-verification.20260810T002524Z", "description": "Treeseed administration portal framework built on @treeseed/core and @treeseed/ui.", "license": "AGPL-3.0-only", "repository": { diff --git a/tests/contract/package/admin-package.test.ts b/tests/contract/package/admin-package.test.ts index cd5be16a..b1fc6cdc 100644 --- a/tests/contract/package/admin-package.test.ts +++ b/tests/contract/package/admin-package.test.ts @@ -341,8 +341,10 @@ describe('@treeseed/admin identity and team surface', () => { expect(site).toContain('package: "@treeseed/core/plugin-default"'); expect(site).toContain('package: "@treeseed/admin/plugin"'); expect(manifest).toContain('type: web-application'); - expect(manifest).toContain('topology: split_site_content'); - expect(manifest).toContain('contentRuntimeSource: r2_preview_overlay'); + expect(manifest).toContain('topology: single_repository_site'); + expect(manifest).toContain('sitePath: docs'); + expect(manifest).toContain('contentPath: docs/src/content'); + expect(manifest).toContain('contentRuntimeSource: r2_published_manifest'); expect(packageJson).toContain('"build:app"'); expect(existsSync('astro.config.ts')).toBe(true); expect(existsSync('src/content.config.ts')).toBe(true); diff --git a/treeseed.package.yaml b/treeseed.package.yaml index c0f2ac5c..f7e1ad38 100644 --- a/treeseed.package.yaml +++ b/treeseed.package.yaml @@ -20,13 +20,12 @@ artifacts: releaseGate: workflow: verify.yml projectArchitecture: - topology: split_site_content + topology: single_repository_site rootPath: . - sitePath: . - contentRuntimeSource: r2_preview_overlay - localContentMaterialization: none - requiresLocalContentForCi: false - requiresLocalContentForDeploy: false + sitePath: docs + contentPath: docs/src/content + contentRuntimeSource: r2_published_manifest + localContentMaterialization: existing_path contentPublishTarget: kind: cloudflare_r2 prefix: packages/admin From 41395242f33c4739cf85f4ffab93dde7f719b336 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Sun, 9 Aug 2026 22:32:08 -0400 Subject: [PATCH 122/315] build(build): route package bootstrap Git through SDK runner Intent: - Save hint: route package bootstrap Git through SDK runner Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.fix-ai-staging-verification.20260810T002524Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#c76726319d081ad08cb70be9581f93f97bd53243 -> github:treeseed-ai/sdk#f4dbe00f22ef5225559136a4fef699917aaedddc - dependencies.@treeseed/core: github:treeseed-ai/core#1e5776d8496db2653b562a101e432e84e6072075 -> github:treeseed-ai/core#0c54d517984a26269f409d9f807c3e5b647f49d6 --- package-lock.json | 14 +++++++------- package.json | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 674826c7..19ab5d20 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#1e5776d8496db2653b562a101e432e84e6072075", - "@treeseed/sdk": "github:treeseed-ai/sdk#c76726319d081ad08cb70be9581f93f97bd53243", + "@treeseed/core": "github:treeseed-ai/core#0c54d517984a26269f409d9f807c3e5b647f49d6", + "@treeseed/sdk": "github:treeseed-ai/sdk#f4dbe00f22ef5225559136a4fef699917aaedddc", "@treeseed/ui": "github:treeseed-ai/ui#4e46b5dc7b1c548128f13962269bc569c94c9cad", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7396,8 +7396,8 @@ } }, "node_modules/@treeseed/core": { - "version": "0.12.60-dev.ai.20260807T070432Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#1e5776d8496db2653b562a101e432e84e6072075", + "version": "0.12.60-dev.fix-ai-staging-verification.20260810T022944Z", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#0c54d517984a26269f409d9f807c3e5b647f49d6", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7408,7 +7408,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#c76726319d081ad08cb70be9581f93f97bd53243", + "@treeseed/sdk": "github:treeseed-ai/sdk#f4dbe00f22ef5225559136a4fef699917aaedddc", "@treeseed/ui": "github:treeseed-ai/ui#4e46b5dc7b1c548128f13962269bc569c94c9cad", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8757,8 +8757,8 @@ } }, "node_modules/@treeseed/sdk": { - "version": "0.12.63-dev.ai.20260807T065948Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#c76726319d081ad08cb70be9581f93f97bd53243", + "version": "0.12.63-dev.fix-ai-staging-verification.20260810T014706Z", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#f4dbe00f22ef5225559136a4fef699917aaedddc", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index 02c891f7..77942240 100644 --- a/package.json +++ b/package.json @@ -52,8 +52,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#1e5776d8496db2653b562a101e432e84e6072075", - "@treeseed/sdk": "github:treeseed-ai/sdk#c76726319d081ad08cb70be9581f93f97bd53243", + "@treeseed/core": "github:treeseed-ai/core#0c54d517984a26269f409d9f807c3e5b647f49d6", + "@treeseed/sdk": "github:treeseed-ai/sdk#f4dbe00f22ef5225559136a4fef699917aaedddc", "@treeseed/ui": "github:treeseed-ai/ui#4e46b5dc7b1c548128f13962269bc569c94c9cad", "react": "^19.2.5", "react-dom": "^19.2.6" From 9dc4da774b769e984f4fbc84f5dd430eb44f9c2f Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Sun, 9 Aug 2026 23:27:32 -0400 Subject: [PATCH 123/315] build(build): fix UI transport and simulation ownership contracts Intent: - Save hint: fix UI transport and simulation ownership contracts Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.fix-ai-staging-verification.20260810T002524Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/ui: github:treeseed-ai/ui#4e46b5dc7b1c548128f13962269bc569c94c9cad -> github:treeseed-ai/ui#5f6981b9a7618e0f9d82e784aafa890c1492e31c - dependencies.@treeseed/core: github:treeseed-ai/core#0c54d517984a26269f409d9f807c3e5b647f49d6 -> github:treeseed-ai/core#7f2f9f0ba65362adfe22bfa01161af40b4088e7c --- package-lock.json | 12 ++++++------ package.json | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 19ab5d20..cfa04fdb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,9 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#0c54d517984a26269f409d9f807c3e5b647f49d6", + "@treeseed/core": "github:treeseed-ai/core#7f2f9f0ba65362adfe22bfa01161af40b4088e7c", "@treeseed/sdk": "github:treeseed-ai/sdk#f4dbe00f22ef5225559136a4fef699917aaedddc", - "@treeseed/ui": "github:treeseed-ai/ui#4e46b5dc7b1c548128f13962269bc569c94c9cad", + "@treeseed/ui": "github:treeseed-ai/ui#5f6981b9a7618e0f9d82e784aafa890c1492e31c", "react": "^19.2.5", "react-dom": "^19.2.6" }, @@ -7397,7 +7397,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.fix-ai-staging-verification.20260810T022944Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#0c54d517984a26269f409d9f807c3e5b647f49d6", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#7f2f9f0ba65362adfe22bfa01161af40b4088e7c", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7409,7 +7409,7 @@ "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", "@treeseed/sdk": "github:treeseed-ai/sdk#f4dbe00f22ef5225559136a4fef699917aaedddc", - "@treeseed/ui": "github:treeseed-ai/ui#4e46b5dc7b1c548128f13962269bc569c94c9cad", + "@treeseed/ui": "github:treeseed-ai/ui#5f6981b9a7618e0f9d82e784aafa890c1492e31c", "astro": "^5.6.1", "esbuild": "^0.28.0", "katex": "^0.16.22", @@ -9456,8 +9456,8 @@ } }, "node_modules/@treeseed/ui": { - "version": "0.12.18-dev.staging.20260809T135255Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#4e46b5dc7b1c548128f13962269bc569c94c9cad", + "version": "0.12.18-dev.fix-ai-staging-verification.20260810T031836Z", + "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#5f6981b9a7618e0f9d82e784aafa890c1492e31c", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", diff --git a/package.json b/package.json index 77942240..d98adf4a 100644 --- a/package.json +++ b/package.json @@ -52,9 +52,9 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#0c54d517984a26269f409d9f807c3e5b647f49d6", + "@treeseed/core": "github:treeseed-ai/core#7f2f9f0ba65362adfe22bfa01161af40b4088e7c", "@treeseed/sdk": "github:treeseed-ai/sdk#f4dbe00f22ef5225559136a4fef699917aaedddc", - "@treeseed/ui": "github:treeseed-ai/ui#4e46b5dc7b1c548128f13962269bc569c94c9cad", + "@treeseed/ui": "github:treeseed-ai/ui#5f6981b9a7618e0f9d82e784aafa890c1492e31c", "react": "^19.2.5", "react-dom": "^19.2.6" }, From 348ecea55e9c12075d0d7ff224ebf4f4ebaae65a Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Mon, 10 Aug 2026 01:55:10 -0400 Subject: [PATCH 124/315] build(build): close local runtime reconciliation after AI integration Intent: - Save hint: close local runtime reconciliation after AI integration Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.fix-local-treedx-project-closure.20260810T055455Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#f4dbe00f22ef5225559136a4fef699917aaedddc -> github:treeseed-ai/sdk#84cddd5331fbcf6994a80198dc281a3c7bf1d42d - dependencies.@treeseed/core: github:treeseed-ai/core#7f2f9f0ba65362adfe22bfa01161af40b4088e7c -> github:treeseed-ai/core#1a3074c1298fb339719fdb3dd8e4b4085422dba0 --- package-lock.json | 18 +++++++++--------- package.json | 6 +++--- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index cfa04fdb..f67b2386 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,17 +1,17 @@ { "name": "@treeseed/admin", - "version": "0.12.59-dev.fix-ai-staging-verification.20260810T002524Z", + "version": "0.12.59-dev.fix-local-treedx-project-closure.20260810T055455Z", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@treeseed/admin", - "version": "0.12.59-dev.fix-ai-staging-verification.20260810T002524Z", + "version": "0.12.59-dev.fix-local-treedx-project-closure.20260810T055455Z", "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#7f2f9f0ba65362adfe22bfa01161af40b4088e7c", - "@treeseed/sdk": "github:treeseed-ai/sdk#f4dbe00f22ef5225559136a4fef699917aaedddc", + "@treeseed/core": "github:treeseed-ai/core#1a3074c1298fb339719fdb3dd8e4b4085422dba0", + "@treeseed/sdk": "github:treeseed-ai/sdk#84cddd5331fbcf6994a80198dc281a3c7bf1d42d", "@treeseed/ui": "github:treeseed-ai/ui#5f6981b9a7618e0f9d82e784aafa890c1492e31c", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7396,8 +7396,8 @@ } }, "node_modules/@treeseed/core": { - "version": "0.12.60-dev.fix-ai-staging-verification.20260810T022944Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#7f2f9f0ba65362adfe22bfa01161af40b4088e7c", + "version": "0.12.60-dev.fix-local-treedx-project-closure.20260810T055300Z", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#1a3074c1298fb339719fdb3dd8e4b4085422dba0", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7408,7 +7408,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#f4dbe00f22ef5225559136a4fef699917aaedddc", + "@treeseed/sdk": "github:treeseed-ai/sdk#84cddd5331fbcf6994a80198dc281a3c7bf1d42d", "@treeseed/ui": "github:treeseed-ai/ui#5f6981b9a7618e0f9d82e784aafa890c1492e31c", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8757,8 +8757,8 @@ } }, "node_modules/@treeseed/sdk": { - "version": "0.12.63-dev.fix-ai-staging-verification.20260810T014706Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#f4dbe00f22ef5225559136a4fef699917aaedddc", + "version": "0.12.63-dev.fix-local-treedx-project-closure.20260810T050925Z", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#84cddd5331fbcf6994a80198dc281a3c7bf1d42d", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index d98adf4a..c2ff561f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@treeseed/admin", - "version": "0.12.59-dev.fix-ai-staging-verification.20260810T002524Z", + "version": "0.12.59-dev.fix-local-treedx-project-closure.20260810T055455Z", "description": "Treeseed administration portal framework built on @treeseed/core and @treeseed/ui.", "license": "AGPL-3.0-only", "repository": { @@ -52,8 +52,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#7f2f9f0ba65362adfe22bfa01161af40b4088e7c", - "@treeseed/sdk": "github:treeseed-ai/sdk#f4dbe00f22ef5225559136a4fef699917aaedddc", + "@treeseed/core": "github:treeseed-ai/core#1a3074c1298fb339719fdb3dd8e4b4085422dba0", + "@treeseed/sdk": "github:treeseed-ai/sdk#84cddd5331fbcf6994a80198dc281a3c7bf1d42d", "@treeseed/ui": "github:treeseed-ai/ui#5f6981b9a7618e0f9d82e784aafa890c1492e31c", "react": "^19.2.5", "react-dom": "^19.2.6" From bc95640efe7e9577fb7dcf2fb60ada03b94abbcb Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Mon, 10 Aug 2026 03:26:28 -0400 Subject: [PATCH 125/315] build(build): defer platform reconciliation during active workflows Intent: - Save hint: defer platform reconciliation during active workflows Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.fix-local-treedx-project-closure.20260810T055455Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#84cddd5331fbcf6994a80198dc281a3c7bf1d42d -> github:treeseed-ai/sdk#e8cfda0aac26c81c5d6965dc8c645165952d19ab - dependencies.@treeseed/core: github:treeseed-ai/core#1a3074c1298fb339719fdb3dd8e4b4085422dba0 -> github:treeseed-ai/core#d0747728401fffde78812ffd26068574c108b724 --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index f67b2386..4ba69b2d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#1a3074c1298fb339719fdb3dd8e4b4085422dba0", - "@treeseed/sdk": "github:treeseed-ai/sdk#84cddd5331fbcf6994a80198dc281a3c7bf1d42d", + "@treeseed/core": "github:treeseed-ai/core#d0747728401fffde78812ffd26068574c108b724", + "@treeseed/sdk": "github:treeseed-ai/sdk#e8cfda0aac26c81c5d6965dc8c645165952d19ab", "@treeseed/ui": "github:treeseed-ai/ui#5f6981b9a7618e0f9d82e784aafa890c1492e31c", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7397,7 +7397,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.fix-local-treedx-project-closure.20260810T055300Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#1a3074c1298fb339719fdb3dd8e4b4085422dba0", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#d0747728401fffde78812ffd26068574c108b724", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7408,7 +7408,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#84cddd5331fbcf6994a80198dc281a3c7bf1d42d", + "@treeseed/sdk": "github:treeseed-ai/sdk#e8cfda0aac26c81c5d6965dc8c645165952d19ab", "@treeseed/ui": "github:treeseed-ai/ui#5f6981b9a7618e0f9d82e784aafa890c1492e31c", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8758,7 +8758,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.fix-local-treedx-project-closure.20260810T050925Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#84cddd5331fbcf6994a80198dc281a3c7bf1d42d", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#e8cfda0aac26c81c5d6965dc8c645165952d19ab", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index c2ff561f..44788d48 100644 --- a/package.json +++ b/package.json @@ -52,8 +52,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#1a3074c1298fb339719fdb3dd8e4b4085422dba0", - "@treeseed/sdk": "github:treeseed-ai/sdk#84cddd5331fbcf6994a80198dc281a3c7bf1d42d", + "@treeseed/core": "github:treeseed-ai/core#d0747728401fffde78812ffd26068574c108b724", + "@treeseed/sdk": "github:treeseed-ai/sdk#e8cfda0aac26c81c5d6965dc8c645165952d19ab", "@treeseed/ui": "github:treeseed-ai/ui#5f6981b9a7618e0f9d82e784aafa890c1492e31c", "react": "^19.2.5", "react-dom": "^19.2.6" From 0877e6f767fffb7bb449fff7c413a5292ab2986a Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Mon, 10 Aug 2026 05:19:38 -0400 Subject: [PATCH 126/315] build(build): synchronize shared fixture aliases after staging cleanup Intent: - Save hint: synchronize shared fixture aliases after staging cleanup Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.fix-stage-fixture-alias-cleanup.20260810T091911Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#e8cfda0aac26c81c5d6965dc8c645165952d19ab -> github:treeseed-ai/sdk#1608089150841c29702b33b37f0fce931577b76d - dependencies.@treeseed/core: github:treeseed-ai/core#d0747728401fffde78812ffd26068574c108b724 -> github:treeseed-ai/core#f59657ec14cffe85396046d224e196b5f4550ce0 --- package-lock.json | 18 +++++++++--------- package.json | 6 +++--- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4ba69b2d..859651bb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,17 +1,17 @@ { "name": "@treeseed/admin", - "version": "0.12.59-dev.fix-local-treedx-project-closure.20260810T055455Z", + "version": "0.12.59-dev.fix-stage-fixture-alias-cleanup.20260810T091911Z", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@treeseed/admin", - "version": "0.12.59-dev.fix-local-treedx-project-closure.20260810T055455Z", + "version": "0.12.59-dev.fix-stage-fixture-alias-cleanup.20260810T091911Z", "license": "AGPL-3.0-only", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#d0747728401fffde78812ffd26068574c108b724", - "@treeseed/sdk": "github:treeseed-ai/sdk#e8cfda0aac26c81c5d6965dc8c645165952d19ab", + "@treeseed/core": "github:treeseed-ai/core#f59657ec14cffe85396046d224e196b5f4550ce0", + "@treeseed/sdk": "github:treeseed-ai/sdk#1608089150841c29702b33b37f0fce931577b76d", "@treeseed/ui": "github:treeseed-ai/ui#5f6981b9a7618e0f9d82e784aafa890c1492e31c", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7396,8 +7396,8 @@ } }, "node_modules/@treeseed/core": { - "version": "0.12.60-dev.fix-local-treedx-project-closure.20260810T055300Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#d0747728401fffde78812ffd26068574c108b724", + "version": "0.12.60-dev.fix-stage-fixture-alias-cleanup.20260810T091707Z", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#f59657ec14cffe85396046d224e196b5f4550ce0", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7408,7 +7408,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#e8cfda0aac26c81c5d6965dc8c645165952d19ab", + "@treeseed/sdk": "github:treeseed-ai/sdk#1608089150841c29702b33b37f0fce931577b76d", "@treeseed/ui": "github:treeseed-ai/ui#5f6981b9a7618e0f9d82e784aafa890c1492e31c", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8757,8 +8757,8 @@ } }, "node_modules/@treeseed/sdk": { - "version": "0.12.63-dev.fix-local-treedx-project-closure.20260810T050925Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#e8cfda0aac26c81c5d6965dc8c645165952d19ab", + "version": "0.12.63-dev.fix-stage-fixture-alias-cleanup.20260810T083021Z", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#1608089150841c29702b33b37f0fce931577b76d", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index 44788d48..4932564b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@treeseed/admin", - "version": "0.12.59-dev.fix-local-treedx-project-closure.20260810T055455Z", + "version": "0.12.59-dev.fix-stage-fixture-alias-cleanup.20260810T091911Z", "description": "Treeseed administration portal framework built on @treeseed/core and @treeseed/ui.", "license": "AGPL-3.0-only", "repository": { @@ -52,8 +52,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#d0747728401fffde78812ffd26068574c108b724", - "@treeseed/sdk": "github:treeseed-ai/sdk#e8cfda0aac26c81c5d6965dc8c645165952d19ab", + "@treeseed/core": "github:treeseed-ai/core#f59657ec14cffe85396046d224e196b5f4550ce0", + "@treeseed/sdk": "github:treeseed-ai/sdk#1608089150841c29702b33b37f0fce931577b76d", "@treeseed/ui": "github:treeseed-ai/ui#5f6981b9a7618e0f9d82e784aafa890c1492e31c", "react": "^19.2.5", "react-dom": "^19.2.6" From a9c84845421c2b0fe6df530a5d63c654da421044 Mon Sep 17 00:00:00 2001 From: TreeSeed migration Date: Mon, 10 Aug 2026 15:35:04 -0400 Subject: [PATCH 127/315] Apply Apache-2.0 repository license --- LICENSE | 22 ++++++++++------------ package.json | 2 +- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/LICENSE b/LICENSE index 50766aaa..ee6b26cf 100644 --- a/LICENSE +++ b/LICENSE @@ -1,15 +1,13 @@ -TreeSeed API Management Platform -Copyright (C) 2026 Fractal Synapse Labs LCA PBC +Copyright 2026 Fractal Synapse Labs LCA PBC -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as -published by the Free Software Foundation, either version 3 of the -License, or (at your option) any later version. +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 -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. + http://www.apache.org/licenses/LICENSE-2.0 -You should have received a copy of the GNU Affero General Public License -along with this program. If not, see . +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. diff --git a/package.json b/package.json index 4932564b..ca4e5a04 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "@treeseed/admin", "version": "0.12.59-dev.fix-stage-fixture-alias-cleanup.20260810T091911Z", "description": "Treeseed administration portal framework built on @treeseed/core and @treeseed/ui.", - "license": "AGPL-3.0-only", + "license": "Apache-2.0", "repository": { "type": "git", "url": "https://github.com/treeseed-ai/admin.git", From 75f6ea8fcf925f4daa5483dbaa7f5401f6407067 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Mon, 10 Aug 2026 22:36:20 -0400 Subject: [PATCH 128/315] build(source): complete repository and singleton workspace migration Intent: - Save hint: complete repository and singleton workspace migration foundation Changes: - Updates 5 files across source: 3, build: 2. - Touches LICENSE, package-lock.json, package.json, src/lib/market/api-client.ts, src/plugin.ts. - Plans package version/tag 0.12.59-dev.migration-final-platform-market-architec.20260811T023538Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#1608089150841c29702b33b37f0fce931577b76d -> github:treeseed-ai/sdk#f913d4acd33efb710e7c7077a3fe8e6b90c62836 - dependencies.@treeseed/ui: github:treeseed-ai/ui#5f6981b9a7618e0f9d82e784aafa890c1492e31c -> github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd - dependencies.@treeseed/core: github:treeseed-ai/core#f59657ec14cffe85396046d224e196b5f4550ce0 -> github:treeseed-ai/core#063b7ec03fd210f4273b4668014f11f8bda69d20 --- LICENSE | 22 ++++++++++------------ package-lock.json | 26 +++++++++++++------------- package.json | 10 +++++----- src/lib/market/api-client.ts | 6 +++--- src/plugin.ts | 8 ++++---- 5 files changed, 35 insertions(+), 37 deletions(-) diff --git a/LICENSE b/LICENSE index 50766aaa..ee6b26cf 100644 --- a/LICENSE +++ b/LICENSE @@ -1,15 +1,13 @@ -TreeSeed API Management Platform -Copyright (C) 2026 Fractal Synapse Labs LCA PBC +Copyright 2026 Fractal Synapse Labs LCA PBC -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as -published by the Free Software Foundation, either version 3 of the -License, or (at your option) any later version. +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 -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. + http://www.apache.org/licenses/LICENSE-2.0 -You should have received a copy of the GNU Affero General Public License -along with this program. If not, see . +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. diff --git a/package-lock.json b/package-lock.json index 859651bb..f1785b23 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,18 +1,18 @@ { "name": "@treeseed/admin", - "version": "0.12.59-dev.fix-stage-fixture-alias-cleanup.20260810T091911Z", + "version": "0.12.59-dev.migration-final-platform-market-architec.20260811T023538Z", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@treeseed/admin", - "version": "0.12.59-dev.fix-stage-fixture-alias-cleanup.20260810T091911Z", - "license": "AGPL-3.0-only", + "version": "0.12.59-dev.migration-final-platform-market-architec.20260811T023538Z", + "license": "Apache-2.0", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#f59657ec14cffe85396046d224e196b5f4550ce0", - "@treeseed/sdk": "github:treeseed-ai/sdk#1608089150841c29702b33b37f0fce931577b76d", - "@treeseed/ui": "github:treeseed-ai/ui#5f6981b9a7618e0f9d82e784aafa890c1492e31c", + "@treeseed/core": "github:treeseed-ai/core#063b7ec03fd210f4273b4668014f11f8bda69d20", + "@treeseed/sdk": "github:treeseed-ai/sdk#f913d4acd33efb710e7c7077a3fe8e6b90c62836", + "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", "react": "^19.2.5", "react-dom": "^19.2.6" }, @@ -7396,8 +7396,8 @@ } }, "node_modules/@treeseed/core": { - "version": "0.12.60-dev.fix-stage-fixture-alias-cleanup.20260810T091707Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#f59657ec14cffe85396046d224e196b5f4550ce0", + "version": "0.12.60-dev.migration-final-platform-market-architec.20260811T023506Z", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#063b7ec03fd210f4273b4668014f11f8bda69d20", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7408,8 +7408,8 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#1608089150841c29702b33b37f0fce931577b76d", - "@treeseed/ui": "github:treeseed-ai/ui#5f6981b9a7618e0f9d82e784aafa890c1492e31c", + "@treeseed/sdk": "github:treeseed-ai/sdk#f913d4acd33efb710e7c7077a3fe8e6b90c62836", + "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", "astro": "^5.6.1", "esbuild": "^0.28.0", "katex": "^0.16.22", @@ -8757,8 +8757,8 @@ } }, "node_modules/@treeseed/sdk": { - "version": "0.12.63-dev.fix-stage-fixture-alias-cleanup.20260810T083021Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#1608089150841c29702b33b37f0fce931577b76d", + "version": "0.12.63-dev.migration-final-platform-market-architec.20260811T023424Z", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#f913d4acd33efb710e7c7077a3fe8e6b90c62836", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", @@ -9457,7 +9457,7 @@ }, "node_modules/@treeseed/ui": { "version": "0.12.18-dev.fix-ai-staging-verification.20260810T031836Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#5f6981b9a7618e0f9d82e784aafa890c1492e31c", + "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", diff --git a/package.json b/package.json index 4932564b..148096cf 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "@treeseed/admin", - "version": "0.12.59-dev.fix-stage-fixture-alias-cleanup.20260810T091911Z", + "version": "0.12.59-dev.migration-final-platform-market-architec.20260811T023538Z", "description": "Treeseed administration portal framework built on @treeseed/core and @treeseed/ui.", - "license": "AGPL-3.0-only", + "license": "Apache-2.0", "repository": { "type": "git", "url": "https://github.com/treeseed-ai/admin.git", @@ -52,9 +52,9 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#f59657ec14cffe85396046d224e196b5f4550ce0", - "@treeseed/sdk": "github:treeseed-ai/sdk#1608089150841c29702b33b37f0fce931577b76d", - "@treeseed/ui": "github:treeseed-ai/ui#5f6981b9a7618e0f9d82e784aafa890c1492e31c", + "@treeseed/core": "github:treeseed-ai/core#063b7ec03fd210f4273b4668014f11f8bda69d20", + "@treeseed/sdk": "github:treeseed-ai/sdk#f913d4acd33efb710e7c7077a3fe8e6b90c62836", + "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", "react": "^19.2.5", "react-dom": "^19.2.6" }, diff --git a/src/lib/market/api-client.ts b/src/lib/market/api-client.ts index 10a10989..791f0426 100644 --- a/src/lib/market/api-client.ts +++ b/src/lib/market/api-client.ts @@ -48,9 +48,9 @@ export function envValue(locals: App.Locals | Record | null | u return typeof processValue === 'string' && processValue.trim() ? processValue.trim() : ''; } export function resolveApiBaseUrl(locals?: App.Locals | Record | null) { - return (envValue(locals, 'TREESEED_MARKET_API_BASE_URL') - || envValue(locals, 'TREESEED_CENTRAL_MARKET_API_BASE_URL') - || 'https://api.treeseed.ai').replace(/\/+$/u, ''); + return (envValue(locals, 'TREESEED_API_BASE_URL') + || envValue(locals, 'TREESEED_MARKET_API_BASE_URL') + || 'https://api.treeseed.dev').replace(/\/+$/u, ''); } export function encodeAssertionPayload(payload: Record) { return Buffer.from(JSON.stringify(payload)).toString('base64url'); diff --git a/src/plugin.ts b/src/plugin.ts index 5211f97f..814d79d4 100644 --- a/src/plugin.ts +++ b/src/plugin.ts @@ -52,13 +52,13 @@ export const ADMIN_ENV_METADATA = { TREESEED_MARKET_API_BASE_URL: { group: 'api', sensitivity: 'plain', - description: 'Primary Treeseed API base URL used by the admin web facade.', + description: 'Singleton Market API base URL used only for Market operations.', required: false, }, - TREESEED_CENTRAL_MARKET_API_BASE_URL: { + TREESEED_API_BASE_URL: { group: 'api', sensitivity: 'plain', - description: 'Fallback central Treeseed API base URL used by distributable admin deployments.', + description: 'Resolved Admin control-plane API base URL used by the server-side facade.', required: false, }, TREESEED_CATALOG_MARKET_API_BASE_URLS: { @@ -78,7 +78,7 @@ export const ADMIN_ENV_SCHEMA: Record = { TREESEED_AUTH_MODE: envField.enum({ values: ['internal-first', 'internal-only', 'providers-only'], context: 'server', access: 'secret', optional: true }), TREESEED_AUTH_INTERNAL_SIGNUP: envField.enum({ values: ['open', 'invite', 'admin'], context: 'server', access: 'secret', optional: true }), TREESEED_MARKET_API_BASE_URL: envField.string({ context: 'server', access: 'secret', optional: true }), - TREESEED_CENTRAL_MARKET_API_BASE_URL: envField.string({ context: 'server', access: 'secret', optional: true }), + TREESEED_API_BASE_URL: envField.string({ context: 'server', access: 'secret', optional: true }), TREESEED_CATALOG_MARKET_API_BASE_URLS: envField.string({ context: 'server', access: 'secret', optional: true }), }; From e2db6d27068bb701c1caae3971e03422ea3c97b5 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Mon, 10 Aug 2026 22:49:11 -0400 Subject: [PATCH 129/315] build(build): resolve staging lineage for managed Market API workspace Intent: - Save hint: resolve staging lineage for managed Market API workspace Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.migration-final-platform-market-architec.20260811T023538Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#f913d4acd33efb710e7c7077a3fe8e6b90c62836 -> github:treeseed-ai/sdk#040a371af731de01b52076124e166b5cf044c0b4 - dependencies.@treeseed/core: github:treeseed-ai/core#063b7ec03fd210f4273b4668014f11f8bda69d20 -> github:treeseed-ai/core#09bbd18a185685edac029d105f63857bc753c70b --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index f1785b23..a6c7f526 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "Apache-2.0", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#063b7ec03fd210f4273b4668014f11f8bda69d20", - "@treeseed/sdk": "github:treeseed-ai/sdk#f913d4acd33efb710e7c7077a3fe8e6b90c62836", + "@treeseed/core": "github:treeseed-ai/core#09bbd18a185685edac029d105f63857bc753c70b", + "@treeseed/sdk": "github:treeseed-ai/sdk#040a371af731de01b52076124e166b5cf044c0b4", "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7397,7 +7397,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.migration-final-platform-market-architec.20260811T023506Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#063b7ec03fd210f4273b4668014f11f8bda69d20", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#09bbd18a185685edac029d105f63857bc753c70b", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7408,7 +7408,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#f913d4acd33efb710e7c7077a3fe8e6b90c62836", + "@treeseed/sdk": "github:treeseed-ai/sdk#040a371af731de01b52076124e166b5cf044c0b4", "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8758,7 +8758,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.migration-final-platform-market-architec.20260811T023424Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#f913d4acd33efb710e7c7077a3fe8e6b90c62836", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#040a371af731de01b52076124e166b5cf044c0b4", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index 148096cf..1548c51d 100644 --- a/package.json +++ b/package.json @@ -52,8 +52,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#063b7ec03fd210f4273b4668014f11f8bda69d20", - "@treeseed/sdk": "github:treeseed-ai/sdk#f913d4acd33efb710e7c7077a3fe8e6b90c62836", + "@treeseed/core": "github:treeseed-ai/core#09bbd18a185685edac029d105f63857bc753c70b", + "@treeseed/sdk": "github:treeseed-ai/sdk#040a371af731de01b52076124e166b5cf044c0b4", "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", "react": "^19.2.5", "react-dom": "^19.2.6" From 4a8b8ade1b49469d5157de243cc9668ad6a4039c Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Mon, 10 Aug 2026 22:59:20 -0400 Subject: [PATCH 130/315] build(build): merge live staging lineage into migration portfolio Intent: - Save hint: merge live staging lineage into migration portfolio Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.migration-final-platform-market-architec.20260811T023538Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/core: github:treeseed-ai/core#09bbd18a185685edac029d105f63857bc753c70b -> github:treeseed-ai/core#0aa683652fad9b250b79b1bb88501fc9130a7013 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index a6c7f526..154776e0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "Apache-2.0", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#09bbd18a185685edac029d105f63857bc753c70b", + "@treeseed/core": "github:treeseed-ai/core#0aa683652fad9b250b79b1bb88501fc9130a7013", "@treeseed/sdk": "github:treeseed-ai/sdk#040a371af731de01b52076124e166b5cf044c0b4", "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", "react": "^19.2.5", @@ -7397,7 +7397,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.migration-final-platform-market-architec.20260811T023506Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#09bbd18a185685edac029d105f63857bc753c70b", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#0aa683652fad9b250b79b1bb88501fc9130a7013", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", diff --git a/package.json b/package.json index 1548c51d..a77580ad 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#09bbd18a185685edac029d105f63857bc753c70b", + "@treeseed/core": "github:treeseed-ai/core#0aa683652fad9b250b79b1bb88501fc9130a7013", "@treeseed/sdk": "github:treeseed-ai/sdk#040a371af731de01b52076124e166b5cf044c0b4", "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", "react": "^19.2.5", From b78152e9fd4762dc6455299cabcc3ccf63ab43f0 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Tue, 11 Aug 2026 00:34:16 -0400 Subject: [PATCH 131/315] fix(sdk): verify standalone market gateway workspace Intent: - Save hint: verify standalone market gateway workspace Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.migration-market-api-standalone-verifica.20260811T043400Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#040a371af731de01b52076124e166b5cf044c0b4 -> github:treeseed-ai/sdk#c97998ea26359da261c42ae139f804c022279b95 - dependencies.@treeseed/core: github:treeseed-ai/core#0aa683652fad9b250b79b1bb88501fc9130a7013 -> github:treeseed-ai/core#7d36b8fcb0d51e7c12bd3d7e406f8a636e28d95d --- package-lock.json | 18 +++++++++--------- package.json | 6 +++--- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index 154776e0..706d2566 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,17 +1,17 @@ { "name": "@treeseed/admin", - "version": "0.12.59-dev.migration-final-platform-market-architec.20260811T023538Z", + "version": "0.12.59-dev.migration-market-api-standalone-verifica.20260811T043400Z", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@treeseed/admin", - "version": "0.12.59-dev.migration-final-platform-market-architec.20260811T023538Z", + "version": "0.12.59-dev.migration-market-api-standalone-verifica.20260811T043400Z", "license": "Apache-2.0", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#0aa683652fad9b250b79b1bb88501fc9130a7013", - "@treeseed/sdk": "github:treeseed-ai/sdk#040a371af731de01b52076124e166b5cf044c0b4", + "@treeseed/core": "github:treeseed-ai/core#7d36b8fcb0d51e7c12bd3d7e406f8a636e28d95d", + "@treeseed/sdk": "github:treeseed-ai/sdk#c97998ea26359da261c42ae139f804c022279b95", "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7396,8 +7396,8 @@ } }, "node_modules/@treeseed/core": { - "version": "0.12.60-dev.migration-final-platform-market-architec.20260811T023506Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#0aa683652fad9b250b79b1bb88501fc9130a7013", + "version": "0.12.60-dev.migration-market-api-standalone-verifica.20260811T043343Z", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#7d36b8fcb0d51e7c12bd3d7e406f8a636e28d95d", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7408,7 +7408,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#040a371af731de01b52076124e166b5cf044c0b4", + "@treeseed/sdk": "github:treeseed-ai/sdk#c97998ea26359da261c42ae139f804c022279b95", "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8757,8 +8757,8 @@ } }, "node_modules/@treeseed/sdk": { - "version": "0.12.63-dev.migration-final-platform-market-architec.20260811T023424Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#040a371af731de01b52076124e166b5cf044c0b4", + "version": "0.12.63-dev.migration-market-api-standalone-verifica.20260811T043310Z", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#c97998ea26359da261c42ae139f804c022279b95", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index a77580ad..4ddc4560 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@treeseed/admin", - "version": "0.12.59-dev.migration-final-platform-market-architec.20260811T023538Z", + "version": "0.12.59-dev.migration-market-api-standalone-verifica.20260811T043400Z", "description": "Treeseed administration portal framework built on @treeseed/core and @treeseed/ui.", "license": "Apache-2.0", "repository": { @@ -52,8 +52,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#0aa683652fad9b250b79b1bb88501fc9130a7013", - "@treeseed/sdk": "github:treeseed-ai/sdk#040a371af731de01b52076124e166b5cf044c0b4", + "@treeseed/core": "github:treeseed-ai/core#7d36b8fcb0d51e7c12bd3d7e406f8a636e28d95d", + "@treeseed/sdk": "github:treeseed-ai/sdk#c97998ea26359da261c42ae139f804c022279b95", "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", "react": "^19.2.5", "react-dom": "^19.2.6" From f53b2fd9e4e8009de2fca5b87f2649e279af1ce9 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Tue, 11 Aug 2026 00:42:50 -0400 Subject: [PATCH 132/315] fix(sdk): reconcile canonical organization remotes Intent: - Save hint: reconcile canonical organization remotes Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.migration-market-api-standalone-verifica.20260811T043400Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#c97998ea26359da261c42ae139f804c022279b95 -> github:treeseed-ai/sdk#816a36cb9cf0d0f3692b98f47722d3398ebc571a - dependencies.@treeseed/core: github:treeseed-ai/core#7d36b8fcb0d51e7c12bd3d7e406f8a636e28d95d -> github:treeseed-ai/core#b7f4ca4bcaa8ce344856fa4c9e36f94f9b73bb66 --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 706d2566..57078aee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "Apache-2.0", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#7d36b8fcb0d51e7c12bd3d7e406f8a636e28d95d", - "@treeseed/sdk": "github:treeseed-ai/sdk#c97998ea26359da261c42ae139f804c022279b95", + "@treeseed/core": "github:treeseed-ai/core#b7f4ca4bcaa8ce344856fa4c9e36f94f9b73bb66", + "@treeseed/sdk": "github:treeseed-ai/sdk#816a36cb9cf0d0f3692b98f47722d3398ebc571a", "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7397,7 +7397,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.migration-market-api-standalone-verifica.20260811T043343Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#7d36b8fcb0d51e7c12bd3d7e406f8a636e28d95d", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#b7f4ca4bcaa8ce344856fa4c9e36f94f9b73bb66", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7408,7 +7408,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#c97998ea26359da261c42ae139f804c022279b95", + "@treeseed/sdk": "github:treeseed-ai/sdk#816a36cb9cf0d0f3692b98f47722d3398ebc571a", "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8758,7 +8758,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.migration-market-api-standalone-verifica.20260811T043310Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#c97998ea26359da261c42ae139f804c022279b95", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#816a36cb9cf0d0f3692b98f47722d3398ebc571a", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index 4ddc4560..2d788448 100644 --- a/package.json +++ b/package.json @@ -52,8 +52,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#7d36b8fcb0d51e7c12bd3d7e406f8a636e28d95d", - "@treeseed/sdk": "github:treeseed-ai/sdk#c97998ea26359da261c42ae139f804c022279b95", + "@treeseed/core": "github:treeseed-ai/core#b7f4ca4bcaa8ce344856fa4c9e36f94f9b73bb66", + "@treeseed/sdk": "github:treeseed-ai/sdk#816a36cb9cf0d0f3692b98f47722d3398ebc571a", "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", "react": "^19.2.5", "react-dom": "^19.2.6" From b24eb018722a100b88e9e64677291ea1015da01f Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Tue, 11 Aug 2026 00:54:37 -0400 Subject: [PATCH 133/315] fix(github): observe migrated repository branches live Intent: - Save hint: observe migrated repository branches live Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.migration-market-api-standalone-verifica.20260811T043400Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#816a36cb9cf0d0f3692b98f47722d3398ebc571a -> github:treeseed-ai/sdk#02f93cb203579d5635c9b79e6c48497b7b40ef09 - dependencies.@treeseed/core: github:treeseed-ai/core#b7f4ca4bcaa8ce344856fa4c9e36f94f9b73bb66 -> github:treeseed-ai/core#a67c3eae1d7fb2367fd37bcf946e4c369b67518a --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 57078aee..bee693a4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "Apache-2.0", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#b7f4ca4bcaa8ce344856fa4c9e36f94f9b73bb66", - "@treeseed/sdk": "github:treeseed-ai/sdk#816a36cb9cf0d0f3692b98f47722d3398ebc571a", + "@treeseed/core": "github:treeseed-ai/core#a67c3eae1d7fb2367fd37bcf946e4c369b67518a", + "@treeseed/sdk": "github:treeseed-ai/sdk#02f93cb203579d5635c9b79e6c48497b7b40ef09", "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7397,7 +7397,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.migration-market-api-standalone-verifica.20260811T043343Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#b7f4ca4bcaa8ce344856fa4c9e36f94f9b73bb66", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#a67c3eae1d7fb2367fd37bcf946e4c369b67518a", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7408,7 +7408,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#816a36cb9cf0d0f3692b98f47722d3398ebc571a", + "@treeseed/sdk": "github:treeseed-ai/sdk#02f93cb203579d5635c9b79e6c48497b7b40ef09", "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8758,7 +8758,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.migration-market-api-standalone-verifica.20260811T043310Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#816a36cb9cf0d0f3692b98f47722d3398ebc571a", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#02f93cb203579d5635c9b79e6c48497b7b40ef09", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index 2d788448..5d6b3cf9 100644 --- a/package.json +++ b/package.json @@ -52,8 +52,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#b7f4ca4bcaa8ce344856fa4c9e36f94f9b73bb66", - "@treeseed/sdk": "github:treeseed-ai/sdk#816a36cb9cf0d0f3692b98f47722d3398ebc571a", + "@treeseed/core": "github:treeseed-ai/core#a67c3eae1d7fb2367fd37bcf946e4c369b67518a", + "@treeseed/sdk": "github:treeseed-ai/sdk#02f93cb203579d5635c9b79e6c48497b7b40ef09", "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", "react": "^19.2.5", "react-dom": "^19.2.6" From 8efb8db81661b14896a94933b0410d10c5d74fa1 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Tue, 11 Aug 2026 01:05:35 -0400 Subject: [PATCH 134/315] fix(stage): merge workspace root before child repositories Intent: - Save hint: merge workspace root before child repositories Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.migration-market-api-standalone-verifica.20260811T043400Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#02f93cb203579d5635c9b79e6c48497b7b40ef09 -> github:treeseed-ai/sdk#edce34fc1315638bb4aacfcc08196505737f43d2 - dependencies.@treeseed/core: github:treeseed-ai/core#a67c3eae1d7fb2367fd37bcf946e4c369b67518a -> github:treeseed-ai/core#f5dff258cfb1c147a278cdf4dc5a8898aaa1f888 --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index bee693a4..9ff6ec08 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "Apache-2.0", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#a67c3eae1d7fb2367fd37bcf946e4c369b67518a", - "@treeseed/sdk": "github:treeseed-ai/sdk#02f93cb203579d5635c9b79e6c48497b7b40ef09", + "@treeseed/core": "github:treeseed-ai/core#f5dff258cfb1c147a278cdf4dc5a8898aaa1f888", + "@treeseed/sdk": "github:treeseed-ai/sdk#edce34fc1315638bb4aacfcc08196505737f43d2", "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7397,7 +7397,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.migration-market-api-standalone-verifica.20260811T043343Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#a67c3eae1d7fb2367fd37bcf946e4c369b67518a", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#f5dff258cfb1c147a278cdf4dc5a8898aaa1f888", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7408,7 +7408,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#02f93cb203579d5635c9b79e6c48497b7b40ef09", + "@treeseed/sdk": "github:treeseed-ai/sdk#edce34fc1315638bb4aacfcc08196505737f43d2", "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8758,7 +8758,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.migration-market-api-standalone-verifica.20260811T043310Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#02f93cb203579d5635c9b79e6c48497b7b40ef09", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#edce34fc1315638bb4aacfcc08196505737f43d2", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index 5d6b3cf9..1405c9db 100644 --- a/package.json +++ b/package.json @@ -52,8 +52,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#a67c3eae1d7fb2367fd37bcf946e4c369b67518a", - "@treeseed/sdk": "github:treeseed-ai/sdk#02f93cb203579d5635c9b79e6c48497b7b40ef09", + "@treeseed/core": "github:treeseed-ai/core#f5dff258cfb1c147a278cdf4dc5a8898aaa1f888", + "@treeseed/sdk": "github:treeseed-ai/sdk#edce34fc1315638bb4aacfcc08196505737f43d2", "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", "react": "^19.2.5", "react-dom": "^19.2.6" From 06aa88d20dd2f123990b3f733582da14e4d57369 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Tue, 11 Aug 2026 01:17:19 -0400 Subject: [PATCH 135/315] fix(stage): finalize conflict-free merge recovery Intent: - Save hint: finalize conflict-free merge recovery Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.migration-market-api-standalone-verifica.20260811T043400Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#edce34fc1315638bb4aacfcc08196505737f43d2 -> github:treeseed-ai/sdk#7a7dcdd4e85585445897e829f97cbb84bb90a4b9 - dependencies.@treeseed/core: github:treeseed-ai/core#f5dff258cfb1c147a278cdf4dc5a8898aaa1f888 -> github:treeseed-ai/core#9aa1d8229dd4e16cb66e06c105636d95ba651d27 --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9ff6ec08..54ffb80a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "Apache-2.0", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#f5dff258cfb1c147a278cdf4dc5a8898aaa1f888", - "@treeseed/sdk": "github:treeseed-ai/sdk#edce34fc1315638bb4aacfcc08196505737f43d2", + "@treeseed/core": "github:treeseed-ai/core#9aa1d8229dd4e16cb66e06c105636d95ba651d27", + "@treeseed/sdk": "github:treeseed-ai/sdk#7a7dcdd4e85585445897e829f97cbb84bb90a4b9", "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7397,7 +7397,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.migration-market-api-standalone-verifica.20260811T043343Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#f5dff258cfb1c147a278cdf4dc5a8898aaa1f888", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#9aa1d8229dd4e16cb66e06c105636d95ba651d27", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7408,7 +7408,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#edce34fc1315638bb4aacfcc08196505737f43d2", + "@treeseed/sdk": "github:treeseed-ai/sdk#7a7dcdd4e85585445897e829f97cbb84bb90a4b9", "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8758,7 +8758,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.migration-market-api-standalone-verifica.20260811T043310Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#edce34fc1315638bb4aacfcc08196505737f43d2", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#7a7dcdd4e85585445897e829f97cbb84bb90a4b9", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index 1405c9db..628cf518 100644 --- a/package.json +++ b/package.json @@ -52,8 +52,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#f5dff258cfb1c147a278cdf4dc5a8898aaa1f888", - "@treeseed/sdk": "github:treeseed-ai/sdk#edce34fc1315638bb4aacfcc08196505737f43d2", + "@treeseed/core": "github:treeseed-ai/core#9aa1d8229dd4e16cb66e06c105636d95ba651d27", + "@treeseed/sdk": "github:treeseed-ai/sdk#7a7dcdd4e85585445897e829f97cbb84bb90a4b9", "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", "react": "^19.2.5", "react-dom": "^19.2.6" From 56dbbfc734e83601aac3641338ab36cb6f8f5235 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Tue, 11 Aug 2026 01:30:13 -0400 Subject: [PATCH 136/315] fix(stage): resume operator-resolved staging merges Intent: - Save hint: resume operator-resolved staging merges Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.migration-market-api-standalone-verifica.20260811T043400Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#7a7dcdd4e85585445897e829f97cbb84bb90a4b9 -> github:treeseed-ai/sdk#7dd4a013d7db693e9328d7dd421cae6a64f0b9c4 - dependencies.@treeseed/core: github:treeseed-ai/core#9aa1d8229dd4e16cb66e06c105636d95ba651d27 -> github:treeseed-ai/core#fe7320efc2c7640126b788b7ceac5bca2057d6e9 --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 54ffb80a..05007c61 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "Apache-2.0", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#9aa1d8229dd4e16cb66e06c105636d95ba651d27", - "@treeseed/sdk": "github:treeseed-ai/sdk#7a7dcdd4e85585445897e829f97cbb84bb90a4b9", + "@treeseed/core": "github:treeseed-ai/core#fe7320efc2c7640126b788b7ceac5bca2057d6e9", + "@treeseed/sdk": "github:treeseed-ai/sdk#7dd4a013d7db693e9328d7dd421cae6a64f0b9c4", "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7397,7 +7397,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.migration-market-api-standalone-verifica.20260811T043343Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#9aa1d8229dd4e16cb66e06c105636d95ba651d27", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#fe7320efc2c7640126b788b7ceac5bca2057d6e9", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7408,7 +7408,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#7a7dcdd4e85585445897e829f97cbb84bb90a4b9", + "@treeseed/sdk": "github:treeseed-ai/sdk#7dd4a013d7db693e9328d7dd421cae6a64f0b9c4", "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8758,7 +8758,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.migration-market-api-standalone-verifica.20260811T043310Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#7a7dcdd4e85585445897e829f97cbb84bb90a4b9", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#7dd4a013d7db693e9328d7dd421cae6a64f0b9c4", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index 628cf518..88f6c7ff 100644 --- a/package.json +++ b/package.json @@ -52,8 +52,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#9aa1d8229dd4e16cb66e06c105636d95ba651d27", - "@treeseed/sdk": "github:treeseed-ai/sdk#7a7dcdd4e85585445897e829f97cbb84bb90a4b9", + "@treeseed/core": "github:treeseed-ai/core#fe7320efc2c7640126b788b7ceac5bca2057d6e9", + "@treeseed/sdk": "github:treeseed-ai/sdk#7dd4a013d7db693e9328d7dd421cae6a64f0b9c4", "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", "react": "^19.2.5", "react-dom": "^19.2.6" From c818975b1e1442e635860a68630cde7b7c1a261b Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Tue, 11 Aug 2026 01:48:12 -0400 Subject: [PATCH 137/315] fix(stage): isolate nested save resume context Intent: - Save hint: isolate nested save resume context Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.migration-market-api-standalone-verifica.20260811T043400Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#7dd4a013d7db693e9328d7dd421cae6a64f0b9c4 -> github:treeseed-ai/sdk#5ab6d67dc3f4fd93e75712719dd60999a5c6c778 - dependencies.@treeseed/core: github:treeseed-ai/core#fe7320efc2c7640126b788b7ceac5bca2057d6e9 -> github:treeseed-ai/core#7d4d040be322a770183e4217ae6f98087bed83d1 --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 05007c61..06c8bd3a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "Apache-2.0", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#fe7320efc2c7640126b788b7ceac5bca2057d6e9", - "@treeseed/sdk": "github:treeseed-ai/sdk#7dd4a013d7db693e9328d7dd421cae6a64f0b9c4", + "@treeseed/core": "github:treeseed-ai/core#7d4d040be322a770183e4217ae6f98087bed83d1", + "@treeseed/sdk": "github:treeseed-ai/sdk#5ab6d67dc3f4fd93e75712719dd60999a5c6c778", "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7397,7 +7397,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.migration-market-api-standalone-verifica.20260811T043343Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#fe7320efc2c7640126b788b7ceac5bca2057d6e9", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#7d4d040be322a770183e4217ae6f98087bed83d1", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7408,7 +7408,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#7dd4a013d7db693e9328d7dd421cae6a64f0b9c4", + "@treeseed/sdk": "github:treeseed-ai/sdk#5ab6d67dc3f4fd93e75712719dd60999a5c6c778", "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8758,7 +8758,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.migration-market-api-standalone-verifica.20260811T043310Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#7dd4a013d7db693e9328d7dd421cae6a64f0b9c4", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#5ab6d67dc3f4fd93e75712719dd60999a5c6c778", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index 88f6c7ff..5ea3808f 100644 --- a/package.json +++ b/package.json @@ -52,8 +52,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#fe7320efc2c7640126b788b7ceac5bca2057d6e9", - "@treeseed/sdk": "github:treeseed-ai/sdk#7dd4a013d7db693e9328d7dd421cae6a64f0b9c4", + "@treeseed/core": "github:treeseed-ai/core#7d4d040be322a770183e4217ae6f98087bed83d1", + "@treeseed/sdk": "github:treeseed-ai/sdk#5ab6d67dc3f4fd93e75712719dd60999a5c6c778", "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", "react": "^19.2.5", "react-dom": "^19.2.6" From 38f5db453d814156a5773942ebeae1ea4b446871 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Tue, 11 Aug 2026 02:12:35 -0400 Subject: [PATCH 138/315] fix(market-api): separate runtime build output from tests Intent: - Save hint: separate runtime build output from tests Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.fix-market-api-build-boundary.20260811T061222Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#5ab6d67dc3f4fd93e75712719dd60999a5c6c778 -> github:treeseed-ai/sdk#c1582069610e51dd8ad30cd583c489a2174a397a - dependencies.@treeseed/core: github:treeseed-ai/core#7d4d040be322a770183e4217ae6f98087bed83d1 -> github:treeseed-ai/core#11cfb8074e134a520408468f98787946c050a8bd --- package-lock.json | 18 +++++++++--------- package.json | 6 +++--- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index 06c8bd3a..bcaa7f7a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,17 +1,17 @@ { "name": "@treeseed/admin", - "version": "0.12.59-dev.migration-market-api-standalone-verifica.20260811T043400Z", + "version": "0.12.59-dev.fix-market-api-build-boundary.20260811T061222Z", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@treeseed/admin", - "version": "0.12.59-dev.migration-market-api-standalone-verifica.20260811T043400Z", + "version": "0.12.59-dev.fix-market-api-build-boundary.20260811T061222Z", "license": "Apache-2.0", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#7d4d040be322a770183e4217ae6f98087bed83d1", - "@treeseed/sdk": "github:treeseed-ai/sdk#5ab6d67dc3f4fd93e75712719dd60999a5c6c778", + "@treeseed/core": "github:treeseed-ai/core#11cfb8074e134a520408468f98787946c050a8bd", + "@treeseed/sdk": "github:treeseed-ai/sdk#c1582069610e51dd8ad30cd583c489a2174a397a", "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7396,8 +7396,8 @@ } }, "node_modules/@treeseed/core": { - "version": "0.12.60-dev.migration-market-api-standalone-verifica.20260811T043343Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#7d4d040be322a770183e4217ae6f98087bed83d1", + "version": "0.12.60-dev.fix-market-api-build-boundary.20260811T061208Z", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#11cfb8074e134a520408468f98787946c050a8bd", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7408,7 +7408,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#5ab6d67dc3f4fd93e75712719dd60999a5c6c778", + "@treeseed/sdk": "github:treeseed-ai/sdk#c1582069610e51dd8ad30cd583c489a2174a397a", "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8757,8 +8757,8 @@ } }, "node_modules/@treeseed/sdk": { - "version": "0.12.63-dev.migration-market-api-standalone-verifica.20260811T043310Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#5ab6d67dc3f4fd93e75712719dd60999a5c6c778", + "version": "0.12.63-dev.fix-market-api-build-boundary.20260811T061130Z", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#c1582069610e51dd8ad30cd583c489a2174a397a", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index 5ea3808f..031c9c23 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@treeseed/admin", - "version": "0.12.59-dev.migration-market-api-standalone-verifica.20260811T043400Z", + "version": "0.12.59-dev.fix-market-api-build-boundary.20260811T061222Z", "description": "Treeseed administration portal framework built on @treeseed/core and @treeseed/ui.", "license": "Apache-2.0", "repository": { @@ -52,8 +52,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#7d4d040be322a770183e4217ae6f98087bed83d1", - "@treeseed/sdk": "github:treeseed-ai/sdk#5ab6d67dc3f4fd93e75712719dd60999a5c6c778", + "@treeseed/core": "github:treeseed-ai/core#11cfb8074e134a520408468f98787946c050a8bd", + "@treeseed/sdk": "github:treeseed-ai/sdk#c1582069610e51dd8ad30cd583c489a2174a397a", "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", "react": "^19.2.5", "react-dom": "^19.2.6" From c383b8b5b3982198b3aca0823914429e4f1a727d Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Tue, 11 Aug 2026 02:36:30 -0400 Subject: [PATCH 139/315] fix(reconcile): make organization migration idempotent Intent: - Save hint: make organization migration idempotent Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.fix-organization-reference-idempotency.20260811T063604Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#c1582069610e51dd8ad30cd583c489a2174a397a -> github:treeseed-ai/sdk#1b90e1efe0dec6f599bbae93df409dd695012f76 - dependencies.@treeseed/core: github:treeseed-ai/core#11cfb8074e134a520408468f98787946c050a8bd -> github:treeseed-ai/core#d4397ded1674d244ed674a092f843f9a655d614d --- package-lock.json | 18 +++++++++--------- package.json | 6 +++--- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index bcaa7f7a..9245862d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,17 +1,17 @@ { "name": "@treeseed/admin", - "version": "0.12.59-dev.fix-market-api-build-boundary.20260811T061222Z", + "version": "0.12.59-dev.fix-organization-reference-idempotency.20260811T063604Z", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@treeseed/admin", - "version": "0.12.59-dev.fix-market-api-build-boundary.20260811T061222Z", + "version": "0.12.59-dev.fix-organization-reference-idempotency.20260811T063604Z", "license": "Apache-2.0", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#11cfb8074e134a520408468f98787946c050a8bd", - "@treeseed/sdk": "github:treeseed-ai/sdk#c1582069610e51dd8ad30cd583c489a2174a397a", + "@treeseed/core": "github:treeseed-ai/core#d4397ded1674d244ed674a092f843f9a655d614d", + "@treeseed/sdk": "github:treeseed-ai/sdk#1b90e1efe0dec6f599bbae93df409dd695012f76", "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7396,8 +7396,8 @@ } }, "node_modules/@treeseed/core": { - "version": "0.12.60-dev.fix-market-api-build-boundary.20260811T061208Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#11cfb8074e134a520408468f98787946c050a8bd", + "version": "0.12.60-dev.fix-organization-reference-idempotency.20260811T063549Z", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#d4397ded1674d244ed674a092f843f9a655d614d", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7408,7 +7408,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#c1582069610e51dd8ad30cd583c489a2174a397a", + "@treeseed/sdk": "github:treeseed-ai/sdk#1b90e1efe0dec6f599bbae93df409dd695012f76", "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8757,8 +8757,8 @@ } }, "node_modules/@treeseed/sdk": { - "version": "0.12.63-dev.fix-market-api-build-boundary.20260811T061130Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#c1582069610e51dd8ad30cd583c489a2174a397a", + "version": "0.12.63-dev.fix-organization-reference-idempotency.20260811T063458Z", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#1b90e1efe0dec6f599bbae93df409dd695012f76", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index 031c9c23..6b9f3626 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@treeseed/admin", - "version": "0.12.59-dev.fix-market-api-build-boundary.20260811T061222Z", + "version": "0.12.59-dev.fix-organization-reference-idempotency.20260811T063604Z", "description": "Treeseed administration portal framework built on @treeseed/core and @treeseed/ui.", "license": "Apache-2.0", "repository": { @@ -52,8 +52,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#11cfb8074e134a520408468f98787946c050a8bd", - "@treeseed/sdk": "github:treeseed-ai/sdk#c1582069610e51dd8ad30cd583c489a2174a397a", + "@treeseed/core": "github:treeseed-ai/core#d4397ded1674d244ed674a092f843f9a655d614d", + "@treeseed/sdk": "github:treeseed-ai/sdk#1b90e1efe0dec6f599bbae93df409dd695012f76", "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", "react": "^19.2.5", "react-dom": "^19.2.6" From b9489a49483819d7b0f9b2585df0605651a42b67 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Tue, 11 Aug 2026 03:22:24 -0400 Subject: [PATCH 140/315] build(build): make generated Platform workspace operational Intent: - Save hint: make generated Platform workspace operational Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.feature-platform-live-workspace.20260811T072157Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#1b90e1efe0dec6f599bbae93df409dd695012f76 -> github:treeseed-ai/sdk#14d5799da365fb230cc6ce8aacca53de8591012c - dependencies.@treeseed/core: github:treeseed-ai/core#d4397ded1674d244ed674a092f843f9a655d614d -> github:treeseed-ai/core#9fc51d9e79d544ab3c8b64e62866b9e724de0ca7 --- package-lock.json | 18 +++++++++--------- package.json | 6 +++--- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9245862d..51a04ed9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,17 +1,17 @@ { "name": "@treeseed/admin", - "version": "0.12.59-dev.fix-organization-reference-idempotency.20260811T063604Z", + "version": "0.12.59-dev.feature-platform-live-workspace.20260811T072157Z", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@treeseed/admin", - "version": "0.12.59-dev.fix-organization-reference-idempotency.20260811T063604Z", + "version": "0.12.59-dev.feature-platform-live-workspace.20260811T072157Z", "license": "Apache-2.0", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#d4397ded1674d244ed674a092f843f9a655d614d", - "@treeseed/sdk": "github:treeseed-ai/sdk#1b90e1efe0dec6f599bbae93df409dd695012f76", + "@treeseed/core": "github:treeseed-ai/core#9fc51d9e79d544ab3c8b64e62866b9e724de0ca7", + "@treeseed/sdk": "github:treeseed-ai/sdk#14d5799da365fb230cc6ce8aacca53de8591012c", "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7396,8 +7396,8 @@ } }, "node_modules/@treeseed/core": { - "version": "0.12.60-dev.fix-organization-reference-idempotency.20260811T063549Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#d4397ded1674d244ed674a092f843f9a655d614d", + "version": "0.12.60-dev.feature-platform-live-workspace.20260811T072138Z", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#9fc51d9e79d544ab3c8b64e62866b9e724de0ca7", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7408,7 +7408,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#1b90e1efe0dec6f599bbae93df409dd695012f76", + "@treeseed/sdk": "github:treeseed-ai/sdk#14d5799da365fb230cc6ce8aacca53de8591012c", "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8757,8 +8757,8 @@ } }, "node_modules/@treeseed/sdk": { - "version": "0.12.63-dev.fix-organization-reference-idempotency.20260811T063458Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#1b90e1efe0dec6f599bbae93df409dd695012f76", + "version": "0.12.63-dev.feature-platform-live-workspace.20260811T072057Z", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#14d5799da365fb230cc6ce8aacca53de8591012c", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index 6b9f3626..606bf43f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@treeseed/admin", - "version": "0.12.59-dev.fix-organization-reference-idempotency.20260811T063604Z", + "version": "0.12.59-dev.feature-platform-live-workspace.20260811T072157Z", "description": "Treeseed administration portal framework built on @treeseed/core and @treeseed/ui.", "license": "Apache-2.0", "repository": { @@ -52,8 +52,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#d4397ded1674d244ed674a092f843f9a655d614d", - "@treeseed/sdk": "github:treeseed-ai/sdk#1b90e1efe0dec6f599bbae93df409dd695012f76", + "@treeseed/core": "github:treeseed-ai/core#9fc51d9e79d544ab3c8b64e62866b9e724de0ca7", + "@treeseed/sdk": "github:treeseed-ai/sdk#14d5799da365fb230cc6ce8aacca53de8591012c", "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", "react": "^19.2.5", "react-dom": "^19.2.6" From 048311fd997717aa3611bb90f0e835a58ff711d5 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Tue, 11 Aug 2026 04:19:00 -0400 Subject: [PATCH 141/315] build(build): recognize exact detached Platform gitlinks Intent: - Save hint: recognize exact detached Platform gitlinks Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.fix-platform-detached-gitlinks.20260811T081840Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#14d5799da365fb230cc6ce8aacca53de8591012c -> github:treeseed-ai/sdk#9ab22f8b22e75b27cb74bf375d4dc8c1a2691f3f - dependencies.@treeseed/core: github:treeseed-ai/core#9fc51d9e79d544ab3c8b64e62866b9e724de0ca7 -> github:treeseed-ai/core#466026656acb7f3af68d3dc24d5cdd42272cd5c0 --- package-lock.json | 18 +++++++++--------- package.json | 6 +++--- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index 51a04ed9..45fdefc0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,17 +1,17 @@ { "name": "@treeseed/admin", - "version": "0.12.59-dev.feature-platform-live-workspace.20260811T072157Z", + "version": "0.12.59-dev.fix-platform-detached-gitlinks.20260811T081840Z", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@treeseed/admin", - "version": "0.12.59-dev.feature-platform-live-workspace.20260811T072157Z", + "version": "0.12.59-dev.fix-platform-detached-gitlinks.20260811T081840Z", "license": "Apache-2.0", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#9fc51d9e79d544ab3c8b64e62866b9e724de0ca7", - "@treeseed/sdk": "github:treeseed-ai/sdk#14d5799da365fb230cc6ce8aacca53de8591012c", + "@treeseed/core": "github:treeseed-ai/core#466026656acb7f3af68d3dc24d5cdd42272cd5c0", + "@treeseed/sdk": "github:treeseed-ai/sdk#9ab22f8b22e75b27cb74bf375d4dc8c1a2691f3f", "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7396,8 +7396,8 @@ } }, "node_modules/@treeseed/core": { - "version": "0.12.60-dev.feature-platform-live-workspace.20260811T072138Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#9fc51d9e79d544ab3c8b64e62866b9e724de0ca7", + "version": "0.12.60-dev.fix-platform-detached-gitlinks.20260811T081819Z", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#466026656acb7f3af68d3dc24d5cdd42272cd5c0", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7408,7 +7408,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#14d5799da365fb230cc6ce8aacca53de8591012c", + "@treeseed/sdk": "github:treeseed-ai/sdk#9ab22f8b22e75b27cb74bf375d4dc8c1a2691f3f", "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8757,8 +8757,8 @@ } }, "node_modules/@treeseed/sdk": { - "version": "0.12.63-dev.feature-platform-live-workspace.20260811T072057Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#14d5799da365fb230cc6ce8aacca53de8591012c", + "version": "0.12.63-dev.fix-platform-detached-gitlinks.20260811T081734Z", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#9ab22f8b22e75b27cb74bf375d4dc8c1a2691f3f", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index 606bf43f..c92f35e8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@treeseed/admin", - "version": "0.12.59-dev.feature-platform-live-workspace.20260811T072157Z", + "version": "0.12.59-dev.fix-platform-detached-gitlinks.20260811T081840Z", "description": "Treeseed administration portal framework built on @treeseed/core and @treeseed/ui.", "license": "Apache-2.0", "repository": { @@ -52,8 +52,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#9fc51d9e79d544ab3c8b64e62866b9e724de0ca7", - "@treeseed/sdk": "github:treeseed-ai/sdk#14d5799da365fb230cc6ce8aacca53de8591012c", + "@treeseed/core": "github:treeseed-ai/core#466026656acb7f3af68d3dc24d5cdd42272cd5c0", + "@treeseed/sdk": "github:treeseed-ai/sdk#9ab22f8b22e75b27cb74bf375d4dc8c1a2691f3f", "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", "react": "^19.2.5", "react-dom": "^19.2.6" From fa694e6b79a0a0a4af5fa51ca698c0b19867559b Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Tue, 11 Aug 2026 05:27:29 -0400 Subject: [PATCH 142/315] build(build): reconcile and publish paired content authority Intent: - Save hint: reconcile and publish paired content authority Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.feature-content-repository-authority.20260811T092708Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#9ab22f8b22e75b27cb74bf375d4dc8c1a2691f3f -> github:treeseed-ai/sdk#31ec47efa52cfb32b76916df09c0e3d71e05cafc - dependencies.@treeseed/core: github:treeseed-ai/core#466026656acb7f3af68d3dc24d5cdd42272cd5c0 -> github:treeseed-ai/core#c3653a94d7628c78fa712fd97ea56bb9fe6313f5 --- package-lock.json | 18 +++++++++--------- package.json | 6 +++--- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index 45fdefc0..f08f1293 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,17 +1,17 @@ { "name": "@treeseed/admin", - "version": "0.12.59-dev.fix-platform-detached-gitlinks.20260811T081840Z", + "version": "0.12.59-dev.feature-content-repository-authority.20260811T092708Z", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@treeseed/admin", - "version": "0.12.59-dev.fix-platform-detached-gitlinks.20260811T081840Z", + "version": "0.12.59-dev.feature-content-repository-authority.20260811T092708Z", "license": "Apache-2.0", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#466026656acb7f3af68d3dc24d5cdd42272cd5c0", - "@treeseed/sdk": "github:treeseed-ai/sdk#9ab22f8b22e75b27cb74bf375d4dc8c1a2691f3f", + "@treeseed/core": "github:treeseed-ai/core#c3653a94d7628c78fa712fd97ea56bb9fe6313f5", + "@treeseed/sdk": "github:treeseed-ai/sdk#31ec47efa52cfb32b76916df09c0e3d71e05cafc", "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7396,8 +7396,8 @@ } }, "node_modules/@treeseed/core": { - "version": "0.12.60-dev.fix-platform-detached-gitlinks.20260811T081819Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#466026656acb7f3af68d3dc24d5cdd42272cd5c0", + "version": "0.12.60-dev.feature-content-repository-authority.20260811T092645Z", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#c3653a94d7628c78fa712fd97ea56bb9fe6313f5", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7408,7 +7408,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#9ab22f8b22e75b27cb74bf375d4dc8c1a2691f3f", + "@treeseed/sdk": "github:treeseed-ai/sdk#31ec47efa52cfb32b76916df09c0e3d71e05cafc", "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8757,8 +8757,8 @@ } }, "node_modules/@treeseed/sdk": { - "version": "0.12.63-dev.fix-platform-detached-gitlinks.20260811T081734Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#9ab22f8b22e75b27cb74bf375d4dc8c1a2691f3f", + "version": "0.12.63-dev.feature-content-repository-authority.20260811T092601Z", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#31ec47efa52cfb32b76916df09c0e3d71e05cafc", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index c92f35e8..917e6d19 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@treeseed/admin", - "version": "0.12.59-dev.fix-platform-detached-gitlinks.20260811T081840Z", + "version": "0.12.59-dev.feature-content-repository-authority.20260811T092708Z", "description": "Treeseed administration portal framework built on @treeseed/core and @treeseed/ui.", "license": "Apache-2.0", "repository": { @@ -52,8 +52,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#466026656acb7f3af68d3dc24d5cdd42272cd5c0", - "@treeseed/sdk": "github:treeseed-ai/sdk#9ab22f8b22e75b27cb74bf375d4dc8c1a2691f3f", + "@treeseed/core": "github:treeseed-ai/core#c3653a94d7628c78fa712fd97ea56bb9fe6313f5", + "@treeseed/sdk": "github:treeseed-ai/sdk#31ec47efa52cfb32b76916df09c0e3d71e05cafc", "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", "react": "^19.2.5", "react-dom": "^19.2.6" From a7b70ac652343a1dc1c3c70a6d8f86da33bf5f57 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Tue, 11 Aug 2026 06:44:26 -0400 Subject: [PATCH 143/315] chore(deps): update @treeseed/core and @treeseed/sdk pointers Changes: - Update package.json and package-lock.json Dependency and pointer updates: - @treeseed/sdk: github:treeseed-ai/sdk#31ec47efa52cfb32b76916df09c0e3d71e05cafc -> github:treeseed-ai/sdk#144f48e941a3404ca2ce12f52878032c5da21753 - @treeseed/core: github:treeseed-ai/core#c3653a94d7628c78fa712fd97ea56bb9fe6313f5 -> github:treeseed-ai/core#27d6805680cd2cb4ea7208ca443392d525602fc2 --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index f08f1293..9831808a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "Apache-2.0", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#c3653a94d7628c78fa712fd97ea56bb9fe6313f5", - "@treeseed/sdk": "github:treeseed-ai/sdk#31ec47efa52cfb32b76916df09c0e3d71e05cafc", + "@treeseed/core": "github:treeseed-ai/core#27d6805680cd2cb4ea7208ca443392d525602fc2", + "@treeseed/sdk": "github:treeseed-ai/sdk#144f48e941a3404ca2ce12f52878032c5da21753", "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7397,7 +7397,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.feature-content-repository-authority.20260811T092645Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#c3653a94d7628c78fa712fd97ea56bb9fe6313f5", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#27d6805680cd2cb4ea7208ca443392d525602fc2", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7408,7 +7408,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#31ec47efa52cfb32b76916df09c0e3d71e05cafc", + "@treeseed/sdk": "github:treeseed-ai/sdk#144f48e941a3404ca2ce12f52878032c5da21753", "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8758,7 +8758,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.feature-content-repository-authority.20260811T092601Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#31ec47efa52cfb32b76916df09c0e3d71e05cafc", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#144f48e941a3404ca2ce12f52878032c5da21753", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index 917e6d19..b3f7b615 100644 --- a/package.json +++ b/package.json @@ -52,8 +52,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#c3653a94d7628c78fa712fd97ea56bb9fe6313f5", - "@treeseed/sdk": "github:treeseed-ai/sdk#31ec47efa52cfb32b76916df09c0e3d71e05cafc", + "@treeseed/core": "github:treeseed-ai/core#27d6805680cd2cb4ea7208ca443392d525602fc2", + "@treeseed/sdk": "github:treeseed-ai/sdk#144f48e941a3404ca2ce12f52878032c5da21753", "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", "react": "^19.2.5", "react-dom": "^19.2.6" From ed38abd7a10255134aba3260500bc044dfb64410 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Tue, 11 Aug 2026 07:35:37 -0400 Subject: [PATCH 144/315] refactor(admin): reconfigure project architecture Changes: - Update `build:app` in `package.json` to use the `astro` command - Update `treeseed.package.yaml` with `split_site_content` topology, new content paths, and updated runtime source and materialization - Update contract tests to reflect architecture changes - Update `package-lock.json` with new dependency versions Dependency and pointer updates: - @treeseed/core: github:treeseed-ai/core#27d6805680cd2cb4ea7208ca443392d525602fc2 -> github:treeseed-ai/core#4b8b0afdcb3f4e5ed2df204e509071e0186147a3 - @treeseed/sdk: github:treeseed-ai/sdk#144f48e941a3404ca2ce12f52878032c5da21753 -> github:treeseed-ai/sdk#a3586c955bfc8d4aeabaa5f07f54757c12041bf9 - @treeseed/ui: github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd -> github:treeseed-ai/ui#c68ed1d9fc64c93426304eddaaf7c449622f2f61 --- package-lock.json | 18 +++++++++--------- package.json | 8 ++++---- tests/contract/package/admin-package.test.ts | 6 +++--- treeseed.package.yaml | 12 ++++++------ 4 files changed, 22 insertions(+), 22 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9831808a..fcaf7ae2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,9 @@ "license": "Apache-2.0", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#27d6805680cd2cb4ea7208ca443392d525602fc2", - "@treeseed/sdk": "github:treeseed-ai/sdk#144f48e941a3404ca2ce12f52878032c5da21753", - "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", + "@treeseed/core": "github:treeseed-ai/core#4b8b0afdcb3f4e5ed2df204e509071e0186147a3", + "@treeseed/sdk": "github:treeseed-ai/sdk#a3586c955bfc8d4aeabaa5f07f54757c12041bf9", + "@treeseed/ui": "github:treeseed-ai/ui#c68ed1d9fc64c93426304eddaaf7c449622f2f61", "react": "^19.2.5", "react-dom": "^19.2.6" }, @@ -7397,7 +7397,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.feature-content-repository-authority.20260811T092645Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#27d6805680cd2cb4ea7208ca443392d525602fc2", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#4b8b0afdcb3f4e5ed2df204e509071e0186147a3", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7408,8 +7408,8 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#144f48e941a3404ca2ce12f52878032c5da21753", - "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", + "@treeseed/sdk": "github:treeseed-ai/sdk#a3586c955bfc8d4aeabaa5f07f54757c12041bf9", + "@treeseed/ui": "github:treeseed-ai/ui#c68ed1d9fc64c93426304eddaaf7c449622f2f61", "astro": "^5.6.1", "esbuild": "^0.28.0", "katex": "^0.16.22", @@ -8758,7 +8758,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.feature-content-repository-authority.20260811T092601Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#144f48e941a3404ca2ce12f52878032c5da21753", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#a3586c955bfc8d4aeabaa5f07f54757c12041bf9", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", @@ -9456,8 +9456,8 @@ } }, "node_modules/@treeseed/ui": { - "version": "0.12.18-dev.fix-ai-staging-verification.20260810T031836Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", + "version": "0.12.18-dev.feature-content-repository-authority.20260811T113238Z", + "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#c68ed1d9fc64c93426304eddaaf7c449622f2f61", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", diff --git a/package.json b/package.json index b3f7b615..322e5eb6 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "setup:ci": "npm ci --workspaces=false", "build": "npm run build:dist && npm run build:app", "build:dist": "node --import tsx ./scripts/build-dist.ts", - "build:app": "node ./node_modules/astro/astro.js build --config astro.config.ts", + "build:app": "astro build --config astro.config.ts", "dev": "node ./node_modules/astro/astro.js dev --config astro.config.ts --port 4322", "preview": "node ./node_modules/astro/astro.js preview --config astro.config.ts --port 4322", "prepare": "node --import tsx ./scripts/prepare.ts", @@ -52,9 +52,9 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#27d6805680cd2cb4ea7208ca443392d525602fc2", - "@treeseed/sdk": "github:treeseed-ai/sdk#144f48e941a3404ca2ce12f52878032c5da21753", - "@treeseed/ui": "github:treeseed-ai/ui#6fb94ae8b1e3b493de92301f24fd7d371f6aabdd", + "@treeseed/core": "github:treeseed-ai/core#4b8b0afdcb3f4e5ed2df204e509071e0186147a3", + "@treeseed/sdk": "github:treeseed-ai/sdk#a3586c955bfc8d4aeabaa5f07f54757c12041bf9", + "@treeseed/ui": "github:treeseed-ai/ui#c68ed1d9fc64c93426304eddaaf7c449622f2f61", "react": "^19.2.5", "react-dom": "^19.2.6" }, diff --git a/tests/contract/package/admin-package.test.ts b/tests/contract/package/admin-package.test.ts index b1fc6cdc..2748eb78 100644 --- a/tests/contract/package/admin-package.test.ts +++ b/tests/contract/package/admin-package.test.ts @@ -341,10 +341,10 @@ describe('@treeseed/admin identity and team surface', () => { expect(site).toContain('package: "@treeseed/core/plugin-default"'); expect(site).toContain('package: "@treeseed/admin/plugin"'); expect(manifest).toContain('type: web-application'); - expect(manifest).toContain('topology: single_repository_site'); + expect(manifest).toContain('topology: split_site_content'); expect(manifest).toContain('sitePath: docs'); - expect(manifest).toContain('contentPath: docs/src/content'); - expect(manifest).toContain('contentRuntimeSource: r2_published_manifest'); + expect(manifest).toContain('contentPath: src/content'); + expect(manifest).toContain('contentRuntimeSource: r2_preview_overlay'); expect(packageJson).toContain('"build:app"'); expect(existsSync('astro.config.ts')).toBe(true); expect(existsSync('src/content.config.ts')).toBe(true); diff --git a/treeseed.package.yaml b/treeseed.package.yaml index f7e1ad38..6dd8f5ca 100644 --- a/treeseed.package.yaml +++ b/treeseed.package.yaml @@ -20,19 +20,19 @@ artifacts: releaseGate: workflow: verify.yml projectArchitecture: - topology: single_repository_site + topology: split_site_content rootPath: . sitePath: docs - contentPath: docs/src/content - contentRuntimeSource: r2_published_manifest - localContentMaterialization: existing_path + contentPath: src/content + contentRuntimeSource: r2_preview_overlay + localContentMaterialization: none contentPublishTarget: kind: cloudflare_r2 prefix: packages/admin contentContributions: - model: books - path: docs/src/content/books + path: src/content/books runtime: published - model: docs - path: docs/src/content/knowledge + path: src/content/knowledge runtime: published From 1703d9d25dcd0b95ad5994eefc4176f476fd6657 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Tue, 11 Aug 2026 09:28:54 -0400 Subject: [PATCH 145/315] docs(content): restructure documentation and update dependencies Changes: - Delete agent definition .mdx files in docs/src/content/agents/ - Add books, groups, knowledge, notes, and questions content - Update contextual help and feedback management architecture tests - Update treeseed.site.yaml configuration - Update package.json and package-lock.json Dependency and pointer updates: - @treeseed/sdk: github:treeseed-ai/sdk#213d9ac3e22dd5b2c7c6c5397598e5b3f3575fc4 - @treeseed/core: github:treeseed-ai/core#4605497a794d0218b1d3a2782d2360b0da2d2644 --- docs/src/content/agents/architect.mdx | 336 ----------------- docs/src/content/agents/engineer.mdx | 343 ------------------ docs/src/content/agents/releaser.mdx | 342 ----------------- docs/src/content/agents/reporter.mdx | 113 ------ docs/src/content/agents/researcher.mdx | 336 ----------------- docs/src/content/agents/reviewer.mdx | 337 ----------------- docs/src/content/agents/technical-writer.mdx | 334 ----------------- docs/src/content/agents/tester.mdx | 343 ------------------ docs/src/content/books/.gitkeep | 1 - .../content/books/accounts-and-identity.md | 20 - docs/src/content/books/credential-security.md | 20 - .../src/content/books/feedback-and-support.md | 20 - .../content/books/services-and-providers.md | 20 - docs/src/content/books/team-administration.md | 20 - docs/src/content/decisions/.gitkeep | 1 - docs/src/content/groups/accept.md | 12 - docs/src/content/groups/access.md | 12 - docs/src/content/groups/account-id.md | 12 - docs/src/content/groups/account-password.md | 12 - docs/src/content/groups/accounts.md | 12 - docs/src/content/groups/actions.md | 12 - docs/src/content/groups/active-team.md | 12 - docs/src/content/groups/activity.md | 12 - docs/src/content/groups/actor.md | 12 - docs/src/content/groups/administration.md | 12 - docs/src/content/groups/administrator-key.md | 12 - docs/src/content/groups/administrator.md | 12 - docs/src/content/groups/agent.md | 12 - docs/src/content/groups/ai.md | 12 - docs/src/content/groups/api-token.md | 12 - docs/src/content/groups/appearance.md | 12 - docs/src/content/groups/architecture.md | 12 - docs/src/content/groups/archive.md | 12 - docs/src/content/groups/archived.md | 12 - docs/src/content/groups/attachment.md | 12 - docs/src/content/groups/audit.md | 12 - docs/src/content/groups/authentication.md | 12 - docs/src/content/groups/author.md | 12 - docs/src/content/groups/authoring.md | 12 - docs/src/content/groups/binding.md | 12 - docs/src/content/groups/blast-radius.md | 12 - docs/src/content/groups/blocker.md | 12 - docs/src/content/groups/blockers.md | 12 - docs/src/content/groups/books.md | 12 - docs/src/content/groups/cadence.md | 12 - docs/src/content/groups/capabilities.md | 12 - docs/src/content/groups/capability.md | 12 - docs/src/content/groups/capture.md | 12 - docs/src/content/groups/change.md | 12 - docs/src/content/groups/changes.md | 12 - docs/src/content/groups/ciphertext.md | 12 - docs/src/content/groups/cloudflare.md | 12 - docs/src/content/groups/colors.md | 12 - docs/src/content/groups/compromise.md | 12 - docs/src/content/groups/conflict.md | 12 - docs/src/content/groups/connect-service.md | 12 - .../src/content/groups/connection-settings.md | 12 - docs/src/content/groups/connections.md | 12 - docs/src/content/groups/contact.md | 12 - docs/src/content/groups/content-fields.md | 12 - docs/src/content/groups/content.md | 12 - docs/src/content/groups/context.md | 12 - docs/src/content/groups/contrast.md | 12 - docs/src/content/groups/contributor.md | 12 - docs/src/content/groups/create-team.md | 12 - docs/src/content/groups/credential.md | 12 - docs/src/content/groups/credentials.md | 12 - docs/src/content/groups/dark-mode.md | 12 - docs/src/content/groups/date.md | 12 - docs/src/content/groups/delete-account.md | 12 - docs/src/content/groups/delete-team.md | 12 - docs/src/content/groups/delete.md | 12 - docs/src/content/groups/devices.md | 12 - docs/src/content/groups/directory.md | 12 - .../src/content/groups/discard-credentials.md | 12 - docs/src/content/groups/disconnect.md | 12 - docs/src/content/groups/dns.md | 12 - docs/src/content/groups/email-mismatch.md | 12 - docs/src/content/groups/email.md | 12 - docs/src/content/groups/encryption.md | 12 - docs/src/content/groups/engineering-team.md | 12 - docs/src/content/groups/engineering.md | 12 - docs/src/content/groups/envelope.md | 12 - docs/src/content/groups/expiry.md | 12 - docs/src/content/groups/export.md | 12 - docs/src/content/groups/feedback.md | 12 - docs/src/content/groups/filter.md | 12 - .../content/groups/forgotten-passphrase.md | 12 - docs/src/content/groups/github-app.md | 12 - docs/src/content/groups/github.md | 12 - docs/src/content/groups/google.md | 12 - docs/src/content/groups/grant.md | 12 - docs/src/content/groups/hashicorp-vault.md | 12 - docs/src/content/groups/history.md | 12 - docs/src/content/groups/hosting.md | 12 - docs/src/content/groups/iana.md | 12 - docs/src/content/groups/identity.md | 12 - docs/src/content/groups/in-progress.md | 12 - docs/src/content/groups/installation.md | 12 - docs/src/content/groups/invitation.md | 12 - docs/src/content/groups/ip-address.md | 12 - docs/src/content/groups/irreversible.md | 12 - docs/src/content/groups/issue.md | 12 - docs/src/content/groups/jsonl.md | 12 - docs/src/content/groups/jwt.md | 12 - docs/src/content/groups/key-wrapping.md | 12 - docs/src/content/groups/knowledge.md | 12 - docs/src/content/groups/last-owner.md | 12 - docs/src/content/groups/lead.md | 12 - docs/src/content/groups/lease.md | 12 - docs/src/content/groups/leave.md | 12 - docs/src/content/groups/lost-access.md | 12 - docs/src/content/groups/member.md | 12 - docs/src/content/groups/members.md | 12 - docs/src/content/groups/membership.md | 12 - docs/src/content/groups/metadata.md | 12 - docs/src/content/groups/name.md | 12 - docs/src/content/groups/notes.md | 12 - docs/src/content/groups/notifications.md | 12 - docs/src/content/groups/oidc.md | 12 - docs/src/content/groups/openbao.md | 12 - docs/src/content/groups/organization.md | 12 - docs/src/content/groups/overrides.md | 12 - docs/src/content/groups/owner.md | 12 - docs/src/content/groups/ownership.md | 12 - docs/src/content/groups/pages.md | 12 - docs/src/content/groups/pagination.md | 12 - docs/src/content/groups/passphrase.md | 12 - docs/src/content/groups/password.md | 12 - docs/src/content/groups/permission.md | 12 - docs/src/content/groups/permissions.md | 12 - .../src/content/groups/personal-passphrase.md | 12 - docs/src/content/groups/platform-admin.md | 12 - docs/src/content/groups/primary.md | 12 - docs/src/content/groups/privacy.md | 12 - docs/src/content/groups/private.md | 12 - docs/src/content/groups/profile.md | 12 - docs/src/content/groups/projects.md | 12 - docs/src/content/groups/provenance.md | 12 - docs/src/content/groups/provider.md | 12 - docs/src/content/groups/providers.md | 12 - docs/src/content/groups/public-profile.md | 12 - docs/src/content/groups/public.md | 12 - docs/src/content/groups/publication.md | 12 - docs/src/content/groups/r2.md | 12 - docs/src/content/groups/railway.md | 12 - docs/src/content/groups/read-only.md | 12 - docs/src/content/groups/reauthentication.md | 12 - docs/src/content/groups/recovery.md | 12 - docs/src/content/groups/redact.md | 12 - docs/src/content/groups/release.md | 12 - docs/src/content/groups/remove.md | 12 - docs/src/content/groups/reopen.md | 12 - docs/src/content/groups/report.md | 12 - docs/src/content/groups/reporting.md | 12 - docs/src/content/groups/repositories.md | 12 - docs/src/content/groups/repository.md | 12 - docs/src/content/groups/research.md | 12 - docs/src/content/groups/resend.md | 12 - docs/src/content/groups/reset-vault.md | 12 - docs/src/content/groups/resolve.md | 12 - docs/src/content/groups/restore.md | 12 - docs/src/content/groups/retention.md | 12 - docs/src/content/groups/review.md | 12 - docs/src/content/groups/revoke.md | 12 - docs/src/content/groups/role.md | 12 - docs/src/content/groups/roles.md | 12 - docs/src/content/groups/rotate-passphrase.md | 12 - docs/src/content/groups/rotate-team-key.md | 12 - docs/src/content/groups/rotate-token.md | 12 - docs/src/content/groups/rotation.md | 12 - docs/src/content/groups/same-passphrase.md | 12 - docs/src/content/groups/screenshot.md | 12 - docs/src/content/groups/search.md | 12 - docs/src/content/groups/secrets.md | 12 - docs/src/content/groups/security.md | 12 - docs/src/content/groups/service-vault.md | 12 - docs/src/content/groups/services.md | 12 - docs/src/content/groups/sessions.md | 12 - docs/src/content/groups/settings.md | 12 - docs/src/content/groups/sign-in.md | 12 - docs/src/content/groups/sign-out.md | 12 - docs/src/content/groups/slug.md | 12 - docs/src/content/groups/sole-administrator.md | 12 - docs/src/content/groups/status.md | 12 - docs/src/content/groups/step-1.md | 12 - docs/src/content/groups/step-2.md | 12 - docs/src/content/groups/step-3.md | 12 - docs/src/content/groups/suggestion.md | 12 - docs/src/content/groups/support.md | 12 - docs/src/content/groups/switch.md | 12 - docs/src/content/groups/team-key.md | 12 - docs/src/content/groups/team-overview.md | 12 - docs/src/content/groups/team-settings.md | 12 - docs/src/content/groups/team-vault-key.md | 12 - docs/src/content/groups/teams.md | 12 - docs/src/content/groups/technical-writing.md | 12 - docs/src/content/groups/testing.md | 12 - docs/src/content/groups/theme.md | 12 - docs/src/content/groups/time-zone.md | 12 - docs/src/content/groups/timestamp.md | 12 - docs/src/content/groups/timezone.md | 12 - docs/src/content/groups/title.md | 12 - docs/src/content/groups/token.md | 12 - docs/src/content/groups/traceability.md | 12 - docs/src/content/groups/transfer.md | 12 - docs/src/content/groups/triage.md | 12 - docs/src/content/groups/username.md | 12 - docs/src/content/groups/validation.md | 12 - docs/src/content/groups/vault.md | 12 - docs/src/content/groups/verification.md | 12 - docs/src/content/groups/viewer.md | 12 - docs/src/content/groups/visibility.md | 12 - docs/src/content/groups/workers.md | 12 - docs/src/content/groups/workflow.md | 12 - docs/src/content/groups/workload-identity.md | 12 - docs/src/content/groups/workspace.md | 12 - docs/src/content/groups/wrapped-team-key.md | 12 - docs/src/content/groups/zero-knowledge.md | 12 - docs/src/content/groups/zip.md | 12 - .../appearance.md | 50 --- .../connected-identities.md | 50 --- .../deletion.md | 46 --- .../treeseed-accounts-and-identity/emails.md | 54 --- .../identity.md | 61 ---- .../notifications.md | 50 --- .../project-overrides.md | 45 --- .../security.md | 57 --- .../sessions.md | 52 --- .../time-zone.md | 49 --- .../treeseed-credential-security/grants.md | 47 --- .../treeseed-credential-security/overview.md | 55 --- .../personal-key.md | 50 --- .../provider-credential-rotation.md | 51 --- .../treeseed-credential-security/recovery.md | 48 --- .../treeseed-credential-security/reset.md | 47 --- .../treeseed-credential-security/rotation.md | 44 --- .../team-custody.md | 50 --- .../administration.md | 49 --- .../treeseed-feedback-and-support/exports.md | 50 --- .../treeseed-feedback-and-support/fields.md | 43 --- .../treeseed-feedback-and-support/privacy.md | 49 --- .../screenshot-privacy.md | 50 --- .../submitting.md | 48 --- .../treeseed-feedback-and-support/triage.md | 48 --- .../activity.md | 47 --- .../capabilities.md | 52 --- .../connect.md | 51 --- .../connection.md | 48 --- .../connections.md | 51 --- .../credentials.md | 52 --- .../disconnection.md | 47 --- .../external-vault.md | 49 --- .../provider-cloudflare.md | 49 --- .../provider-github.md | 51 --- .../provider-openbao.md | 46 --- .../provider-railway.md | 45 --- .../providers.md | 53 --- .../settings.md | 49 --- .../validation.md | 47 --- .../treeseed-team-administration/activity.md | 48 --- .../collection.md | 53 --- .../treeseed-team-administration/creation.md | 46 --- .../invitation.md | 51 --- .../knowledge-authoring.md | 52 --- .../treeseed-team-administration/lifecycle.md | 55 --- .../member-search.md | 46 --- .../membership.md | 57 --- .../treeseed-team-administration/overview.md | 56 --- .../treeseed-team-administration/ownership.md | 48 --- .../treeseed-team-administration/removal.md | 47 --- .../role-changes.md | 46 --- .../treeseed-team-administration/roles.md | 52 --- .../treeseed-team-administration/settings.md | 49 --- .../visibility.md | 46 --- docs/src/content/notes/.gitkeep | 1 - .../notes/knowledge-authoring-traceability.md | 28 -- docs/src/content/objectives/core.md | 21 -- docs/src/content/pages/.gitkeep | 1 - docs/src/content/people/.gitkeep | 1 - docs/src/content/proposals/.gitkeep | 1 - docs/src/content/questions/.gitkeep | 1 - ...-knowledge-publication-stay-trustworthy.md | 22 -- docs/src/content/templates/.gitkeep | 1 - docs/src/content/workdays/.gitkeep | 1 - package-lock.json | 10 +- package.json | 4 +- .../contextual-help-architecture.test.ts | 19 +- .../feedback-management-architecture.test.ts | 12 +- treeseed.site.yaml | 4 +- 290 files changed, 25 insertions(+), 7880 deletions(-) delete mode 100644 docs/src/content/agents/architect.mdx delete mode 100644 docs/src/content/agents/engineer.mdx delete mode 100644 docs/src/content/agents/releaser.mdx delete mode 100644 docs/src/content/agents/reporter.mdx delete mode 100644 docs/src/content/agents/researcher.mdx delete mode 100644 docs/src/content/agents/reviewer.mdx delete mode 100644 docs/src/content/agents/technical-writer.mdx delete mode 100644 docs/src/content/agents/tester.mdx delete mode 100644 docs/src/content/books/.gitkeep delete mode 100644 docs/src/content/books/accounts-and-identity.md delete mode 100644 docs/src/content/books/credential-security.md delete mode 100644 docs/src/content/books/feedback-and-support.md delete mode 100644 docs/src/content/books/services-and-providers.md delete mode 100644 docs/src/content/books/team-administration.md delete mode 100644 docs/src/content/decisions/.gitkeep delete mode 100644 docs/src/content/groups/accept.md delete mode 100644 docs/src/content/groups/access.md delete mode 100644 docs/src/content/groups/account-id.md delete mode 100644 docs/src/content/groups/account-password.md delete mode 100644 docs/src/content/groups/accounts.md delete mode 100644 docs/src/content/groups/actions.md delete mode 100644 docs/src/content/groups/active-team.md delete mode 100644 docs/src/content/groups/activity.md delete mode 100644 docs/src/content/groups/actor.md delete mode 100644 docs/src/content/groups/administration.md delete mode 100644 docs/src/content/groups/administrator-key.md delete mode 100644 docs/src/content/groups/administrator.md delete mode 100644 docs/src/content/groups/agent.md delete mode 100644 docs/src/content/groups/ai.md delete mode 100644 docs/src/content/groups/api-token.md delete mode 100644 docs/src/content/groups/appearance.md delete mode 100644 docs/src/content/groups/architecture.md delete mode 100644 docs/src/content/groups/archive.md delete mode 100644 docs/src/content/groups/archived.md delete mode 100644 docs/src/content/groups/attachment.md delete mode 100644 docs/src/content/groups/audit.md delete mode 100644 docs/src/content/groups/authentication.md delete mode 100644 docs/src/content/groups/author.md delete mode 100644 docs/src/content/groups/authoring.md delete mode 100644 docs/src/content/groups/binding.md delete mode 100644 docs/src/content/groups/blast-radius.md delete mode 100644 docs/src/content/groups/blocker.md delete mode 100644 docs/src/content/groups/blockers.md delete mode 100644 docs/src/content/groups/books.md delete mode 100644 docs/src/content/groups/cadence.md delete mode 100644 docs/src/content/groups/capabilities.md delete mode 100644 docs/src/content/groups/capability.md delete mode 100644 docs/src/content/groups/capture.md delete mode 100644 docs/src/content/groups/change.md delete mode 100644 docs/src/content/groups/changes.md delete mode 100644 docs/src/content/groups/ciphertext.md delete mode 100644 docs/src/content/groups/cloudflare.md delete mode 100644 docs/src/content/groups/colors.md delete mode 100644 docs/src/content/groups/compromise.md delete mode 100644 docs/src/content/groups/conflict.md delete mode 100644 docs/src/content/groups/connect-service.md delete mode 100644 docs/src/content/groups/connection-settings.md delete mode 100644 docs/src/content/groups/connections.md delete mode 100644 docs/src/content/groups/contact.md delete mode 100644 docs/src/content/groups/content-fields.md delete mode 100644 docs/src/content/groups/content.md delete mode 100644 docs/src/content/groups/context.md delete mode 100644 docs/src/content/groups/contrast.md delete mode 100644 docs/src/content/groups/contributor.md delete mode 100644 docs/src/content/groups/create-team.md delete mode 100644 docs/src/content/groups/credential.md delete mode 100644 docs/src/content/groups/credentials.md delete mode 100644 docs/src/content/groups/dark-mode.md delete mode 100644 docs/src/content/groups/date.md delete mode 100644 docs/src/content/groups/delete-account.md delete mode 100644 docs/src/content/groups/delete-team.md delete mode 100644 docs/src/content/groups/delete.md delete mode 100644 docs/src/content/groups/devices.md delete mode 100644 docs/src/content/groups/directory.md delete mode 100644 docs/src/content/groups/discard-credentials.md delete mode 100644 docs/src/content/groups/disconnect.md delete mode 100644 docs/src/content/groups/dns.md delete mode 100644 docs/src/content/groups/email-mismatch.md delete mode 100644 docs/src/content/groups/email.md delete mode 100644 docs/src/content/groups/encryption.md delete mode 100644 docs/src/content/groups/engineering-team.md delete mode 100644 docs/src/content/groups/engineering.md delete mode 100644 docs/src/content/groups/envelope.md delete mode 100644 docs/src/content/groups/expiry.md delete mode 100644 docs/src/content/groups/export.md delete mode 100644 docs/src/content/groups/feedback.md delete mode 100644 docs/src/content/groups/filter.md delete mode 100644 docs/src/content/groups/forgotten-passphrase.md delete mode 100644 docs/src/content/groups/github-app.md delete mode 100644 docs/src/content/groups/github.md delete mode 100644 docs/src/content/groups/google.md delete mode 100644 docs/src/content/groups/grant.md delete mode 100644 docs/src/content/groups/hashicorp-vault.md delete mode 100644 docs/src/content/groups/history.md delete mode 100644 docs/src/content/groups/hosting.md delete mode 100644 docs/src/content/groups/iana.md delete mode 100644 docs/src/content/groups/identity.md delete mode 100644 docs/src/content/groups/in-progress.md delete mode 100644 docs/src/content/groups/installation.md delete mode 100644 docs/src/content/groups/invitation.md delete mode 100644 docs/src/content/groups/ip-address.md delete mode 100644 docs/src/content/groups/irreversible.md delete mode 100644 docs/src/content/groups/issue.md delete mode 100644 docs/src/content/groups/jsonl.md delete mode 100644 docs/src/content/groups/jwt.md delete mode 100644 docs/src/content/groups/key-wrapping.md delete mode 100644 docs/src/content/groups/knowledge.md delete mode 100644 docs/src/content/groups/last-owner.md delete mode 100644 docs/src/content/groups/lead.md delete mode 100644 docs/src/content/groups/lease.md delete mode 100644 docs/src/content/groups/leave.md delete mode 100644 docs/src/content/groups/lost-access.md delete mode 100644 docs/src/content/groups/member.md delete mode 100644 docs/src/content/groups/members.md delete mode 100644 docs/src/content/groups/membership.md delete mode 100644 docs/src/content/groups/metadata.md delete mode 100644 docs/src/content/groups/name.md delete mode 100644 docs/src/content/groups/notes.md delete mode 100644 docs/src/content/groups/notifications.md delete mode 100644 docs/src/content/groups/oidc.md delete mode 100644 docs/src/content/groups/openbao.md delete mode 100644 docs/src/content/groups/organization.md delete mode 100644 docs/src/content/groups/overrides.md delete mode 100644 docs/src/content/groups/owner.md delete mode 100644 docs/src/content/groups/ownership.md delete mode 100644 docs/src/content/groups/pages.md delete mode 100644 docs/src/content/groups/pagination.md delete mode 100644 docs/src/content/groups/passphrase.md delete mode 100644 docs/src/content/groups/password.md delete mode 100644 docs/src/content/groups/permission.md delete mode 100644 docs/src/content/groups/permissions.md delete mode 100644 docs/src/content/groups/personal-passphrase.md delete mode 100644 docs/src/content/groups/platform-admin.md delete mode 100644 docs/src/content/groups/primary.md delete mode 100644 docs/src/content/groups/privacy.md delete mode 100644 docs/src/content/groups/private.md delete mode 100644 docs/src/content/groups/profile.md delete mode 100644 docs/src/content/groups/projects.md delete mode 100644 docs/src/content/groups/provenance.md delete mode 100644 docs/src/content/groups/provider.md delete mode 100644 docs/src/content/groups/providers.md delete mode 100644 docs/src/content/groups/public-profile.md delete mode 100644 docs/src/content/groups/public.md delete mode 100644 docs/src/content/groups/publication.md delete mode 100644 docs/src/content/groups/r2.md delete mode 100644 docs/src/content/groups/railway.md delete mode 100644 docs/src/content/groups/read-only.md delete mode 100644 docs/src/content/groups/reauthentication.md delete mode 100644 docs/src/content/groups/recovery.md delete mode 100644 docs/src/content/groups/redact.md delete mode 100644 docs/src/content/groups/release.md delete mode 100644 docs/src/content/groups/remove.md delete mode 100644 docs/src/content/groups/reopen.md delete mode 100644 docs/src/content/groups/report.md delete mode 100644 docs/src/content/groups/reporting.md delete mode 100644 docs/src/content/groups/repositories.md delete mode 100644 docs/src/content/groups/repository.md delete mode 100644 docs/src/content/groups/research.md delete mode 100644 docs/src/content/groups/resend.md delete mode 100644 docs/src/content/groups/reset-vault.md delete mode 100644 docs/src/content/groups/resolve.md delete mode 100644 docs/src/content/groups/restore.md delete mode 100644 docs/src/content/groups/retention.md delete mode 100644 docs/src/content/groups/review.md delete mode 100644 docs/src/content/groups/revoke.md delete mode 100644 docs/src/content/groups/role.md delete mode 100644 docs/src/content/groups/roles.md delete mode 100644 docs/src/content/groups/rotate-passphrase.md delete mode 100644 docs/src/content/groups/rotate-team-key.md delete mode 100644 docs/src/content/groups/rotate-token.md delete mode 100644 docs/src/content/groups/rotation.md delete mode 100644 docs/src/content/groups/same-passphrase.md delete mode 100644 docs/src/content/groups/screenshot.md delete mode 100644 docs/src/content/groups/search.md delete mode 100644 docs/src/content/groups/secrets.md delete mode 100644 docs/src/content/groups/security.md delete mode 100644 docs/src/content/groups/service-vault.md delete mode 100644 docs/src/content/groups/services.md delete mode 100644 docs/src/content/groups/sessions.md delete mode 100644 docs/src/content/groups/settings.md delete mode 100644 docs/src/content/groups/sign-in.md delete mode 100644 docs/src/content/groups/sign-out.md delete mode 100644 docs/src/content/groups/slug.md delete mode 100644 docs/src/content/groups/sole-administrator.md delete mode 100644 docs/src/content/groups/status.md delete mode 100644 docs/src/content/groups/step-1.md delete mode 100644 docs/src/content/groups/step-2.md delete mode 100644 docs/src/content/groups/step-3.md delete mode 100644 docs/src/content/groups/suggestion.md delete mode 100644 docs/src/content/groups/support.md delete mode 100644 docs/src/content/groups/switch.md delete mode 100644 docs/src/content/groups/team-key.md delete mode 100644 docs/src/content/groups/team-overview.md delete mode 100644 docs/src/content/groups/team-settings.md delete mode 100644 docs/src/content/groups/team-vault-key.md delete mode 100644 docs/src/content/groups/teams.md delete mode 100644 docs/src/content/groups/technical-writing.md delete mode 100644 docs/src/content/groups/testing.md delete mode 100644 docs/src/content/groups/theme.md delete mode 100644 docs/src/content/groups/time-zone.md delete mode 100644 docs/src/content/groups/timestamp.md delete mode 100644 docs/src/content/groups/timezone.md delete mode 100644 docs/src/content/groups/title.md delete mode 100644 docs/src/content/groups/token.md delete mode 100644 docs/src/content/groups/traceability.md delete mode 100644 docs/src/content/groups/transfer.md delete mode 100644 docs/src/content/groups/triage.md delete mode 100644 docs/src/content/groups/username.md delete mode 100644 docs/src/content/groups/validation.md delete mode 100644 docs/src/content/groups/vault.md delete mode 100644 docs/src/content/groups/verification.md delete mode 100644 docs/src/content/groups/viewer.md delete mode 100644 docs/src/content/groups/visibility.md delete mode 100644 docs/src/content/groups/workers.md delete mode 100644 docs/src/content/groups/workflow.md delete mode 100644 docs/src/content/groups/workload-identity.md delete mode 100644 docs/src/content/groups/workspace.md delete mode 100644 docs/src/content/groups/wrapped-team-key.md delete mode 100644 docs/src/content/groups/zero-knowledge.md delete mode 100644 docs/src/content/groups/zip.md delete mode 100644 docs/src/content/knowledge/treeseed-accounts-and-identity/appearance.md delete mode 100644 docs/src/content/knowledge/treeseed-accounts-and-identity/connected-identities.md delete mode 100644 docs/src/content/knowledge/treeseed-accounts-and-identity/deletion.md delete mode 100644 docs/src/content/knowledge/treeseed-accounts-and-identity/emails.md delete mode 100644 docs/src/content/knowledge/treeseed-accounts-and-identity/identity.md delete mode 100644 docs/src/content/knowledge/treeseed-accounts-and-identity/notifications.md delete mode 100644 docs/src/content/knowledge/treeseed-accounts-and-identity/project-overrides.md delete mode 100644 docs/src/content/knowledge/treeseed-accounts-and-identity/security.md delete mode 100644 docs/src/content/knowledge/treeseed-accounts-and-identity/sessions.md delete mode 100644 docs/src/content/knowledge/treeseed-accounts-and-identity/time-zone.md delete mode 100644 docs/src/content/knowledge/treeseed-credential-security/grants.md delete mode 100644 docs/src/content/knowledge/treeseed-credential-security/overview.md delete mode 100644 docs/src/content/knowledge/treeseed-credential-security/personal-key.md delete mode 100644 docs/src/content/knowledge/treeseed-credential-security/provider-credential-rotation.md delete mode 100644 docs/src/content/knowledge/treeseed-credential-security/recovery.md delete mode 100644 docs/src/content/knowledge/treeseed-credential-security/reset.md delete mode 100644 docs/src/content/knowledge/treeseed-credential-security/rotation.md delete mode 100644 docs/src/content/knowledge/treeseed-credential-security/team-custody.md delete mode 100644 docs/src/content/knowledge/treeseed-feedback-and-support/administration.md delete mode 100644 docs/src/content/knowledge/treeseed-feedback-and-support/exports.md delete mode 100644 docs/src/content/knowledge/treeseed-feedback-and-support/fields.md delete mode 100644 docs/src/content/knowledge/treeseed-feedback-and-support/privacy.md delete mode 100644 docs/src/content/knowledge/treeseed-feedback-and-support/screenshot-privacy.md delete mode 100644 docs/src/content/knowledge/treeseed-feedback-and-support/submitting.md delete mode 100644 docs/src/content/knowledge/treeseed-feedback-and-support/triage.md delete mode 100644 docs/src/content/knowledge/treeseed-services-and-providers/activity.md delete mode 100644 docs/src/content/knowledge/treeseed-services-and-providers/capabilities.md delete mode 100644 docs/src/content/knowledge/treeseed-services-and-providers/connect.md delete mode 100644 docs/src/content/knowledge/treeseed-services-and-providers/connection.md delete mode 100644 docs/src/content/knowledge/treeseed-services-and-providers/connections.md delete mode 100644 docs/src/content/knowledge/treeseed-services-and-providers/credentials.md delete mode 100644 docs/src/content/knowledge/treeseed-services-and-providers/disconnection.md delete mode 100644 docs/src/content/knowledge/treeseed-services-and-providers/external-vault.md delete mode 100644 docs/src/content/knowledge/treeseed-services-and-providers/provider-cloudflare.md delete mode 100644 docs/src/content/knowledge/treeseed-services-and-providers/provider-github.md delete mode 100644 docs/src/content/knowledge/treeseed-services-and-providers/provider-openbao.md delete mode 100644 docs/src/content/knowledge/treeseed-services-and-providers/provider-railway.md delete mode 100644 docs/src/content/knowledge/treeseed-services-and-providers/providers.md delete mode 100644 docs/src/content/knowledge/treeseed-services-and-providers/settings.md delete mode 100644 docs/src/content/knowledge/treeseed-services-and-providers/validation.md delete mode 100644 docs/src/content/knowledge/treeseed-team-administration/activity.md delete mode 100644 docs/src/content/knowledge/treeseed-team-administration/collection.md delete mode 100644 docs/src/content/knowledge/treeseed-team-administration/creation.md delete mode 100644 docs/src/content/knowledge/treeseed-team-administration/invitation.md delete mode 100644 docs/src/content/knowledge/treeseed-team-administration/knowledge-authoring.md delete mode 100644 docs/src/content/knowledge/treeseed-team-administration/lifecycle.md delete mode 100644 docs/src/content/knowledge/treeseed-team-administration/member-search.md delete mode 100644 docs/src/content/knowledge/treeseed-team-administration/membership.md delete mode 100644 docs/src/content/knowledge/treeseed-team-administration/overview.md delete mode 100644 docs/src/content/knowledge/treeseed-team-administration/ownership.md delete mode 100644 docs/src/content/knowledge/treeseed-team-administration/removal.md delete mode 100644 docs/src/content/knowledge/treeseed-team-administration/role-changes.md delete mode 100644 docs/src/content/knowledge/treeseed-team-administration/roles.md delete mode 100644 docs/src/content/knowledge/treeseed-team-administration/settings.md delete mode 100644 docs/src/content/knowledge/treeseed-team-administration/visibility.md delete mode 100644 docs/src/content/notes/.gitkeep delete mode 100644 docs/src/content/notes/knowledge-authoring-traceability.md delete mode 100644 docs/src/content/objectives/core.md delete mode 100644 docs/src/content/pages/.gitkeep delete mode 100644 docs/src/content/people/.gitkeep delete mode 100644 docs/src/content/proposals/.gitkeep delete mode 100644 docs/src/content/questions/.gitkeep delete mode 100644 docs/src/content/questions/how-should-knowledge-publication-stay-trustworthy.md delete mode 100644 docs/src/content/templates/.gitkeep delete mode 100644 docs/src/content/workdays/.gitkeep diff --git a/docs/src/content/agents/architect.mdx b/docs/src/content/agents/architect.mdx deleted file mode 100644 index 3becb3e0..00000000 --- a/docs/src/content/agents/architect.mdx +++ /dev/null @@ -1,336 +0,0 @@ ---- -id: agent:architect -slug: architect -title: Architect -name: Architect -agentClass: architecture -projectAgentClassId: architecture -projectAgentClassSlug: architecture -template: engineering-agent/architect -enabled: true -description: Defines the project architecture, objectives, standards, and decision-aligned knowledge structure. -summary: Defines the project architecture, objectives, standards, and decision-aligned knowledge structure. -runtimeStatus: active -groupIds: - - agent - - architecture - - engineering-team -identity: - purpose: Defines the project architecture, objectives, standards, and decision-aligned knowledge structure. - responsibilities: - - Participate in autonomous planning for the project. - - Submit structured estimates when assigned estimating work. - - Use only profile-scoped tools and TreeDX-backed content operations. - durableInstructions: | - Keep all work scoped to this project and activity profile. Create TreeSeed content as Astro content model Markdown through TreeDX tools. Ask questions through TreeDX question content when blocked. -capabilities: - - id: architecture.planning - description: Planning support for architecture. - produces: - - question - - note - - proposal_feedback - - id: architecture.execute - description: Assignment execution support for architecture. - produces: - - architecture_spec - - objective_update - - knowledge_update -activityProfiles: - planning: - activityType: planning - enabled: true - handler: writer - prompt: - system: | - You are the Architect for this TreeSeed project. Defines the project architecture, objectives, standards, and decision-aligned knowledge structure. Use TreeDX-backed content tools for all project content and keep work scoped to the current activity profile. - task: planning - branchPolicy: - kind: staging-content - base: staging - contentAccess: - read: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - describe - - query - - read - write: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - create - - update - - link - - validate - - commit - commit: - allowed: true - tools: - allowed: - - treeseed.content.describe - - treeseed.content.query - - treeseed.content.read - - treedx.build_context - - treedx.read_repository_files - - treeseed.repository.read_file - - treeseed.repository.search - - treedx.search_workspace - - treedx.read_workspace_file - - treeseed.status - - treeseed.content.create - - treeseed.content.update - - treeseed.content.link - - treeseed.content.validate - - treeseed.content.commit - - treedx.apply_workspace_changeset - - treedx.commit_workspace - outputs: - messageTypes: [] - modelMutations: - - linked_note:create - - proposal_feedback:create - - question:create - questionPolicy: - blockExecutionWhenCreated: true - defaultAnswerPolicy: - kind: team-human - execution: - requiredCapabilities: - - agent-execution - maxRuntimeSeconds: 1800 - maxRetries: 2 - verificationRequired: false - estimating: - activityType: estimating - enabled: true - handler: estimate - prompt: - system: | - You are the Architect for this TreeSeed project. Defines the project architecture, objectives, standards, and decision-aligned knowledge structure. Use TreeDX-backed content tools for all project content and keep work scoped to the current activity profile. - task: estimating - branchPolicy: - kind: read-only - base: main - contentAccess: - read: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - describe - - query - - read - write: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - create - - update - - link - - validate - - commit - commit: - allowed: false - tools: - allowed: - - treeseed.content.describe - - treeseed.content.query - - treeseed.content.read - - treedx.build_context - - treedx.read_repository_files - - treeseed.repository.read_file - - treeseed.repository.search - - treedx.search_workspace - - treedx.read_workspace_file - - treeseed.status - outputs: - messageTypes: [] - modelMutations: - - estimate:create - - dependency_declaration:create - questionPolicy: - blockExecutionWhenCreated: true - defaultAnswerPolicy: - kind: team-human - execution: - requiredCapabilities: - - agent-execution - maxRuntimeSeconds: 1800 - maxRetries: 2 - verificationRequired: false - reviewing: - activityType: reviewing - enabled: true - handler: writer - prompt: - system: | - You are the Architect for this TreeSeed project. Defines the project architecture, objectives, standards, and decision-aligned knowledge structure. Use TreeDX-backed content tools for all project content and keep work scoped to the current activity profile. - task: reviewing - branchPolicy: - kind: read-only - base: main - contentAccess: - read: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - describe - - query - - read - write: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - create - - update - - link - - validate - - commit - commit: - allowed: false - tools: - allowed: - - treeseed.content.describe - - treeseed.content.query - - treeseed.content.read - - treedx.build_context - - treedx.read_repository_files - - treeseed.repository.read_file - - treeseed.repository.search - - treedx.search_workspace - - treedx.read_workspace_file - - treeseed.status - outputs: - messageTypes: [] - modelMutations: - - review_note:create - - risk_note:create - questionPolicy: - blockExecutionWhenCreated: true - defaultAnswerPolicy: - kind: team-human - execution: - requiredCapabilities: - - agent-execution - maxRuntimeSeconds: 1800 - maxRetries: 2 - verificationRequired: false - acting: - activityType: acting - enabled: true - handler: writer - prompt: - system: | - You are the Architect for this TreeSeed project. Defines the project architecture, objectives, standards, and decision-aligned knowledge structure. Use TreeDX-backed content tools for all project content and keep work scoped to the current activity profile. - task: acting - branchPolicy: - kind: staging-content - base: staging - contentAccess: - read: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - describe - - query - - read - write: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - create - - update - - link - - validate - - commit - commit: - allowed: true - tools: - allowed: - - treeseed.content.describe - - treeseed.content.query - - treeseed.content.read - - treedx.build_context - - treedx.read_repository_files - - treeseed.repository.read_file - - treeseed.repository.search - - treedx.search_workspace - - treedx.read_workspace_file - - treeseed.status - - treeseed.content.create - - treeseed.content.update - - treeseed.content.link - - treeseed.content.validate - - treeseed.content.commit - - treedx.apply_workspace_changeset - - treedx.commit_workspace - outputs: - messageTypes: [] - modelMutations: - - architecture_spec:create - - objective_update:create - - knowledge_update:create - questionPolicy: - blockExecutionWhenCreated: true - defaultAnswerPolicy: - kind: team-human - execution: - requiredCapabilities: - - agent-execution - maxRuntimeSeconds: 1800 - maxRetries: 2 - verificationRequired: false ---- - -Architect for the admin TreeSeed project. - -Defines the project architecture, objectives, standards, and decision-aligned knowledge structure. diff --git a/docs/src/content/agents/engineer.mdx b/docs/src/content/agents/engineer.mdx deleted file mode 100644 index 7a07baaa..00000000 --- a/docs/src/content/agents/engineer.mdx +++ /dev/null @@ -1,343 +0,0 @@ ---- -id: agent:engineer -slug: engineer -title: Engineer -name: Engineer -agentClass: engineering -projectAgentClassId: engineering -projectAgentClassSlug: engineering -template: engineering-agent/engineer -enabled: true -description: Implements decision-scoped code and configuration changes without modifying tests. -summary: Implements decision-scoped code and configuration changes without modifying tests. -runtimeStatus: active -groupIds: - - agent - - engineering - - engineering-team -identity: - purpose: Implements decision-scoped code and configuration changes without modifying tests. - responsibilities: - - Participate in autonomous planning for the project. - - Submit structured estimates when assigned estimating work. - - Use only profile-scoped tools and TreeDX-backed content operations. - durableInstructions: | - Keep all work scoped to this project and activity profile. Create TreeSeed content as Astro content model Markdown through TreeDX tools. Ask questions through TreeDX question content when blocked. -capabilities: - - id: engineering.planning - description: Planning support for engineering. - produces: - - question - - note - - proposal_feedback - - id: engineering.execute - description: Assignment execution support for engineering. - produces: - - implementation-change - - implementation_report -activityProfiles: - planning: - activityType: planning - enabled: true - handler: writer - prompt: - system: | - You are the Engineer for this TreeSeed project. Implements decision-scoped code and configuration changes without modifying tests. Use TreeDX-backed content tools for all project content and keep work scoped to the current activity profile. - task: planning - branchPolicy: - kind: staging-content - base: staging - contentAccess: - read: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - describe - - query - - read - write: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - create - - update - - link - - validate - - commit - commit: - allowed: true - tools: - allowed: - - treeseed.content.describe - - treeseed.content.query - - treeseed.content.read - - treedx.build_context - - treedx.read_repository_files - - treeseed.repository.read_file - - treeseed.repository.search - - treedx.search_workspace - - treedx.read_workspace_file - - treeseed.status - - treeseed.content.create - - treeseed.content.update - - treeseed.content.link - - treeseed.content.validate - - treeseed.content.commit - - treedx.apply_workspace_changeset - - treedx.commit_workspace - outputs: - messageTypes: [] - modelMutations: - - linked_note:create - - proposal_feedback:create - - question:create - questionPolicy: - blockExecutionWhenCreated: true - defaultAnswerPolicy: - kind: human-or-agent - execution: - requiredCapabilities: - - agent-execution - maxRuntimeSeconds: 1800 - maxRetries: 2 - verificationRequired: true - estimating: - activityType: estimating - enabled: true - handler: estimate - prompt: - system: | - You are the Engineer for this TreeSeed project. Implements decision-scoped code and configuration changes without modifying tests. Use TreeDX-backed content tools for all project content and keep work scoped to the current activity profile. - task: estimating - branchPolicy: - kind: read-only - base: main - contentAccess: - read: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - describe - - query - - read - write: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - create - - update - - link - - validate - - commit - commit: - allowed: false - tools: - allowed: - - treeseed.content.describe - - treeseed.content.query - - treeseed.content.read - - treedx.build_context - - treedx.read_repository_files - - treeseed.repository.read_file - - treeseed.repository.search - - treedx.search_workspace - - treedx.read_workspace_file - - treeseed.status - outputs: - messageTypes: [] - modelMutations: - - estimate:create - - dependency_declaration:create - questionPolicy: - blockExecutionWhenCreated: true - defaultAnswerPolicy: - kind: human-or-agent - execution: - requiredCapabilities: - - agent-execution - maxRuntimeSeconds: 1800 - maxRetries: 2 - verificationRequired: false - reviewing: - activityType: reviewing - enabled: true - handler: writer - prompt: - system: | - You are the Engineer for this TreeSeed project. Implements decision-scoped code and configuration changes without modifying tests. Use TreeDX-backed content tools for all project content and keep work scoped to the current activity profile. - task: reviewing - branchPolicy: - kind: read-only - base: main - contentAccess: - read: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - describe - - query - - read - write: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - create - - update - - link - - validate - - commit - commit: - allowed: false - tools: - allowed: - - treeseed.content.describe - - treeseed.content.query - - treeseed.content.read - - treedx.build_context - - treedx.read_repository_files - - treeseed.repository.read_file - - treeseed.repository.search - - treedx.search_workspace - - treedx.read_workspace_file - - treeseed.status - outputs: - messageTypes: [] - modelMutations: - - review_note:create - - risk_note:create - questionPolicy: - blockExecutionWhenCreated: true - defaultAnswerPolicy: - kind: human-or-agent - execution: - requiredCapabilities: - - agent-execution - maxRuntimeSeconds: 1800 - maxRetries: 2 - verificationRequired: false - acting: - activityType: acting - enabled: true - handler: actor - prompt: - system: | - You are the Engineer for this TreeSeed project. Implements decision-scoped code and configuration changes without modifying tests. Use TreeDX-backed content tools for all project content and keep work scoped to the current activity profile. - task: acting - branchPolicy: - kind: assignment-feature - base: staging - target: staging - branchNameTemplate: agent/{agentSlug}/{assignmentId} - worktree: new - updateBaseBeforeRun: true - mergeTargetBeforeSave: true - prefix: engineer - contentAccess: - read: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - describe - - query - - read - write: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - create - - update - - link - - validate - - commit - commit: - allowed: true - tools: - allowed: - - treeseed.content.describe - - treeseed.content.query - - treeseed.content.read - - treedx.build_context - - treedx.read_repository_files - - treeseed.repository.read_file - - treeseed.repository.search - - treedx.search_workspace - - treedx.read_workspace_file - - treeseed.status - - treeseed.content.create - - treeseed.content.update - - treeseed.content.link - - treeseed.content.validate - - treeseed.content.commit - - treedx.apply_workspace_changeset - - treedx.commit_workspace - - treeseed.changed_paths - - treeseed.verify - - treeseed.dev_plan - outputs: - messageTypes: [] - modelMutations: - - implementation-change:create - - implementation_report:create - questionPolicy: - blockExecutionWhenCreated: true - defaultAnswerPolicy: - kind: human-or-agent - execution: - requiredCapabilities: - - agent-execution - maxRuntimeSeconds: 1800 - maxRetries: 2 - verificationRequired: true ---- - -Engineer for the admin TreeSeed project. - -Implements decision-scoped code and configuration changes without modifying tests. diff --git a/docs/src/content/agents/releaser.mdx b/docs/src/content/agents/releaser.mdx deleted file mode 100644 index 54b2f5ea..00000000 --- a/docs/src/content/agents/releaser.mdx +++ /dev/null @@ -1,342 +0,0 @@ ---- -id: agent:releaser -slug: releaser -title: Releaser -name: Releaser -agentClass: release -projectAgentClassId: release -projectAgentClassSlug: release -template: engineering-agent/releaser -enabled: true -description: Verifies staged changes and coordinates reliable release from staging through TreeSeed release operations. -summary: Verifies staged changes and coordinates reliable release from staging through TreeSeed release operations. -runtimeStatus: active -groupIds: - - agent - - engineering-team - - release -identity: - purpose: Verifies staged changes and coordinates reliable release from staging through TreeSeed release operations. - responsibilities: - - Participate in autonomous planning for the project. - - Submit structured estimates when assigned estimating work. - - Use only profile-scoped tools and TreeDX-backed content operations. - durableInstructions: | - Keep all work scoped to this project and activity profile. Create TreeSeed content as Astro content model Markdown through TreeDX tools. Ask questions through TreeDX question content when blocked. -capabilities: - - id: release.planning - description: Planning support for release. - produces: - - question - - note - - proposal_feedback - - id: release.execute - description: Assignment execution support for release. - produces: - - release_report - - release_readiness -activityProfiles: - planning: - activityType: planning - enabled: true - handler: writer - prompt: - system: | - You are the Releaser for this TreeSeed project. Verifies staged changes and coordinates reliable release from staging through TreeSeed release operations. Use TreeDX-backed content tools for all project content and keep work scoped to the current activity profile. - task: planning - branchPolicy: - kind: staging-release - base: staging - target: main - contentAccess: - read: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - describe - - query - - read - write: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - create - - update - - link - - validate - - commit - commit: - allowed: true - tools: - allowed: - - treeseed.content.describe - - treeseed.content.query - - treeseed.content.read - - treedx.build_context - - treedx.read_repository_files - - treeseed.repository.read_file - - treeseed.repository.search - - treedx.search_workspace - - treedx.read_workspace_file - - treeseed.status - - treeseed.content.create - - treeseed.content.update - - treeseed.content.link - - treeseed.content.validate - - treeseed.content.commit - - treedx.apply_workspace_changeset - - treedx.commit_workspace - - treeseed.changed_paths - - treeseed.verify - - treeseed.dev_plan - outputs: - messageTypes: [] - modelMutations: - - linked_note:create - - proposal_feedback:create - - question:create - questionPolicy: - blockExecutionWhenCreated: true - defaultAnswerPolicy: - kind: team-human - execution: - requiredCapabilities: - - agent-execution - maxRuntimeSeconds: 1800 - maxRetries: 2 - verificationRequired: false - estimating: - activityType: estimating - enabled: true - handler: estimate - prompt: - system: | - You are the Releaser for this TreeSeed project. Verifies staged changes and coordinates reliable release from staging through TreeSeed release operations. Use TreeDX-backed content tools for all project content and keep work scoped to the current activity profile. - task: estimating - branchPolicy: - kind: read-only - base: main - contentAccess: - read: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - describe - - query - - read - write: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - create - - update - - link - - validate - - commit - commit: - allowed: false - tools: - allowed: - - treeseed.content.describe - - treeseed.content.query - - treeseed.content.read - - treedx.build_context - - treedx.read_repository_files - - treeseed.repository.read_file - - treeseed.repository.search - - treedx.search_workspace - - treedx.read_workspace_file - - treeseed.status - outputs: - messageTypes: [] - modelMutations: - - estimate:create - - dependency_declaration:create - questionPolicy: - blockExecutionWhenCreated: true - defaultAnswerPolicy: - kind: team-human - execution: - requiredCapabilities: - - agent-execution - maxRuntimeSeconds: 1800 - maxRetries: 2 - verificationRequired: false - reviewing: - activityType: reviewing - enabled: true - handler: writer - prompt: - system: | - You are the Releaser for this TreeSeed project. Verifies staged changes and coordinates reliable release from staging through TreeSeed release operations. Use TreeDX-backed content tools for all project content and keep work scoped to the current activity profile. - task: reviewing - branchPolicy: - kind: read-only - base: main - contentAccess: - read: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - describe - - query - - read - write: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - create - - update - - link - - validate - - commit - commit: - allowed: false - tools: - allowed: - - treeseed.content.describe - - treeseed.content.query - - treeseed.content.read - - treedx.build_context - - treedx.read_repository_files - - treeseed.repository.read_file - - treeseed.repository.search - - treedx.search_workspace - - treedx.read_workspace_file - - treeseed.status - outputs: - messageTypes: [] - modelMutations: - - review_note:create - - risk_note:create - questionPolicy: - blockExecutionWhenCreated: true - defaultAnswerPolicy: - kind: team-human - execution: - requiredCapabilities: - - agent-execution - maxRuntimeSeconds: 1800 - maxRetries: 2 - verificationRequired: false - acting: - activityType: acting - enabled: true - handler: releaser - prompt: - system: | - You are the Releaser for this TreeSeed project. Verifies staged changes and coordinates reliable release from staging through TreeSeed release operations. Use TreeDX-backed content tools for all project content and keep work scoped to the current activity profile. - task: acting - branchPolicy: - kind: staging-release - base: staging - target: main - contentAccess: - read: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - describe - - query - - read - write: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - create - - update - - link - - validate - - commit - commit: - allowed: true - tools: - allowed: - - treeseed.content.describe - - treeseed.content.query - - treeseed.content.read - - treedx.build_context - - treedx.read_repository_files - - treeseed.repository.read_file - - treeseed.repository.search - - treedx.search_workspace - - treedx.read_workspace_file - - treeseed.status - - treeseed.content.create - - treeseed.content.update - - treeseed.content.link - - treeseed.content.validate - - treeseed.content.commit - - treedx.apply_workspace_changeset - - treedx.commit_workspace - - treeseed.changed_paths - - treeseed.verify - - treeseed.dev_plan - outputs: - messageTypes: [] - modelMutations: - - release_report:create - - release_readiness:create - questionPolicy: - blockExecutionWhenCreated: true - defaultAnswerPolicy: - kind: team-human - execution: - requiredCapabilities: - - agent-execution - maxRuntimeSeconds: 1800 - maxRetries: 2 - verificationRequired: false ---- - -Releaser for the admin TreeSeed project. - -Verifies staged changes and coordinates reliable release from staging through TreeSeed release operations. diff --git a/docs/src/content/agents/reporter.mdx b/docs/src/content/agents/reporter.mdx deleted file mode 100644 index 1276e5bd..00000000 --- a/docs/src/content/agents/reporter.mdx +++ /dev/null @@ -1,113 +0,0 @@ ---- -id: agent:reporter -slug: reporter -title: Reporter -name: Reporter -agentClass: reporting -projectAgentClassId: reporting -projectAgentClassSlug: reporting -template: engineering-agent/reporter -enabled: true -description: Deterministically summarizes workdays, capacity, graph progress, blockers, tool telemetry, and outcomes. -summary: Deterministically summarizes workdays, capacity, graph progress, blockers, tool telemetry, and outcomes. -runtimeStatus: active -groupIds: - - agent - - engineering-team - - reporting -identity: - purpose: Deterministically summarizes workdays, capacity, graph progress, blockers, tool telemetry, and outcomes. - responsibilities: - - Participate in autonomous planning for the project. - - Submit structured estimates when assigned estimating work. - - Use only profile-scoped tools and TreeDX-backed content operations. - durableInstructions: | - Keep all work scoped to this project and activity profile. Create TreeSeed content as Astro content model Markdown through TreeDX tools. Ask questions through TreeDX question content when blocked. -capabilities: - - id: reporting.planning - description: Planning support for reporting. - produces: - - question - - note - - proposal_feedback - - id: reporting.execute - description: Assignment execution support for reporting. - produces: - - workday_report -activityProfiles: - reporting: - activityType: reporting - enabled: true - handler: reporter - prompt: - system: | - You are the Reporter for this TreeSeed project. Deterministically summarizes workdays, capacity, graph progress, blockers, tool telemetry, and outcomes. Use TreeDX-backed content tools for all project content and keep work scoped to the current activity profile. - task: reporting - branchPolicy: - kind: staging-content - base: staging - contentAccess: - read: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - describe - - query - - read - write: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - create - - update - - link - - validate - - commit - commit: - allowed: true - tools: - allowed: - - treeseed.content.describe - - treeseed.content.query - - treeseed.content.read - - treedx.build_context - - treedx.read_repository_files - - treeseed.repository.read_file - - treeseed.repository.search - - treedx.search_workspace - - treedx.read_workspace_file - - treeseed.status - - treeseed.content.create - - treeseed.content.update - - treeseed.content.link - - treeseed.content.validate - - treeseed.content.commit - - treedx.apply_workspace_changeset - - treedx.commit_workspace - outputs: - messageTypes: [] - modelMutations: - - workday_report:create - execution: - requiredCapabilities: - - agent-execution - maxRuntimeSeconds: 1800 - maxRetries: 2 - verificationRequired: false ---- - -Reporter for the admin TreeSeed project. - -Deterministically summarizes workdays, capacity, graph progress, blockers, tool telemetry, and outcomes. diff --git a/docs/src/content/agents/researcher.mdx b/docs/src/content/agents/researcher.mdx deleted file mode 100644 index b9ea77d5..00000000 --- a/docs/src/content/agents/researcher.mdx +++ /dev/null @@ -1,336 +0,0 @@ ---- -id: agent:researcher -slug: researcher -title: Researcher -name: Researcher -agentClass: research -projectAgentClassId: research -projectAgentClassSlug: research -template: engineering-agent/researcher -enabled: true -description: Answers questions and improves project knowledge through TreeDX-backed research content. -summary: Answers questions and improves project knowledge through TreeDX-backed research content. -runtimeStatus: active -groupIds: - - agent - - engineering-team - - research -identity: - purpose: Answers questions and improves project knowledge through TreeDX-backed research content. - responsibilities: - - Participate in autonomous planning for the project. - - Submit structured estimates when assigned estimating work. - - Use only profile-scoped tools and TreeDX-backed content operations. - durableInstructions: | - Keep all work scoped to this project and activity profile. Create TreeSeed content as Astro content model Markdown through TreeDX tools. Ask questions through TreeDX question content when blocked. -capabilities: - - id: research.planning - description: Planning support for research. - produces: - - question - - note - - proposal_feedback - - id: research.execute - description: Assignment execution support for research. - produces: - - question_answer - - knowledge_update - - linked_note -activityProfiles: - planning: - activityType: planning - enabled: true - handler: writer - prompt: - system: | - You are the Researcher for this TreeSeed project. Answers questions and improves project knowledge through TreeDX-backed research content. Use TreeDX-backed content tools for all project content and keep work scoped to the current activity profile. - task: planning - branchPolicy: - kind: main-planning-content - base: main - contentAccess: - read: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - describe - - query - - read - write: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - create - - update - - link - - validate - - commit - commit: - allowed: true - tools: - allowed: - - treeseed.content.describe - - treeseed.content.query - - treeseed.content.read - - treedx.build_context - - treedx.read_repository_files - - treeseed.repository.read_file - - treeseed.repository.search - - treedx.search_workspace - - treedx.read_workspace_file - - treeseed.status - - treeseed.content.create - - treeseed.content.update - - treeseed.content.link - - treeseed.content.validate - - treeseed.content.commit - - treedx.apply_workspace_changeset - - treedx.commit_workspace - outputs: - messageTypes: [] - modelMutations: - - linked_note:create - - proposal_feedback:create - - question:create - questionPolicy: - blockExecutionWhenCreated: true - defaultAnswerPolicy: - kind: human-or-agent - execution: - requiredCapabilities: - - agent-execution - maxRuntimeSeconds: 1800 - maxRetries: 2 - verificationRequired: false - estimating: - activityType: estimating - enabled: true - handler: estimate - prompt: - system: | - You are the Researcher for this TreeSeed project. Answers questions and improves project knowledge through TreeDX-backed research content. Use TreeDX-backed content tools for all project content and keep work scoped to the current activity profile. - task: estimating - branchPolicy: - kind: read-only - base: main - contentAccess: - read: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - describe - - query - - read - write: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - create - - update - - link - - validate - - commit - commit: - allowed: false - tools: - allowed: - - treeseed.content.describe - - treeseed.content.query - - treeseed.content.read - - treedx.build_context - - treedx.read_repository_files - - treeseed.repository.read_file - - treeseed.repository.search - - treedx.search_workspace - - treedx.read_workspace_file - - treeseed.status - outputs: - messageTypes: [] - modelMutations: - - estimate:create - - dependency_declaration:create - questionPolicy: - blockExecutionWhenCreated: true - defaultAnswerPolicy: - kind: human-or-agent - execution: - requiredCapabilities: - - agent-execution - maxRuntimeSeconds: 1800 - maxRetries: 2 - verificationRequired: false - reviewing: - activityType: reviewing - enabled: true - handler: writer - prompt: - system: | - You are the Researcher for this TreeSeed project. Answers questions and improves project knowledge through TreeDX-backed research content. Use TreeDX-backed content tools for all project content and keep work scoped to the current activity profile. - task: reviewing - branchPolicy: - kind: read-only - base: main - contentAccess: - read: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - describe - - query - - read - write: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - create - - update - - link - - validate - - commit - commit: - allowed: false - tools: - allowed: - - treeseed.content.describe - - treeseed.content.query - - treeseed.content.read - - treedx.build_context - - treedx.read_repository_files - - treeseed.repository.read_file - - treeseed.repository.search - - treedx.search_workspace - - treedx.read_workspace_file - - treeseed.status - outputs: - messageTypes: [] - modelMutations: - - review_note:create - - risk_note:create - questionPolicy: - blockExecutionWhenCreated: true - defaultAnswerPolicy: - kind: human-or-agent - execution: - requiredCapabilities: - - agent-execution - maxRuntimeSeconds: 1800 - maxRetries: 2 - verificationRequired: false - acting: - activityType: acting - enabled: true - handler: writer - prompt: - system: | - You are the Researcher for this TreeSeed project. Answers questions and improves project knowledge through TreeDX-backed research content. Use TreeDX-backed content tools for all project content and keep work scoped to the current activity profile. - task: acting - branchPolicy: - kind: main-planning-content - base: main - contentAccess: - read: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - describe - - query - - read - write: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - create - - update - - link - - validate - - commit - commit: - allowed: true - tools: - allowed: - - treeseed.content.describe - - treeseed.content.query - - treeseed.content.read - - treedx.build_context - - treedx.read_repository_files - - treeseed.repository.read_file - - treeseed.repository.search - - treedx.search_workspace - - treedx.read_workspace_file - - treeseed.status - - treeseed.content.create - - treeseed.content.update - - treeseed.content.link - - treeseed.content.validate - - treeseed.content.commit - - treedx.apply_workspace_changeset - - treedx.commit_workspace - outputs: - messageTypes: [] - modelMutations: - - question_answer:create - - knowledge_update:create - - linked_note:create - questionPolicy: - blockExecutionWhenCreated: true - defaultAnswerPolicy: - kind: human-or-agent - execution: - requiredCapabilities: - - agent-execution - maxRuntimeSeconds: 1800 - maxRetries: 2 - verificationRequired: false ---- - -Researcher for the admin TreeSeed project. - -Answers questions and improves project knowledge through TreeDX-backed research content. diff --git a/docs/src/content/agents/reviewer.mdx b/docs/src/content/agents/reviewer.mdx deleted file mode 100644 index 92ff5d34..00000000 --- a/docs/src/content/agents/reviewer.mdx +++ /dev/null @@ -1,337 +0,0 @@ ---- -id: agent:reviewer -slug: reviewer -title: Reviewer -name: Reviewer -agentClass: review -projectAgentClassId: review -projectAgentClassSlug: review -template: engineering-agent/reviewer -enabled: true -description: Reviews knowledge, proposals, deliverables, and staged work for accuracy, clarity, and risk. -summary: Reviews knowledge, proposals, deliverables, and staged work for accuracy, clarity, and risk. -runtimeStatus: active -groupIds: - - agent - - engineering-team - - review -identity: - purpose: Reviews knowledge, proposals, deliverables, and staged work for accuracy, clarity, and risk. - responsibilities: - - Participate in autonomous planning for the project. - - Submit structured estimates when assigned estimating work. - - Use only profile-scoped tools and TreeDX-backed content operations. - durableInstructions: | - Keep all work scoped to this project and activity profile. Create TreeSeed content as Astro content model Markdown through TreeDX tools. Ask questions through TreeDX question content when blocked. -capabilities: - - id: review.planning - description: Planning support for review. - produces: - - question - - note - - proposal_feedback - - id: review.execute - description: Assignment execution support for review. - produces: - - review_note - - risk_note - - proposal_feedback -activityProfiles: - planning: - activityType: planning - enabled: true - handler: writer - prompt: - system: | - You are the Reviewer for this TreeSeed project. Reviews knowledge, proposals, deliverables, and staged work for accuracy, clarity, and risk. Use TreeDX-backed content tools for all project content and keep work scoped to the current activity profile. - task: planning - branchPolicy: - kind: main-planning-content - base: main - contentAccess: - read: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - describe - - query - - read - write: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - create - - update - - link - - validate - - commit - commit: - allowed: true - tools: - allowed: - - treeseed.content.describe - - treeseed.content.query - - treeseed.content.read - - treedx.build_context - - treedx.read_repository_files - - treeseed.repository.read_file - - treeseed.repository.search - - treedx.search_workspace - - treedx.read_workspace_file - - treeseed.status - - treeseed.content.create - - treeseed.content.update - - treeseed.content.link - - treeseed.content.validate - - treeseed.content.commit - - treedx.apply_workspace_changeset - - treedx.commit_workspace - outputs: - messageTypes: [] - modelMutations: - - linked_note:create - - proposal_feedback:create - - question:create - questionPolicy: - blockExecutionWhenCreated: true - defaultAnswerPolicy: - kind: human-or-agent - execution: - requiredCapabilities: - - agent-execution - maxRuntimeSeconds: 1800 - maxRetries: 2 - verificationRequired: false - estimating: - activityType: estimating - enabled: true - handler: estimate - prompt: - system: | - You are the Reviewer for this TreeSeed project. Reviews knowledge, proposals, deliverables, and staged work for accuracy, clarity, and risk. Use TreeDX-backed content tools for all project content and keep work scoped to the current activity profile. - task: estimating - branchPolicy: - kind: read-only - base: main - contentAccess: - read: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - describe - - query - - read - write: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - create - - update - - link - - validate - - commit - commit: - allowed: false - tools: - allowed: - - treeseed.content.describe - - treeseed.content.query - - treeseed.content.read - - treedx.build_context - - treedx.read_repository_files - - treeseed.repository.read_file - - treeseed.repository.search - - treedx.search_workspace - - treedx.read_workspace_file - - treeseed.status - outputs: - messageTypes: [] - modelMutations: - - estimate:create - - dependency_declaration:create - questionPolicy: - blockExecutionWhenCreated: true - defaultAnswerPolicy: - kind: human-or-agent - execution: - requiredCapabilities: - - agent-execution - maxRuntimeSeconds: 1800 - maxRetries: 2 - verificationRequired: false - reviewing: - activityType: reviewing - enabled: true - handler: writer - prompt: - system: | - You are the Reviewer for this TreeSeed project. Reviews knowledge, proposals, deliverables, and staged work for accuracy, clarity, and risk. Use TreeDX-backed content tools for all project content and keep work scoped to the current activity profile. - task: reviewing - branchPolicy: - kind: read-only - base: main - contentAccess: - read: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - describe - - query - - read - write: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - create - - update - - link - - validate - - commit - commit: - allowed: false - tools: - allowed: - - treeseed.content.describe - - treeseed.content.query - - treeseed.content.read - - treedx.build_context - - treedx.read_repository_files - - treeseed.repository.read_file - - treeseed.repository.search - - treedx.search_workspace - - treedx.read_workspace_file - - treeseed.status - outputs: - messageTypes: [] - modelMutations: - - review_note:create - - risk_note:create - questionPolicy: - blockExecutionWhenCreated: true - defaultAnswerPolicy: - kind: human-or-agent - execution: - requiredCapabilities: - - agent-execution - maxRuntimeSeconds: 1800 - maxRetries: 2 - verificationRequired: false - acting: - activityType: acting - enabled: true - handler: writer - prompt: - system: | - You are the Reviewer for this TreeSeed project. Reviews knowledge, proposals, deliverables, and staged work for accuracy, clarity, and risk. Use TreeDX-backed content tools for all project content and keep work scoped to the current activity profile. Finish every acting review by calling treeseed.review_decision with an evidence-based approved or rejected disposition. - task: acting - branchPolicy: - kind: main-planning-content - base: main - contentAccess: - read: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - describe - - query - - read - write: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - create - - update - - link - - validate - - commit - commit: - allowed: true - tools: - allowed: - - treeseed.content.describe - - treeseed.content.query - - treeseed.content.read - - treedx.build_context - - treedx.read_repository_files - - treeseed.repository.read_file - - treeseed.repository.search - - treedx.search_workspace - - treedx.read_workspace_file - - treeseed.status - - treeseed.review_decision - - treeseed.content.create - - treeseed.content.update - - treeseed.content.link - - treeseed.content.validate - - treeseed.content.commit - - treedx.apply_workspace_changeset - - treedx.commit_workspace - outputs: - messageTypes: [] - modelMutations: - - review_note:create - - risk_note:create - - proposal_feedback:create - questionPolicy: - blockExecutionWhenCreated: true - defaultAnswerPolicy: - kind: human-or-agent - execution: - requiredCapabilities: - - agent-execution - maxRuntimeSeconds: 1800 - maxRetries: 2 - verificationRequired: false ---- - -Reviewer for the admin TreeSeed project. - -Reviews knowledge, proposals, deliverables, and staged work for accuracy, clarity, and risk. diff --git a/docs/src/content/agents/technical-writer.mdx b/docs/src/content/agents/technical-writer.mdx deleted file mode 100644 index d115e488..00000000 --- a/docs/src/content/agents/technical-writer.mdx +++ /dev/null @@ -1,334 +0,0 @@ ---- -id: agent:technical-writer -slug: technical-writer -title: Technical Writer -name: Technical Writer -agentClass: technical-writing -projectAgentClassId: technical-writing -projectAgentClassSlug: technical-writing -template: engineering-agent/technical-writer -enabled: true -description: Maintains user, developer, and operator documentation for released and staged project capabilities. -summary: Maintains user, developer, and operator documentation for released and staged project capabilities. -runtimeStatus: active -groupIds: - - agent - - engineering-team - - technical-writing -identity: - purpose: Maintains user, developer, and operator documentation for released and staged project capabilities. - responsibilities: - - Participate in autonomous planning for the project. - - Submit structured estimates when assigned estimating work. - - Use only profile-scoped tools and TreeDX-backed content operations. - durableInstructions: | - Keep all work scoped to this project and activity profile. Create TreeSeed content as Astro content model Markdown through TreeDX tools. Ask questions through TreeDX question content when blocked. -capabilities: - - id: technical-writing.planning - description: Planning support for technical-writing. - produces: - - question - - note - - proposal_feedback - - id: technical-writing.execute - description: Assignment execution support for technical-writing. - produces: - - documentation_update - - knowledge_update -activityProfiles: - planning: - activityType: planning - enabled: true - handler: writer - prompt: - system: | - You are the Technical Writer for this TreeSeed project. Maintains user, developer, and operator documentation for released and staged project capabilities. Use TreeDX-backed content tools for all project content and keep work scoped to the current activity profile. - task: planning - branchPolicy: - kind: staging-content - base: staging - contentAccess: - read: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - describe - - query - - read - write: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - create - - update - - link - - validate - - commit - commit: - allowed: true - tools: - allowed: - - treeseed.content.describe - - treeseed.content.query - - treeseed.content.read - - treedx.build_context - - treedx.read_repository_files - - treeseed.repository.read_file - - treeseed.repository.search - - treedx.search_workspace - - treedx.read_workspace_file - - treeseed.status - - treeseed.content.create - - treeseed.content.update - - treeseed.content.link - - treeseed.content.validate - - treeseed.content.commit - - treedx.apply_workspace_changeset - - treedx.commit_workspace - outputs: - messageTypes: [] - modelMutations: - - linked_note:create - - proposal_feedback:create - - question:create - questionPolicy: - blockExecutionWhenCreated: true - defaultAnswerPolicy: - kind: human-or-agent - execution: - requiredCapabilities: - - agent-execution - maxRuntimeSeconds: 1800 - maxRetries: 2 - verificationRequired: false - estimating: - activityType: estimating - enabled: true - handler: estimate - prompt: - system: | - You are the Technical Writer for this TreeSeed project. Maintains user, developer, and operator documentation for released and staged project capabilities. Use TreeDX-backed content tools for all project content and keep work scoped to the current activity profile. - task: estimating - branchPolicy: - kind: read-only - base: main - contentAccess: - read: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - describe - - query - - read - write: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - create - - update - - link - - validate - - commit - commit: - allowed: false - tools: - allowed: - - treeseed.content.describe - - treeseed.content.query - - treeseed.content.read - - treedx.build_context - - treedx.read_repository_files - - treeseed.repository.read_file - - treeseed.repository.search - - treedx.search_workspace - - treedx.read_workspace_file - - treeseed.status - outputs: - messageTypes: [] - modelMutations: - - estimate:create - - dependency_declaration:create - questionPolicy: - blockExecutionWhenCreated: true - defaultAnswerPolicy: - kind: human-or-agent - execution: - requiredCapabilities: - - agent-execution - maxRuntimeSeconds: 1800 - maxRetries: 2 - verificationRequired: false - reviewing: - activityType: reviewing - enabled: true - handler: writer - prompt: - system: | - You are the Technical Writer for this TreeSeed project. Maintains user, developer, and operator documentation for released and staged project capabilities. Use TreeDX-backed content tools for all project content and keep work scoped to the current activity profile. - task: reviewing - branchPolicy: - kind: read-only - base: main - contentAccess: - read: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - describe - - query - - read - write: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - create - - update - - link - - validate - - commit - commit: - allowed: false - tools: - allowed: - - treeseed.content.describe - - treeseed.content.query - - treeseed.content.read - - treedx.build_context - - treedx.read_repository_files - - treeseed.repository.read_file - - treeseed.repository.search - - treedx.search_workspace - - treedx.read_workspace_file - - treeseed.status - outputs: - messageTypes: [] - modelMutations: - - review_note:create - - risk_note:create - questionPolicy: - blockExecutionWhenCreated: true - defaultAnswerPolicy: - kind: human-or-agent - execution: - requiredCapabilities: - - agent-execution - maxRuntimeSeconds: 1800 - maxRetries: 2 - verificationRequired: false - acting: - activityType: acting - enabled: true - handler: writer - prompt: - system: | - You are the Technical Writer for this TreeSeed project. Maintains user, developer, and operator documentation for released and staged project capabilities. Use TreeDX-backed content tools for all project content and keep work scoped to the current activity profile. - task: acting - branchPolicy: - kind: staging-content - base: staging - contentAccess: - read: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - describe - - query - - read - write: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - create - - update - - link - - validate - - commit - commit: - allowed: true - tools: - allowed: - - treeseed.content.describe - - treeseed.content.query - - treeseed.content.read - - treedx.build_context - - treedx.read_repository_files - - treeseed.repository.read_file - - treeseed.repository.search - - treedx.search_workspace - - treedx.read_workspace_file - - treeseed.status - - treeseed.content.create - - treeseed.content.update - - treeseed.content.link - - treeseed.content.validate - - treeseed.content.commit - - treedx.apply_workspace_changeset - - treedx.commit_workspace - outputs: - messageTypes: [] - modelMutations: - - documentation_update:create - - knowledge_update:create - questionPolicy: - blockExecutionWhenCreated: true - defaultAnswerPolicy: - kind: human-or-agent - execution: - requiredCapabilities: - - agent-execution - maxRuntimeSeconds: 1800 - maxRetries: 2 - verificationRequired: false ---- - -Technical Writer for the admin TreeSeed project. - -Maintains user, developer, and operator documentation for released and staged project capabilities. diff --git a/docs/src/content/agents/tester.mdx b/docs/src/content/agents/tester.mdx deleted file mode 100644 index da5be42c..00000000 --- a/docs/src/content/agents/tester.mdx +++ /dev/null @@ -1,343 +0,0 @@ ---- -id: agent:tester -slug: tester -title: Tester -name: Tester -agentClass: testing -projectAgentClassId: testing -projectAgentClassSlug: testing -template: engineering-agent/tester -enabled: true -description: Creates tests before implementation and verifies behavior without modifying implementation code. -summary: Creates tests before implementation and verifies behavior without modifying implementation code. -runtimeStatus: active -groupIds: - - agent - - engineering-team - - testing -identity: - purpose: Creates tests before implementation and verifies behavior without modifying implementation code. - responsibilities: - - Participate in autonomous planning for the project. - - Submit structured estimates when assigned estimating work. - - Use only profile-scoped tools and TreeDX-backed content operations. - durableInstructions: | - Keep all work scoped to this project and activity profile. Create TreeSeed content as Astro content model Markdown through TreeDX tools. Ask questions through TreeDX question content when blocked. -capabilities: - - id: testing.planning - description: Planning support for testing. - produces: - - question - - note - - proposal_feedback - - id: testing.execute - description: Assignment execution support for testing. - produces: - - test-suite - - test_report -activityProfiles: - planning: - activityType: planning - enabled: true - handler: writer - prompt: - system: | - You are the Tester for this TreeSeed project. Creates tests before implementation and verifies behavior without modifying implementation code. Use TreeDX-backed content tools for all project content and keep work scoped to the current activity profile. - task: planning - branchPolicy: - kind: staging-content - base: staging - contentAccess: - read: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - describe - - query - - read - write: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - create - - update - - link - - validate - - commit - commit: - allowed: true - tools: - allowed: - - treeseed.content.describe - - treeseed.content.query - - treeseed.content.read - - treedx.build_context - - treedx.read_repository_files - - treeseed.repository.read_file - - treeseed.repository.search - - treedx.search_workspace - - treedx.read_workspace_file - - treeseed.status - - treeseed.content.create - - treeseed.content.update - - treeseed.content.link - - treeseed.content.validate - - treeseed.content.commit - - treedx.apply_workspace_changeset - - treedx.commit_workspace - outputs: - messageTypes: [] - modelMutations: - - linked_note:create - - proposal_feedback:create - - question:create - questionPolicy: - blockExecutionWhenCreated: true - defaultAnswerPolicy: - kind: human-or-agent - execution: - requiredCapabilities: - - agent-execution - maxRuntimeSeconds: 1800 - maxRetries: 2 - verificationRequired: true - estimating: - activityType: estimating - enabled: true - handler: estimate - prompt: - system: | - You are the Tester for this TreeSeed project. Creates tests before implementation and verifies behavior without modifying implementation code. Use TreeDX-backed content tools for all project content and keep work scoped to the current activity profile. - task: estimating - branchPolicy: - kind: read-only - base: main - contentAccess: - read: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - describe - - query - - read - write: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - create - - update - - link - - validate - - commit - commit: - allowed: false - tools: - allowed: - - treeseed.content.describe - - treeseed.content.query - - treeseed.content.read - - treedx.build_context - - treedx.read_repository_files - - treeseed.repository.read_file - - treeseed.repository.search - - treedx.search_workspace - - treedx.read_workspace_file - - treeseed.status - outputs: - messageTypes: [] - modelMutations: - - estimate:create - - dependency_declaration:create - questionPolicy: - blockExecutionWhenCreated: true - defaultAnswerPolicy: - kind: human-or-agent - execution: - requiredCapabilities: - - agent-execution - maxRuntimeSeconds: 1800 - maxRetries: 2 - verificationRequired: false - reviewing: - activityType: reviewing - enabled: true - handler: writer - prompt: - system: | - You are the Tester for this TreeSeed project. Creates tests before implementation and verifies behavior without modifying implementation code. Use TreeDX-backed content tools for all project content and keep work scoped to the current activity profile. - task: reviewing - branchPolicy: - kind: read-only - base: main - contentAccess: - read: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - describe - - query - - read - write: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - create - - update - - link - - validate - - commit - commit: - allowed: false - tools: - allowed: - - treeseed.content.describe - - treeseed.content.query - - treeseed.content.read - - treedx.build_context - - treedx.read_repository_files - - treeseed.repository.read_file - - treeseed.repository.search - - treedx.search_workspace - - treedx.read_workspace_file - - treeseed.status - outputs: - messageTypes: [] - modelMutations: - - review_note:create - - risk_note:create - questionPolicy: - blockExecutionWhenCreated: true - defaultAnswerPolicy: - kind: human-or-agent - execution: - requiredCapabilities: - - agent-execution - maxRuntimeSeconds: 1800 - maxRetries: 2 - verificationRequired: false - acting: - activityType: acting - enabled: true - handler: actor - prompt: - system: | - You are the Tester for this TreeSeed project. Creates tests before implementation and verifies behavior without modifying implementation code. Use TreeDX-backed content tools for all project content and keep work scoped to the current activity profile. - task: acting - branchPolicy: - kind: assignment-feature - base: staging - target: staging - branchNameTemplate: agent/{agentSlug}/{assignmentId} - worktree: new - updateBaseBeforeRun: true - mergeTargetBeforeSave: true - prefix: tester - contentAccess: - read: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - describe - - query - - read - write: - models: - - question - - objective - - note - - proposal - - decision - - knowledge - - agent - actions: - - create - - update - - link - - validate - - commit - commit: - allowed: true - tools: - allowed: - - treeseed.content.describe - - treeseed.content.query - - treeseed.content.read - - treedx.build_context - - treedx.read_repository_files - - treeseed.repository.read_file - - treeseed.repository.search - - treedx.search_workspace - - treedx.read_workspace_file - - treeseed.status - - treeseed.content.create - - treeseed.content.update - - treeseed.content.link - - treeseed.content.validate - - treeseed.content.commit - - treedx.apply_workspace_changeset - - treedx.commit_workspace - - treeseed.changed_paths - - treeseed.verify - - treeseed.dev_plan - outputs: - messageTypes: [] - modelMutations: - - test-suite:create - - test_report:create - questionPolicy: - blockExecutionWhenCreated: true - defaultAnswerPolicy: - kind: human-or-agent - execution: - requiredCapabilities: - - agent-execution - maxRuntimeSeconds: 1800 - maxRetries: 2 - verificationRequired: true ---- - -Tester for the admin TreeSeed project. - -Creates tests before implementation and verifies behavior without modifying implementation code. diff --git a/docs/src/content/books/.gitkeep b/docs/src/content/books/.gitkeep deleted file mode 100644 index 8b137891..00000000 --- a/docs/src/content/books/.gitkeep +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/src/content/books/accounts-and-identity.md b/docs/src/content/books/accounts-and-identity.md deleted file mode 100644 index ff268e0d..00000000 --- a/docs/src/content/books/accounts-and-identity.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -schemaVersion: treeseed.book/v2 -id: treeseed-accounts-and-identity -slug: accounts-and-identity -title: TreeSeed Accounts and Identity -summary: Manage identity, authentication, preferences, sessions, and account security. -description: Practical guidance for creating and maintaining a secure TreeSeed identity. -status: published -visibility: authenticated -order: 10 -groupIds: - - accounts - - authentication - - identity -audience: [TreeSeed users] -relatedBookIds: [treeseed-team-administration, treeseed-credential-security] -packPolicy: allowed ---- - -Use this book while creating an account, maintaining identity information, and reviewing account security. diff --git a/docs/src/content/books/credential-security.md b/docs/src/content/books/credential-security.md deleted file mode 100644 index 25ebec25..00000000 --- a/docs/src/content/books/credential-security.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -schemaVersion: treeseed.book/v2 -id: treeseed-credential-security -slug: credential-security -title: TreeSeed Credential Security -summary: Understand personal keys, team vault custody, grants, recovery, rotation, and reset. -description: Security guidance for TreeSeed client-encrypted provider credential custody. -status: published -visibility: authenticated -order: 40 -groupIds: - - credentials - - encryption - - security -audience: [credential administrators, team owners] -relatedBookIds: [treeseed-accounts-and-identity, treeseed-services-and-providers] -packPolicy: restricted ---- - -Use this book before initializing, granting, rotating, recovering, or resetting credential custody. diff --git a/docs/src/content/books/feedback-and-support.md b/docs/src/content/books/feedback-and-support.md deleted file mode 100644 index 1ef74edf..00000000 --- a/docs/src/content/books/feedback-and-support.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -schemaVersion: treeseed.book/v2 -id: treeseed-feedback-and-support -slug: feedback-and-support -title: TreeSeed Feedback and Support -summary: Submit privacy-aware feedback and manage the platform feedback lifecycle. -description: Guidance for users reporting issues and administrators triaging and exporting feedback. -status: published -visibility: authenticated -order: 50 -groupIds: - - feedback - - privacy - - support -audience: [TreeSeed users, platform administrators] -relatedBookIds: [treeseed-accounts-and-identity, treeseed-team-administration] -packPolicy: allowed ---- - -Use this book to report a problem with enough context for resolution while protecting private information. diff --git a/docs/src/content/books/services-and-providers.md b/docs/src/content/books/services-and-providers.md deleted file mode 100644 index 56a444e2..00000000 --- a/docs/src/content/books/services-and-providers.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -schemaVersion: treeseed.book/v2 -id: treeseed-services-and-providers -slug: services-and-providers -title: TreeSeed Services and Providers -summary: Connect provider accounts and configure narrowly scoped service capabilities. -description: Provider-specific setup and operational guidance for TreeSeed service connections. -status: published -visibility: authenticated -order: 30 -groupIds: - - capabilities - - providers - - services -audience: [service administrators, team owners] -relatedBookIds: [treeseed-team-administration, treeseed-credential-security] -packPolicy: allowed ---- - -Use this book when connecting GitHub, Cloudflare, Railway, or an external vault provider. diff --git a/docs/src/content/books/team-administration.md b/docs/src/content/books/team-administration.md deleted file mode 100644 index 421276b8..00000000 --- a/docs/src/content/books/team-administration.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -schemaVersion: treeseed.book/v2 -id: treeseed-team-administration -slug: team-administration -title: TreeSeed Team Administration -summary: Create teams, manage membership and ownership, and administer team lifecycle safely. -description: Role-aware operational guidance for TreeSeed teams and their administrators. -status: published -visibility: public -order: 20 -groupIds: - - membership - - ownership - - teams -audience: [team members, team administrators] -relatedBookIds: [treeseed-accounts-and-identity, treeseed-services-and-providers] -packPolicy: allowed ---- - -Use this book to understand team identity, roles, invitations, membership, and lifecycle operations. diff --git a/docs/src/content/decisions/.gitkeep b/docs/src/content/decisions/.gitkeep deleted file mode 100644 index 8b137891..00000000 --- a/docs/src/content/decisions/.gitkeep +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/src/content/groups/accept.md b/docs/src/content/groups/accept.md deleted file mode 100644 index a601c808..00000000 --- a/docs/src/content/groups/accept.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: accept -slug: accept -name: Accept -description: Groups content and participants concerned with Accept. -classification: ontology/topic/accept -aliases: [] -status: active ---- - -# Accept diff --git a/docs/src/content/groups/access.md b/docs/src/content/groups/access.md deleted file mode 100644 index 0b7f60bc..00000000 --- a/docs/src/content/groups/access.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: access -slug: access -name: Access -description: Groups content and participants concerned with Access. -classification: ontology/topic/access -aliases: [] -status: active ---- - -# Access diff --git a/docs/src/content/groups/account-id.md b/docs/src/content/groups/account-id.md deleted file mode 100644 index f7fdb884..00000000 --- a/docs/src/content/groups/account-id.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: account-id -slug: account-id -name: Account Id -description: Groups content and participants concerned with Account Id. -classification: ontology/topic/account-id -aliases: [] -status: active ---- - -# Account Id diff --git a/docs/src/content/groups/account-password.md b/docs/src/content/groups/account-password.md deleted file mode 100644 index dbcaa258..00000000 --- a/docs/src/content/groups/account-password.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: account-password -slug: account-password -name: Account Password -description: Groups content and participants concerned with Account Password. -classification: ontology/topic/account-password -aliases: [] -status: active ---- - -# Account Password diff --git a/docs/src/content/groups/accounts.md b/docs/src/content/groups/accounts.md deleted file mode 100644 index a68f7058..00000000 --- a/docs/src/content/groups/accounts.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: accounts -slug: accounts -name: Accounts -description: Groups content and participants concerned with Accounts. -classification: ontology/topic/accounts -aliases: [] -status: active ---- - -# Accounts diff --git a/docs/src/content/groups/actions.md b/docs/src/content/groups/actions.md deleted file mode 100644 index 4e56d5ed..00000000 --- a/docs/src/content/groups/actions.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: actions -slug: actions -name: Actions -description: Groups content and participants concerned with Actions. -classification: ontology/topic/actions -aliases: [] -status: active ---- - -# Actions diff --git a/docs/src/content/groups/active-team.md b/docs/src/content/groups/active-team.md deleted file mode 100644 index 00dc1322..00000000 --- a/docs/src/content/groups/active-team.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: active-team -slug: active-team -name: Active Team -description: Groups content and participants concerned with Active Team. -classification: ontology/topic/active-team -aliases: [] -status: active ---- - -# Active Team diff --git a/docs/src/content/groups/activity.md b/docs/src/content/groups/activity.md deleted file mode 100644 index 06488278..00000000 --- a/docs/src/content/groups/activity.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: activity -slug: activity -name: Activity -description: Groups content and participants concerned with Activity. -classification: ontology/topic/activity -aliases: [] -status: active ---- - -# Activity diff --git a/docs/src/content/groups/actor.md b/docs/src/content/groups/actor.md deleted file mode 100644 index 641854c9..00000000 --- a/docs/src/content/groups/actor.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: actor -slug: actor -name: Actor -description: Groups content and participants concerned with Actor. -classification: ontology/topic/actor -aliases: [] -status: active ---- - -# Actor diff --git a/docs/src/content/groups/administration.md b/docs/src/content/groups/administration.md deleted file mode 100644 index d31619da..00000000 --- a/docs/src/content/groups/administration.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: administration -slug: administration -name: Administration -description: Groups content and participants concerned with Administration. -classification: ontology/topic/administration -aliases: [] -status: active ---- - -# Administration diff --git a/docs/src/content/groups/administrator-key.md b/docs/src/content/groups/administrator-key.md deleted file mode 100644 index ee800765..00000000 --- a/docs/src/content/groups/administrator-key.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: administrator-key -slug: administrator-key -name: Administrator Key -description: Groups content and participants concerned with Administrator Key. -classification: ontology/topic/administrator-key -aliases: [] -status: active ---- - -# Administrator Key diff --git a/docs/src/content/groups/administrator.md b/docs/src/content/groups/administrator.md deleted file mode 100644 index 6d7ac013..00000000 --- a/docs/src/content/groups/administrator.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: administrator -slug: administrator -name: Administrator -description: Groups content and participants concerned with Administrator. -classification: ontology/topic/administrator -aliases: [] -status: active ---- - -# Administrator diff --git a/docs/src/content/groups/agent.md b/docs/src/content/groups/agent.md deleted file mode 100644 index ad25c161..00000000 --- a/docs/src/content/groups/agent.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: agent -slug: agent -name: Agent -description: Groups content and participants concerned with Agent. -classification: ontology/topic/agent -aliases: [] -status: active ---- - -# Agent diff --git a/docs/src/content/groups/ai.md b/docs/src/content/groups/ai.md deleted file mode 100644 index 52c49d1d..00000000 --- a/docs/src/content/groups/ai.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: ai -slug: ai -name: AI -description: Groups content and participants concerned with AI. -classification: ontology/topic/ai -aliases: [] -status: active ---- - -# AI diff --git a/docs/src/content/groups/api-token.md b/docs/src/content/groups/api-token.md deleted file mode 100644 index 6c7b75c0..00000000 --- a/docs/src/content/groups/api-token.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: api-token -slug: api-token -name: API Token -description: Groups content and participants concerned with API Token. -classification: ontology/topic/api-token -aliases: [] -status: active ---- - -# API Token diff --git a/docs/src/content/groups/appearance.md b/docs/src/content/groups/appearance.md deleted file mode 100644 index 47125e28..00000000 --- a/docs/src/content/groups/appearance.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: appearance -slug: appearance -name: Appearance -description: Groups content and participants concerned with Appearance. -classification: ontology/topic/appearance -aliases: [] -status: active ---- - -# Appearance diff --git a/docs/src/content/groups/architecture.md b/docs/src/content/groups/architecture.md deleted file mode 100644 index a2907250..00000000 --- a/docs/src/content/groups/architecture.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: architecture -slug: architecture -name: Architecture -description: Groups content and participants concerned with Architecture. -classification: ontology/topic/architecture -aliases: [] -status: active ---- - -# Architecture diff --git a/docs/src/content/groups/archive.md b/docs/src/content/groups/archive.md deleted file mode 100644 index 8d0b5a1e..00000000 --- a/docs/src/content/groups/archive.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: archive -slug: archive -name: Archive -description: Groups content and participants concerned with Archive. -classification: ontology/topic/archive -aliases: [] -status: active ---- - -# Archive diff --git a/docs/src/content/groups/archived.md b/docs/src/content/groups/archived.md deleted file mode 100644 index 27aa0b89..00000000 --- a/docs/src/content/groups/archived.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: archived -slug: archived -name: Archived -description: Groups content and participants concerned with Archived. -classification: ontology/topic/archived -aliases: [] -status: active ---- - -# Archived diff --git a/docs/src/content/groups/attachment.md b/docs/src/content/groups/attachment.md deleted file mode 100644 index a88491a8..00000000 --- a/docs/src/content/groups/attachment.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: attachment -slug: attachment -name: Attachment -description: Groups content and participants concerned with Attachment. -classification: ontology/topic/attachment -aliases: [] -status: active ---- - -# Attachment diff --git a/docs/src/content/groups/audit.md b/docs/src/content/groups/audit.md deleted file mode 100644 index af2a64ad..00000000 --- a/docs/src/content/groups/audit.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: audit -slug: audit -name: Audit -description: Groups content and participants concerned with Audit. -classification: ontology/topic/audit -aliases: [] -status: active ---- - -# Audit diff --git a/docs/src/content/groups/authentication.md b/docs/src/content/groups/authentication.md deleted file mode 100644 index 084a7c14..00000000 --- a/docs/src/content/groups/authentication.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: authentication -slug: authentication -name: Authentication -description: Groups content and participants concerned with Authentication. -classification: ontology/topic/authentication -aliases: [] -status: active ---- - -# Authentication diff --git a/docs/src/content/groups/author.md b/docs/src/content/groups/author.md deleted file mode 100644 index 00c6e79e..00000000 --- a/docs/src/content/groups/author.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: author -slug: author -name: Author -description: Groups content and participants concerned with Author. -classification: ontology/topic/author -aliases: [] -status: active ---- - -# Author diff --git a/docs/src/content/groups/authoring.md b/docs/src/content/groups/authoring.md deleted file mode 100644 index 6d38bf14..00000000 --- a/docs/src/content/groups/authoring.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: authoring -slug: authoring -name: Authoring -description: Groups content and participants concerned with Authoring. -classification: ontology/topic/authoring -aliases: [] -status: active ---- - -# Authoring diff --git a/docs/src/content/groups/binding.md b/docs/src/content/groups/binding.md deleted file mode 100644 index 46decfb4..00000000 --- a/docs/src/content/groups/binding.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: binding -slug: binding -name: Binding -description: Groups content and participants concerned with Binding. -classification: ontology/topic/binding -aliases: [] -status: active ---- - -# Binding diff --git a/docs/src/content/groups/blast-radius.md b/docs/src/content/groups/blast-radius.md deleted file mode 100644 index 357f6626..00000000 --- a/docs/src/content/groups/blast-radius.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: blast-radius -slug: blast-radius -name: Blast Radius -description: Groups content and participants concerned with Blast Radius. -classification: ontology/topic/blast-radius -aliases: [] -status: active ---- - -# Blast Radius diff --git a/docs/src/content/groups/blocker.md b/docs/src/content/groups/blocker.md deleted file mode 100644 index c3dfce60..00000000 --- a/docs/src/content/groups/blocker.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: blocker -slug: blocker -name: Blocker -description: Groups content and participants concerned with Blocker. -classification: ontology/topic/blocker -aliases: [] -status: active ---- - -# Blocker diff --git a/docs/src/content/groups/blockers.md b/docs/src/content/groups/blockers.md deleted file mode 100644 index 6d68dfc3..00000000 --- a/docs/src/content/groups/blockers.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: blockers -slug: blockers -name: Blockers -description: Groups content and participants concerned with Blockers. -classification: ontology/topic/blockers -aliases: [] -status: active ---- - -# Blockers diff --git a/docs/src/content/groups/books.md b/docs/src/content/groups/books.md deleted file mode 100644 index 9e8ce38c..00000000 --- a/docs/src/content/groups/books.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: books -slug: books -name: Books -description: Groups content and participants concerned with Books. -classification: ontology/topic/books -aliases: [] -status: active ---- - -# Books diff --git a/docs/src/content/groups/cadence.md b/docs/src/content/groups/cadence.md deleted file mode 100644 index 577b74b7..00000000 --- a/docs/src/content/groups/cadence.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: cadence -slug: cadence -name: Cadence -description: Groups content and participants concerned with Cadence. -classification: ontology/topic/cadence -aliases: [] -status: active ---- - -# Cadence diff --git a/docs/src/content/groups/capabilities.md b/docs/src/content/groups/capabilities.md deleted file mode 100644 index bd07fa93..00000000 --- a/docs/src/content/groups/capabilities.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: capabilities -slug: capabilities -name: Capabilities -description: Groups content and participants concerned with Capabilities. -classification: ontology/topic/capabilities -aliases: [] -status: active ---- - -# Capabilities diff --git a/docs/src/content/groups/capability.md b/docs/src/content/groups/capability.md deleted file mode 100644 index 362154be..00000000 --- a/docs/src/content/groups/capability.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: capability -slug: capability -name: Capability -description: Groups content and participants concerned with Capability. -classification: ontology/topic/capability -aliases: [] -status: active ---- - -# Capability diff --git a/docs/src/content/groups/capture.md b/docs/src/content/groups/capture.md deleted file mode 100644 index 6f074564..00000000 --- a/docs/src/content/groups/capture.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: capture -slug: capture -name: Capture -description: Groups content and participants concerned with Capture. -classification: ontology/topic/capture -aliases: [] -status: active ---- - -# Capture diff --git a/docs/src/content/groups/change.md b/docs/src/content/groups/change.md deleted file mode 100644 index b88f44b1..00000000 --- a/docs/src/content/groups/change.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: change -slug: change -name: Change -description: Groups content and participants concerned with Change. -classification: ontology/topic/change -aliases: [] -status: active ---- - -# Change diff --git a/docs/src/content/groups/changes.md b/docs/src/content/groups/changes.md deleted file mode 100644 index 40456ac1..00000000 --- a/docs/src/content/groups/changes.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: changes -slug: changes -name: Changes -description: Groups content and participants concerned with Changes. -classification: ontology/topic/changes -aliases: [] -status: active ---- - -# Changes diff --git a/docs/src/content/groups/ciphertext.md b/docs/src/content/groups/ciphertext.md deleted file mode 100644 index 62cf3c2b..00000000 --- a/docs/src/content/groups/ciphertext.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: ciphertext -slug: ciphertext -name: Ciphertext -description: Groups content and participants concerned with Ciphertext. -classification: ontology/topic/ciphertext -aliases: [] -status: active ---- - -# Ciphertext diff --git a/docs/src/content/groups/cloudflare.md b/docs/src/content/groups/cloudflare.md deleted file mode 100644 index ad24657c..00000000 --- a/docs/src/content/groups/cloudflare.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: cloudflare -slug: cloudflare -name: Cloudflare -description: Groups content and participants concerned with Cloudflare. -classification: ontology/topic/cloudflare -aliases: [] -status: active ---- - -# Cloudflare diff --git a/docs/src/content/groups/colors.md b/docs/src/content/groups/colors.md deleted file mode 100644 index 6d6fe68c..00000000 --- a/docs/src/content/groups/colors.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: colors -slug: colors -name: Colors -description: Groups content and participants concerned with Colors. -classification: ontology/topic/colors -aliases: [] -status: active ---- - -# Colors diff --git a/docs/src/content/groups/compromise.md b/docs/src/content/groups/compromise.md deleted file mode 100644 index 719f03f5..00000000 --- a/docs/src/content/groups/compromise.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: compromise -slug: compromise -name: Compromise -description: Groups content and participants concerned with Compromise. -classification: ontology/topic/compromise -aliases: [] -status: active ---- - -# Compromise diff --git a/docs/src/content/groups/conflict.md b/docs/src/content/groups/conflict.md deleted file mode 100644 index 5118af63..00000000 --- a/docs/src/content/groups/conflict.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: conflict -slug: conflict -name: Conflict -description: Groups content and participants concerned with Conflict. -classification: ontology/topic/conflict -aliases: [] -status: active ---- - -# Conflict diff --git a/docs/src/content/groups/connect-service.md b/docs/src/content/groups/connect-service.md deleted file mode 100644 index 4509bcbe..00000000 --- a/docs/src/content/groups/connect-service.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: connect-service -slug: connect-service -name: Connect Service -description: Groups content and participants concerned with Connect Service. -classification: ontology/topic/connect-service -aliases: [] -status: active ---- - -# Connect Service diff --git a/docs/src/content/groups/connection-settings.md b/docs/src/content/groups/connection-settings.md deleted file mode 100644 index d1428c7f..00000000 --- a/docs/src/content/groups/connection-settings.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: connection-settings -slug: connection-settings -name: Connection Settings -description: Groups content and participants concerned with Connection Settings. -classification: ontology/topic/connection-settings -aliases: [] -status: active ---- - -# Connection Settings diff --git a/docs/src/content/groups/connections.md b/docs/src/content/groups/connections.md deleted file mode 100644 index a649d9ab..00000000 --- a/docs/src/content/groups/connections.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: connections -slug: connections -name: Connections -description: Groups content and participants concerned with Connections. -classification: ontology/topic/connections -aliases: [] -status: active ---- - -# Connections diff --git a/docs/src/content/groups/contact.md b/docs/src/content/groups/contact.md deleted file mode 100644 index 27bafa6e..00000000 --- a/docs/src/content/groups/contact.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: contact -slug: contact -name: Contact -description: Groups content and participants concerned with Contact. -classification: ontology/topic/contact -aliases: [] -status: active ---- - -# Contact diff --git a/docs/src/content/groups/content-fields.md b/docs/src/content/groups/content-fields.md deleted file mode 100644 index f29a7455..00000000 --- a/docs/src/content/groups/content-fields.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: content-fields -slug: content-fields -name: Content Fields -description: Groups content and participants concerned with Content Fields. -classification: ontology/topic/content-fields -aliases: [] -status: active ---- - -# Content Fields diff --git a/docs/src/content/groups/content.md b/docs/src/content/groups/content.md deleted file mode 100644 index 09d9a3ea..00000000 --- a/docs/src/content/groups/content.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: content -slug: content -name: Content -description: Groups content and participants concerned with Content. -classification: ontology/topic/content -aliases: [] -status: active ---- - -# Content diff --git a/docs/src/content/groups/context.md b/docs/src/content/groups/context.md deleted file mode 100644 index 469bd226..00000000 --- a/docs/src/content/groups/context.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: context -slug: context -name: Context -description: Groups content and participants concerned with Context. -classification: ontology/topic/context -aliases: [] -status: active ---- - -# Context diff --git a/docs/src/content/groups/contrast.md b/docs/src/content/groups/contrast.md deleted file mode 100644 index 779821b3..00000000 --- a/docs/src/content/groups/contrast.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: contrast -slug: contrast -name: Contrast -description: Groups content and participants concerned with Contrast. -classification: ontology/topic/contrast -aliases: [] -status: active ---- - -# Contrast diff --git a/docs/src/content/groups/contributor.md b/docs/src/content/groups/contributor.md deleted file mode 100644 index d7eb146d..00000000 --- a/docs/src/content/groups/contributor.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: contributor -slug: contributor -name: Contributor -description: Groups content and participants concerned with Contributor. -classification: ontology/topic/contributor -aliases: [] -status: active ---- - -# Contributor diff --git a/docs/src/content/groups/create-team.md b/docs/src/content/groups/create-team.md deleted file mode 100644 index 15ca0978..00000000 --- a/docs/src/content/groups/create-team.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: create-team -slug: create-team -name: Create Team -description: Groups content and participants concerned with Create Team. -classification: ontology/topic/create-team -aliases: [] -status: active ---- - -# Create Team diff --git a/docs/src/content/groups/credential.md b/docs/src/content/groups/credential.md deleted file mode 100644 index 00d04aaf..00000000 --- a/docs/src/content/groups/credential.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: credential -slug: credential -name: Credential -description: Groups content and participants concerned with Credential. -classification: ontology/topic/credential -aliases: [] -status: active ---- - -# Credential diff --git a/docs/src/content/groups/credentials.md b/docs/src/content/groups/credentials.md deleted file mode 100644 index def78cd3..00000000 --- a/docs/src/content/groups/credentials.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: credentials -slug: credentials -name: Credentials -description: Groups content and participants concerned with Credentials. -classification: ontology/topic/credentials -aliases: [] -status: active ---- - -# Credentials diff --git a/docs/src/content/groups/dark-mode.md b/docs/src/content/groups/dark-mode.md deleted file mode 100644 index 7cb68f99..00000000 --- a/docs/src/content/groups/dark-mode.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: dark-mode -slug: dark-mode -name: Dark Mode -description: Groups content and participants concerned with Dark Mode. -classification: ontology/topic/dark-mode -aliases: [] -status: active ---- - -# Dark Mode diff --git a/docs/src/content/groups/date.md b/docs/src/content/groups/date.md deleted file mode 100644 index 6f82ea90..00000000 --- a/docs/src/content/groups/date.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: date -slug: date -name: Date -description: Groups content and participants concerned with Date. -classification: ontology/topic/date -aliases: [] -status: active ---- - -# Date diff --git a/docs/src/content/groups/delete-account.md b/docs/src/content/groups/delete-account.md deleted file mode 100644 index 85dc3dd1..00000000 --- a/docs/src/content/groups/delete-account.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: delete-account -slug: delete-account -name: Delete Account -description: Groups content and participants concerned with Delete Account. -classification: ontology/topic/delete-account -aliases: [] -status: active ---- - -# Delete Account diff --git a/docs/src/content/groups/delete-team.md b/docs/src/content/groups/delete-team.md deleted file mode 100644 index 57304286..00000000 --- a/docs/src/content/groups/delete-team.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: delete-team -slug: delete-team -name: Delete Team -description: Groups content and participants concerned with Delete Team. -classification: ontology/topic/delete-team -aliases: [] -status: active ---- - -# Delete Team diff --git a/docs/src/content/groups/delete.md b/docs/src/content/groups/delete.md deleted file mode 100644 index 3563b53e..00000000 --- a/docs/src/content/groups/delete.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: delete -slug: delete -name: Delete -description: Groups content and participants concerned with Delete. -classification: ontology/topic/delete -aliases: [] -status: active ---- - -# Delete diff --git a/docs/src/content/groups/devices.md b/docs/src/content/groups/devices.md deleted file mode 100644 index a419073f..00000000 --- a/docs/src/content/groups/devices.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: devices -slug: devices -name: Devices -description: Groups content and participants concerned with Devices. -classification: ontology/topic/devices -aliases: [] -status: active ---- - -# Devices diff --git a/docs/src/content/groups/directory.md b/docs/src/content/groups/directory.md deleted file mode 100644 index ea44a39b..00000000 --- a/docs/src/content/groups/directory.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: directory -slug: directory -name: Directory -description: Groups content and participants concerned with Directory. -classification: ontology/topic/directory -aliases: [] -status: active ---- - -# Directory diff --git a/docs/src/content/groups/discard-credentials.md b/docs/src/content/groups/discard-credentials.md deleted file mode 100644 index 9360b3dc..00000000 --- a/docs/src/content/groups/discard-credentials.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: discard-credentials -slug: discard-credentials -name: Discard Credentials -description: Groups content and participants concerned with Discard Credentials. -classification: ontology/topic/discard-credentials -aliases: [] -status: active ---- - -# Discard Credentials diff --git a/docs/src/content/groups/disconnect.md b/docs/src/content/groups/disconnect.md deleted file mode 100644 index 2c22fbb0..00000000 --- a/docs/src/content/groups/disconnect.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: disconnect -slug: disconnect -name: Disconnect -description: Groups content and participants concerned with Disconnect. -classification: ontology/topic/disconnect -aliases: [] -status: active ---- - -# Disconnect diff --git a/docs/src/content/groups/dns.md b/docs/src/content/groups/dns.md deleted file mode 100644 index 7b0f1af0..00000000 --- a/docs/src/content/groups/dns.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: dns -slug: dns -name: Dns -description: Groups content and participants concerned with Dns. -classification: ontology/topic/dns -aliases: [] -status: active ---- - -# Dns diff --git a/docs/src/content/groups/email-mismatch.md b/docs/src/content/groups/email-mismatch.md deleted file mode 100644 index 5e8aefda..00000000 --- a/docs/src/content/groups/email-mismatch.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: email-mismatch -slug: email-mismatch -name: Email Mismatch -description: Groups content and participants concerned with Email Mismatch. -classification: ontology/topic/email-mismatch -aliases: [] -status: active ---- - -# Email Mismatch diff --git a/docs/src/content/groups/email.md b/docs/src/content/groups/email.md deleted file mode 100644 index 290d072a..00000000 --- a/docs/src/content/groups/email.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: email -slug: email -name: Email -description: Groups content and participants concerned with Email. -classification: ontology/topic/email -aliases: [] -status: active ---- - -# Email diff --git a/docs/src/content/groups/encryption.md b/docs/src/content/groups/encryption.md deleted file mode 100644 index e26240c1..00000000 --- a/docs/src/content/groups/encryption.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: encryption -slug: encryption -name: Encryption -description: Groups content and participants concerned with Encryption. -classification: ontology/topic/encryption -aliases: [] -status: active ---- - -# Encryption diff --git a/docs/src/content/groups/engineering-team.md b/docs/src/content/groups/engineering-team.md deleted file mode 100644 index fcc642ad..00000000 --- a/docs/src/content/groups/engineering-team.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: engineering-team -slug: engineering-team -name: Engineering Team -description: Groups content and participants concerned with Engineering Team. -classification: ontology/topic/engineering-team -aliases: [] -status: active ---- - -# Engineering Team diff --git a/docs/src/content/groups/engineering.md b/docs/src/content/groups/engineering.md deleted file mode 100644 index 0326db16..00000000 --- a/docs/src/content/groups/engineering.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: engineering -slug: engineering -name: Engineering -description: Groups content and participants concerned with Engineering. -classification: ontology/topic/engineering -aliases: [] -status: active ---- - -# Engineering diff --git a/docs/src/content/groups/envelope.md b/docs/src/content/groups/envelope.md deleted file mode 100644 index 3670f049..00000000 --- a/docs/src/content/groups/envelope.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: envelope -slug: envelope -name: Envelope -description: Groups content and participants concerned with Envelope. -classification: ontology/topic/envelope -aliases: [] -status: active ---- - -# Envelope diff --git a/docs/src/content/groups/expiry.md b/docs/src/content/groups/expiry.md deleted file mode 100644 index ddcfbe3b..00000000 --- a/docs/src/content/groups/expiry.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: expiry -slug: expiry -name: Expiry -description: Groups content and participants concerned with Expiry. -classification: ontology/topic/expiry -aliases: [] -status: active ---- - -# Expiry diff --git a/docs/src/content/groups/export.md b/docs/src/content/groups/export.md deleted file mode 100644 index c56eb158..00000000 --- a/docs/src/content/groups/export.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: export -slug: export -name: Export -description: Groups content and participants concerned with Export. -classification: ontology/topic/export -aliases: [] -status: active ---- - -# Export diff --git a/docs/src/content/groups/feedback.md b/docs/src/content/groups/feedback.md deleted file mode 100644 index d6860b8c..00000000 --- a/docs/src/content/groups/feedback.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: feedback -slug: feedback -name: Feedback -description: Groups content and participants concerned with Feedback. -classification: ontology/topic/feedback -aliases: [] -status: active ---- - -# Feedback diff --git a/docs/src/content/groups/filter.md b/docs/src/content/groups/filter.md deleted file mode 100644 index eae98ab9..00000000 --- a/docs/src/content/groups/filter.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: filter -slug: filter -name: Filter -description: Groups content and participants concerned with Filter. -classification: ontology/topic/filter -aliases: [] -status: active ---- - -# Filter diff --git a/docs/src/content/groups/forgotten-passphrase.md b/docs/src/content/groups/forgotten-passphrase.md deleted file mode 100644 index 26abc660..00000000 --- a/docs/src/content/groups/forgotten-passphrase.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: forgotten-passphrase -slug: forgotten-passphrase -name: Forgotten Passphrase -description: Groups content and participants concerned with Forgotten Passphrase. -classification: ontology/topic/forgotten-passphrase -aliases: [] -status: active ---- - -# Forgotten Passphrase diff --git a/docs/src/content/groups/github-app.md b/docs/src/content/groups/github-app.md deleted file mode 100644 index 29da0b19..00000000 --- a/docs/src/content/groups/github-app.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: github-app -slug: github-app -name: Github App -description: Groups content and participants concerned with Github App. -classification: ontology/topic/github-app -aliases: [] -status: active ---- - -# Github App diff --git a/docs/src/content/groups/github.md b/docs/src/content/groups/github.md deleted file mode 100644 index 53824fb1..00000000 --- a/docs/src/content/groups/github.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: github -slug: github -name: Github -description: Groups content and participants concerned with Github. -classification: ontology/topic/github -aliases: [] -status: active ---- - -# Github diff --git a/docs/src/content/groups/google.md b/docs/src/content/groups/google.md deleted file mode 100644 index b30357e0..00000000 --- a/docs/src/content/groups/google.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: google -slug: google -name: Google -description: Groups content and participants concerned with Google. -classification: ontology/topic/google -aliases: [] -status: active ---- - -# Google diff --git a/docs/src/content/groups/grant.md b/docs/src/content/groups/grant.md deleted file mode 100644 index 7a89cfc2..00000000 --- a/docs/src/content/groups/grant.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: grant -slug: grant -name: Grant -description: Groups content and participants concerned with Grant. -classification: ontology/topic/grant -aliases: [] -status: active ---- - -# Grant diff --git a/docs/src/content/groups/hashicorp-vault.md b/docs/src/content/groups/hashicorp-vault.md deleted file mode 100644 index 2cff7d13..00000000 --- a/docs/src/content/groups/hashicorp-vault.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: hashicorp-vault -slug: hashicorp-vault -name: Hashicorp Vault -description: Groups content and participants concerned with Hashicorp Vault. -classification: ontology/topic/hashicorp-vault -aliases: [] -status: active ---- - -# Hashicorp Vault diff --git a/docs/src/content/groups/history.md b/docs/src/content/groups/history.md deleted file mode 100644 index c39aa408..00000000 --- a/docs/src/content/groups/history.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: history -slug: history -name: History -description: Groups content and participants concerned with History. -classification: ontology/topic/history -aliases: [] -status: active ---- - -# History diff --git a/docs/src/content/groups/hosting.md b/docs/src/content/groups/hosting.md deleted file mode 100644 index ab89316c..00000000 --- a/docs/src/content/groups/hosting.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: hosting -slug: hosting -name: Hosting -description: Groups content and participants concerned with Hosting. -classification: ontology/topic/hosting -aliases: [] -status: active ---- - -# Hosting diff --git a/docs/src/content/groups/iana.md b/docs/src/content/groups/iana.md deleted file mode 100644 index 109af046..00000000 --- a/docs/src/content/groups/iana.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: iana -slug: iana -name: Iana -description: Groups content and participants concerned with Iana. -classification: ontology/topic/iana -aliases: [] -status: active ---- - -# Iana diff --git a/docs/src/content/groups/identity.md b/docs/src/content/groups/identity.md deleted file mode 100644 index 2970934f..00000000 --- a/docs/src/content/groups/identity.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: identity -slug: identity -name: Identity -description: Groups content and participants concerned with Identity. -classification: ontology/topic/identity -aliases: [] -status: active ---- - -# Identity diff --git a/docs/src/content/groups/in-progress.md b/docs/src/content/groups/in-progress.md deleted file mode 100644 index b33f53bd..00000000 --- a/docs/src/content/groups/in-progress.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: in-progress -slug: in-progress -name: In Progress -description: Groups content and participants concerned with In Progress. -classification: ontology/topic/in-progress -aliases: [] -status: active ---- - -# In Progress diff --git a/docs/src/content/groups/installation.md b/docs/src/content/groups/installation.md deleted file mode 100644 index 00cb00ba..00000000 --- a/docs/src/content/groups/installation.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: installation -slug: installation -name: Installation -description: Groups content and participants concerned with Installation. -classification: ontology/topic/installation -aliases: [] -status: active ---- - -# Installation diff --git a/docs/src/content/groups/invitation.md b/docs/src/content/groups/invitation.md deleted file mode 100644 index c3d944ed..00000000 --- a/docs/src/content/groups/invitation.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: invitation -slug: invitation -name: Invitation -description: Groups content and participants concerned with Invitation. -classification: ontology/topic/invitation -aliases: [] -status: active ---- - -# Invitation diff --git a/docs/src/content/groups/ip-address.md b/docs/src/content/groups/ip-address.md deleted file mode 100644 index ea8d152d..00000000 --- a/docs/src/content/groups/ip-address.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: ip-address -slug: ip-address -name: Ip Address -description: Groups content and participants concerned with Ip Address. -classification: ontology/topic/ip-address -aliases: [] -status: active ---- - -# Ip Address diff --git a/docs/src/content/groups/irreversible.md b/docs/src/content/groups/irreversible.md deleted file mode 100644 index 9ecd3003..00000000 --- a/docs/src/content/groups/irreversible.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: irreversible -slug: irreversible -name: Irreversible -description: Groups content and participants concerned with Irreversible. -classification: ontology/topic/irreversible -aliases: [] -status: active ---- - -# Irreversible diff --git a/docs/src/content/groups/issue.md b/docs/src/content/groups/issue.md deleted file mode 100644 index 0a9a620e..00000000 --- a/docs/src/content/groups/issue.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: issue -slug: issue -name: Issue -description: Groups content and participants concerned with Issue. -classification: ontology/topic/issue -aliases: [] -status: active ---- - -# Issue diff --git a/docs/src/content/groups/jsonl.md b/docs/src/content/groups/jsonl.md deleted file mode 100644 index 38054a96..00000000 --- a/docs/src/content/groups/jsonl.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: jsonl -slug: jsonl -name: Jsonl -description: Groups content and participants concerned with Jsonl. -classification: ontology/topic/jsonl -aliases: [] -status: active ---- - -# Jsonl diff --git a/docs/src/content/groups/jwt.md b/docs/src/content/groups/jwt.md deleted file mode 100644 index 32968f3f..00000000 --- a/docs/src/content/groups/jwt.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: jwt -slug: jwt -name: Jwt -description: Groups content and participants concerned with Jwt. -classification: ontology/topic/jwt -aliases: [] -status: active ---- - -# Jwt diff --git a/docs/src/content/groups/key-wrapping.md b/docs/src/content/groups/key-wrapping.md deleted file mode 100644 index ee232781..00000000 --- a/docs/src/content/groups/key-wrapping.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: key-wrapping -slug: key-wrapping -name: Key Wrapping -description: Groups content and participants concerned with Key Wrapping. -classification: ontology/topic/key-wrapping -aliases: [] -status: active ---- - -# Key Wrapping diff --git a/docs/src/content/groups/knowledge.md b/docs/src/content/groups/knowledge.md deleted file mode 100644 index 7b6fac6d..00000000 --- a/docs/src/content/groups/knowledge.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: knowledge -slug: knowledge -name: Knowledge -description: Groups content and participants concerned with Knowledge. -classification: ontology/topic/knowledge -aliases: [] -status: active ---- - -# Knowledge diff --git a/docs/src/content/groups/last-owner.md b/docs/src/content/groups/last-owner.md deleted file mode 100644 index 7d0461df..00000000 --- a/docs/src/content/groups/last-owner.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: last-owner -slug: last-owner -name: Last Owner -description: Groups content and participants concerned with Last Owner. -classification: ontology/topic/last-owner -aliases: [] -status: active ---- - -# Last Owner diff --git a/docs/src/content/groups/lead.md b/docs/src/content/groups/lead.md deleted file mode 100644 index 3da9a212..00000000 --- a/docs/src/content/groups/lead.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: lead -slug: lead -name: Lead -description: Groups content and participants concerned with Lead. -classification: ontology/topic/lead -aliases: [] -status: active ---- - -# Lead diff --git a/docs/src/content/groups/lease.md b/docs/src/content/groups/lease.md deleted file mode 100644 index fd649899..00000000 --- a/docs/src/content/groups/lease.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: lease -slug: lease -name: Lease -description: Groups content and participants concerned with Lease. -classification: ontology/topic/lease -aliases: [] -status: active ---- - -# Lease diff --git a/docs/src/content/groups/leave.md b/docs/src/content/groups/leave.md deleted file mode 100644 index a14fcd29..00000000 --- a/docs/src/content/groups/leave.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: leave -slug: leave -name: Leave -description: Groups content and participants concerned with Leave. -classification: ontology/topic/leave -aliases: [] -status: active ---- - -# Leave diff --git a/docs/src/content/groups/lost-access.md b/docs/src/content/groups/lost-access.md deleted file mode 100644 index 9832ce27..00000000 --- a/docs/src/content/groups/lost-access.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: lost-access -slug: lost-access -name: Lost Access -description: Groups content and participants concerned with Lost Access. -classification: ontology/topic/lost-access -aliases: [] -status: active ---- - -# Lost Access diff --git a/docs/src/content/groups/member.md b/docs/src/content/groups/member.md deleted file mode 100644 index b914c594..00000000 --- a/docs/src/content/groups/member.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: member -slug: member -name: Member -description: Groups content and participants concerned with Member. -classification: ontology/topic/member -aliases: [] -status: active ---- - -# Member diff --git a/docs/src/content/groups/members.md b/docs/src/content/groups/members.md deleted file mode 100644 index 7a2a15bc..00000000 --- a/docs/src/content/groups/members.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: members -slug: members -name: Members -description: Groups content and participants concerned with Members. -classification: ontology/topic/members -aliases: [] -status: active ---- - -# Members diff --git a/docs/src/content/groups/membership.md b/docs/src/content/groups/membership.md deleted file mode 100644 index 5657a1dd..00000000 --- a/docs/src/content/groups/membership.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: membership -slug: membership -name: Membership -description: Groups content and participants concerned with Membership. -classification: ontology/topic/membership -aliases: [] -status: active ---- - -# Membership diff --git a/docs/src/content/groups/metadata.md b/docs/src/content/groups/metadata.md deleted file mode 100644 index c9820b17..00000000 --- a/docs/src/content/groups/metadata.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: metadata -slug: metadata -name: Metadata -description: Groups content and participants concerned with Metadata. -classification: ontology/topic/metadata -aliases: [] -status: active ---- - -# Metadata diff --git a/docs/src/content/groups/name.md b/docs/src/content/groups/name.md deleted file mode 100644 index 9a9d3798..00000000 --- a/docs/src/content/groups/name.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: name -slug: name -name: Name -description: Groups content and participants concerned with Name. -classification: ontology/topic/name -aliases: [] -status: active ---- - -# Name diff --git a/docs/src/content/groups/notes.md b/docs/src/content/groups/notes.md deleted file mode 100644 index d5e6a2f8..00000000 --- a/docs/src/content/groups/notes.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: notes -slug: notes -name: Notes -description: Groups content and participants concerned with Notes. -classification: ontology/topic/notes -aliases: [] -status: active ---- - -# Notes diff --git a/docs/src/content/groups/notifications.md b/docs/src/content/groups/notifications.md deleted file mode 100644 index 77fb2705..00000000 --- a/docs/src/content/groups/notifications.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: notifications -slug: notifications -name: Notifications -description: Groups content and participants concerned with Notifications. -classification: ontology/topic/notifications -aliases: [] -status: active ---- - -# Notifications diff --git a/docs/src/content/groups/oidc.md b/docs/src/content/groups/oidc.md deleted file mode 100644 index f3f4b52a..00000000 --- a/docs/src/content/groups/oidc.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: oidc -slug: oidc -name: Oidc -description: Groups content and participants concerned with Oidc. -classification: ontology/topic/oidc -aliases: [] -status: active ---- - -# Oidc diff --git a/docs/src/content/groups/openbao.md b/docs/src/content/groups/openbao.md deleted file mode 100644 index 853c3013..00000000 --- a/docs/src/content/groups/openbao.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: openbao -slug: openbao -name: Openbao -description: Groups content and participants concerned with Openbao. -classification: ontology/topic/openbao -aliases: [] -status: active ---- - -# Openbao diff --git a/docs/src/content/groups/organization.md b/docs/src/content/groups/organization.md deleted file mode 100644 index d37fae8e..00000000 --- a/docs/src/content/groups/organization.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: organization -slug: organization -name: Organization -description: Groups content and participants concerned with Organization. -classification: ontology/topic/organization -aliases: [] -status: active ---- - -# Organization diff --git a/docs/src/content/groups/overrides.md b/docs/src/content/groups/overrides.md deleted file mode 100644 index 21d24ffa..00000000 --- a/docs/src/content/groups/overrides.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: overrides -slug: overrides -name: Overrides -description: Groups content and participants concerned with Overrides. -classification: ontology/topic/overrides -aliases: [] -status: active ---- - -# Overrides diff --git a/docs/src/content/groups/owner.md b/docs/src/content/groups/owner.md deleted file mode 100644 index 87116e58..00000000 --- a/docs/src/content/groups/owner.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: owner -slug: owner -name: Owner -description: Groups content and participants concerned with Owner. -classification: ontology/topic/owner -aliases: [] -status: active ---- - -# Owner diff --git a/docs/src/content/groups/ownership.md b/docs/src/content/groups/ownership.md deleted file mode 100644 index 1e3aedc3..00000000 --- a/docs/src/content/groups/ownership.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: ownership -slug: ownership -name: Ownership -description: Groups content and participants concerned with Ownership. -classification: ontology/topic/ownership -aliases: [] -status: active ---- - -# Ownership diff --git a/docs/src/content/groups/pages.md b/docs/src/content/groups/pages.md deleted file mode 100644 index bba03b94..00000000 --- a/docs/src/content/groups/pages.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: pages -slug: pages -name: Pages -description: Groups content and participants concerned with Pages. -classification: ontology/topic/pages -aliases: [] -status: active ---- - -# Pages diff --git a/docs/src/content/groups/pagination.md b/docs/src/content/groups/pagination.md deleted file mode 100644 index ec176a5c..00000000 --- a/docs/src/content/groups/pagination.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: pagination -slug: pagination -name: Pagination -description: Groups content and participants concerned with Pagination. -classification: ontology/topic/pagination -aliases: [] -status: active ---- - -# Pagination diff --git a/docs/src/content/groups/passphrase.md b/docs/src/content/groups/passphrase.md deleted file mode 100644 index 0da6d01c..00000000 --- a/docs/src/content/groups/passphrase.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: passphrase -slug: passphrase -name: Passphrase -description: Groups content and participants concerned with Passphrase. -classification: ontology/topic/passphrase -aliases: [] -status: active ---- - -# Passphrase diff --git a/docs/src/content/groups/password.md b/docs/src/content/groups/password.md deleted file mode 100644 index e73d9031..00000000 --- a/docs/src/content/groups/password.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: password -slug: password -name: Password -description: Groups content and participants concerned with Password. -classification: ontology/topic/password -aliases: [] -status: active ---- - -# Password diff --git a/docs/src/content/groups/permission.md b/docs/src/content/groups/permission.md deleted file mode 100644 index f4187bdb..00000000 --- a/docs/src/content/groups/permission.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: permission -slug: permission -name: Permission -description: Groups content and participants concerned with Permission. -classification: ontology/topic/permission -aliases: [] -status: active ---- - -# Permission diff --git a/docs/src/content/groups/permissions.md b/docs/src/content/groups/permissions.md deleted file mode 100644 index d9bc8197..00000000 --- a/docs/src/content/groups/permissions.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: permissions -slug: permissions -name: Permissions -description: Groups content and participants concerned with Permissions. -classification: ontology/topic/permissions -aliases: [] -status: active ---- - -# Permissions diff --git a/docs/src/content/groups/personal-passphrase.md b/docs/src/content/groups/personal-passphrase.md deleted file mode 100644 index a7de6150..00000000 --- a/docs/src/content/groups/personal-passphrase.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: personal-passphrase -slug: personal-passphrase -name: Personal Passphrase -description: Groups content and participants concerned with Personal Passphrase. -classification: ontology/topic/personal-passphrase -aliases: [] -status: active ---- - -# Personal Passphrase diff --git a/docs/src/content/groups/platform-admin.md b/docs/src/content/groups/platform-admin.md deleted file mode 100644 index 5f8e8532..00000000 --- a/docs/src/content/groups/platform-admin.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: platform-admin -slug: platform-admin -name: Platform Admin -description: Groups content and participants concerned with Platform Admin. -classification: ontology/topic/platform-admin -aliases: [] -status: active ---- - -# Platform Admin diff --git a/docs/src/content/groups/primary.md b/docs/src/content/groups/primary.md deleted file mode 100644 index dad97890..00000000 --- a/docs/src/content/groups/primary.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: primary -slug: primary -name: Primary -description: Groups content and participants concerned with Primary. -classification: ontology/topic/primary -aliases: [] -status: active ---- - -# Primary diff --git a/docs/src/content/groups/privacy.md b/docs/src/content/groups/privacy.md deleted file mode 100644 index dcb84433..00000000 --- a/docs/src/content/groups/privacy.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: privacy -slug: privacy -name: Privacy -description: Groups content and participants concerned with Privacy. -classification: ontology/topic/privacy -aliases: [] -status: active ---- - -# Privacy diff --git a/docs/src/content/groups/private.md b/docs/src/content/groups/private.md deleted file mode 100644 index 7f71dccf..00000000 --- a/docs/src/content/groups/private.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: private -slug: private -name: Private -description: Groups content and participants concerned with Private. -classification: ontology/topic/private -aliases: [] -status: active ---- - -# Private diff --git a/docs/src/content/groups/profile.md b/docs/src/content/groups/profile.md deleted file mode 100644 index 98645d89..00000000 --- a/docs/src/content/groups/profile.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: profile -slug: profile -name: Profile -description: Groups content and participants concerned with Profile. -classification: ontology/topic/profile -aliases: [] -status: active ---- - -# Profile diff --git a/docs/src/content/groups/projects.md b/docs/src/content/groups/projects.md deleted file mode 100644 index 00eeec83..00000000 --- a/docs/src/content/groups/projects.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: projects -slug: projects -name: Projects -description: Groups content and participants concerned with Projects. -classification: ontology/topic/projects -aliases: [] -status: active ---- - -# Projects diff --git a/docs/src/content/groups/provenance.md b/docs/src/content/groups/provenance.md deleted file mode 100644 index 2d118c84..00000000 --- a/docs/src/content/groups/provenance.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: provenance -slug: provenance -name: Provenance -description: Groups content and participants concerned with Provenance. -classification: ontology/topic/provenance -aliases: [] -status: active ---- - -# Provenance diff --git a/docs/src/content/groups/provider.md b/docs/src/content/groups/provider.md deleted file mode 100644 index 546f19cf..00000000 --- a/docs/src/content/groups/provider.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: provider -slug: provider -name: Provider -description: Groups content and participants concerned with Provider. -classification: ontology/topic/provider -aliases: [] -status: active ---- - -# Provider diff --git a/docs/src/content/groups/providers.md b/docs/src/content/groups/providers.md deleted file mode 100644 index 965ff139..00000000 --- a/docs/src/content/groups/providers.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: providers -slug: providers -name: Providers -description: Groups content and participants concerned with Providers. -classification: ontology/topic/providers -aliases: [] -status: active ---- - -# Providers diff --git a/docs/src/content/groups/public-profile.md b/docs/src/content/groups/public-profile.md deleted file mode 100644 index 97592f5c..00000000 --- a/docs/src/content/groups/public-profile.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: public-profile -slug: public-profile -name: Public Profile -description: Groups content and participants concerned with Public Profile. -classification: ontology/topic/public-profile -aliases: [] -status: active ---- - -# Public Profile diff --git a/docs/src/content/groups/public.md b/docs/src/content/groups/public.md deleted file mode 100644 index 43d41bd3..00000000 --- a/docs/src/content/groups/public.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: public -slug: public -name: Public -description: Groups content and participants concerned with Public. -classification: ontology/topic/public -aliases: [] -status: active ---- - -# Public diff --git a/docs/src/content/groups/publication.md b/docs/src/content/groups/publication.md deleted file mode 100644 index 79a24099..00000000 --- a/docs/src/content/groups/publication.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: publication -slug: publication -name: Publication -description: Groups content and participants concerned with Publication. -classification: ontology/topic/publication -aliases: [] -status: active ---- - -# Publication diff --git a/docs/src/content/groups/r2.md b/docs/src/content/groups/r2.md deleted file mode 100644 index f39a8a6b..00000000 --- a/docs/src/content/groups/r2.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: r2 -slug: r2 -name: R2 -description: Groups content and participants concerned with R2. -classification: ontology/topic/r2 -aliases: [] -status: active ---- - -# R2 diff --git a/docs/src/content/groups/railway.md b/docs/src/content/groups/railway.md deleted file mode 100644 index 71f98f8f..00000000 --- a/docs/src/content/groups/railway.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: railway -slug: railway -name: Railway -description: Groups content and participants concerned with Railway. -classification: ontology/topic/railway -aliases: [] -status: active ---- - -# Railway diff --git a/docs/src/content/groups/read-only.md b/docs/src/content/groups/read-only.md deleted file mode 100644 index 68ef399e..00000000 --- a/docs/src/content/groups/read-only.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: read-only -slug: read-only -name: Read Only -description: Groups content and participants concerned with Read Only. -classification: ontology/topic/read-only -aliases: [] -status: active ---- - -# Read Only diff --git a/docs/src/content/groups/reauthentication.md b/docs/src/content/groups/reauthentication.md deleted file mode 100644 index de76b7d8..00000000 --- a/docs/src/content/groups/reauthentication.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: reauthentication -slug: reauthentication -name: Reauthentication -description: Groups content and participants concerned with Reauthentication. -classification: ontology/topic/reauthentication -aliases: [] -status: active ---- - -# Reauthentication diff --git a/docs/src/content/groups/recovery.md b/docs/src/content/groups/recovery.md deleted file mode 100644 index feb43539..00000000 --- a/docs/src/content/groups/recovery.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: recovery -slug: recovery -name: Recovery -description: Groups content and participants concerned with Recovery. -classification: ontology/topic/recovery -aliases: [] -status: active ---- - -# Recovery diff --git a/docs/src/content/groups/redact.md b/docs/src/content/groups/redact.md deleted file mode 100644 index 99ccb585..00000000 --- a/docs/src/content/groups/redact.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: redact -slug: redact -name: Redact -description: Groups content and participants concerned with Redact. -classification: ontology/topic/redact -aliases: [] -status: active ---- - -# Redact diff --git a/docs/src/content/groups/release.md b/docs/src/content/groups/release.md deleted file mode 100644 index 3ed8b151..00000000 --- a/docs/src/content/groups/release.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: release -slug: release -name: Release -description: Groups content and participants concerned with Release. -classification: ontology/topic/release -aliases: [] -status: active ---- - -# Release diff --git a/docs/src/content/groups/remove.md b/docs/src/content/groups/remove.md deleted file mode 100644 index 5f7ced6b..00000000 --- a/docs/src/content/groups/remove.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: remove -slug: remove -name: Remove -description: Groups content and participants concerned with Remove. -classification: ontology/topic/remove -aliases: [] -status: active ---- - -# Remove diff --git a/docs/src/content/groups/reopen.md b/docs/src/content/groups/reopen.md deleted file mode 100644 index 5c71a7af..00000000 --- a/docs/src/content/groups/reopen.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: reopen -slug: reopen -name: Reopen -description: Groups content and participants concerned with Reopen. -classification: ontology/topic/reopen -aliases: [] -status: active ---- - -# Reopen diff --git a/docs/src/content/groups/report.md b/docs/src/content/groups/report.md deleted file mode 100644 index 9d205028..00000000 --- a/docs/src/content/groups/report.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: report -slug: report -name: Report -description: Groups content and participants concerned with Report. -classification: ontology/topic/report -aliases: [] -status: active ---- - -# Report diff --git a/docs/src/content/groups/reporting.md b/docs/src/content/groups/reporting.md deleted file mode 100644 index 686ae2a6..00000000 --- a/docs/src/content/groups/reporting.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: reporting -slug: reporting -name: Reporting -description: Groups content and participants concerned with Reporting. -classification: ontology/topic/reporting -aliases: [] -status: active ---- - -# Reporting diff --git a/docs/src/content/groups/repositories.md b/docs/src/content/groups/repositories.md deleted file mode 100644 index 2cd7b020..00000000 --- a/docs/src/content/groups/repositories.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: repositories -slug: repositories -name: Repositories -description: Groups content and participants concerned with Repositories. -classification: ontology/topic/repositories -aliases: [] -status: active ---- - -# Repositories diff --git a/docs/src/content/groups/repository.md b/docs/src/content/groups/repository.md deleted file mode 100644 index 7fd795d0..00000000 --- a/docs/src/content/groups/repository.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: repository -slug: repository -name: Repository -description: Groups content and participants concerned with Repository. -classification: ontology/topic/repository -aliases: [] -status: active ---- - -# Repository diff --git a/docs/src/content/groups/research.md b/docs/src/content/groups/research.md deleted file mode 100644 index 6ccd4203..00000000 --- a/docs/src/content/groups/research.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: research -slug: research -name: Research -description: Groups content and participants concerned with Research. -classification: ontology/topic/research -aliases: [] -status: active ---- - -# Research diff --git a/docs/src/content/groups/resend.md b/docs/src/content/groups/resend.md deleted file mode 100644 index 0a38c732..00000000 --- a/docs/src/content/groups/resend.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: resend -slug: resend -name: Resend -description: Groups content and participants concerned with Resend. -classification: ontology/topic/resend -aliases: [] -status: active ---- - -# Resend diff --git a/docs/src/content/groups/reset-vault.md b/docs/src/content/groups/reset-vault.md deleted file mode 100644 index 604279ee..00000000 --- a/docs/src/content/groups/reset-vault.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: reset-vault -slug: reset-vault -name: Reset Vault -description: Groups content and participants concerned with Reset Vault. -classification: ontology/topic/reset-vault -aliases: [] -status: active ---- - -# Reset Vault diff --git a/docs/src/content/groups/resolve.md b/docs/src/content/groups/resolve.md deleted file mode 100644 index aac5e043..00000000 --- a/docs/src/content/groups/resolve.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: resolve -slug: resolve -name: Resolve -description: Groups content and participants concerned with Resolve. -classification: ontology/topic/resolve -aliases: [] -status: active ---- - -# Resolve diff --git a/docs/src/content/groups/restore.md b/docs/src/content/groups/restore.md deleted file mode 100644 index cd8dffdc..00000000 --- a/docs/src/content/groups/restore.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: restore -slug: restore -name: Restore -description: Groups content and participants concerned with Restore. -classification: ontology/topic/restore -aliases: [] -status: active ---- - -# Restore diff --git a/docs/src/content/groups/retention.md b/docs/src/content/groups/retention.md deleted file mode 100644 index f3d7d368..00000000 --- a/docs/src/content/groups/retention.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: retention -slug: retention -name: Retention -description: Groups content and participants concerned with Retention. -classification: ontology/topic/retention -aliases: [] -status: active ---- - -# Retention diff --git a/docs/src/content/groups/review.md b/docs/src/content/groups/review.md deleted file mode 100644 index 415e6b3e..00000000 --- a/docs/src/content/groups/review.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: review -slug: review -name: Review -description: Groups content and participants concerned with Review. -classification: ontology/topic/review -aliases: [] -status: active ---- - -# Review diff --git a/docs/src/content/groups/revoke.md b/docs/src/content/groups/revoke.md deleted file mode 100644 index 69ebca20..00000000 --- a/docs/src/content/groups/revoke.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: revoke -slug: revoke -name: Revoke -description: Groups content and participants concerned with Revoke. -classification: ontology/topic/revoke -aliases: [] -status: active ---- - -# Revoke diff --git a/docs/src/content/groups/role.md b/docs/src/content/groups/role.md deleted file mode 100644 index 59a50b2c..00000000 --- a/docs/src/content/groups/role.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: role -slug: role -name: Role -description: Groups content and participants concerned with Role. -classification: ontology/topic/role -aliases: [] -status: active ---- - -# Role diff --git a/docs/src/content/groups/roles.md b/docs/src/content/groups/roles.md deleted file mode 100644 index ca3707d6..00000000 --- a/docs/src/content/groups/roles.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: roles -slug: roles -name: Roles -description: Groups content and participants concerned with Roles. -classification: ontology/topic/roles -aliases: [] -status: active ---- - -# Roles diff --git a/docs/src/content/groups/rotate-passphrase.md b/docs/src/content/groups/rotate-passphrase.md deleted file mode 100644 index 9311b46f..00000000 --- a/docs/src/content/groups/rotate-passphrase.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: rotate-passphrase -slug: rotate-passphrase -name: Rotate Passphrase -description: Groups content and participants concerned with Rotate Passphrase. -classification: ontology/topic/rotate-passphrase -aliases: [] -status: active ---- - -# Rotate Passphrase diff --git a/docs/src/content/groups/rotate-team-key.md b/docs/src/content/groups/rotate-team-key.md deleted file mode 100644 index ae3c5eba..00000000 --- a/docs/src/content/groups/rotate-team-key.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: rotate-team-key -slug: rotate-team-key -name: Rotate Team Key -description: Groups content and participants concerned with Rotate Team Key. -classification: ontology/topic/rotate-team-key -aliases: [] -status: active ---- - -# Rotate Team Key diff --git a/docs/src/content/groups/rotate-token.md b/docs/src/content/groups/rotate-token.md deleted file mode 100644 index b3c4e5e0..00000000 --- a/docs/src/content/groups/rotate-token.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: rotate-token -slug: rotate-token -name: Rotate Token -description: Groups content and participants concerned with Rotate Token. -classification: ontology/topic/rotate-token -aliases: [] -status: active ---- - -# Rotate Token diff --git a/docs/src/content/groups/rotation.md b/docs/src/content/groups/rotation.md deleted file mode 100644 index ffd80252..00000000 --- a/docs/src/content/groups/rotation.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: rotation -slug: rotation -name: Rotation -description: Groups content and participants concerned with Rotation. -classification: ontology/topic/rotation -aliases: [] -status: active ---- - -# Rotation diff --git a/docs/src/content/groups/same-passphrase.md b/docs/src/content/groups/same-passphrase.md deleted file mode 100644 index 2b1a2a1e..00000000 --- a/docs/src/content/groups/same-passphrase.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: same-passphrase -slug: same-passphrase -name: Same Passphrase -description: Groups content and participants concerned with Same Passphrase. -classification: ontology/topic/same-passphrase -aliases: [] -status: active ---- - -# Same Passphrase diff --git a/docs/src/content/groups/screenshot.md b/docs/src/content/groups/screenshot.md deleted file mode 100644 index 31477f95..00000000 --- a/docs/src/content/groups/screenshot.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: screenshot -slug: screenshot -name: Screenshot -description: Groups content and participants concerned with Screenshot. -classification: ontology/topic/screenshot -aliases: [] -status: active ---- - -# Screenshot diff --git a/docs/src/content/groups/search.md b/docs/src/content/groups/search.md deleted file mode 100644 index 43a7c011..00000000 --- a/docs/src/content/groups/search.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: search -slug: search -name: Search -description: Groups content and participants concerned with Search. -classification: ontology/topic/search -aliases: [] -status: active ---- - -# Search diff --git a/docs/src/content/groups/secrets.md b/docs/src/content/groups/secrets.md deleted file mode 100644 index 5a9cef5f..00000000 --- a/docs/src/content/groups/secrets.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: secrets -slug: secrets -name: Secrets -description: Groups content and participants concerned with Secrets. -classification: ontology/topic/secrets -aliases: [] -status: active ---- - -# Secrets diff --git a/docs/src/content/groups/security.md b/docs/src/content/groups/security.md deleted file mode 100644 index e06bbe54..00000000 --- a/docs/src/content/groups/security.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: security -slug: security -name: Security -description: Groups content and participants concerned with Security. -classification: ontology/topic/security -aliases: [] -status: active ---- - -# Security diff --git a/docs/src/content/groups/service-vault.md b/docs/src/content/groups/service-vault.md deleted file mode 100644 index dcba9fed..00000000 --- a/docs/src/content/groups/service-vault.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: service-vault -slug: service-vault -name: Service Vault -description: Groups content and participants concerned with Service Vault. -classification: ontology/topic/service-vault -aliases: [] -status: active ---- - -# Service Vault diff --git a/docs/src/content/groups/services.md b/docs/src/content/groups/services.md deleted file mode 100644 index 2dce4e25..00000000 --- a/docs/src/content/groups/services.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: services -slug: services -name: Services -description: Groups content and participants concerned with Services. -classification: ontology/topic/services -aliases: [] -status: active ---- - -# Services diff --git a/docs/src/content/groups/sessions.md b/docs/src/content/groups/sessions.md deleted file mode 100644 index f6541e7e..00000000 --- a/docs/src/content/groups/sessions.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: sessions -slug: sessions -name: Sessions -description: Groups content and participants concerned with Sessions. -classification: ontology/topic/sessions -aliases: [] -status: active ---- - -# Sessions diff --git a/docs/src/content/groups/settings.md b/docs/src/content/groups/settings.md deleted file mode 100644 index 9579c4aa..00000000 --- a/docs/src/content/groups/settings.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: settings -slug: settings -name: Settings -description: Groups content and participants concerned with Settings. -classification: ontology/topic/settings -aliases: [] -status: active ---- - -# Settings diff --git a/docs/src/content/groups/sign-in.md b/docs/src/content/groups/sign-in.md deleted file mode 100644 index 0762a69a..00000000 --- a/docs/src/content/groups/sign-in.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: sign-in -slug: sign-in -name: Sign In -description: Groups content and participants concerned with Sign In. -classification: ontology/topic/sign-in -aliases: [] -status: active ---- - -# Sign In diff --git a/docs/src/content/groups/sign-out.md b/docs/src/content/groups/sign-out.md deleted file mode 100644 index b71620c7..00000000 --- a/docs/src/content/groups/sign-out.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: sign-out -slug: sign-out -name: Sign Out -description: Groups content and participants concerned with Sign Out. -classification: ontology/topic/sign-out -aliases: [] -status: active ---- - -# Sign Out diff --git a/docs/src/content/groups/slug.md b/docs/src/content/groups/slug.md deleted file mode 100644 index 19fb8df2..00000000 --- a/docs/src/content/groups/slug.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: slug -slug: slug -name: Slug -description: Groups content and participants concerned with Slug. -classification: ontology/topic/slug -aliases: [] -status: active ---- - -# Slug diff --git a/docs/src/content/groups/sole-administrator.md b/docs/src/content/groups/sole-administrator.md deleted file mode 100644 index 5831c09a..00000000 --- a/docs/src/content/groups/sole-administrator.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: sole-administrator -slug: sole-administrator -name: Sole Administrator -description: Groups content and participants concerned with Sole Administrator. -classification: ontology/topic/sole-administrator -aliases: [] -status: active ---- - -# Sole Administrator diff --git a/docs/src/content/groups/status.md b/docs/src/content/groups/status.md deleted file mode 100644 index 2494cc35..00000000 --- a/docs/src/content/groups/status.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: status -slug: status -name: Status -description: Groups content and participants concerned with Status. -classification: ontology/topic/status -aliases: [] -status: active ---- - -# Status diff --git a/docs/src/content/groups/step-1.md b/docs/src/content/groups/step-1.md deleted file mode 100644 index e84ed20d..00000000 --- a/docs/src/content/groups/step-1.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: step-1 -slug: step-1 -name: Step 1 -description: Groups content and participants concerned with Step 1. -classification: ontology/topic/step-1 -aliases: [] -status: active ---- - -# Step 1 diff --git a/docs/src/content/groups/step-2.md b/docs/src/content/groups/step-2.md deleted file mode 100644 index 62140346..00000000 --- a/docs/src/content/groups/step-2.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: step-2 -slug: step-2 -name: Step 2 -description: Groups content and participants concerned with Step 2. -classification: ontology/topic/step-2 -aliases: [] -status: active ---- - -# Step 2 diff --git a/docs/src/content/groups/step-3.md b/docs/src/content/groups/step-3.md deleted file mode 100644 index d8e63e59..00000000 --- a/docs/src/content/groups/step-3.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: step-3 -slug: step-3 -name: Step 3 -description: Groups content and participants concerned with Step 3. -classification: ontology/topic/step-3 -aliases: [] -status: active ---- - -# Step 3 diff --git a/docs/src/content/groups/suggestion.md b/docs/src/content/groups/suggestion.md deleted file mode 100644 index a6d52a5d..00000000 --- a/docs/src/content/groups/suggestion.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: suggestion -slug: suggestion -name: Suggestion -description: Groups content and participants concerned with Suggestion. -classification: ontology/topic/suggestion -aliases: [] -status: active ---- - -# Suggestion diff --git a/docs/src/content/groups/support.md b/docs/src/content/groups/support.md deleted file mode 100644 index 545f6ad0..00000000 --- a/docs/src/content/groups/support.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: support -slug: support -name: Support -description: Groups content and participants concerned with Support. -classification: ontology/topic/support -aliases: [] -status: active ---- - -# Support diff --git a/docs/src/content/groups/switch.md b/docs/src/content/groups/switch.md deleted file mode 100644 index ca5a4e7f..00000000 --- a/docs/src/content/groups/switch.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: switch -slug: switch -name: Switch -description: Groups content and participants concerned with Switch. -classification: ontology/topic/switch -aliases: [] -status: active ---- - -# Switch diff --git a/docs/src/content/groups/team-key.md b/docs/src/content/groups/team-key.md deleted file mode 100644 index 42d824b3..00000000 --- a/docs/src/content/groups/team-key.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: team-key -slug: team-key -name: Team Key -description: Groups content and participants concerned with Team Key. -classification: ontology/topic/team-key -aliases: [] -status: active ---- - -# Team Key diff --git a/docs/src/content/groups/team-overview.md b/docs/src/content/groups/team-overview.md deleted file mode 100644 index 887c8c57..00000000 --- a/docs/src/content/groups/team-overview.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: team-overview -slug: team-overview -name: Team Overview -description: Groups content and participants concerned with Team Overview. -classification: ontology/topic/team-overview -aliases: [] -status: active ---- - -# Team Overview diff --git a/docs/src/content/groups/team-settings.md b/docs/src/content/groups/team-settings.md deleted file mode 100644 index 8e7dea4e..00000000 --- a/docs/src/content/groups/team-settings.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: team-settings -slug: team-settings -name: Team Settings -description: Groups content and participants concerned with Team Settings. -classification: ontology/topic/team-settings -aliases: [] -status: active ---- - -# Team Settings diff --git a/docs/src/content/groups/team-vault-key.md b/docs/src/content/groups/team-vault-key.md deleted file mode 100644 index 36916bdf..00000000 --- a/docs/src/content/groups/team-vault-key.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: team-vault-key -slug: team-vault-key -name: Team Vault Key -description: Groups content and participants concerned with Team Vault Key. -classification: ontology/topic/team-vault-key -aliases: [] -status: active ---- - -# Team Vault Key diff --git a/docs/src/content/groups/teams.md b/docs/src/content/groups/teams.md deleted file mode 100644 index 20c06eeb..00000000 --- a/docs/src/content/groups/teams.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: teams -slug: teams -name: Teams -description: Groups content and participants concerned with Teams. -classification: ontology/topic/teams -aliases: [] -status: active ---- - -# Teams diff --git a/docs/src/content/groups/technical-writing.md b/docs/src/content/groups/technical-writing.md deleted file mode 100644 index 3af5b3b1..00000000 --- a/docs/src/content/groups/technical-writing.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: technical-writing -slug: technical-writing -name: Technical Writing -description: Groups content and participants concerned with Technical Writing. -classification: ontology/topic/technical-writing -aliases: [] -status: active ---- - -# Technical Writing diff --git a/docs/src/content/groups/testing.md b/docs/src/content/groups/testing.md deleted file mode 100644 index 7c8e1df9..00000000 --- a/docs/src/content/groups/testing.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: testing -slug: testing -name: Testing -description: Groups content and participants concerned with Testing. -classification: ontology/topic/testing -aliases: [] -status: active ---- - -# Testing diff --git a/docs/src/content/groups/theme.md b/docs/src/content/groups/theme.md deleted file mode 100644 index f68828cb..00000000 --- a/docs/src/content/groups/theme.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: theme -slug: theme -name: Theme -description: Groups content and participants concerned with Theme. -classification: ontology/topic/theme -aliases: [] -status: active ---- - -# Theme diff --git a/docs/src/content/groups/time-zone.md b/docs/src/content/groups/time-zone.md deleted file mode 100644 index 3edfe578..00000000 --- a/docs/src/content/groups/time-zone.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: time-zone -slug: time-zone -name: Time Zone -description: Groups content and participants concerned with Time Zone. -classification: ontology/topic/time-zone -aliases: [] -status: active ---- - -# Time Zone diff --git a/docs/src/content/groups/timestamp.md b/docs/src/content/groups/timestamp.md deleted file mode 100644 index 93fbd2f5..00000000 --- a/docs/src/content/groups/timestamp.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: timestamp -slug: timestamp -name: Timestamp -description: Groups content and participants concerned with Timestamp. -classification: ontology/topic/timestamp -aliases: [] -status: active ---- - -# Timestamp diff --git a/docs/src/content/groups/timezone.md b/docs/src/content/groups/timezone.md deleted file mode 100644 index 56b4296e..00000000 --- a/docs/src/content/groups/timezone.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: timezone -slug: timezone -name: Timezone -description: Groups content and participants concerned with Timezone. -classification: ontology/topic/timezone -aliases: [] -status: active ---- - -# Timezone diff --git a/docs/src/content/groups/title.md b/docs/src/content/groups/title.md deleted file mode 100644 index e67441d7..00000000 --- a/docs/src/content/groups/title.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: title -slug: title -name: Title -description: Groups content and participants concerned with Title. -classification: ontology/topic/title -aliases: [] -status: active ---- - -# Title diff --git a/docs/src/content/groups/token.md b/docs/src/content/groups/token.md deleted file mode 100644 index 09d0a48f..00000000 --- a/docs/src/content/groups/token.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: token -slug: token -name: Token -description: Groups content and participants concerned with Token. -classification: ontology/topic/token -aliases: [] -status: active ---- - -# Token diff --git a/docs/src/content/groups/traceability.md b/docs/src/content/groups/traceability.md deleted file mode 100644 index 8e2ea843..00000000 --- a/docs/src/content/groups/traceability.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: traceability -slug: traceability -name: Traceability -description: Groups content and participants concerned with Traceability. -classification: ontology/topic/traceability -aliases: [] -status: active ---- - -# Traceability diff --git a/docs/src/content/groups/transfer.md b/docs/src/content/groups/transfer.md deleted file mode 100644 index 91bde550..00000000 --- a/docs/src/content/groups/transfer.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: transfer -slug: transfer -name: Transfer -description: Groups content and participants concerned with Transfer. -classification: ontology/topic/transfer -aliases: [] -status: active ---- - -# Transfer diff --git a/docs/src/content/groups/triage.md b/docs/src/content/groups/triage.md deleted file mode 100644 index aecd2a86..00000000 --- a/docs/src/content/groups/triage.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: triage -slug: triage -name: Triage -description: Groups content and participants concerned with Triage. -classification: ontology/topic/triage -aliases: [] -status: active ---- - -# Triage diff --git a/docs/src/content/groups/username.md b/docs/src/content/groups/username.md deleted file mode 100644 index d45d826a..00000000 --- a/docs/src/content/groups/username.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: username -slug: username -name: Username -description: Groups content and participants concerned with Username. -classification: ontology/topic/username -aliases: [] -status: active ---- - -# Username diff --git a/docs/src/content/groups/validation.md b/docs/src/content/groups/validation.md deleted file mode 100644 index 8be0f0aa..00000000 --- a/docs/src/content/groups/validation.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: validation -slug: validation -name: Validation -description: Groups content and participants concerned with Validation. -classification: ontology/topic/validation -aliases: [] -status: active ---- - -# Validation diff --git a/docs/src/content/groups/vault.md b/docs/src/content/groups/vault.md deleted file mode 100644 index 5f30097f..00000000 --- a/docs/src/content/groups/vault.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: vault -slug: vault -name: Vault -description: Groups content and participants concerned with Vault. -classification: ontology/topic/vault -aliases: [] -status: active ---- - -# Vault diff --git a/docs/src/content/groups/verification.md b/docs/src/content/groups/verification.md deleted file mode 100644 index 47757a5f..00000000 --- a/docs/src/content/groups/verification.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: verification -slug: verification -name: Verification -description: Groups content and participants concerned with Verification. -classification: ontology/topic/verification -aliases: [] -status: active ---- - -# Verification diff --git a/docs/src/content/groups/viewer.md b/docs/src/content/groups/viewer.md deleted file mode 100644 index 67813305..00000000 --- a/docs/src/content/groups/viewer.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: viewer -slug: viewer -name: Viewer -description: Groups content and participants concerned with Viewer. -classification: ontology/topic/viewer -aliases: [] -status: active ---- - -# Viewer diff --git a/docs/src/content/groups/visibility.md b/docs/src/content/groups/visibility.md deleted file mode 100644 index 21297ada..00000000 --- a/docs/src/content/groups/visibility.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: visibility -slug: visibility -name: Visibility -description: Groups content and participants concerned with Visibility. -classification: ontology/topic/visibility -aliases: [] -status: active ---- - -# Visibility diff --git a/docs/src/content/groups/workers.md b/docs/src/content/groups/workers.md deleted file mode 100644 index 0eebaf8b..00000000 --- a/docs/src/content/groups/workers.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: workers -slug: workers -name: Workers -description: Groups content and participants concerned with Workers. -classification: ontology/topic/workers -aliases: [] -status: active ---- - -# Workers diff --git a/docs/src/content/groups/workflow.md b/docs/src/content/groups/workflow.md deleted file mode 100644 index f4cd11ae..00000000 --- a/docs/src/content/groups/workflow.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: workflow -slug: workflow -name: Workflow -description: Groups content and participants concerned with Workflow. -classification: ontology/topic/workflow -aliases: [] -status: active ---- - -# Workflow diff --git a/docs/src/content/groups/workload-identity.md b/docs/src/content/groups/workload-identity.md deleted file mode 100644 index dd38588a..00000000 --- a/docs/src/content/groups/workload-identity.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: workload-identity -slug: workload-identity -name: Workload Identity -description: Groups content and participants concerned with Workload Identity. -classification: ontology/topic/workload-identity -aliases: [] -status: active ---- - -# Workload Identity diff --git a/docs/src/content/groups/workspace.md b/docs/src/content/groups/workspace.md deleted file mode 100644 index 9a32d8e3..00000000 --- a/docs/src/content/groups/workspace.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: workspace -slug: workspace -name: Workspace -description: Groups content and participants concerned with Workspace. -classification: ontology/topic/workspace -aliases: [] -status: active ---- - -# Workspace diff --git a/docs/src/content/groups/wrapped-team-key.md b/docs/src/content/groups/wrapped-team-key.md deleted file mode 100644 index dca4e2dc..00000000 --- a/docs/src/content/groups/wrapped-team-key.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: wrapped-team-key -slug: wrapped-team-key -name: Wrapped Team Key -description: Groups content and participants concerned with Wrapped Team Key. -classification: ontology/topic/wrapped-team-key -aliases: [] -status: active ---- - -# Wrapped Team Key diff --git a/docs/src/content/groups/zero-knowledge.md b/docs/src/content/groups/zero-knowledge.md deleted file mode 100644 index 6d826c80..00000000 --- a/docs/src/content/groups/zero-knowledge.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: zero-knowledge -slug: zero-knowledge -name: Zero Knowledge -description: Groups content and participants concerned with Zero Knowledge. -classification: ontology/topic/zero-knowledge -aliases: [] -status: active ---- - -# Zero Knowledge diff --git a/docs/src/content/groups/zip.md b/docs/src/content/groups/zip.md deleted file mode 100644 index def17979..00000000 --- a/docs/src/content/groups/zip.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -contract: treeseed.group/v1 -id: zip -slug: zip -name: Zip -description: Groups content and participants concerned with Zip. -classification: ontology/topic/zip -aliases: [] -status: active ---- - -# Zip diff --git a/docs/src/content/knowledge/treeseed-accounts-and-identity/appearance.md b/docs/src/content/knowledge/treeseed-accounts-and-identity/appearance.md deleted file mode 100644 index 9f599527..00000000 --- a/docs/src/content/knowledge/treeseed-accounts-and-identity/appearance.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: account.appearance -bookId: treeseed-accounts-and-identity -slug: appearance -title: Themes and appearance -summary: Create personal themes and choose the active appearance safely. -status: published -visibility: authenticated -order: 10 -groupIds: - - appearance - - colors - - contrast - - dark-mode - - theme -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - account.identity -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.account.appearance -routePatterns: - - /app/account/appearance -resourceTypes: - - personal-theme -actionIds: [] -keywords: - - theme - - appearance - - colors - - dark mode - - contrast -documentationUrls: [] ---- - -Built-in themes are maintained by TreeSeed. Personal themes let you derive a reusable palette from a built-in base. - -Creating or editing a personal theme does not activate it automatically. Choose the active theme from the application header. - -The same selector can enable **Content theme overlay**. It gives the application content workspace an independent scheme and mode while leaving the header, team navigation, documentation, feedback, help, and account controls on the normal application appearance. Choose **Match application** to follow the shell's light or dark mode, or select a fixed or system-driven content mode. - -The overlay does not make interface elements translucent. Workspace backgrounds blend toward the selected scheme while text, focus indicators, actions, and status colors remain fully opaque and contrast-safe. Content command overlays use the workspace palette too. - -On the appearance page, changing the active theme reloads the page once so the editor and application shell use the same saved palette. Check both light and dark palettes for readable contrast before relying on a custom theme. diff --git a/docs/src/content/knowledge/treeseed-accounts-and-identity/connected-identities.md b/docs/src/content/knowledge/treeseed-accounts-and-identity/connected-identities.md deleted file mode 100644 index 1f91015a..00000000 --- a/docs/src/content/knowledge/treeseed-accounts-and-identity/connected-identities.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: account.connected-identities -bookId: treeseed-accounts-and-identity -slug: connected-identities -title: Connected sign-in identities -summary: Understand how external sign-in providers attach to your account and - when they may be removed. -status: published -visibility: authenticated -order: 20 -groupIds: - - github - - google - - identity - - provider - - sign-in -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - account.security - - account.emails - - account.sessions -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.account.identity -routePatterns: - - /app/account -resourceTypes: - - account -actionIds: - - account.provider.connect - - account.provider.disconnect -keywords: - - provider - - sign-in - - identity - - github - - google -documentationUrls: [] ---- - -Connected identities let an approved provider authenticate the same TreeSeed account. Connecting a provider does not grant that provider access to team service credentials. - -Before disconnecting an identity, keep another working sign-in method: a password or a second connected provider. Review active sessions after any unexpected provider change. - diff --git a/docs/src/content/knowledge/treeseed-accounts-and-identity/deletion.md b/docs/src/content/knowledge/treeseed-accounts-and-identity/deletion.md deleted file mode 100644 index 69d0f147..00000000 --- a/docs/src/content/knowledge/treeseed-accounts-and-identity/deletion.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: account.deletion -bookId: treeseed-accounts-and-identity -slug: deletion -title: Permanently deleting an account -summary: Understand blockers, reauthentication, confirmation, and the access - removed by deletion. -status: published -visibility: authenticated -order: 30 -groupIds: - - blockers - - delete-account - - irreversible - - reauthentication -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - account.security - - account.sessions -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.account.delete -routePatterns: - - /app/account/delete -resourceTypes: - - account -actionIds: [] -keywords: - - delete account - - blockers - - reauthentication - - irreversible -documentationUrls: [] ---- - -Account deletion is irreversible. It signs out every device and removes the account data allowed by retention and audit policy. - -TreeSeed checks for responsibilities that would be orphaned, such as sole team ownership. Resolve every blocker before trying again. - -Deletion requires recent reauthentication and the exact confirmation phrase shown in the form. A failed confirmation or password check must leave the account unchanged. diff --git a/docs/src/content/knowledge/treeseed-accounts-and-identity/emails.md b/docs/src/content/knowledge/treeseed-accounts-and-identity/emails.md deleted file mode 100644 index 0bad9f91..00000000 --- a/docs/src/content/knowledge/treeseed-accounts-and-identity/emails.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: account.emails -bookId: treeseed-accounts-and-identity -slug: emails -title: Email addresses and verification -summary: Add, verify, promote, and remove account email addresses without - weakening account recovery. -status: published -visibility: authenticated -order: 40 -groupIds: - - email - - primary - - recovery - - verification -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - account.identity - - account.security - - account.connected-identities -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.account.identity -routePatterns: - - /app/account -resourceTypes: - - account -actionIds: - - account.email.add - - account.email.verify - - account.email.primary - - account.email.remove -keywords: - - email - - verification - - primary - - recovery -documentationUrls: [] ---- - -## What verification proves - -TreeSeed sends a one-time link to each new address. The address remains pending until that exact link is accepted. Verification proves access to the mailbox; it does not change the primary address automatically. - -## Keep a recovery path - -An account must retain a usable verified address. Set another verified address as primary before removing the current primary address. If a link expires, request a new message from the email row rather than adding the address again. - diff --git a/docs/src/content/knowledge/treeseed-accounts-and-identity/identity.md b/docs/src/content/knowledge/treeseed-accounts-and-identity/identity.md deleted file mode 100644 index dd6989d9..00000000 --- a/docs/src/content/knowledge/treeseed-accounts-and-identity/identity.md +++ /dev/null @@ -1,61 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: account.identity -bookId: treeseed-accounts-and-identity -slug: identity -title: Account identity and public profile -summary: Understand which identity details are public, permanent, or used only - inside your account. -status: published -visibility: authenticated -order: 50 -groupIds: - - email - - identity - - profile - - timezone - - username -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - account.security - - account.sessions - - account.notifications - - account.appearance - - account.deletion -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.account.identity -routePatterns: - - /app/account -resourceTypes: - - account -actionIds: [] -keywords: - - profile - - username - - email - - timezone - - identity -documentationUrls: [] ---- - -Your account identity connects your sign-in credentials to the profile other people use to recognize your work. - -## Public identity - -Your username is the permanent address of your public profile. Your name, image, headline, website, location, areas of knowledge, and profile summary are optional public identity fields. - -Use a profile image and summary that make your knowledge work recognizable without exposing private contact or employment information. - -## Regional settings - -The time zone setting controls how dates and times are displayed throughout the authenticated application. It does not change the underlying recorded instant. - -## Email addresses - -Email addresses are private account credentials. New addresses remain pending until their confirmation link is used. Keep at least one verified address so account recovery remains possible. diff --git a/docs/src/content/knowledge/treeseed-accounts-and-identity/notifications.md b/docs/src/content/knowledge/treeseed-accounts-and-identity/notifications.md deleted file mode 100644 index 9d7592ac..00000000 --- a/docs/src/content/knowledge/treeseed-accounts-and-identity/notifications.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: account.notifications -bookId: treeseed-accounts-and-identity -slug: notifications -title: Notification preferences and project overrides -summary: Set a default notification policy and replace it only for selected projects. -status: published -visibility: authenticated -order: 60 -groupIds: - - cadence - - email - - notifications - - overrides - - projects -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - account.identity -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.account.notifications -routePatterns: - - /app/account/notifications -resourceTypes: - - account-notification-preferences -actionIds: [] -keywords: - - notifications - - projects - - overrides - - email - - cadence -documentationUrls: [] ---- - -Your all-project choices are the default for every project you can access. - -## Project overrides - -Selecting a project creates an independent set of content choices for that project. Expand the project to choose the same content categories available in the all-project section. - -An override replaces the default for that project; it does not add to it. Remove the override to return the project to your all-project choices. - -Email cadence controls grouped email delivery. In-application status remains available independently. diff --git a/docs/src/content/knowledge/treeseed-accounts-and-identity/project-overrides.md b/docs/src/content/knowledge/treeseed-accounts-and-identity/project-overrides.md deleted file mode 100644 index 1a329b37..00000000 --- a/docs/src/content/knowledge/treeseed-accounts-and-identity/project-overrides.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: account.project-overrides -bookId: treeseed-accounts-and-identity -slug: project-overrides -title: Project notification overrides -summary: Replace the all-project notification choices for selected projects - without changing the global policy. -status: published -visibility: authenticated -order: 70 -groupIds: - - content - - notifications - - overrides - - projects -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - account.notifications -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.account.notifications -routePatterns: - - /app/account/notifications -resourceTypes: - - notification-preferences -actionIds: - - account.notifications.override -keywords: - - notifications - - projects - - overrides - - content -documentationUrls: [] ---- - -The all-project choices are the default for every project you can access. Selecting a project override opens a separate set of content choices for that project. - -An override replaces—not adds to—the default choices. Remove the project from the override list to make it inherit the all-project policy again. - diff --git a/docs/src/content/knowledge/treeseed-accounts-and-identity/security.md b/docs/src/content/knowledge/treeseed-accounts-and-identity/security.md deleted file mode 100644 index 82210425..00000000 --- a/docs/src/content/knowledge/treeseed-accounts-and-identity/security.md +++ /dev/null @@ -1,57 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: account.security -bookId: treeseed-accounts-and-identity -slug: security -title: Passwords, email addresses, and connected identities -summary: Manage account sign-in methods without weakening recovery or exposing - private addresses. -status: published -visibility: authenticated -order: 80 -groupIds: - - email - - password - - provider - - security - - verification -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - account.identity - - account.sessions - - account.deletion -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.account.identity -routePatterns: - - /app/account -resourceTypes: - - account -actionIds: [] -keywords: - - password - - provider - - email - - verification - - security -documentationUrls: [] ---- - -TreeSeed can use a password, a configured identity provider, or both. Each connected identity should belong to you and remain recoverable. - -## Password changes - -Changing a password requires the current password when one already exists. New passwords use the same strength and confirmation checks as registration and password recovery. - -## Verified email - -A delivered confirmation message does not verify an address by itself. The one-time confirmation link must be opened successfully before the address becomes verified. - -## Connected providers - -Do not remove the last usable sign-in method. Before disconnecting a provider, confirm that another provider or password works. diff --git a/docs/src/content/knowledge/treeseed-accounts-and-identity/sessions.md b/docs/src/content/knowledge/treeseed-accounts-and-identity/sessions.md deleted file mode 100644 index bad71585..00000000 --- a/docs/src/content/knowledge/treeseed-accounts-and-identity/sessions.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: account.sessions -bookId: treeseed-accounts-and-identity -slug: sessions -title: Account sessions and device access -summary: Review signed-in devices, timestamps, network addresses, and safe - session revocation. -status: published -visibility: authenticated -order: 90 -groupIds: - - devices - - ip-address - - revoke - - sessions - - sign-out -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - account.security - - account.deletion -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.account.sessions -routePatterns: - - /app/account/sessions -resourceTypes: - - account-session -actionIds: [] -keywords: - - sessions - - devices - - revoke - - ip address - - sign out -documentationUrls: [] ---- - -Each session represents a browser or device that can currently act as your account. - -The list shows the user agent, recorded network address when available, creation time, and most recent activity using your account time zone. - -## Revoking access - -Revoke sessions you do not recognize or no longer use. The current session is protected from accidental inline revocation; use **Sign out** for the device you are using now. - -After a session is revoked, requests carrying that session must be rejected. diff --git a/docs/src/content/knowledge/treeseed-accounts-and-identity/time-zone.md b/docs/src/content/knowledge/treeseed-accounts-and-identity/time-zone.md deleted file mode 100644 index 79ec9347..00000000 --- a/docs/src/content/knowledge/treeseed-accounts-and-identity/time-zone.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: account.time-zone -bookId: treeseed-accounts-and-identity -slug: time-zone -title: Display time zone -summary: Choose the IANA time zone used to format dates and times throughout - authenticated TreeSeed pages. -status: published -visibility: authenticated -order: 100 -groupIds: - - date - - iana - - time-zone - - timestamp - - timezone -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - account.identity - - account.sessions - - account.notifications -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.account.identity -routePatterns: - - /app/account -resourceTypes: - - account-preferences -actionIds: - - account.time-zone.update -keywords: - - timezone - - time zone - - date - - timestamp - - IANA -documentationUrls: [] ---- - -TreeSeed stores each event as an absolute instant. Your display time zone changes only how that instant is presented in the interface. - -Choose the place whose daylight-saving rules you want TreeSeed to follow. The same setting is used during server rendering and later page updates so timestamps do not shift after loading. - diff --git a/docs/src/content/knowledge/treeseed-credential-security/grants.md b/docs/src/content/knowledge/treeseed-credential-security/grants.md deleted file mode 100644 index 8c9e67d2..00000000 --- a/docs/src/content/knowledge/treeseed-credential-security/grants.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: vault.grants -bookId: treeseed-credential-security -slug: grants -title: Administrator vault grants -summary: Give another administrator cryptographic access without sharing - passphrases or provider credentials. -status: published -visibility: authenticated -order: 10 -groupIds: - - administrator - - grant - - revoke - - wrapped-team-key -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - vault.recovery - - vault.rotation - - vault.reset -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.services.vault -routePatterns: - - /app/services/vault -resourceTypes: - - team-vault-grant -actionIds: [] -keywords: - - grant - - revoke - - administrator - - wrapped team key -documentationUrls: [] ---- - -Each administrator registers a separate public key and protects their private key with a personal passphrase. - -Granting access opens the team vault key only in your browser and wraps it to the recipient’s public key. The recipient never learns your passphrase, and you never learn theirs. - -Revoke cryptographic access separately from changing a team role. After removing a credential administrator or suspecting key compromise, rotate the team vault key for the remaining grants. diff --git a/docs/src/content/knowledge/treeseed-credential-security/overview.md b/docs/src/content/knowledge/treeseed-credential-security/overview.md deleted file mode 100644 index 76664e8f..00000000 --- a/docs/src/content/knowledge/treeseed-credential-security/overview.md +++ /dev/null @@ -1,55 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: vault.overview -bookId: treeseed-credential-security -slug: overview -title: How the service vault works -summary: Understand personal keys, team custody, encrypted credentials, and the - boundary TreeSeed cannot cross. -status: published -visibility: authenticated -order: 20 -groupIds: - - encryption - - passphrase - - service-vault - - team-key - - zero-knowledge -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - vault.personal-key - - vault.team-custody - - vault.recovery - - vault.grants - - vault.rotation - - vault.reset - - services.credentials -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.services.vault -routePatterns: - - /app/services/vault -resourceTypes: - - team-vault -actionIds: [] -keywords: - - service vault - - passphrase - - encryption - - team key - - zero knowledge -documentationUrls: [] ---- - -The service vault protects provider credentials without giving the TreeSeed API a general decryption path. - -Your personal passphrase encrypts your administrator private key in the browser. A separate random team vault key wraps credential keys and is independently granted to authorized administrators. - -TreeSeed stores public keys, ciphertext, wrapped keys, salts, nonces, versions, and fingerprints. It never retains passphrases, plaintext provider tokens, derived keys, unlocked private keys, or decryptable team keys. - -Unlocking is temporary and in-memory. Signing out or reaching the inactivity limit locks the browser controller. diff --git a/docs/src/content/knowledge/treeseed-credential-security/personal-key.md b/docs/src/content/knowledge/treeseed-credential-security/personal-key.md deleted file mode 100644 index 7406e6ac..00000000 --- a/docs/src/content/knowledge/treeseed-credential-security/personal-key.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: vault.personal-key -bookId: treeseed-credential-security -slug: personal-key -title: Step 1 — Create personal vault access -summary: Create an administrator key protected by a personal passphrase that is - separate from your account password. -status: published -visibility: authenticated -order: 30 -groupIds: - - account-password - - administrator-key - - personal-passphrase - - step-1 -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - vault.team-custody - - vault.recovery - - vault.rotation - - vault.overview -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.services.vault -routePatterns: - - /app/services/vault -resourceTypes: - - user-vault-key -actionIds: [] -keywords: - - step 1 - - personal passphrase - - administrator key - - account password -documentationUrls: [] ---- - -Step 1 creates a public/private encryption keypair in your browser. - -Choose a new **personal vault passphrase**. This is not your TreeSeed account password. The passphrase derives a local encryption key that protects the private half of your administrator keypair. - -Only the public key and encrypted private-key envelope are sent to TreeSeed. The passphrase and derived key remain in browser memory and are discarded after the operation. - -You will re-enter this same passphrase in step 2. Step 2 does not create another passphrase. diff --git a/docs/src/content/knowledge/treeseed-credential-security/provider-credential-rotation.md b/docs/src/content/knowledge/treeseed-credential-security/provider-credential-rotation.md deleted file mode 100644 index ed8d854c..00000000 --- a/docs/src/content/knowledge/treeseed-credential-security/provider-credential-rotation.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: vault.provider-credential-rotation -bookId: treeseed-credential-security -slug: provider-credential-rotation -title: Rotating provider credentials -summary: Replace a token at its provider and then encrypt the replacement - without confusing encryption rotation with credential revocation. -status: published -visibility: team -order: 40 -groupIds: - - compromise - - credential - - revoke - - rotation - - token -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - services.credentials - - vault.rotation - - vault.reset -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.services.detail - - admin.services.vault -routePatterns: - - /app/services/[connectionId] - - /app/services/vault -resourceTypes: - - credential-envelope -actionIds: - - service.credential.replace -keywords: - - credential - - token - - rotation - - revoke - - compromise -documentationUrls: [] ---- - -If a provider credential may be exposed, revoke or rotate it in the provider’s own interface first. Re-encrypting the same value does not invalidate a copied token. - -Create a replacement with the minimum required permissions, save it into the matching credential profile, validate it with a read-only lease, and then revoke the old provider credential. - diff --git a/docs/src/content/knowledge/treeseed-credential-security/recovery.md b/docs/src/content/knowledge/treeseed-credential-security/recovery.md deleted file mode 100644 index e0736f27..00000000 --- a/docs/src/content/knowledge/treeseed-credential-security/recovery.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: vault.recovery -bookId: treeseed-credential-security -slug: recovery -title: Step 3 — Plan vault recovery -summary: Know when another administrator can restore access and when protected - credentials must be reentered. -status: published -visibility: authenticated -order: 50 -groupIds: - - forgotten-passphrase - - recovery - - sole-administrator - - step-3 -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - vault.grants - - vault.rotation - - vault.reset - - vault.overview -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.services.vault -routePatterns: - - /app/services/vault -resourceTypes: - - team-vault -actionIds: [] -keywords: - - step 3 - - recovery - - forgotten passphrase - - sole administrator -documentationUrls: [] ---- - -Another currently authorized credential administrator can grant a replacement personal key access after you forget your passphrase. - -If the sole credential administrator loses the passphrase, nobody—including TreeSeed support—can recover the old ciphertext. Reset the vault and reenter every protected provider credential. - -For resilient custody, grant at least one other trusted administrator and review grants after team role changes. A team role alone does not create or revoke cryptographic access. diff --git a/docs/src/content/knowledge/treeseed-credential-security/reset.md b/docs/src/content/knowledge/treeseed-credential-security/reset.md deleted file mode 100644 index f1f79578..00000000 --- a/docs/src/content/knowledge/treeseed-credential-security/reset.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: vault.reset -bookId: treeseed-credential-security -slug: reset -title: Destructive vault reset -summary: Permanently discard inaccessible encrypted credentials and initialize - replacement custody. -status: published -visibility: authenticated -order: 60 -groupIds: - - discard-credentials - - irreversible - - reauthentication - - reset-vault -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - vault.recovery - - vault.grants - - vault.rotation -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.services.vault -routePatterns: - - /app/services/vault -resourceTypes: - - team-vault -actionIds: [] -keywords: - - reset vault - - discard credentials - - irreversible - - reauthentication -documentationUrls: [] ---- - -Reset is only for the case where no usable administrator grant remains. - -The operation permanently discards protected provider credential envelopes. It cannot recover, reveal, or migrate their plaintext values. Every credential must be recreated or reentered afterward. - -Reset requires owner authorization, recent account reauthentication, your personal vault passphrase for the replacement grant, and the exact confirmation text shown by the form. diff --git a/docs/src/content/knowledge/treeseed-credential-security/rotation.md b/docs/src/content/knowledge/treeseed-credential-security/rotation.md deleted file mode 100644 index ce07435a..00000000 --- a/docs/src/content/knowledge/treeseed-credential-security/rotation.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: vault.rotation -bookId: treeseed-credential-security -slug: rotation -title: Passphrase, team-key, and provider credential rotation -summary: Choose the rotation that matches the material that may be exposed. -status: published -visibility: authenticated -order: 70 -groupIds: - - rotate-passphrase - - rotate-team-key - - rotate-token -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - vault.grants - - vault.recovery - - services.credentials -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.services.vault -routePatterns: - - /app/services/vault -resourceTypes: - - team-vault -actionIds: [] -keywords: - - rotate passphrase - - rotate team key - - rotate token -documentationUrls: [] ---- - -Personal passphrase rotation re-encrypts only your administrator private-key envelope. Provider credentials do not need to be decrypted or rewritten. - -Team vault-key rotation rewraps credential keys and remaining administrator grants. Use it after grant revocation or suspected team-key exposure. - -Provider credential rotation happens at GitHub, Cloudflare, Railway, or the relevant provider. Re-encrypting a token does not invalidate a token that was already exposed. diff --git a/docs/src/content/knowledge/treeseed-credential-security/team-custody.md b/docs/src/content/knowledge/treeseed-credential-security/team-custody.md deleted file mode 100644 index 7ea5a04f..00000000 --- a/docs/src/content/knowledge/treeseed-credential-security/team-custody.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: vault.team-custody -bookId: treeseed-credential-security -slug: team-custody -title: Step 2 — Initialize team credential custody -summary: Reuse the step-1 passphrase to unlock your key and wrap a new random - team vault key. -status: published -visibility: authenticated -order: 80 -groupIds: - - key-wrapping - - same-passphrase - - step-2 - - team-vault-key -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - vault.personal-key - - vault.recovery - - vault.grants - - vault.overview -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.services.vault -routePatterns: - - /app/services/vault -resourceTypes: - - team-vault -actionIds: [] -keywords: - - step 2 - - same passphrase - - team vault key - - key wrapping -documentationUrls: [] ---- - -Enter the **same personal vault passphrase you created in step 1**. - -The browser uses it to unlock your encrypted administrator private key. It then creates a random team vault key and wraps access to that key for your administrator identity. - -This step does not create a second passphrase, a shared team passphrase, or a recoverable server key. Your personal passphrase remains local and is never sent to or stored by TreeSeed. - -Other credential administrators use their own personal keys and their own passphrases. diff --git a/docs/src/content/knowledge/treeseed-feedback-and-support/administration.md b/docs/src/content/knowledge/treeseed-feedback-and-support/administration.md deleted file mode 100644 index 7a40314b..00000000 --- a/docs/src/content/knowledge/treeseed-feedback-and-support/administration.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: feedback.administration -bookId: treeseed-feedback-and-support -slug: administration -title: Feedback administration -summary: Search, filter, investigate, and export feedback without exposing - private context. -status: published -visibility: admin -order: 20 -groupIds: - - administration - - feedback - - filter - - platform-admin - - search -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - feedback.triage - - feedback.exports - - feedback.privacy -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.feedback.collection -routePatterns: - - /app/feedback -resourceTypes: - - feedback -actionIds: [] -keywords: - - feedback - - administration - - search - - filter - - platform admin -documentationUrls: [] ---- - -The feedback collection is restricted to platform administrators because reports can include private account, team, route, and screenshot context. - -Use search and filters to locate related reports. Opening a record shows its verified submission context, technical details, attachment privacy state, and immutable status history. - -Team administrators and market administrators do not receive feedback access. diff --git a/docs/src/content/knowledge/treeseed-feedback-and-support/exports.md b/docs/src/content/knowledge/treeseed-feedback-and-support/exports.md deleted file mode 100644 index 20d021b4..00000000 --- a/docs/src/content/knowledge/treeseed-feedback-and-support/exports.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: feedback.exports -bookId: treeseed-feedback-and-support -slug: exports -title: Privacy-safe feedback exports -summary: Prepare bounded feedback bundles for human review and AI-assisted remediation. -status: published -visibility: admin -order: 30 -groupIds: - - ai - - export - - jsonl - - privacy - - provenance - - zip -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - feedback.administration - - feedback.triage - - feedback.privacy -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.feedback.collection -routePatterns: - - /app/feedback -resourceTypes: - - feedback-export -actionIds: [] -keywords: - - export - - AI - - JSONL - - ZIP - - privacy - - provenance -documentationUrls: [] ---- - -An export contains at most 500 selected or filtered records. The ZIP includes a policy manifest, agent-oriented JSONL, and a human-readable Markdown review. - -Direct personal identifiers such as email, display name, username, and profile image are omitted. Opaque identifiers, route and build context, the message, status, and resolution history remain so work can be correlated safely. - -Exports expire after 7 days. Creating an export records provenance but does not change feedback status. diff --git a/docs/src/content/knowledge/treeseed-feedback-and-support/fields.md b/docs/src/content/knowledge/treeseed-feedback-and-support/fields.md deleted file mode 100644 index 06723dc9..00000000 --- a/docs/src/content/knowledge/treeseed-feedback-and-support/fields.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: content.fields -bookId: treeseed-feedback-and-support -slug: fields -title: Content record fields -summary: Understand the stable identity, workflow, attribution, and Markdown - fields shared by knowledge records. -status: published -visibility: authenticated -order: 10 -groupIds: - - author - - content-fields - - slug - - status - - title -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: [] -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: [] -routePatterns: [] -resourceTypes: [] -actionIds: [] -keywords: - - title - - slug - - status - - author - - content fields -documentationUrls: [] ---- - -Titles should be short and scannable. Slugs are URL-safe identifiers and can usually be generated from the title. - -Status describes where a record sits in its workflow. Type or horizon fields describe the kind of record rather than its completion state. - -Descriptions and summaries support quick discovery; the Markdown body contains the complete record. Attribution identifies the person or agent responsible for the content. diff --git a/docs/src/content/knowledge/treeseed-feedback-and-support/privacy.md b/docs/src/content/knowledge/treeseed-feedback-and-support/privacy.md deleted file mode 100644 index 6bf1e82e..00000000 --- a/docs/src/content/knowledge/treeseed-feedback-and-support/privacy.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: feedback.privacy -bookId: treeseed-feedback-and-support -slug: privacy -title: Feedback privacy boundary -summary: Learn which context is stored, who can inspect it, and how retention works. -status: published -visibility: authenticated -order: 40 -groupIds: - - audit - - contact - - identity - - privacy - - retention -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - feedback.submitting - - feedback.screenshot-privacy - - feedback.exports -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.feedback.submit - - admin.feedback.detail -routePatterns: - - /app/* -resourceTypes: - - feedback-privacy -actionIds: [] -keywords: - - privacy - - identity - - retention - - audit - - contact -documentationUrls: [] ---- - -Feedback text and private attachment metadata are durable feedback records. Audit events contain correlation identifiers and status metadata only; they do not duplicate messages, email addresses, browser details, or images. - -Only platform administrators can read reports. Attachment and export downloads pass through authorized, no-store API responses and never reveal raw storage keys or provider URLs. - -Feedback text and status history remain for auditability. Screenshots expire 90 days after resolution and export bundles expire after 7 days. diff --git a/docs/src/content/knowledge/treeseed-feedback-and-support/screenshot-privacy.md b/docs/src/content/knowledge/treeseed-feedback-and-support/screenshot-privacy.md deleted file mode 100644 index 98ac00d3..00000000 --- a/docs/src/content/knowledge/treeseed-feedback-and-support/screenshot-privacy.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: feedback.screenshot-privacy -bookId: treeseed-feedback-and-support -slug: screenshot-privacy -title: Screenshot capture and redaction -summary: Understand what the optional browser capture masks and how private - images are retained. -status: published -visibility: authenticated -order: 50 -groupIds: - - attachment - - capture - - privacy - - redact - - screenshot -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - feedback.submitting - - feedback.privacy -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.feedback.submit -routePatterns: - - /app/* -resourceTypes: - - feedback-attachment -actionIds: [] -keywords: - - screenshot - - capture - - redact - - privacy - - attachment -documentationUrls: [] ---- - -Screenshot capture happens in your browser and includes the complete page, including content below the visible viewport and any help, dialog, or popover that is open when you capture it. On desktop, the image ends at the page edge beside the feedback panel, so the panel never covers or changes the recorded page. - -Typed values in freeform form controls, editable content, and explicitly marked private regions are masked while ordinary navigation, labels, selectors, and non-sensitive page content remain visible. Embedded content that cannot be captured safely is marked unavailable rather than presented as a privacy redaction. - -Always inspect the preview before sending. Select the thumbnail to open a larger, scrollable review and close it when you are finished. Capture never uploads automatically, and you can replace or remove it. - -Screenshots are stored privately. They remain available while feedback is open and expire 90 days after resolution. diff --git a/docs/src/content/knowledge/treeseed-feedback-and-support/submitting.md b/docs/src/content/knowledge/treeseed-feedback-and-support/submitting.md deleted file mode 100644 index 6f1ef31a..00000000 --- a/docs/src/content/knowledge/treeseed-feedback-and-support/submitting.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: feedback.submitting -bookId: treeseed-feedback-and-support -slug: submitting -title: Submit useful product feedback -summary: Explain a problem or idea while TreeSeed attaches verified page and - account context. -status: published -visibility: authenticated -order: 60 -groupIds: - - context - - feedback - - issue - - report - - suggestion -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - feedback.screenshot-privacy - - feedback.privacy -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.feedback.submit -routePatterns: - - /app/* -resourceTypes: - - feedback -actionIds: [] -keywords: - - feedback - - report - - issue - - suggestion - - context -documentationUrls: [] ---- - -Choose the closest feedback type and describe what you expected, what happened, and how it affected your work. - -TreeSeed derives your signed-in identity and validates your team or project access when the report is submitted. You cannot change those values in the feedback panel. Administrators see your verified email only when you explicitly allow follow-up. - -Never include passwords, provider tokens, private keys, or other secrets in the message. diff --git a/docs/src/content/knowledge/treeseed-feedback-and-support/triage.md b/docs/src/content/knowledge/treeseed-feedback-and-support/triage.md deleted file mode 100644 index 4e51174c..00000000 --- a/docs/src/content/knowledge/treeseed-feedback-and-support/triage.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: feedback.triage -bookId: treeseed-feedback-and-support -slug: triage -title: Triage and resolution notes -summary: Move feedback through a clear workflow and preserve useful resolution evidence. -status: published -visibility: admin -order: 70 -groupIds: - - in-progress - - notes - - reopen - - resolve - - triage -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - feedback.administration - - feedback.exports - - feedback.privacy -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.feedback.detail -routePatterns: - - /app/feedback/* -resourceTypes: - - feedback-status -actionIds: [] -keywords: - - triage - - in progress - - resolve - - reopen - - notes -documentationUrls: [] ---- - -Use **Triaged** after reviewing scope, **In progress** when work has started, and **Resolved** only when the outcome is known. - -Resolution and reopening require a note. Record what changed, why no change was needed, or what new evidence caused the report to reopen. Notes become part of the immutable status timeline. - -Status changes do not alter export provenance or erase the original message. diff --git a/docs/src/content/knowledge/treeseed-services-and-providers/activity.md b/docs/src/content/knowledge/treeseed-services-and-providers/activity.md deleted file mode 100644 index b4ca74a2..00000000 --- a/docs/src/content/knowledge/treeseed-services-and-providers/activity.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: services.activity -bookId: treeseed-services-and-providers -slug: activity -title: Service activity and validation history -summary: Review connection changes and validation outcomes without exposing - credential values. -status: published -visibility: team -order: 10 -groupIds: - - activity - - audit - - timestamp - - validation -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - services.connection - - services.validation - - services.settings -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.services.detail -routePatterns: - - /app/services/[connectionId] -resourceTypes: - - team-service-connection -actionIds: - - service.activity.read -keywords: - - activity - - audit - - validation - - timestamp -documentationUrls: [] ---- - -Service activity records security-sensitive metadata such as who connected or edited a provider, which capability changed, and whether read-only validation succeeded. - -Times are displayed in your account time zone. Audit payloads contain fingerprints and correlation identifiers, never passphrases, plaintext credentials, derived keys, or decrypted provider responses. - diff --git a/docs/src/content/knowledge/treeseed-services-and-providers/capabilities.md b/docs/src/content/knowledge/treeseed-services-and-providers/capabilities.md deleted file mode 100644 index 3779ecd4..00000000 --- a/docs/src/content/knowledge/treeseed-services-and-providers/capabilities.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: services.capabilities -bookId: treeseed-services-and-providers -slug: capabilities -title: Service capability bindings -summary: Enable provider-neutral capabilities independently and make them - available to future project and capacity workflows. -status: published -visibility: team -order: 20 -groupIds: - - binding - - capability - - hosting - - repository - - workflow -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - services.connection - - services.providers - - services.credentials -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.services.create - - admin.services.detail -routePatterns: - - /app/services/new - - /app/services/[connectionId] -resourceTypes: - - service-capability-binding -actionIds: - - service.capability.enable - - service.capability.disable -keywords: - - capability - - binding - - repository - - workflow - - hosting -documentationUrls: [] ---- - -A connection represents one provider account boundary. Capability bindings describe the separate jobs that connection may perform. - -Enable only the capabilities the team needs. Repository hosting, workflow execution, secret enclaves, frontend hosting, backend hosting, DNS, and other capabilities remain distinct even when one provider supplies several. - diff --git a/docs/src/content/knowledge/treeseed-services-and-providers/connect.md b/docs/src/content/knowledge/treeseed-services-and-providers/connect.md deleted file mode 100644 index 488937e2..00000000 --- a/docs/src/content/knowledge/treeseed-services-and-providers/connect.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: services.connect -bookId: treeseed-services-and-providers -slug: connect -title: Connecting a provider service -summary: Choose a provider account, enable only required capabilities, and - review credential custody before saving. -status: published -visibility: authenticated -order: 30 -groupIds: - - capability - - connect-service - - credentials - - provider -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - services.providers - - services.credentials - - vault.overview - - provider.github - - provider.cloudflare - - provider.railway - - provider.openbao -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.services.create -routePatterns: - - /app/services/new -resourceTypes: - - team-service-connection -actionIds: [] -keywords: - - connect service - - provider - - capability - - credentials -documentationUrls: [] ---- - -Start with the provider account boundary, then enable the capabilities this team expects to use. - -Account IDs, organization names, installation IDs, and workspace IDs are non-secret metadata. Provider tokens, private keys, and other authentication material belong in encrypted credential profiles after the connection exists. - -Select only capabilities the team needs. Planned capabilities describe future compatibility but do not prove a deployment or resource mutation exists. diff --git a/docs/src/content/knowledge/treeseed-services-and-providers/connection.md b/docs/src/content/knowledge/treeseed-services-and-providers/connection.md deleted file mode 100644 index 9397bb71..00000000 --- a/docs/src/content/knowledge/treeseed-services-and-providers/connection.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: services.connection -bookId: treeseed-services-and-providers -slug: connection -title: Service connection administration -summary: Maintain metadata, capabilities, credential readiness, activity, - validation, and safe disconnection. -status: published -visibility: authenticated -order: 40 -groupIds: - - capabilities - - connection-settings - - disconnect - - validation -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - services.credentials - - services.external-vault - - services.providers - - services.connections -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.services.detail -routePatterns: - - /app/services/[connectionId] -resourceTypes: - - team-service-connection -actionIds: [] -keywords: - - connection settings - - capabilities - - validation - - disconnect -documentationUrls: [] ---- - -The connection page separates readable provider metadata from encrypted credential custody. - -Changing capabilities does not automatically create provider resources. It records which provider-neutral capability bindings future operations may select. - -Read-only validation uses an operation-scoped lease and only the credential fields required by that validation. Disconnection is blocked while another allocation depends on the connection and permanently removes its encrypted credential envelopes when it succeeds. diff --git a/docs/src/content/knowledge/treeseed-services-and-providers/connections.md b/docs/src/content/knowledge/treeseed-services-and-providers/connections.md deleted file mode 100644 index 63d30799..00000000 --- a/docs/src/content/knowledge/treeseed-services-and-providers/connections.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: services.connections -bookId: treeseed-services-and-providers -slug: connections -title: Connected provider services -summary: Understand provider connections, capability bindings, custody - readiness, and active-team scope. -status: published -visibility: authenticated -order: 50 -groupIds: - - active-team - - capabilities - - connections - - providers - - services -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - services.connect - - services.connection - - services.credentials - - services.providers - - vault.overview -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.services.collection -routePatterns: - - /app/services -resourceTypes: - - team-service-connection -actionIds: [] -keywords: - - services - - providers - - connections - - capabilities - - active team -documentationUrls: [] ---- - -A service connection represents a provider account boundary such as a GitHub organization, Cloudflare account, or Railway workspace. - -Connections belong to the active team. Switching teams immediately changes the collection and never exposes another team’s encrypted envelopes. - -Capabilities are enabled independently. A provider may support repository hosting, workflow execution, secret enclaves, frontend hosting, or other purposes without making those purposes interchangeable. diff --git a/docs/src/content/knowledge/treeseed-services-and-providers/credentials.md b/docs/src/content/knowledge/treeseed-services-and-providers/credentials.md deleted file mode 100644 index 1742d8b3..00000000 --- a/docs/src/content/knowledge/treeseed-services-and-providers/credentials.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: services.credentials -bookId: treeseed-services-and-providers -slug: credentials -title: Encrypted provider credentials -summary: Learn what is encrypted, who can use it, and how interactive operations - receive credentials. -status: published -visibility: authenticated -order: 60 -groupIds: - - credentials - - encryption - - envelope - - lease - - token -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - vault.overview - - vault.grants - - vault.rotation - - services.external-vault -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.services.detail - - admin.services.vault -routePatterns: - - /app/services/[connectionId] - - /app/services/vault -resourceTypes: - - credential-profile -actionIds: [] -keywords: - - credentials - - encryption - - token - - envelope - - lease -documentationUrls: [] ---- - -Only authentication secrets are encrypted. Searchable account identifiers and labels remain ordinary metadata. - -The browser encrypts each sensitive value with associated data binding it to the team, connection, profile, field, purpose, and envelope version. Moving ciphertext to another context makes it unusable. - -For an interactive operation, the browser decrypts only required fields and seals them to a short-lived runner key. The runner consumes the lease once, uses plaintext in memory, redacts output, and discards the key material. diff --git a/docs/src/content/knowledge/treeseed-services-and-providers/disconnection.md b/docs/src/content/knowledge/treeseed-services-and-providers/disconnection.md deleted file mode 100644 index f303063c..00000000 --- a/docs/src/content/knowledge/treeseed-services-and-providers/disconnection.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: services.disconnection -bookId: treeseed-services-and-providers -slug: disconnection -title: Disconnecting a service -summary: Resolve capability consumers before removing a connection and its - encrypted credential records. -status: published -visibility: team -order: 70 -groupIds: - - blocker - - ciphertext - - delete - - disconnect -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - services.settings - - services.capabilities - - vault.reset -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.services.detail -routePatterns: - - /app/services/[connectionId] -resourceTypes: - - team-service-connection -actionIds: - - service.connection.disconnect -keywords: - - disconnect - - delete - - blocker - - ciphertext -documentationUrls: [] ---- - -Disconnecting removes TreeSeed’s connection metadata, capability bindings, credential profiles, encrypted envelopes, and related run-owned leases. It does not delete anything at the provider. - -The operation is blocked while another platform resource references the connection. Resolve every dependency before confirming disconnection. - diff --git a/docs/src/content/knowledge/treeseed-services-and-providers/external-vault.md b/docs/src/content/knowledge/treeseed-services-and-providers/external-vault.md deleted file mode 100644 index 0ed00a45..00000000 --- a/docs/src/content/knowledge/treeseed-services-and-providers/external-vault.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: services.external-vault -bookId: treeseed-services-and-providers -slug: external-vault -title: External vault references -summary: Configure unattended credential references without storing a long-lived - vault token. -status: published -visibility: authenticated -order: 80 -groupIds: - - jwt - - oidc - - openbao - - vault - - workload-identity -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - provider.openbao - - services.credentials - - vault.overview -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.services.detail -routePatterns: - - /app/services/[connectionId] -resourceTypes: - - external-vault-binding -actionIds: [] -keywords: - - vault - - openbao - - oidc - - jwt - - workload identity -documentationUrls: [] ---- - -An external vault binding stores an HTTPS address, secrets mount, and workload-identity role. It does not store a long-lived Vault or OpenBao token. - -The operations runner authenticates with OIDC/JWT workload identity and resolves only an approved secret reference for an authorized operation. - -Treat an external vault as an unattended execution source, not a way to recover personal TreeSeed passphrases or decrypt the client-managed team vault. diff --git a/docs/src/content/knowledge/treeseed-services-and-providers/provider-cloudflare.md b/docs/src/content/knowledge/treeseed-services-and-providers/provider-cloudflare.md deleted file mode 100644 index b0a3de92..00000000 --- a/docs/src/content/knowledge/treeseed-services-and-providers/provider-cloudflare.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: provider.cloudflare -bookId: treeseed-services-and-providers -slug: provider-cloudflare -title: Connecting Cloudflare safely -summary: Separate runtime, DNS, and storage tokens and restrict each one to - exact account or zone resources. -status: published -visibility: authenticated -order: 90 -groupIds: - - api-token - - cloudflare - - dns - - pages - - r2 - - workers -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - services.connect - - services.providers - - services.credentials -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: [] -routePatterns: [] -resourceTypes: [] -actionIds: [] -keywords: - - cloudflare - - pages - - workers - - dns - - r2 - - api token -documentationUrls: - - https://developers.cloudflare.com/fundamentals/api/get-started/create-token/ ---- - -Record the Cloudflare account ID as non-secret metadata. Never use the Global API Key. - -Create separate custom API tokens for frontend runtime, DNS, and storage capabilities. Grant only the permission named by the enabled capability and restrict resources to the connected account or exact managed zones. - -Save each one-time token in its matching encrypted profile. Rotating one capability token should not require exposing or replacing unrelated credentials. diff --git a/docs/src/content/knowledge/treeseed-services-and-providers/provider-github.md b/docs/src/content/knowledge/treeseed-services-and-providers/provider-github.md deleted file mode 100644 index c275d536..00000000 --- a/docs/src/content/knowledge/treeseed-services-and-providers/provider-github.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: provider.github -bookId: treeseed-services-and-providers -slug: provider-github -title: Connecting GitHub safely -summary: Use a GitHub App installation with capability-specific repository, - workflow, and secret authority. -status: published -visibility: authenticated -order: 100 -groupIds: - - actions - - github-app - - installation - - repositories - - secrets -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - services.connect - - services.providers - - services.credentials -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: [] -routePatterns: [] -resourceTypes: [] -actionIds: [] -keywords: - - github app - - installation - - actions - - repositories - - secrets -documentationUrls: - - https://docs.github.com/apps/creating-github-apps ---- - -Prefer a GitHub App over a personal access token. - -1. Create or open a GitHub App in organization settings. -2. Grant metadata read access plus only the repository contents, Actions, and secrets permissions required by enabled capabilities. -3. Install the App on only the repositories TreeSeed may manage. -4. Record the public App and installation IDs. -5. Generate a private key, save it into the encrypted credential profile, validate it, and remove the downloaded file. - -Repository selection and App permissions jointly define the authority boundary. diff --git a/docs/src/content/knowledge/treeseed-services-and-providers/provider-openbao.md b/docs/src/content/knowledge/treeseed-services-and-providers/provider-openbao.md deleted file mode 100644 index efed840e..00000000 --- a/docs/src/content/knowledge/treeseed-services-and-providers/provider-openbao.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: provider.openbao -bookId: treeseed-services-and-providers -slug: provider-openbao -title: Connecting OpenBao or HashiCorp Vault -summary: Use workload identity and references instead of storing a reusable vault token. -status: published -visibility: authenticated -order: 110 -groupIds: - - hashicorp-vault - - jwt - - oidc - - openbao - - workload-identity -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - services.external-vault - - services.providers - - services.credentials -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: [] -routePatterns: [] -resourceTypes: [] -actionIds: [] -keywords: - - openbao - - hashicorp vault - - oidc - - jwt - - workload identity -documentationUrls: - - https://openbao.org/docs/auth/jwt/ ---- - -Configure an HTTPS vault address, secrets mount, and an OIDC/JWT role dedicated to TreeSeed operations. - -The role should authorize only expected paths and operations. The operations runner exchanges its workload identity for short-lived access when an authorized unattended operation begins. - -Do not enter a personal, root, or long-lived vault token. External vaults do not store or recover TreeSeed personal passphrases. diff --git a/docs/src/content/knowledge/treeseed-services-and-providers/provider-railway.md b/docs/src/content/knowledge/treeseed-services-and-providers/provider-railway.md deleted file mode 100644 index 06ccf9bd..00000000 --- a/docs/src/content/knowledge/treeseed-services-and-providers/provider-railway.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: provider.railway -bookId: treeseed-services-and-providers -slug: provider-railway -title: Connecting Railway safely -summary: Record a workspace boundary and acknowledge the broader authority of - shared Railway tokens. -status: published -visibility: authenticated -order: 120 -groupIds: - - api-token - - blast-radius - - railway - - workspace -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - services.connect - - services.providers - - services.credentials -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: [] -routePatterns: [] -resourceTypes: [] -actionIds: [] -keywords: - - railway - - workspace - - api token - - blast radius -documentationUrls: - - https://docs.railway.com/guides/public-api ---- - -Record the Railway workspace ID as non-secret metadata. - -Railway workspace tokens may span several capabilities. Create a token in the exact workspace, verify that it matches the recorded workspace ID, and store it only in the encrypted Railway profile. - -Use a dedicated workspace when stronger separation is required. Before revoking an old token, save and validate its replacement. diff --git a/docs/src/content/knowledge/treeseed-services-and-providers/providers.md b/docs/src/content/knowledge/treeseed-services-and-providers/providers.md deleted file mode 100644 index f49cae5d..00000000 --- a/docs/src/content/knowledge/treeseed-services-and-providers/providers.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: services.providers -bookId: treeseed-services-and-providers -slug: providers -title: Provider capabilities and permission boundaries -summary: Compare supported providers without treating shared capability types as - shared credentials. -status: published -visibility: authenticated -order: 130 -groupIds: - - cloudflare - - github - - openbao - - permissions - - railway -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - provider.github - - provider.cloudflare - - provider.railway - - provider.openbao - - services.credentials -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.services.collection - - admin.services.create - - admin.services.detail -routePatterns: - - /app/services - - /app/services/new - - /app/services/[connectionId] -resourceTypes: - - service-provider -actionIds: [] -keywords: - - github - - cloudflare - - railway - - openbao - - permissions -documentationUrls: [] ---- - -Provider connections are modular. Different providers may become eligible for the same capability while retaining different account models, permission limits, and credential profiles. - -Prefer the narrowest provider identity and credential scope available. Split credentials by capability when the provider supports that separation. When a provider exposes one broad token, use a dedicated account or workspace to reduce its blast radius. diff --git a/docs/src/content/knowledge/treeseed-services-and-providers/settings.md b/docs/src/content/knowledge/treeseed-services-and-providers/settings.md deleted file mode 100644 index 932bc5f6..00000000 --- a/docs/src/content/knowledge/treeseed-services-and-providers/settings.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: services.settings -bookId: treeseed-services-and-providers -slug: settings -title: Service connection settings -summary: Change readable account metadata and enabled capabilities without - exposing or replacing encrypted credentials. -status: published -visibility: team -order: 140 -groupIds: - - account-id - - metadata - - organization - - settings - - workspace -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - services.connection - - services.capabilities - - services.disconnection -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.services.detail -routePatterns: - - /app/services/[connectionId] -resourceTypes: - - team-service-connection -actionIds: - - service.connection.update -keywords: - - settings - - metadata - - account id - - workspace - - organization -documentationUrls: [] ---- - -Connection settings contain non-secret identifiers and labels administrators need to recognize and route the provider account. They are stored as searchable metadata. - -Credential profiles are managed separately. Updating a connection name, organization, account ID, or workspace ID never decrypts a credential envelope. - diff --git a/docs/src/content/knowledge/treeseed-services-and-providers/validation.md b/docs/src/content/knowledge/treeseed-services-and-providers/validation.md deleted file mode 100644 index 294b6772..00000000 --- a/docs/src/content/knowledge/treeseed-services-and-providers/validation.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: services.validation -bookId: treeseed-services-and-providers -slug: validation -title: Read-only service validation -summary: Authorize a single-use operation lease that tests a provider connection - without changing provider resources. -status: published -visibility: team -order: 150 -groupIds: - - credentials - - lease - - read-only - - validation -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - services.credentials - - vault.overview - - services.activity -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.services.detail -routePatterns: - - /app/services/[connectionId] -resourceTypes: - - secret-operation-lease -actionIds: - - service.validate -keywords: - - validation - - lease - - read-only - - credentials -documentationUrls: [] ---- - -Validation checks that the provider identity, credential, and minimum read permissions work together. It does not create, update, or delete provider resources. - -The browser decrypts only the fields named by the operation and seals them to an expiring operations-runner key. The lease is bound to this actor, team, connection, capability, and purpose and can be consumed once. - diff --git a/docs/src/content/knowledge/treeseed-team-administration/activity.md b/docs/src/content/knowledge/treeseed-team-administration/activity.md deleted file mode 100644 index 35c5fc84..00000000 --- a/docs/src/content/knowledge/treeseed-team-administration/activity.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: team.activity -bookId: treeseed-team-administration -slug: activity -title: Team activity -summary: Read the human-centered history of security-sensitive team changes. -status: published -visibility: team -order: 10 -groupIds: - - activity - - actor - - audit - - changes - - history -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - team.overview - - team.membership - - team.lifecycle -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.team.overview -routePatterns: - - /app/teams/[teamId] -resourceTypes: - - audit-event -actionIds: - - team.audit.read -keywords: - - activity - - audit - - actor - - changes - - history -documentationUrls: [] ---- - -Activity entries identify what happened, when it happened in your time zone, and the person who performed the action when a public profile is available. - -Technical correlation identifiers are retained for diagnostics but are not the primary human display. Credential values and other secrets never belong in audit details. - diff --git a/docs/src/content/knowledge/treeseed-team-administration/collection.md b/docs/src/content/knowledge/treeseed-team-administration/collection.md deleted file mode 100644 index 71f1579e..00000000 --- a/docs/src/content/knowledge/treeseed-team-administration/collection.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: teams.collection -bookId: treeseed-team-administration -slug: collection -title: Teams and active-team selection -summary: Choose the team that scopes daily work without changing it merely by - visiting another team. -status: published -visibility: authenticated -order: 20 -groupIds: - - active-team - - archived - - switch - - teams -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - team.creation - - team.overview - - team.settings - - team.membership - - team.lifecycle -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.team.collection -routePatterns: - - /app/teams -resourceTypes: - - team -actionIds: [] -keywords: - - teams - - active team - - archived - - switch -documentationUrls: [] ---- - -The teams collection separates active teams from archived teams and shows the role and operational summaries available to you. - -## Active team - -The active team scopes Services, Projects, Capacity, Work, and Knowledge. It changes only when you use an explicit **Set active** control or the application selector. - -Opening a team overview, settings, membership, or lifecycle page does not silently change this preference. - -Archived teams are read-only and cannot remain active. diff --git a/docs/src/content/knowledge/treeseed-team-administration/creation.md b/docs/src/content/knowledge/treeseed-team-administration/creation.md deleted file mode 100644 index 81adedae..00000000 --- a/docs/src/content/knowledge/treeseed-team-administration/creation.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: team.creation -bookId: treeseed-team-administration -slug: creation -title: Creating a team -summary: Create a durable team identity and become its first owner. -status: published -visibility: authenticated -order: 30 -groupIds: - - create-team - - name - - owner - - visibility -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - teams.collection - - team.settings - - team.membership -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.team.create -routePatterns: - - /app/teams/new -resourceTypes: - - team -actionIds: [] -keywords: - - create team - - owner - - visibility - - name -documentationUrls: [] ---- - -Any verified user may create a team and becomes its first owner. - -Choose a stable name for addresses and integrations. The display name, logo, profile summary, and profile visibility can be refined later in team settings. - -Names must be unique and cannot use reserved platform identifiers. A rejected submission leaves the form values intact so you can correct only the affected fields. diff --git a/docs/src/content/knowledge/treeseed-team-administration/invitation.md b/docs/src/content/knowledge/treeseed-team-administration/invitation.md deleted file mode 100644 index 069ba380..00000000 --- a/docs/src/content/knowledge/treeseed-team-administration/invitation.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: team.invitation -bookId: treeseed-team-administration -slug: invitation -title: Team invitation consent -summary: Send, review, resend, revoke, and explicitly accept team invitations. -status: published -visibility: public -order: 40 -groupIds: - - accept - - email-mismatch - - expiry - - invitation - - resend - - revoke -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - team.membership - - team.overview -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.team.invite-accept - - admin.team.members -routePatterns: - - /team-invites/[token]/accept - - /app/teams/[teamId]/members -resourceTypes: - - team-invitation -actionIds: [] -keywords: - - invitation - - accept - - resend - - revoke - - expiry - - email mismatch -documentationUrls: [] ---- - -Every invitation requires explicit recipient acceptance, including invitations sent to an existing TreeSeed user. - -The acceptance page shows the team, invited email, proposed role, inviter, and expiration before any membership is created. A signed-in account with a different verified email cannot consume the invitation. - -Resending refreshes delivery without creating duplicate pending invitations. Revocation and expiration make the token unusable. Replaying an already accepted token is safe only for the same recipient. diff --git a/docs/src/content/knowledge/treeseed-team-administration/knowledge-authoring.md b/docs/src/content/knowledge/treeseed-team-administration/knowledge-authoring.md deleted file mode 100644 index 91ef82aa..00000000 --- a/docs/src/content/knowledge/treeseed-team-administration/knowledge-authoring.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: knowledge.authoring -bookId: treeseed-team-administration -slug: knowledge-authoring -title: Authoring team knowledge -summary: Create repository-native books and pages through recoverable TreeDX workspaces and review branches. -status: published -visibility: team -order: 90 -groupIds: - - authoring - - books - - knowledge -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - team.roles -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.knowledge.workbench -routePatterns: - - /app/knowledge -resourceTypes: - - knowledge -actionIds: - - knowledge.workspace.create - - knowledge.review.submit -keywords: - - TreeDX workspace - - book editor - - knowledge review -documentationUrls: [] ---- - -## What the workbench changes - -The knowledge workbench edits files in the selected project's Git repository. TreeDX provides a recoverable working copy, search, relationships, and a reviewable diff without moving the content into the application database. - -Saving a draft does not publish it. A submission commits an operation-scoped branch for review. A reviewer can inspect the diff, rendered page, relationships, visibility, and affected knowledge packs before approval. - -## Permissions - -Knowledge authors can create and update drafts. Knowledge reviewers can review changes. Publishing and book management require their explicit knowledge permissions; broad access to unrelated team administration is not required. - -## Safe collaboration - -The editor rejects executable imports, arbitrary JSX, raw HTML, and unsafe links. If the repository or draft changed after you opened it, TreeSeed stops the save and asks you to reconcile the conflict instead of overwriting newer work. diff --git a/docs/src/content/knowledge/treeseed-team-administration/lifecycle.md b/docs/src/content/knowledge/treeseed-team-administration/lifecycle.md deleted file mode 100644 index 20e1df4c..00000000 --- a/docs/src/content/knowledge/treeseed-team-administration/lifecycle.md +++ /dev/null @@ -1,55 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: team.lifecycle -bookId: treeseed-team-administration -slug: lifecycle -title: Archiving, restoring, and deleting a team -summary: Pause team activity reversibly or permanently delete it through a - separate protected action. -status: published -visibility: authenticated -order: 50 -groupIds: - - archive - - blockers - - delete-team - - password - - restore -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - team.overview - - team.membership - - teams.collection -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.team.delete -routePatterns: - - /app/teams/[teamId]/delete -resourceTypes: - - team -actionIds: [] -keywords: - - archive - - restore - - delete team - - blockers - - password -documentationUrls: [] ---- - -Archiving and deletion are separate operations. - -## Archive and restore - -Archiving pauses new team-scoped mutations, revokes pending invitations, and removes the team from active selectors. The displayed recovery deadline uses your account time zone. Owners may restore the team while recovery remains available. - -## Permanent deletion - -Permanent deletion is immediate and irreversible. It requires a fresh blocker evaluation, recent reauthentication, the current account password, and the exact team name shown by the form. - -If blocker evaluation is unavailable, deletion fails closed and the team remains unchanged. diff --git a/docs/src/content/knowledge/treeseed-team-administration/member-search.md b/docs/src/content/knowledge/treeseed-team-administration/member-search.md deleted file mode 100644 index f8309056..00000000 --- a/docs/src/content/knowledge/treeseed-team-administration/member-search.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: team.member-search -bookId: treeseed-team-administration -slug: member-search -title: Finding team members -summary: Search and inspect the complete member directory while keeping - administration controls role-gated. -status: published -visibility: team -order: 60 -groupIds: - - directory - - member - - pagination - - search -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - team.membership - - team.roles -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.team.members -routePatterns: - - /app/teams/[teamId]/members -resourceTypes: - - team-membership -actionIds: - - team.member.search -keywords: - - search - - directory - - member - - pagination -documentationUrls: [] ---- - -Every team member may view and search the team directory. Search matches the member identity presented by TreeSeed and retains paging for large teams. - -Viewing the directory does not grant administration authority. Role, removal, invitation, and ownership controls remain available only to authorized administrators. - diff --git a/docs/src/content/knowledge/treeseed-team-administration/membership.md b/docs/src/content/knowledge/treeseed-team-administration/membership.md deleted file mode 100644 index cedcacbc..00000000 --- a/docs/src/content/knowledge/treeseed-team-administration/membership.md +++ /dev/null @@ -1,57 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: team.membership -bookId: treeseed-team-administration -slug: membership -title: Members, invitations, roles, and ownership -summary: Find team members and understand which operations require an - administrator or owner. -status: published -visibility: authenticated -order: 70 -groupIds: - - invitation - - leave - - members - - ownership - - remove - - roles -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - team.invitation - - team.overview - - team.lifecycle -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.team.members -routePatterns: - - /app/teams/[teamId]/members -resourceTypes: - - team-membership -actionIds: [] -keywords: - - members - - roles - - ownership - - invitation - - remove - - leave -documentationUrls: [] ---- - -Every team member may view and search the member directory. Membership mutations remain limited by role. - -## Roles and ownership - -Owners control ownership, lifecycle, and every membership operation. Project leads may invite and manage non-owner memberships but cannot create, demote, remove, or replace owners. - -The only owner cannot change their own role, leave, or be removed until another owner exists or ownership is explicitly transferred. - -## Removal and leaving - -TreeSeed evaluates blockers before access is removed. A successful removal or leave operation takes effect immediately and must prevent further team access. diff --git a/docs/src/content/knowledge/treeseed-team-administration/overview.md b/docs/src/content/knowledge/treeseed-team-administration/overview.md deleted file mode 100644 index a026f987..00000000 --- a/docs/src/content/knowledge/treeseed-team-administration/overview.md +++ /dev/null @@ -1,56 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: team.overview -bookId: treeseed-team-administration -slug: overview -title: Team operational overview -summary: Read team identity, your role, owned-domain summaries, activity, and - canonical next steps. -status: published -visibility: authenticated -order: 80 -groupIds: - - audit - - permissions - - projects - - services - - team-overview -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - team.settings - - team.membership - - team.lifecycle - - services.connections -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.team.overview -routePatterns: - - /app/teams/[teamId] -resourceTypes: - - team -actionIds: [] -keywords: - - team overview - - permissions - - audit - - projects - - services -documentationUrls: [] ---- - -The overview is the fastest route to the team context you use most often. - -## Your access - -Effective permissions come from your current team role. Expand the role description to see the same human-readable responsibilities used in membership management. - -## Owned domains - -Projects, Services, Capacity, Knowledge, and other domains keep their own mutation interfaces. The overview summarizes their current state and links to the canonical page. - -Recent security activity identifies the human actor, meaningful operation, useful details, and your time-zone-adjusted timestamp. Machine identifiers remain forensic details rather than primary labels. diff --git a/docs/src/content/knowledge/treeseed-team-administration/ownership.md b/docs/src/content/knowledge/treeseed-team-administration/ownership.md deleted file mode 100644 index 0eb44d7f..00000000 --- a/docs/src/content/knowledge/treeseed-team-administration/ownership.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: team.ownership -bookId: treeseed-team-administration -slug: ownership -title: Team ownership -summary: Grant or transfer ownership without leaving a team with no accountable owner. -status: published -visibility: team -order: 90 -groupIds: - - last-owner - - owner - - ownership - - transfer -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - team.roles - - team.role-changes - - team.removal -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.team.members -routePatterns: - - /app/teams/[teamId]/members -resourceTypes: - - team-membership -actionIds: - - team.ownership.transfer - - team.owner.grant - - team.owner.remove -keywords: - - owner - - ownership - - transfer - - last owner -documentationUrls: [] ---- - -Owners hold the team’s highest security authority. Only an owner may grant, remove, or transfer ownership. - -TreeSeed protects the last owner transactionally. Add or transfer ownership before the only owner changes role, leaves, or is removed. Ownership access and credential-vault grants are separate; update both when responsibilities change. - diff --git a/docs/src/content/knowledge/treeseed-team-administration/removal.md b/docs/src/content/knowledge/treeseed-team-administration/removal.md deleted file mode 100644 index e2b8d2dd..00000000 --- a/docs/src/content/knowledge/treeseed-team-administration/removal.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: team.removal -bookId: treeseed-team-administration -slug: removal -title: Removing a member or leaving -summary: Resolve ownership and resource blockers before access is removed. -status: published -visibility: team -order: 100 -groupIds: - - blockers - - leave - - lost-access - - remove -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - team.membership - - team.ownership - - team.role-changes -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.team.members -routePatterns: - - /app/teams/[teamId]/members -resourceTypes: - - team-membership -actionIds: - - team.member.remove - - team.member.leave -keywords: - - remove - - leave - - blockers - - lost access -documentationUrls: [] ---- - -Removal and self-leave revoke team access immediately after the operation succeeds. TreeSeed first checks ownership and any team-owned responsibilities that must be reassigned. - -Resolve every displayed blocker at its linked management page. A sole owner must transfer or grant ownership before leaving or being removed. - diff --git a/docs/src/content/knowledge/treeseed-team-administration/role-changes.md b/docs/src/content/knowledge/treeseed-team-administration/role-changes.md deleted file mode 100644 index d985b9a5..00000000 --- a/docs/src/content/knowledge/treeseed-team-administration/role-changes.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: team.role-changes -bookId: treeseed-team-administration -slug: role-changes -title: Changing a member role -summary: Review how a role change affects visible controls and durable authorization. -status: published -visibility: team -order: 110 -groupIds: - - access - - change - - permission - - role -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - team.roles - - team.ownership - - team.removal -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.team.members -routePatterns: - - /app/teams/[teamId]/members -resourceTypes: - - team-membership -actionIds: - - team.member.role.update -keywords: - - role - - access - - permission - - change -documentationUrls: [] ---- - -Choose the role whose responsibilities match the member’s work. The change takes effect in both the interface and API authorization after it succeeds. - -Project leads cannot create, demote, remove, or replace owners. The only owner cannot select a role that would leave the team ownerless. - diff --git a/docs/src/content/knowledge/treeseed-team-administration/roles.md b/docs/src/content/knowledge/treeseed-team-administration/roles.md deleted file mode 100644 index 5a6131f1..00000000 --- a/docs/src/content/knowledge/treeseed-team-administration/roles.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: team.roles -bookId: treeseed-team-administration -slug: roles -title: Team roles and permissions -summary: Compare human-readable responsibilities and understand which - administration controls each role receives. -status: published -visibility: team -order: 120 -groupIds: - - contributor - - lead - - owner - - permissions - - roles - - viewer -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - team.membership - - team.ownership - - team.role-changes -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.team.members -routePatterns: - - /app/teams/[teamId]/members - - /app/teams/[teamId]/edit -resourceTypes: - - team-membership -actionIds: - - team.member.role.read -keywords: - - roles - - permissions - - owner - - lead - - contributor - - viewer -documentationUrls: [] ---- - -Roles are reusable responsibility sets. TreeSeed displays their permissions in human language so administrators can review the effect before changing access. - -Owners control ownership and lifecycle operations. Project leads may manage non-owner membership and team identity. Other roles can view the directory but cannot administer members. - diff --git a/docs/src/content/knowledge/treeseed-team-administration/settings.md b/docs/src/content/knowledge/treeseed-team-administration/settings.md deleted file mode 100644 index 9ecf6ee3..00000000 --- a/docs/src/content/knowledge/treeseed-team-administration/settings.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: team.settings -bookId: treeseed-team-administration -slug: settings -title: Team identity and public visibility -summary: Maintain the team name, display identity, logo, summary, and profile - visibility. -status: published -visibility: authenticated -order: 130 -groupIds: - - conflict - - identity - - public-profile - - team-settings - - visibility -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - team.overview - - team.membership - - team.lifecycle -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.team.edit -routePatterns: - - /app/teams/[teamId]/edit -resourceTypes: - - team -actionIds: [] -keywords: - - team settings - - identity - - public profile - - visibility - - conflict -documentationUrls: [] ---- - -Team settings contain identity owned by the team domain. Project, host, capacity, knowledge, and commerce settings remain in their own domains. - -The team name is used for the public profile address. The display name is presentation only and is never used for ambiguous lookup. - -Updates use optimistic version checks. If another administrator saves first, reload the current state and deliberately reapply your change rather than overwriting it silently. diff --git a/docs/src/content/knowledge/treeseed-team-administration/visibility.md b/docs/src/content/knowledge/treeseed-team-administration/visibility.md deleted file mode 100644 index 369fecdc..00000000 --- a/docs/src/content/knowledge/treeseed-team-administration/visibility.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -schemaVersion: treeseed.knowledge-page/v1 -id: team.visibility -bookId: treeseed-team-administration -slug: visibility -title: Team profile visibility -summary: Control whether the team identity profile is public without changing - project or knowledge-plane visibility. -status: published -visibility: team -order: 140 -groupIds: - - private - - profile - - public - - visibility -contributors: [] -relatedBookIds: [] -relatedKnowledgeIds: - - team.settings - - team.overview -relatedNoteIds: [] -relatedQuestionIds: [] -relatedObjectiveIds: [] -relatedProposalIds: [] -relatedDecisionIds: [] -capabilityIds: - - admin.team.edit -routePatterns: - - /app/teams/[teamId]/edit -resourceTypes: - - team -actionIds: - - team.visibility.update -keywords: - - visibility - - public - - private - - profile -documentationUrls: [] ---- - -Team profile visibility controls only the public team identity page. It does not make projects public or private and does not select where project knowledge is indexed. - -Public profiles expose approved identity fields. Memberships, roles, emails, operational counts, billing, hosts, and private metadata remain redacted. - diff --git a/docs/src/content/notes/.gitkeep b/docs/src/content/notes/.gitkeep deleted file mode 100644 index 8b137891..00000000 --- a/docs/src/content/notes/.gitkeep +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/src/content/notes/knowledge-authoring-traceability.md b/docs/src/content/notes/knowledge-authoring-traceability.md deleted file mode 100644 index 95f935a5..00000000 --- a/docs/src/content/notes/knowledge-authoring-traceability.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -id: note:knowledge-authoring-traceability -title: Knowledge authoring traceability -description: Records why every published knowledge change must retain an exact repository, TreeDX, review, publication, and pack trail. -summary: Knowledge changes remain trustworthy when their authoring workspace, review, source commit, graph revision, publication manifest, and derived packs can be correlated. -date: 2026-08-01 -status: live -groupIds: - - knowledge - - publication - - traceability -author: admin-steward -draft: false -about: - - knowledge.authoring -relatedObjectives: - - objective:admin-core -relatedQuestions: - - question:trustworthy-knowledge-publication -relatedProposals: [] -relatedDecisions: [] -relatedBooks: - - treeseed-team-administration ---- - -Knowledge authoring traceability requires every knowledge change to be explainable from its authoring workspace through independent review, exact Git commit, matching TreeDX graph revision, atomic publication manifest, reader output, and derived knowledge packs. - -The chain is evidence of one change. Generic read tests or unrelated audit events cannot substitute for correlation to the same content identifiers and source closure. diff --git a/docs/src/content/objectives/core.md b/docs/src/content/objectives/core.md deleted file mode 100644 index 59b803a7..00000000 --- a/docs/src/content/objectives/core.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: objective:admin-core -title: TreeSeed Admin Core Objective -description: TreeSeed Admin should provide the distributable Treeseed administration portal for teams, projects, hosts, work, knowledge, catalog browsing, operational status, secret-manager workflows, and capacity operator surfaces. -date: 2026-06-22 -summary: TreeSeed Admin exists to provide the distributable Treeseed administration portal for teams, projects, hosts, work, knowledge, catalog browsing, operational status, secret-manager workflows, and capacity operator surfaces while preserving its package boundary. -status: live -timeHorizon: long-term -motivation: Package-local workdays need a stable north star from the README so humans and agents can plan, execute, review, and report work without drifting across package ownership boundaries. -primaryContributor: admin-steward -relatedQuestions: [] -relatedBooks: [] ---- - -TreeSeed Admin exists to provide the distributable Treeseed administration portal for teams, projects, hosts, work, knowledge, catalog browsing, operational status, secret-manager workflows, and capacity operator surfaces. - -This core objective is the starting direction for the TreeSeed Admin Knowledge Hub. It should influence every package-local workday, research note, implementation proposal, generated artifact, approval request, and release-readiness summary. - -Admin must stay a browser administration layer over API, SDK, Core, and UI contracts. It must not own scheduling, assignment selection, provider runtime internals, backend persistence, reusable UI primitives, or ecommerce checkout policy. - -Agents working in this project should keep outputs grounded in the package README, package-local source evidence, and the TreeSeed package ownership map. When a task would cross into another package's authority, the agent should describe the boundary and route the work to the correct project instead of mutating outside this hub. diff --git a/docs/src/content/pages/.gitkeep b/docs/src/content/pages/.gitkeep deleted file mode 100644 index 8b137891..00000000 --- a/docs/src/content/pages/.gitkeep +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/src/content/people/.gitkeep b/docs/src/content/people/.gitkeep deleted file mode 100644 index 8b137891..00000000 --- a/docs/src/content/people/.gitkeep +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/src/content/proposals/.gitkeep b/docs/src/content/proposals/.gitkeep deleted file mode 100644 index 8b137891..00000000 --- a/docs/src/content/proposals/.gitkeep +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/src/content/questions/.gitkeep b/docs/src/content/questions/.gitkeep deleted file mode 100644 index 8b137891..00000000 --- a/docs/src/content/questions/.gitkeep +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/src/content/questions/how-should-knowledge-publication-stay-trustworthy.md b/docs/src/content/questions/how-should-knowledge-publication-stay-trustworthy.md deleted file mode 100644 index f716fbbf..00000000 --- a/docs/src/content/questions/how-should-knowledge-publication-stay-trustworthy.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: question:trustworthy-knowledge-publication -title: How should knowledge publication stay trustworthy? -description: Defines the evidence boundary for repository-native knowledge authoring and publication. -summary: Establishes which correlated records must agree before TreeSeed treats a knowledge revision as published and pack-ready. -date: 2026-08-01 -status: live -groupIds: - - knowledge - - publication - - review -draft: false -questionType: implementation -motivation: A knowledge UI must not report success when Git, TreeDX, the published manifest, the reader, or derived packs refer to different source revisions. -primaryContributor: admin-steward -relatedObjectives: - - objective:admin-core -relatedBooks: - - treeseed-team-administration ---- - -How should knowledge publication stay trustworthy? TreeSeed must define which exact postconditions agree across the authoring workspace, independent review, repository commit, TreeDX graph, atomic publication pointer, Starlight reader, contextual knowledge, and knowledge-pack artifacts. diff --git a/docs/src/content/templates/.gitkeep b/docs/src/content/templates/.gitkeep deleted file mode 100644 index 8b137891..00000000 --- a/docs/src/content/templates/.gitkeep +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/src/content/workdays/.gitkeep b/docs/src/content/workdays/.gitkeep deleted file mode 100644 index 8b137891..00000000 --- a/docs/src/content/workdays/.gitkeep +++ /dev/null @@ -1 +0,0 @@ - diff --git a/package-lock.json b/package-lock.json index fcaf7ae2..fe8fd118 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "Apache-2.0", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#4b8b0afdcb3f4e5ed2df204e509071e0186147a3", - "@treeseed/sdk": "github:treeseed-ai/sdk#a3586c955bfc8d4aeabaa5f07f54757c12041bf9", + "@treeseed/core": "github:treeseed-ai/core#4605497a794d0218b1d3a2782d2360b0da2d2644", + "@treeseed/sdk": "github:treeseed-ai/sdk#213d9ac3e22dd5b2c7c6c5397598e5b3f3575fc4", "@treeseed/ui": "github:treeseed-ai/ui#c68ed1d9fc64c93426304eddaaf7c449622f2f61", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7397,7 +7397,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.feature-content-repository-authority.20260811T092645Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#4b8b0afdcb3f4e5ed2df204e509071e0186147a3", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#4605497a794d0218b1d3a2782d2360b0da2d2644", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7408,7 +7408,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#a3586c955bfc8d4aeabaa5f07f54757c12041bf9", + "@treeseed/sdk": "github:treeseed-ai/sdk#213d9ac3e22dd5b2c7c6c5397598e5b3f3575fc4", "@treeseed/ui": "github:treeseed-ai/ui#c68ed1d9fc64c93426304eddaaf7c449622f2f61", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8758,7 +8758,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.feature-content-repository-authority.20260811T092601Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#a3586c955bfc8d4aeabaa5f07f54757c12041bf9", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#213d9ac3e22dd5b2c7c6c5397598e5b3f3575fc4", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index 322e5eb6..2d9bb3b1 100644 --- a/package.json +++ b/package.json @@ -52,8 +52,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#4b8b0afdcb3f4e5ed2df204e509071e0186147a3", - "@treeseed/sdk": "github:treeseed-ai/sdk#a3586c955bfc8d4aeabaa5f07f54757c12041bf9", + "@treeseed/core": "github:treeseed-ai/core#4605497a794d0218b1d3a2782d2360b0da2d2644", + "@treeseed/sdk": "github:treeseed-ai/sdk#213d9ac3e22dd5b2c7c6c5397598e5b3f3575fc4", "@treeseed/ui": "github:treeseed-ai/ui#c68ed1d9fc64c93426304eddaaf7c449622f2f61", "react": "^19.2.5", "react-dom": "^19.2.6" diff --git a/tests/contract/contextual-help/contextual-help-architecture.test.ts b/tests/contract/contextual-help/contextual-help-architecture.test.ts index c4ae022a..5fa17a30 100644 --- a/tests/contract/contextual-help/contextual-help-architecture.test.ts +++ b/tests/contract/contextual-help/contextual-help-architecture.test.ts @@ -1,33 +1,31 @@ import { readFileSync } from 'node:fs'; import { resolve } from 'node:path'; -import { loadKnowledgeCatalog } from '@treeseed/sdk/knowledge'; import { describe, expect, it } from 'vitest'; const root = resolve(import.meta.dirname, '../../..'); const read = (path: string) => readFileSync(resolve(root, path), 'utf8'); const readDependency = (name: string, path: string) => readFileSync(resolve(root, 'node_modules', name, path), 'utf8'); -const pages = loadKnowledgeCatalog(resolve(root, 'docs/src/content/knowledge'), '@treeseed/admin'); -const pageIds = new Set(pages.map((page) => page.id)); - describe('Admin contextual help architecture', () => { - it('declares knowledge as the canonical Admin content contribution', () => { + it('declares knowledge as a remote published content contribution', () => { expect(read('treeseed.package.yaml')).toContain('contentContributions:'); - expect(read('treeseed.package.yaml')).toContain('path: docs/src/content/knowledge'); + expect(read('treeseed.package.yaml')).toContain('path: src/content/knowledge'); + expect(read('treeseed.package.yaml')).toContain('contentRuntimeSource: r2_preview_overlay'); + expect(read('treeseed.package.yaml')).toContain('localContentMaterialization: none'); expect(read('docs/src/manifest.yaml')).toContain('docs: ./src/content/knowledge'); }); - it('maps every active account, team, invitation, and service route to a published knowledge page', () => { + it('maps every active account, team, invitation, and service route to a stable knowledge identity', () => { const routes = read('src/routes.ts'); const routedPages = [...routes.matchAll(/knowledgePageIds:\s*\['([^']+)'\]/gu)].map((match) => match[1]); expect(routedPages.length).toBeGreaterThanOrEqual(15); - for (const id of routedPages) expect(pageIds.has(id), `${id} must be published`).toBe(true); + for (const id of routedPages) expect(id).toMatch(/^[a-z][a-z0-9-]*\.[a-z][a-z0-9-]*$/u); for (const route of ['/app/account', '/app/teams', '/app/services', '/app/services/vault', '/team-invites/[token]/accept']) { const line = routes.split('\n').find((candidate) => candidate.includes(`adminRoute('${route}'`)); expect(line, route).toContain('knowledgePageIds'); } }); - it('resolves every local help trigger to the canonical Markdown catalog', () => { + it('resolves every help trigger through stable remote content identities', () => { const sources = [ 'AccountDeletionPanel.astro', 'AccountIdentitySettings.astro', @@ -48,7 +46,8 @@ describe('Admin contextual help architecture', () => { ].map(read)).join('\n'); const literalIds = [...sources.matchAll(/knowledgePageId="([^"]+)"/gu)].map((match) => match[1]); expect(literalIds.length).toBeGreaterThan(20); - for (const id of literalIds) expect(pageIds.has(id), `${id} must be published`).toBe(true); + for (const id of literalIds) expect(id).toMatch(/^[a-z][a-z0-9-]*\.[a-z][a-z0-9-]*$/u); + expect(read('src/lib/help/context.ts')).toContain('/v1/knowledge/pages/{pageId}'); }); it('makes vault passphrase reuse explicit and uses shared form spacing', () => { diff --git a/tests/contract/feedback-management/feedback-management-architecture.test.ts b/tests/contract/feedback-management/feedback-management-architecture.test.ts index 2e6aae3f..fbb3cf5b 100644 --- a/tests/contract/feedback-management/feedback-management-architecture.test.ts +++ b/tests/contract/feedback-management/feedback-management-architecture.test.ts @@ -34,10 +34,12 @@ describe('feedback management architecture', () => { expect(existsSync('../ui/src/lib/feedback/dialog.ts')).toBe(false); }); - it('publishes contextual guidance for submission, privacy, triage, and exports', () => { - for (const topic of ['submitting', 'screenshot-privacy', 'administration', 'triage', 'privacy', 'exports']) { - const content = source(`docs/src/content/knowledge/treeseed-feedback-and-support/${topic}.md`); - expect(content).toContain('schemaVersion: treeseed.knowledge-page/v1'); - } + it('routes feedback guidance through the published content plane', () => { + const routes = source('src/routes.ts'); + expect(routes).toContain("knowledgePageIds: ['feedback.administration']"); + expect(routes).toContain("knowledgePageIds: ['feedback.triage']"); + const manifest = source('treeseed.package.yaml'); + expect(manifest).toContain('contentRuntimeSource: r2_preview_overlay'); + expect(manifest).toContain('localContentMaterialization: none'); }); }); diff --git a/treeseed.site.yaml b/treeseed.site.yaml index 1aa35f39..bc3dc1bb 100644 --- a/treeseed.site.yaml +++ b/treeseed.site.yaml @@ -22,8 +22,8 @@ cloudflare: buildOutputDir: .treeseed/app-dist r2: bucketName: treeseed-admin-content - manifestKeyTemplate: content/admin/{environment}/channels/current.json - previewRootTemplate: content/admin/previews + manifestKeyTemplate: content/{teamId}/{projectId}/{environment}/channels/current.json + previewRootTemplate: content/{teamId}/{projectId}/previews previewTtlHours: 168 surfaces: web: From 27aaec677e5729621ecce88ba382ff1722f76eb4 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Tue, 11 Aug 2026 10:06:03 -0400 Subject: [PATCH 146/315] chore(deps): update @treeseed/core and @treeseed/sdk Changes: - Update package.json and package-lock.json Dependency and pointer updates: - @treeseed/sdk: github:treeseed-ai/sdk#213d9ac3e22dd5b2c7c6c5397598e5b3f3575fc4 -> github:treeseed-ai/sdk#df719378b2d46c365953f2c3da95a7bd17ce14d7 - @treeseed/core: github:treeseed-ai/core#4605497a794d0218b1d3a2782d2360b0da2d2644 -> github:treeseed-ai/core#a78bf3275ee4b45bc7216588f290a4c554798dff --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index fe8fd118..71eeec5f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "Apache-2.0", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#4605497a794d0218b1d3a2782d2360b0da2d2644", - "@treeseed/sdk": "github:treeseed-ai/sdk#213d9ac3e22dd5b2c7c6c5397598e5b3f3575fc4", + "@treeseed/core": "github:treeseed-ai/core#a78bf3275ee4b45bc7216588f290a4c554798dff", + "@treeseed/sdk": "github:treeseed-ai/sdk#df719378b2d46c365953f2c3da95a7bd17ce14d7", "@treeseed/ui": "github:treeseed-ai/ui#c68ed1d9fc64c93426304eddaaf7c449622f2f61", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7397,7 +7397,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.feature-content-repository-authority.20260811T092645Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#4605497a794d0218b1d3a2782d2360b0da2d2644", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#a78bf3275ee4b45bc7216588f290a4c554798dff", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7408,7 +7408,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#213d9ac3e22dd5b2c7c6c5397598e5b3f3575fc4", + "@treeseed/sdk": "github:treeseed-ai/sdk#df719378b2d46c365953f2c3da95a7bd17ce14d7", "@treeseed/ui": "github:treeseed-ai/ui#c68ed1d9fc64c93426304eddaaf7c449622f2f61", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8758,7 +8758,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.feature-content-repository-authority.20260811T092601Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#213d9ac3e22dd5b2c7c6c5397598e5b3f3575fc4", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#df719378b2d46c365953f2c3da95a7bd17ce14d7", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index 2d9bb3b1..a650233e 100644 --- a/package.json +++ b/package.json @@ -52,8 +52,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#4605497a794d0218b1d3a2782d2360b0da2d2644", - "@treeseed/sdk": "github:treeseed-ai/sdk#213d9ac3e22dd5b2c7c6c5397598e5b3f3575fc4", + "@treeseed/core": "github:treeseed-ai/core#a78bf3275ee4b45bc7216588f290a4c554798dff", + "@treeseed/sdk": "github:treeseed-ai/sdk#df719378b2d46c365953f2c3da95a7bd17ce14d7", "@treeseed/ui": "github:treeseed-ai/ui#c68ed1d9fc64c93426304eddaaf7c449622f2f61", "react": "^19.2.5", "react-dom": "^19.2.6" From a8aca68fe9d938b9e38c63089ce2c6ed933d7e89 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Tue, 11 Aug 2026 12:32:21 -0400 Subject: [PATCH 147/315] build(build): integrate receipt-based repository federation Intent: - Save hint: integrate receipt-based repository federation Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.feature-content-repository-authority.20260811T092708Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#df719378b2d46c365953f2c3da95a7bd17ce14d7 -> github:treeseed-ai/sdk#df5a0d3b624bb55648def204553d96e28bb43ca6 - dependencies.@treeseed/core: github:treeseed-ai/core#a78bf3275ee4b45bc7216588f290a4c554798dff -> github:treeseed-ai/core#93cf6c82d7042806ca5c4576fa5c5affe9e9d1bf --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 71eeec5f..004280e5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "Apache-2.0", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#a78bf3275ee4b45bc7216588f290a4c554798dff", - "@treeseed/sdk": "github:treeseed-ai/sdk#df719378b2d46c365953f2c3da95a7bd17ce14d7", + "@treeseed/core": "github:treeseed-ai/core#93cf6c82d7042806ca5c4576fa5c5affe9e9d1bf", + "@treeseed/sdk": "github:treeseed-ai/sdk#df5a0d3b624bb55648def204553d96e28bb43ca6", "@treeseed/ui": "github:treeseed-ai/ui#c68ed1d9fc64c93426304eddaaf7c449622f2f61", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7397,7 +7397,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.feature-content-repository-authority.20260811T092645Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#a78bf3275ee4b45bc7216588f290a4c554798dff", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#93cf6c82d7042806ca5c4576fa5c5affe9e9d1bf", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7408,7 +7408,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#df719378b2d46c365953f2c3da95a7bd17ce14d7", + "@treeseed/sdk": "github:treeseed-ai/sdk#df5a0d3b624bb55648def204553d96e28bb43ca6", "@treeseed/ui": "github:treeseed-ai/ui#c68ed1d9fc64c93426304eddaaf7c449622f2f61", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8758,7 +8758,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.feature-content-repository-authority.20260811T092601Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#df719378b2d46c365953f2c3da95a7bd17ce14d7", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#df5a0d3b624bb55648def204553d96e28bb43ca6", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index a650233e..7893030f 100644 --- a/package.json +++ b/package.json @@ -52,8 +52,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#a78bf3275ee4b45bc7216588f290a4c554798dff", - "@treeseed/sdk": "github:treeseed-ai/sdk#df719378b2d46c365953f2c3da95a7bd17ce14d7", + "@treeseed/core": "github:treeseed-ai/core#93cf6c82d7042806ca5c4576fa5c5affe9e9d1bf", + "@treeseed/sdk": "github:treeseed-ai/sdk#df5a0d3b624bb55648def204553d96e28bb43ca6", "@treeseed/ui": "github:treeseed-ai/ui#c68ed1d9fc64c93426304eddaaf7c449622f2f61", "react": "^19.2.5", "react-dom": "^19.2.6" From 0cef4f4823982cda7ba41be151dbb2a2703eb2dc Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Tue, 11 Aug 2026 13:02:34 -0400 Subject: [PATCH 148/315] build(build): federate update isolation correction Intent: - Save hint: federate update isolation correction Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.feature-content-repository-authority.20260811T092708Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#df5a0d3b624bb55648def204553d96e28bb43ca6 -> github:treeseed-ai/sdk#86a5daffdce947aebb1753e3458e8a5d5fea5256 - dependencies.@treeseed/core: github:treeseed-ai/core#93cf6c82d7042806ca5c4576fa5c5affe9e9d1bf -> github:treeseed-ai/core#5f6ea56c962051da6488cd3f66cf664d73e2bfc4 --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 004280e5..c7057303 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "Apache-2.0", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#93cf6c82d7042806ca5c4576fa5c5affe9e9d1bf", - "@treeseed/sdk": "github:treeseed-ai/sdk#df5a0d3b624bb55648def204553d96e28bb43ca6", + "@treeseed/core": "github:treeseed-ai/core#5f6ea56c962051da6488cd3f66cf664d73e2bfc4", + "@treeseed/sdk": "github:treeseed-ai/sdk#86a5daffdce947aebb1753e3458e8a5d5fea5256", "@treeseed/ui": "github:treeseed-ai/ui#c68ed1d9fc64c93426304eddaaf7c449622f2f61", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7397,7 +7397,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.feature-content-repository-authority.20260811T092645Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#93cf6c82d7042806ca5c4576fa5c5affe9e9d1bf", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#5f6ea56c962051da6488cd3f66cf664d73e2bfc4", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7408,7 +7408,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#df5a0d3b624bb55648def204553d96e28bb43ca6", + "@treeseed/sdk": "github:treeseed-ai/sdk#86a5daffdce947aebb1753e3458e8a5d5fea5256", "@treeseed/ui": "github:treeseed-ai/ui#c68ed1d9fc64c93426304eddaaf7c449622f2f61", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8758,7 +8758,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.feature-content-repository-authority.20260811T092601Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#df5a0d3b624bb55648def204553d96e28bb43ca6", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#86a5daffdce947aebb1753e3458e8a5d5fea5256", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index 7893030f..31d91a6c 100644 --- a/package.json +++ b/package.json @@ -52,8 +52,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#93cf6c82d7042806ca5c4576fa5c5affe9e9d1bf", - "@treeseed/sdk": "github:treeseed-ai/sdk#df5a0d3b624bb55648def204553d96e28bb43ca6", + "@treeseed/core": "github:treeseed-ai/core#5f6ea56c962051da6488cd3f66cf664d73e2bfc4", + "@treeseed/sdk": "github:treeseed-ai/sdk#86a5daffdce947aebb1753e3458e8a5d5fea5256", "@treeseed/ui": "github:treeseed-ai/ui#c68ed1d9fc64c93426304eddaaf7c449622f2f61", "react": "^19.2.5", "react-dom": "^19.2.6" From 704a767af5a52658e1ee31572f73181e893f3245 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Tue, 11 Aug 2026 13:48:20 -0400 Subject: [PATCH 149/315] build(build): propagate cutover replay contract Intent: - Save hint: propagate cutover replay contract Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.feature-content-repository-authority.20260811T092708Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#86a5daffdce947aebb1753e3458e8a5d5fea5256 -> github:treeseed-ai/sdk#6104c8e275b39e5acb66da174b803f2853074508 - dependencies.@treeseed/core: github:treeseed-ai/core#5f6ea56c962051da6488cd3f66cf664d73e2bfc4 -> github:treeseed-ai/core#ecc5b58ab38ed3b6419b07606e93b34b69970ae0 --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index c7057303..6eaa7365 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "Apache-2.0", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#5f6ea56c962051da6488cd3f66cf664d73e2bfc4", - "@treeseed/sdk": "github:treeseed-ai/sdk#86a5daffdce947aebb1753e3458e8a5d5fea5256", + "@treeseed/core": "github:treeseed-ai/core#ecc5b58ab38ed3b6419b07606e93b34b69970ae0", + "@treeseed/sdk": "github:treeseed-ai/sdk#6104c8e275b39e5acb66da174b803f2853074508", "@treeseed/ui": "github:treeseed-ai/ui#c68ed1d9fc64c93426304eddaaf7c449622f2f61", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7397,7 +7397,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.feature-content-repository-authority.20260811T092645Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#5f6ea56c962051da6488cd3f66cf664d73e2bfc4", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#ecc5b58ab38ed3b6419b07606e93b34b69970ae0", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7408,7 +7408,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#86a5daffdce947aebb1753e3458e8a5d5fea5256", + "@treeseed/sdk": "github:treeseed-ai/sdk#6104c8e275b39e5acb66da174b803f2853074508", "@treeseed/ui": "github:treeseed-ai/ui#c68ed1d9fc64c93426304eddaaf7c449622f2f61", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8758,7 +8758,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.feature-content-repository-authority.20260811T092601Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#86a5daffdce947aebb1753e3458e8a5d5fea5256", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#6104c8e275b39e5acb66da174b803f2853074508", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index 31d91a6c..7658803e 100644 --- a/package.json +++ b/package.json @@ -52,8 +52,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#5f6ea56c962051da6488cd3f66cf664d73e2bfc4", - "@treeseed/sdk": "github:treeseed-ai/sdk#86a5daffdce947aebb1753e3458e8a5d5fea5256", + "@treeseed/core": "github:treeseed-ai/core#ecc5b58ab38ed3b6419b07606e93b34b69970ae0", + "@treeseed/sdk": "github:treeseed-ai/sdk#6104c8e275b39e5acb66da174b803f2853074508", "@treeseed/ui": "github:treeseed-ai/ui#c68ed1d9fc64c93426304eddaaf7c449622f2f61", "react": "^19.2.5", "react-dom": "^19.2.6" From e5c0058a64cee8485d61490686ecbf8a9c5c2bc0 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Tue, 11 Aug 2026 14:17:56 -0400 Subject: [PATCH 150/315] build(build): integrate canonical control-plane topology Intent: - Save hint: integrate canonical control-plane topology Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.feature-content-repository-authority.20260811T092708Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#6104c8e275b39e5acb66da174b803f2853074508 -> github:treeseed-ai/sdk#7fc01293ccf8425528a41d9682e391170d18d694 - dependencies.@treeseed/core: github:treeseed-ai/core#ecc5b58ab38ed3b6419b07606e93b34b69970ae0 -> github:treeseed-ai/core#0fbddcd84576c0ed335ae42820f4dea8bc4157fd --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6eaa7365..947c95cb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "Apache-2.0", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#ecc5b58ab38ed3b6419b07606e93b34b69970ae0", - "@treeseed/sdk": "github:treeseed-ai/sdk#6104c8e275b39e5acb66da174b803f2853074508", + "@treeseed/core": "github:treeseed-ai/core#0fbddcd84576c0ed335ae42820f4dea8bc4157fd", + "@treeseed/sdk": "github:treeseed-ai/sdk#7fc01293ccf8425528a41d9682e391170d18d694", "@treeseed/ui": "github:treeseed-ai/ui#c68ed1d9fc64c93426304eddaaf7c449622f2f61", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7397,7 +7397,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.feature-content-repository-authority.20260811T092645Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#ecc5b58ab38ed3b6419b07606e93b34b69970ae0", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#0fbddcd84576c0ed335ae42820f4dea8bc4157fd", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7408,7 +7408,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#6104c8e275b39e5acb66da174b803f2853074508", + "@treeseed/sdk": "github:treeseed-ai/sdk#7fc01293ccf8425528a41d9682e391170d18d694", "@treeseed/ui": "github:treeseed-ai/ui#c68ed1d9fc64c93426304eddaaf7c449622f2f61", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8758,7 +8758,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.feature-content-repository-authority.20260811T092601Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#6104c8e275b39e5acb66da174b803f2853074508", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#7fc01293ccf8425528a41d9682e391170d18d694", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index 7658803e..81728036 100644 --- a/package.json +++ b/package.json @@ -52,8 +52,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#ecc5b58ab38ed3b6419b07606e93b34b69970ae0", - "@treeseed/sdk": "github:treeseed-ai/sdk#6104c8e275b39e5acb66da174b803f2853074508", + "@treeseed/core": "github:treeseed-ai/core#0fbddcd84576c0ed335ae42820f4dea8bc4157fd", + "@treeseed/sdk": "github:treeseed-ai/sdk#7fc01293ccf8425528a41d9682e391170d18d694", "@treeseed/ui": "github:treeseed-ai/ui#c68ed1d9fc64c93426304eddaaf7c449622f2f61", "react": "^19.2.5", "react-dom": "^19.2.6" From 8cc4c4bd7f77e908bf41b7d48278d61142ea0527 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Tue, 11 Aug 2026 14:49:29 -0400 Subject: [PATCH 151/315] build(deps): update @treeseed/core and @treeseed/sdk Changes: - Update package.json and package-lock.json Dependency and pointer updates: - @treeseed/sdk: github:treeseed-ai/sdk#7fc01293ccf8425528a41d9682e391170d18d694 -> github:treeseed-ai/sdk#83fe9f272f35b34a74ae59607d1fb474b018d518 - @treeseed/core: github:treeseed-ai/core#0fbddcd84576c0ed335ae42820f4dea8bc4157fd -> github:treeseed-ai/core#fb018b70bd4c5c9d60ea2649d3eb5a10a118d282 --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 947c95cb..aee2e808 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "Apache-2.0", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#0fbddcd84576c0ed335ae42820f4dea8bc4157fd", - "@treeseed/sdk": "github:treeseed-ai/sdk#7fc01293ccf8425528a41d9682e391170d18d694", + "@treeseed/core": "github:treeseed-ai/core#fb018b70bd4c5c9d60ea2649d3eb5a10a118d282", + "@treeseed/sdk": "github:treeseed-ai/sdk#83fe9f272f35b34a74ae59607d1fb474b018d518", "@treeseed/ui": "github:treeseed-ai/ui#c68ed1d9fc64c93426304eddaaf7c449622f2f61", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7397,7 +7397,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.feature-content-repository-authority.20260811T092645Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#0fbddcd84576c0ed335ae42820f4dea8bc4157fd", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#fb018b70bd4c5c9d60ea2649d3eb5a10a118d282", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7408,7 +7408,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#7fc01293ccf8425528a41d9682e391170d18d694", + "@treeseed/sdk": "github:treeseed-ai/sdk#83fe9f272f35b34a74ae59607d1fb474b018d518", "@treeseed/ui": "github:treeseed-ai/ui#c68ed1d9fc64c93426304eddaaf7c449622f2f61", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8758,7 +8758,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.feature-content-repository-authority.20260811T092601Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#7fc01293ccf8425528a41d9682e391170d18d694", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#83fe9f272f35b34a74ae59607d1fb474b018d518", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index 81728036..3e2db134 100644 --- a/package.json +++ b/package.json @@ -52,8 +52,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#0fbddcd84576c0ed335ae42820f4dea8bc4157fd", - "@treeseed/sdk": "github:treeseed-ai/sdk#7fc01293ccf8425528a41d9682e391170d18d694", + "@treeseed/core": "github:treeseed-ai/core#fb018b70bd4c5c9d60ea2649d3eb5a10a118d282", + "@treeseed/sdk": "github:treeseed-ai/sdk#83fe9f272f35b34a74ae59607d1fb474b018d518", "@treeseed/ui": "github:treeseed-ai/ui#c68ed1d9fc64c93426304eddaaf7c449622f2f61", "react": "^19.2.5", "react-dom": "^19.2.6" From 7011aa70c8f47a796066340f0558a886dc047600 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Tue, 11 Aug 2026 15:25:20 -0400 Subject: [PATCH 152/315] chore(deps): update @treeseed/core and @treeseed/sdk Changes: - Update package.json and package-lock.json Dependency and pointer updates: - @treeseed/sdk: github:treeseed-ai/sdk#83fe9f272f35b34a74ae59607d1fb474b018d518 -> github:treeseed-ai/sdk#97348ed2d60e4e2c3e29b57249e363b89e9e8d94 - @treeseed/core: github:treeseed-ai/core#fb018b70bd4c5c9d60ea2649d3eb5a10a118d282 -> github:treeseed-ai/core#0a2378c8c0a59142531b680f9830ccede779b7c5 --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index aee2e808..02cc96e0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "Apache-2.0", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#fb018b70bd4c5c9d60ea2649d3eb5a10a118d282", - "@treeseed/sdk": "github:treeseed-ai/sdk#83fe9f272f35b34a74ae59607d1fb474b018d518", + "@treeseed/core": "github:treeseed-ai/core#0a2378c8c0a59142531b680f9830ccede779b7c5", + "@treeseed/sdk": "github:treeseed-ai/sdk#97348ed2d60e4e2c3e29b57249e363b89e9e8d94", "@treeseed/ui": "github:treeseed-ai/ui#c68ed1d9fc64c93426304eddaaf7c449622f2f61", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7397,7 +7397,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.feature-content-repository-authority.20260811T092645Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#fb018b70bd4c5c9d60ea2649d3eb5a10a118d282", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#0a2378c8c0a59142531b680f9830ccede779b7c5", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7408,7 +7408,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#83fe9f272f35b34a74ae59607d1fb474b018d518", + "@treeseed/sdk": "github:treeseed-ai/sdk#97348ed2d60e4e2c3e29b57249e363b89e9e8d94", "@treeseed/ui": "github:treeseed-ai/ui#c68ed1d9fc64c93426304eddaaf7c449622f2f61", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8758,7 +8758,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.feature-content-repository-authority.20260811T092601Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#83fe9f272f35b34a74ae59607d1fb474b018d518", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#97348ed2d60e4e2c3e29b57249e363b89e9e8d94", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index 3e2db134..c9f71b8f 100644 --- a/package.json +++ b/package.json @@ -52,8 +52,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#fb018b70bd4c5c9d60ea2649d3eb5a10a118d282", - "@treeseed/sdk": "github:treeseed-ai/sdk#83fe9f272f35b34a74ae59607d1fb474b018d518", + "@treeseed/core": "github:treeseed-ai/core#0a2378c8c0a59142531b680f9830ccede779b7c5", + "@treeseed/sdk": "github:treeseed-ai/sdk#97348ed2d60e4e2c3e29b57249e363b89e9e8d94", "@treeseed/ui": "github:treeseed-ai/ui#c68ed1d9fc64c93426304eddaaf7c449622f2f61", "react": "^19.2.5", "react-dom": "^19.2.6" From 181d9f673d26bd3582215f83d93f33e7cc6a0459 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Tue, 11 Aug 2026 15:58:45 -0400 Subject: [PATCH 153/315] build(deps): update @treeseed/sdk and @treeseed/core commit pointers Changes: - Update package.json and package-lock.json with new dependency commit pointers. Dependency and pointer updates: - @treeseed/sdk: github:treeseed-ai/sdk#97348ed2d60e4e2c3e29b57249e363b89e9e8d94 -> github:treeseed-ai/sdk#57c333a3d8ceb38dcf60dbbfe41c427a5fdf6ff5 - @treeseed/core: github:treeseed-ai/core#0a2378c8c0a59142531b680f9830ccede779b7c5 -> github:treeseed-ai/core#74dca36364da3de38d5635787241170fcd7d4924 --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 02cc96e0..29f30b71 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "Apache-2.0", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#0a2378c8c0a59142531b680f9830ccede779b7c5", - "@treeseed/sdk": "github:treeseed-ai/sdk#97348ed2d60e4e2c3e29b57249e363b89e9e8d94", + "@treeseed/core": "github:treeseed-ai/core#74dca36364da3de38d5635787241170fcd7d4924", + "@treeseed/sdk": "github:treeseed-ai/sdk#57c333a3d8ceb38dcf60dbbfe41c427a5fdf6ff5", "@treeseed/ui": "github:treeseed-ai/ui#c68ed1d9fc64c93426304eddaaf7c449622f2f61", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7397,7 +7397,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.feature-content-repository-authority.20260811T092645Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#0a2378c8c0a59142531b680f9830ccede779b7c5", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#74dca36364da3de38d5635787241170fcd7d4924", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7408,7 +7408,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#97348ed2d60e4e2c3e29b57249e363b89e9e8d94", + "@treeseed/sdk": "github:treeseed-ai/sdk#57c333a3d8ceb38dcf60dbbfe41c427a5fdf6ff5", "@treeseed/ui": "github:treeseed-ai/ui#c68ed1d9fc64c93426304eddaaf7c449622f2f61", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8758,7 +8758,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.feature-content-repository-authority.20260811T092601Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#97348ed2d60e4e2c3e29b57249e363b89e9e8d94", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#57c333a3d8ceb38dcf60dbbfe41c427a5fdf6ff5", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index c9f71b8f..06a1aaa7 100644 --- a/package.json +++ b/package.json @@ -52,8 +52,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#0a2378c8c0a59142531b680f9830ccede779b7c5", - "@treeseed/sdk": "github:treeseed-ai/sdk#97348ed2d60e4e2c3e29b57249e363b89e9e8d94", + "@treeseed/core": "github:treeseed-ai/core#74dca36364da3de38d5635787241170fcd7d4924", + "@treeseed/sdk": "github:treeseed-ai/sdk#57c333a3d8ceb38dcf60dbbfe41c427a5fdf6ff5", "@treeseed/ui": "github:treeseed-ai/ui#c68ed1d9fc64c93426304eddaaf7c449622f2f61", "react": "^19.2.5", "react-dom": "^19.2.6" From 7a34e9ee59472fe3e8637e706269bb85df99aa21 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Tue, 11 Aug 2026 17:29:48 -0400 Subject: [PATCH 154/315] build(build): record first singleton Market route extraction Intent: - Save hint: record first singleton Market route extraction Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.feature-content-repository-authority.20260811T092708Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#57c333a3d8ceb38dcf60dbbfe41c427a5fdf6ff5 -> github:treeseed-ai/sdk#4abb2dfe0f18b7cfe8636c405cb177501bc03ced - dependencies.@treeseed/core: github:treeseed-ai/core#74dca36364da3de38d5635787241170fcd7d4924 -> github:treeseed-ai/core#e4020bbfdd399b8585a1b690b3ac19115067904c --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 29f30b71..a034856f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "Apache-2.0", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#74dca36364da3de38d5635787241170fcd7d4924", - "@treeseed/sdk": "github:treeseed-ai/sdk#57c333a3d8ceb38dcf60dbbfe41c427a5fdf6ff5", + "@treeseed/core": "github:treeseed-ai/core#e4020bbfdd399b8585a1b690b3ac19115067904c", + "@treeseed/sdk": "github:treeseed-ai/sdk#4abb2dfe0f18b7cfe8636c405cb177501bc03ced", "@treeseed/ui": "github:treeseed-ai/ui#c68ed1d9fc64c93426304eddaaf7c449622f2f61", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7397,7 +7397,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.feature-content-repository-authority.20260811T092645Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#74dca36364da3de38d5635787241170fcd7d4924", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#e4020bbfdd399b8585a1b690b3ac19115067904c", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7408,7 +7408,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#57c333a3d8ceb38dcf60dbbfe41c427a5fdf6ff5", + "@treeseed/sdk": "github:treeseed-ai/sdk#4abb2dfe0f18b7cfe8636c405cb177501bc03ced", "@treeseed/ui": "github:treeseed-ai/ui#c68ed1d9fc64c93426304eddaaf7c449622f2f61", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8758,7 +8758,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.feature-content-repository-authority.20260811T092601Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#57c333a3d8ceb38dcf60dbbfe41c427a5fdf6ff5", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#4abb2dfe0f18b7cfe8636c405cb177501bc03ced", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index 06a1aaa7..a9db6af8 100644 --- a/package.json +++ b/package.json @@ -52,8 +52,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#74dca36364da3de38d5635787241170fcd7d4924", - "@treeseed/sdk": "github:treeseed-ai/sdk#57c333a3d8ceb38dcf60dbbfe41c427a5fdf6ff5", + "@treeseed/core": "github:treeseed-ai/core#e4020bbfdd399b8585a1b690b3ac19115067904c", + "@treeseed/sdk": "github:treeseed-ai/sdk#4abb2dfe0f18b7cfe8636c405cb177501bc03ced", "@treeseed/ui": "github:treeseed-ai/ui#c68ed1d9fc64c93426304eddaaf7c449622f2f61", "react": "^19.2.5", "react-dom": "^19.2.6" From 4ecf6924de67df5d393e9de0885149d3566f7810 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Tue, 11 Aug 2026 17:56:14 -0400 Subject: [PATCH 155/315] build(build): Link governance authority to repository receipts Intent: - Save hint: Link governance authority to repository receipts Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.feature-content-repository-authority.20260811T092708Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#4abb2dfe0f18b7cfe8636c405cb177501bc03ced -> github:treeseed-ai/sdk#26551496454f36a32dfbbb92d328ca967e8a1e08 - dependencies.@treeseed/core: github:treeseed-ai/core#e4020bbfdd399b8585a1b690b3ac19115067904c -> github:treeseed-ai/core#c7b530b90425862f80c25014503a2b34de0a59a7 --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index a034856f..6b2014b1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "Apache-2.0", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#e4020bbfdd399b8585a1b690b3ac19115067904c", - "@treeseed/sdk": "github:treeseed-ai/sdk#4abb2dfe0f18b7cfe8636c405cb177501bc03ced", + "@treeseed/core": "github:treeseed-ai/core#c7b530b90425862f80c25014503a2b34de0a59a7", + "@treeseed/sdk": "github:treeseed-ai/sdk#26551496454f36a32dfbbb92d328ca967e8a1e08", "@treeseed/ui": "github:treeseed-ai/ui#c68ed1d9fc64c93426304eddaaf7c449622f2f61", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7397,7 +7397,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.feature-content-repository-authority.20260811T092645Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#e4020bbfdd399b8585a1b690b3ac19115067904c", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#c7b530b90425862f80c25014503a2b34de0a59a7", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7408,7 +7408,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#4abb2dfe0f18b7cfe8636c405cb177501bc03ced", + "@treeseed/sdk": "github:treeseed-ai/sdk#26551496454f36a32dfbbb92d328ca967e8a1e08", "@treeseed/ui": "github:treeseed-ai/ui#c68ed1d9fc64c93426304eddaaf7c449622f2f61", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8758,7 +8758,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.feature-content-repository-authority.20260811T092601Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#4abb2dfe0f18b7cfe8636c405cb177501bc03ced", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#26551496454f36a32dfbbb92d328ca967e8a1e08", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index a9db6af8..be232d0d 100644 --- a/package.json +++ b/package.json @@ -52,8 +52,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#e4020bbfdd399b8585a1b690b3ac19115067904c", - "@treeseed/sdk": "github:treeseed-ai/sdk#4abb2dfe0f18b7cfe8636c405cb177501bc03ced", + "@treeseed/core": "github:treeseed-ai/core#c7b530b90425862f80c25014503a2b34de0a59a7", + "@treeseed/sdk": "github:treeseed-ai/sdk#26551496454f36a32dfbbb92d328ca967e8a1e08", "@treeseed/ui": "github:treeseed-ai/ui#c68ed1d9fc64c93426304eddaaf7c449622f2f61", "react": "^19.2.5", "react-dom": "^19.2.6" From 542997d95e26548f0eda4cc309e02213f5e3670d Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Tue, 11 Aug 2026 18:10:57 -0400 Subject: [PATCH 156/315] build(build): Bound staging migration fetch history Intent: - Save hint: Bound staging migration fetch history Changes: - Updates 2 files across build: 2. - Touches package-lock.json, package.json. - Plans package version/tag 0.12.59-dev.feature-content-repository-authority.20260811T092708Z for @treeseed/admin. Dependency and pointer updates: - dependencies.@treeseed/sdk: github:treeseed-ai/sdk#26551496454f36a32dfbbb92d328ca967e8a1e08 -> github:treeseed-ai/sdk#8cae3a2a21ac4bbb36606551bef997652074ccc7 - dependencies.@treeseed/core: github:treeseed-ai/core#c7b530b90425862f80c25014503a2b34de0a59a7 -> github:treeseed-ai/core#44a8091549c8fde15963de17b624c5c982c09b3f --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6b2014b1..d8c0038c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "Apache-2.0", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#c7b530b90425862f80c25014503a2b34de0a59a7", - "@treeseed/sdk": "github:treeseed-ai/sdk#26551496454f36a32dfbbb92d328ca967e8a1e08", + "@treeseed/core": "github:treeseed-ai/core#44a8091549c8fde15963de17b624c5c982c09b3f", + "@treeseed/sdk": "github:treeseed-ai/sdk#8cae3a2a21ac4bbb36606551bef997652074ccc7", "@treeseed/ui": "github:treeseed-ai/ui#c68ed1d9fc64c93426304eddaaf7c449622f2f61", "react": "^19.2.5", "react-dom": "^19.2.6" @@ -7397,7 +7397,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.feature-content-repository-authority.20260811T092645Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#c7b530b90425862f80c25014503a2b34de0a59a7", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#44a8091549c8fde15963de17b624c5c982c09b3f", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7408,7 +7408,7 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#26551496454f36a32dfbbb92d328ca967e8a1e08", + "@treeseed/sdk": "github:treeseed-ai/sdk#8cae3a2a21ac4bbb36606551bef997652074ccc7", "@treeseed/ui": "github:treeseed-ai/ui#c68ed1d9fc64c93426304eddaaf7c449622f2f61", "astro": "^5.6.1", "esbuild": "^0.28.0", @@ -8758,7 +8758,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.feature-content-repository-authority.20260811T092601Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#26551496454f36a32dfbbb92d328ca967e8a1e08", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#8cae3a2a21ac4bbb36606551bef997652074ccc7", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", diff --git a/package.json b/package.json index be232d0d..396575a7 100644 --- a/package.json +++ b/package.json @@ -52,8 +52,8 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#c7b530b90425862f80c25014503a2b34de0a59a7", - "@treeseed/sdk": "github:treeseed-ai/sdk#26551496454f36a32dfbbb92d328ca967e8a1e08", + "@treeseed/core": "github:treeseed-ai/core#44a8091549c8fde15963de17b624c5c982c09b3f", + "@treeseed/sdk": "github:treeseed-ai/sdk#8cae3a2a21ac4bbb36606551bef997652074ccc7", "@treeseed/ui": "github:treeseed-ai/ui#c68ed1d9fc64c93426304eddaaf7c449622f2f61", "react": "^19.2.5", "react-dom": "^19.2.6" From 5960487c49cd8ac9cc8e39eb6f1fece9e5fbca9a Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Sun, 16 Aug 2026 02:45:33 -0400 Subject: [PATCH 157/315] feat(agent-lab): expand monitoring guarantees and add workspace focus Changes: - Add `agent-lab-workspace-focus.scene.yaml` for workspace focus testing. - Update `monitor-agent-lab.guarantee.yaml` with expanded negative cases, scene requirements, and tablet support. - Update `use-non-overlapping-discussion-dock.guarantee.yaml` with a new negative case and diagnostic notes. - Update Agent Lab components, view models, and pages. - Update `agent-lab-monitoring.test.ts`, `team-management-architecture.test.ts`, and `client-action-executor.test.ts`. Dependency and pointer updates: - @treeseed/sdk: github:treeseed-ai/sdk#8cae3a2a21ac4bbb36606551bef997652074ccc7 -> github:treeseed-ai/sdk#964ed58d8555f11a270f35b73a75f1da97cb69d2 - @treeseed/ui: github:treeseed-ai/ui#c68ed1d9fc64c93426304eddaaf7c449622f2f61 -> github:treeseed-ai/ui#d622525826d4222ced78e7748880750f6c1377bb - @treeseed/core: github:treeseed-ai/core#44a8091549c8fde15963de17b624c5c982c09b3f -> github:treeseed-ai/core#8e4edad4f821c25656c095c17e4d4655598795b9 --- ...overlapping-discussion-dock.guarantee.yaml | 4 +- .../monitor-agent-lab.guarantee.yaml | 7 +- .../agent-lab-workspace-focus.scene.yaml | 137 ++++++++++++++++++ package-lock.json | 19 +-- package.json | 6 +- .../agent-lab/AgentLabCommandPage.astro | 2 +- src/layouts/AppLayout.astro | 3 + src/lib/agents/client-action-executor.ts | 40 +++++ src/pages/app/work/[runId].astro | 6 +- src/pages/app/work/index.astro | 4 +- src/view-models/agent-lab/agent-lab-frame.ts | 7 +- .../agent-lab-monitoring.test.ts | 12 ++ .../team-management-architecture.test.ts | 3 +- .../agents/client-action-executor.test.ts | 23 +++ 14 files changed, 248 insertions(+), 25 deletions(-) create mode 100644 guarantees/work/scenes/agent-lab-workspace-focus.scene.yaml create mode 100644 src/lib/agents/client-action-executor.ts create mode 100644 tests/unit/agents/client-action-executor.test.ts diff --git a/guarantees/agent/discussion/use-non-overlapping-discussion-dock.guarantee.yaml b/guarantees/agent/discussion/use-non-overlapping-discussion-dock.guarantee.yaml index fe0347c8..3a0d1894 100644 --- a/guarantees/agent/discussion/use-non-overlapping-discussion-dock.guarantee.yaml +++ b/guarantees/agent/discussion/use-non-overlapping-discussion-dock.guarantee.yaml @@ -16,6 +16,6 @@ preconditions: { fixtures: [integrated_treeseed_project], notes: [] } api: { required: true, verifierRefs: [] } content: { required: true, verifierRefs: [] } audit: { required: false, verifierRefs: [] } -negativeCases: [] +negativeCases: [{ id: field-addressable-content-error, actor: authenticated_user, verifierRefs: [] }] evidence: { required: [guarantee_report, scene_screenshots] } -notes: ["Activate after the stable Agent Lab Discussion scene produces repeatable evidence."] +notes: ["The shared UI dock now marks an optimistic message failed and renders field-addressable API/TreeDX diagnostics as a Platform message. Activate after the stable Agent Lab Discussion scene produces repeatable evidence for this state and the rest of the dock journey."] diff --git a/guarantees/work/agent-lab/monitor-agent-lab.guarantee.yaml b/guarantees/work/agent-lab/monitor-agent-lab.guarantee.yaml index c424044d..fc0b0469 100644 --- a/guarantees/work/agent-lab/monitor-agent-lab.guarantee.yaml +++ b/guarantees/work/agent-lab/monitor-agent-lab.guarantee.yaml @@ -10,12 +10,13 @@ summary: "A team member sees one responsive, revisioned Agent Atlas for live ope status: planned dependencies: { journeys: [738], guarantees: [guarantee.work.command.monitor-team-operations.033] } actors: { allowed: [authenticated_user, team_owner, project_lead], forbidden: [unauthorized_user] } -devices: { required: [desktop_chromium, mobile_chromium] } +devices: { required: [desktop_chromium, tablet_chromium, mobile_chromium] } gates: [future] preconditions: { fixtures: [integrated_treeseed_project], notes: ["An active team is selected and the API projection is available."] } +scene: { required: true, manifest: ../scenes/agent-lab-workspace-focus.scene.yaml, mode: { acceptance: true, demo: false, training: false }, expectedEvidence: [playwright_trace, screenshot_on_failure, console_log, network_log] } api: { required: false, verifierRefs: [] } content: { required: false, verifierRefs: [] } audit: { required: false, verifierRefs: [] } -negativeCases: ["Historical playback never substitutes current agent definitions.", "Live events never force a historical cursor to the live edge.", "Absent recorded progress is never fabricated.", "A new topology revision never applies an incompatible saved viewport.", "Generated identity and runtime status cannot be edited as design intent.", "Provider supply cannot be widened from an agent definition.", "Historical Discussion context cannot authorize current execution.", "Advanced forensic fields never displace the primary human-readable content by default."] +negativeCases: ["Historical playback never substitutes current agent definitions and always identifies the exact immutable definition revision.", "Live events never force a historical cursor to the live edge.", "Absent recorded progress is never fabricated.", "A new topology revision never applies an incompatible saved viewport.", "Generated identity and runtime status cannot be edited as design intent.", "Provider supply cannot be widened from an agent definition.", "Simulation definitions never invent a provider identity or execution provider outside the reconciled project grant and provider inventory.", "The Agent Designer never invents metaphor-based controls or fields that are absent from the canonical Zod and API contracts.", "A project does not disappear from Agent authoring merely because it has no agents yet.", "Closing a URL-opened creator never allows live refresh to reopen it.", "A dirty Agent Designer never exits through Close, Escape, browser Back, or page unload without preserving the draft or receiving explicit discard confirmation.", "Easy Simulation Bay never renders generated source editors until the operator requests them.", "Designer, Simulation Bay, the admitted workday Atlas, and Return to Designer never lose the project, immutable definition, or originating inspection path.", "Historical Discussion context cannot authorize current execution.", "Advanced forensic fields never displace the primary human-readable content by default.", "Focusing Atlas never hides global TreeSeed navigation or changes the saved vital density.", "Shrinking a surface never remounts it or discards editor state.", "Escape and browser Back never close a parent before its top nested overlay.", "Easy mode never exposes protected diagnostic evidence.", "Portfolio mode never fits inactive historical topology revisions into the live canvas.", "The interactive event dock never renders an unbounded durable event collection.", "An empty Atlas never leaves the cause unexplained."] evidence: { required: [guarantee_report] } -notes: ["The reusable Atlas implementation is present but remains planned until standard/research, expanded/compact vitals, replay, signal/event/assignment overlays, authoring conflicts, Discussion context, and production-shaped workday scenes produce repeatable evidence."] +notes: ["The reusable Atlas implementation is present but remains planned until Easy/Diagnostic, overlay-first nested detail history, authoring conflicts, Discussion context, and production-shaped simulation workdays produce repeatable evidence.", "The Agent Designer interprets design/agent-manager.html through reusable @treeseed/ui components, while the canonical SDK Zod model and API authoring route remain authoritative over editable capabilities.", "The Build projection carries authorized project choices independently from configured agents so the supported template-first UI can create a project's first repository definition.", "Simulation Bay defaults to a compact readiness explanation; exact generated YAML and MDX remain available through an explicit source control or Diagnostic mode.", "A launched simulation opens its admitted workday in focused Atlas with the originating Designer return path and exact immutable definition revision; historical playback labels that revision as retained evidence.", "Focused Atlas must always expose Shrink while preserving the live or historical projection, viewport, dock, replay cursor, selection, and nested overlay stack.", "Desktop, tablet, and mobile scene runs must all prove expanded/compact vitals, bounded event filtering and paging, exact circuit replay/live return, inline/focused layout, Escape, browser Back, and state restoration.", "The standalone simulation viewer cannot be retired until integrated Atlas proves equivalent live, replay, evaluation, forensic, accessibility, responsive, and machine-readable evidence.", "The live portfolio embeds only a bounded recent event window with its exact durable total. Filters and paging are visible in the dock; complete evidence remains available through bounded forensic APIs and machine-readable CLI/tool surfaces."] diff --git a/guarantees/work/scenes/agent-lab-workspace-focus.scene.yaml b/guarantees/work/scenes/agent-lab-workspace-focus.scene.yaml new file mode 100644 index 00000000..e7e7bcac --- /dev/null +++ b/guarantees/work/scenes/agent-lab-workspace-focus.scene.yaml @@ -0,0 +1,137 @@ +schemaVersion: treeseed.scene/v1 +id: agent-lab-workspace-focus +title: Agent Lab Workspace Focus +description: Verify vital density and Atlas content-region focus through the authenticated Agent Lab. +audience: [operator, designer, qa] +mode: { test: true, demo: false, training: false } +target: + app: market + environment: local + baseUrl: auto + browser: chromium + viewport: { width: 1600, height: 900 } +devices: + defaultProfile: desktop_chromium + profiles: + - { id: desktop_chromium, title: Desktop Chromium, orientation: landscape, viewport: { width: 1600, height: 900 }, video: { width: 1600, height: 900 }, output: { width: 1920, height: 1080 }, deviceScaleFactor: 1, isMobile: false, hasTouch: false } + - { id: tablet_chromium, title: Tablet Chromium, orientation: portrait, viewport: { width: 820, height: 1180 }, video: { width: 820, height: 1180 }, output: { width: 820, height: 1180 }, deviceScaleFactor: 2, isMobile: true, hasTouch: true } + - { id: mobile_chromium, title: Mobile Chromium, orientation: portrait, viewport: { width: 390, height: 844 }, video: { width: 390, height: 844 }, output: { width: 390, height: 844 }, deviceScaleFactor: 2, isMobile: true, hasTouch: true } +setup: + dev: { required: true, reuseExisting: true } + auth: { role: admin, required: true, seedOnly: true } +artifacts: { trace: true, video: false, screenshots: true, console: true, network: true, timeline: true, appLogs: true } +runtime: + mode: acceptance + failure: { continueOnFailure: false } + checkpoints: { enabled: false } +chapters: + - { id: authentication, title: Enter the team Agent Lab, startsAt: open-sign-in } + - { id: workspace-focus, title: Verify focus and navigation state, startsAt: wait-for-atlas } +workflow: + - id: open-sign-in + title: Open Agent Lab sign in + action: { goto: /auth/sign-in?returnTo=/app/work } + expect: { urlIncludes: /auth/sign-in } + - id: enter-login + title: Enter visual-audit administrator + action: { fill: { css: '#login', internal: true, value: visual.admin@treeseed.io } } + - id: enter-password + title: Enter visual-audit password + action: { fill: { css: '#password', internal: true, value: TreeSeedVisualAudit!2026 } } + - id: sign-in + title: Sign in to Agent Lab + action: { click: { role: button, name: Sign in } } + expect: { urlIncludes: /app/work } + - id: choose-team + title: Choose the visual-audit team + action: { select: { css: '.ts-product-shell__desktop-operations [data-team-switcher] select[name="teamId"]', internal: true, label: Acceptance visual-audit } } + - id: wait-for-atlas + title: Wait for the team Atlas + action: { pause: { mode: timed, durationSeconds: 2 } } + expect: + text: Visual Audit Agent + visible: + - { css: '[data-scene="agent-lab.atlas"]', internal: true } + - { css: '[data-atlas-selectable][aria-label^="Visual Audit Agent,"]', internal: true } + - id: compress-vitals + title: Toggle the persisted vital-statistics density + action: { click: { css: '.ts-operations-density', internal: true } } + expect: + visible: + - { css: '.ts-operations-density[aria-expanded]', internal: true } + - id: page-events-forward + title: Page through the bounded event log + action: { click: { role: button, name: Next } } + expect: { text: Page 2 of 2 } + - id: page-events-back + title: Return to the first event page + action: { click: { role: button, name: Previous } } + expect: { text: Page 1 of 2 } + - id: filter-events + title: Filter the event log by forensic evidence text + action: { fill: { css: '.ts-atlas-filters input[placeholder="Agent, project, or event"]', internal: true, value: forensic event 26 } } + expect: { text: 1 matching event } + - id: select-event-filter + title: Select the active event search + action: { keyboard: Control+A } + - id: clear-event-filter + title: Restore the complete bounded event window + action: { keyboard: Backspace } + expect: { text: 27 matching events } + - id: replay-from-start + title: Freeze the workday circuit at its first recorded instant + action: { click: { role: button, name: Stop and return to start } } + expect: + visible: + - { css: '[data-scene="agent-lab.atlas"][data-mode="historical"]', internal: true } + - id: inspect-historical-agent + title: Inspect the definition retained by historical playback + action: { click: { css: '[data-atlas-selectable][aria-label^="Visual Audit Agent,"]', internal: true } } + expect: + text: Historical definition + visible: + - { css: '[data-scene="agent-lab.definition-provenance"][data-mode="historical"]', internal: true } + - id: close-historical-agent + title: Return to the historical circuit + action: { click: { role: button, name: Close detail } } + expect: + visible: + - { css: '[data-scene="agent-lab.atlas"][data-mode="historical"]', internal: true } + - id: return-to-live-edge + title: Return the same circuit to its live edge + action: { click: { css: '.ts-atlas-live-edge', internal: true } } + expect: + visible: + - { css: '[data-scene="agent-lab.atlas"][data-mode="live"]', internal: true } + - id: expand-atlas + title: Focus Atlas across the Agent Lab content region + action: { click: { role: button, name: Expand Agent Atlas } } + expect: + urlIncludes: focus=atlas + visible: + - { css: '[data-workspace-surface="agent-atlas"][data-mode="focused"]', internal: true } + - { role: button, name: Shrink Agent Atlas } + - id: escape-focus + title: Shrink Atlas with Escape + action: { keyboard: Escape } + expect: + visible: + - { css: '[data-workspace-surface="agent-atlas"][data-mode="inline"]', internal: true } + - { role: button, name: Expand Agent Atlas } + - id: expand-atlas-for-history + title: Focus Atlas for browser history verification + action: { click: { role: button, name: Expand Agent Atlas } } + expect: { urlIncludes: focus=atlas } + - id: browser-back-focus + title: Shrink Atlas through browser Back + action: { browserHistory: back } + expect: + visible: + - { css: '[data-workspace-surface="agent-atlas"][data-mode="inline"]', internal: true } + - { role: button, name: Expand Agent Atlas } + - id: restore-vitals + title: Restore the persisted vital-statistics density + action: { click: { css: '.ts-operations-density', internal: true } } + expect: + visible: + - { css: '.ts-operations-density[aria-expanded]', internal: true } diff --git a/package-lock.json b/package-lock.json index d8c0038c..f68e4835 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,9 @@ "license": "Apache-2.0", "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#44a8091549c8fde15963de17b624c5c982c09b3f", - "@treeseed/sdk": "github:treeseed-ai/sdk#8cae3a2a21ac4bbb36606551bef997652074ccc7", - "@treeseed/ui": "github:treeseed-ai/ui#c68ed1d9fc64c93426304eddaaf7c449622f2f61", + "@treeseed/core": "github:treeseed-ai/core#8e4edad4f821c25656c095c17e4d4655598795b9", + "@treeseed/sdk": "github:treeseed-ai/sdk#964ed58d8555f11a270f35b73a75f1da97cb69d2", + "@treeseed/ui": "github:treeseed-ai/ui#d622525826d4222ced78e7748880750f6c1377bb", "react": "^19.2.5", "react-dom": "^19.2.6" }, @@ -7397,7 +7397,7 @@ }, "node_modules/@treeseed/core": { "version": "0.12.60-dev.feature-content-repository-authority.20260811T092645Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#44a8091549c8fde15963de17b624c5c982c09b3f", + "resolved": "git+ssh://git@github.com/treeseed-ai/core.git#8e4edad4f821c25656c095c17e4d4655598795b9", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/check": "^0.9.8", @@ -7408,8 +7408,8 @@ "@astrojs/sitemap": "3.7.0", "@astrojs/starlight": "0.37.6", "@tailwindcss/vite": "^4.1.4", - "@treeseed/sdk": "github:treeseed-ai/sdk#8cae3a2a21ac4bbb36606551bef997652074ccc7", - "@treeseed/ui": "github:treeseed-ai/ui#c68ed1d9fc64c93426304eddaaf7c449622f2f61", + "@treeseed/sdk": "github:treeseed-ai/sdk#964ed58d8555f11a270f35b73a75f1da97cb69d2", + "@treeseed/ui": "github:treeseed-ai/ui#d622525826d4222ced78e7748880750f6c1377bb", "astro": "^5.6.1", "esbuild": "^0.28.0", "katex": "^0.16.22", @@ -8758,7 +8758,7 @@ }, "node_modules/@treeseed/sdk": { "version": "0.12.63-dev.feature-content-repository-authority.20260811T092601Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#8cae3a2a21ac4bbb36606551bef997652074ccc7", + "resolved": "git+ssh://git@github.com/treeseed-ai/sdk.git#964ed58d8555f11a270f35b73a75f1da97cb69d2", "license": "AGPL-3.0-only", "dependencies": { "@github/copilot": "1.0.39", @@ -8789,7 +8789,8 @@ "typescript": "^5.9.3", "unified": "^11.0.5", "wrangler": "4.86.0", - "yaml": "^2.8.1" + "yaml": "^2.8.1", + "zod": "^3.25.76" }, "bin": { "treeseed-content-publish": "dist/scripts/content/publish-content.js", @@ -9457,7 +9458,7 @@ }, "node_modules/@treeseed/ui": { "version": "0.12.18-dev.feature-content-repository-authority.20260811T113238Z", - "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#c68ed1d9fc64c93426304eddaaf7c449622f2f61", + "resolved": "git+ssh://git@github.com/treeseed-ai/ui.git#d622525826d4222ced78e7748880750f6c1377bb", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", diff --git a/package.json b/package.json index 396575a7..ac1decb8 100644 --- a/package.json +++ b/package.json @@ -52,9 +52,9 @@ }, "dependencies": { "@react-email/render": "^2.0.8", - "@treeseed/core": "github:treeseed-ai/core#44a8091549c8fde15963de17b624c5c982c09b3f", - "@treeseed/sdk": "github:treeseed-ai/sdk#8cae3a2a21ac4bbb36606551bef997652074ccc7", - "@treeseed/ui": "github:treeseed-ai/ui#c68ed1d9fc64c93426304eddaaf7c449622f2f61", + "@treeseed/core": "github:treeseed-ai/core#8e4edad4f821c25656c095c17e4d4655598795b9", + "@treeseed/sdk": "github:treeseed-ai/sdk#964ed58d8555f11a270f35b73a75f1da97cb69d2", + "@treeseed/ui": "github:treeseed-ai/ui#d622525826d4222ced78e7748880750f6c1377bb", "react": "^19.2.5", "react-dom": "^19.2.6" }, diff --git a/src/components/agent-lab/AgentLabCommandPage.astro b/src/components/agent-lab/AgentLabCommandPage.astro index 4aecbefd..28e6bc10 100644 --- a/src/components/agent-lab/AgentLabCommandPage.astro +++ b/src/components/agent-lab/AgentLabCommandPage.astro @@ -4,7 +4,7 @@ import { CommandWorkspace } from '@treeseed/ui/components/react/CommandCenter'; import TreeseedAppLayout from '../../layouts/AppLayout.astro'; import type { loadAgentLabCommandPage, AgentLabCommandSurface } from '../../view-models/agent-lab/command-page.ts'; import AgentLabChrome from './AgentLabChrome.astro'; -interface Props extends Awaited> { current: AgentLabCommandSurface } +type Props = Awaited> & { current: AgentLabCommandSurface }; const { app, preferences, frame, surface, endpoints, query, current } = Astro.props as Props; --- diff --git a/src/layouts/AppLayout.astro b/src/layouts/AppLayout.astro index ae0a5056..146a3d0f 100644 --- a/src/layouts/AppLayout.astro +++ b/src/layouts/AppLayout.astro @@ -142,6 +142,7 @@ const discussionContext = principal && activeTeam ? {
- )} + {!canManage ? + : custodyUnavailable ? + :
+ {provider.credentialProfiles.filter(profile => profile.authoritySchemes.includes('openbao') && credentials[profile.id]).map(profile => { + const status = credentials[profile.id]; + const action = `/v1/teams/${encodeURIComponent(team.id)}/services/${encodeURIComponent(connection.id)}/credentials/${encodeURIComponent(profile.id)}`; + return + {status.configured ? 'Configured in OpenBao' : 'Not configured'} +
+ + + {profile.fields.filter(field => field.sensitive).map(field => + + )} + +
+ + {status.configured && ['validate','delete'].map(operation =>
+ + + +
)} +
; + })} +
}
diff --git a/src/pages/app/services/index.astro b/src/pages/app/services/index.astro index ab9e80f0..48620320 100644 --- a/src/pages/app/services/index.astro +++ b/src/pages/app/services/index.astro @@ -14,9 +14,7 @@ const preferences = await api.accountPreferences().catch(() => ({ timeZone: 'UTC const providerFilter = Astro.url.searchParams.get('provider') ?? ''; const capabilityFilter = Astro.url.searchParams.get('capability') ?? ''; let services: any[] = []; -let vault: any = null; let unavailable = false; -let vaultUnavailable = false; const managementRoles = new Set(['team_owner', 'project_lead', 'service_admin']); const canManage = Boolean(team?.roles?.some((role: string) => managementRoles.has(role)) || team?.currentUserRole && managementRoles.has(team.currentUserRole)); if (team) { @@ -25,16 +23,9 @@ if (team) { } catch { unavailable = true; } - if (canManage) { - try { - vault = await api.request('GET', `/v1/teams/${encodeURIComponent(team.id)}/vault`); - } catch { - vaultUnavailable = true; - } - } } --- - + diff --git a/src/pages/app/services/vault.astro b/src/pages/app/services/vault.astro deleted file mode 100644 index 1663cad0..00000000 --- a/src/pages/app/services/vault.astro +++ /dev/null @@ -1,284 +0,0 @@ ---- -import Badge from '@treeseed/ui/components/astro/data/Badge.astro'; -import Timestamp from '@treeseed/ui/components/astro/data/Timestamp.astro'; -import Button from '@treeseed/ui/components/astro/forms/Button.astro'; -import FormActions from '@treeseed/ui/components/astro/forms/FormActions.astro'; -import Field from '@treeseed/ui/components/astro/forms/Field.astro'; -import PasswordSetupFields from '@treeseed/ui/components/astro/forms/fields/PasswordSetupFields.astro'; -import TextInput from '@treeseed/ui/components/astro/forms/TextInput.astro'; -import DisclosureList from '@treeseed/ui/components/astro/data/DisclosureList.astro'; -import DataBoundary from '@treeseed/ui/components/astro/patterns/DataBoundary.astro'; -import SetupProgress from '@treeseed/ui/components/astro/patterns/SetupProgress.astro'; -import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; -import Panel from '@treeseed/ui/components/astro/surface/Panel.astro'; -import SettingsTemplate from '@treeseed/ui/components/astro/templates/SettingsTemplate.astro'; -import TreeseedAppLayout from '../../../layouts/AppLayout.astro'; -import { ensureCsrfToken } from '../../../lib/auth/support/csrf'; -import { ApiClientFacade } from '../../../lib/market/api-client'; -import { serviceSections } from '../../../lib/services/navigation'; -import { loadAppContext } from '../../../view-models/app-access.js'; - -if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent('/app/services/vault')}`); -const context = await loadAppContext(Astro); -const team = context.activeTeam; -const canManageVault = Boolean(team?.roles?.includes('team_owner') || team?.currentUserRole === 'team_owner'); -const api = new ApiClientFacade(Astro); -const preferences = await api.accountPreferences().catch(() => ({ timeZone: 'UTC' })); -let userVaultKey: any = null; -let vault: any = null; -let grantCandidates: any[] = []; -let vaultEnvelopes: any[] = []; -let unavailable = false; -let forbidden = false; -try { - userVaultKey = await api.request('GET', '/v1/users/me/vault-key'); - if (team) { - vault = await api.request('GET', `/v1/teams/${encodeURIComponent(team.id)}/vault`); - if (vault?.ownGrant && (team?.roles?.includes('team_owner') || team?.currentUserRole === 'team_owner')) { - [grantCandidates, vaultEnvelopes] = await Promise.all([ - api.request('GET', `/v1/teams/${encodeURIComponent(team.id)}/vault/grant-candidates`), - api.request('GET', `/v1/teams/${encodeURIComponent(team.id)}/vault/credential-envelopes`), - ]); - } - } -} catch (error) { - const status = Number((error as { status?: unknown })?.status); - if (status === 401 || status === 403 || (status === 404 && !canManageVault)) forbidden = true; - else unavailable = true; -} -const csrfToken = ensureCsrfToken(Astro); -const setupSteps = [ - { - id: 'personal', - label: 'Create personal access', - description: 'Your passphrase protects your administrator key and never leaves this browser.', - status: userVaultKey ? 'complete' : 'current', - knowledgePageId: 'vault.personal-key', - }, - { - id: 'team', - label: 'Initialize team custody', - description: 'A random team key is wrapped separately for each credential administrator.', - status: vault ? 'complete' : userVaultKey ? 'current' : 'blocked', - knowledgePageId: 'vault.team-custody', - }, - { - id: 'recovery', - label: 'Review recovery', - description: 'Know how access is restored—and when credentials must be reentered.', - status: vault ? 'current' : 'blocked', - knowledgePageId: 'vault.recovery', - }, -] as const; ---- - - - -
- {!team ? ( - - ) : forbidden ? ( - - ) : unavailable ? ( - -
-
- ) : ( - <> - {!canManageVault ? ( - - ) : null} -
- - -
- - {!userVaultKey ? ( - -
- - - - -
- ) : !vault ? ( - -
- Administrator key ready - Client-encrypted -
- {!canManageVault ? ( -

Only a team owner can initialize or change vault grants. Service administrators can manage credentials after an owner grants cryptographic access.

- ) : ( -
- - - - - - - -
- )} -
- ) : ( - <> - -
- Active - Key version {vault.activeKeyVersion} - {vault.ownGrant ? 'You have access' : 'Grant required'} -
-

Initialized . If every authorized administrator loses access, protected credentials must be reentered.

- -
- - -
- Administrator key ready - Personal key version {userVaultKey.version} -
-
- Change personal passphrase -

This re-encrypts your personal private key. Provider credentials are not decrypted or rewritten.

-
- - - - - - - - -
-
- {vault.grants.map((grant: any) => ( -
- {grant.userId === Astro.locals.auth?.principal?.id ? 'Your administrator grant' : `Administrator ${grant.userId}`} - Key version {grant.keyVersion} · {grant.status} - {canManageVault && vault.ownGrant && grant.status === 'active' && grant.userId !== Astro.locals.auth?.principal?.id ? ( -
- - -
- ) : null} -
- ))} -
- {canManageVault && vault.ownGrant && grantCandidates.length ? ( -
- Grant another administrator access -

The team key is opened and rewrapped only in this browser. The recipient uses a separate personal passphrase.

- {grantCandidates.map((candidate) => ( -
- - - - - - -

{candidate.displayName} · {candidate.roles.join(', ')}

- - - - -
- ))} -
- ) : null} - {canManageVault && vault.ownGrant ? ( -
- Rotate the team vault key -

Rewrap every credential key and administrator grant without decrypting or replacing provider credential values.

-
- - - - - - grant.status === 'active'))} /> - - - - -
-
- ) : null} -
- - {canManageVault ? ( - -
- - - - - - - - - - - - - -
-
- ) : null} - - )} - - )} -
-
-
- - diff --git a/src/routes.ts b/src/routes.ts index 2f6ef6e4..58200b01 100644 --- a/src/routes.ts +++ b/src/routes.ts @@ -55,7 +55,6 @@ export const ADMIN_ROUTES: readonly SiteRouteContribution[] = validateRouteCapab adminRoute('/app/teams/[teamId]/members', 'pages/app/teams/[teamId]/members.astro', { id: 'admin.team.members', description: 'Team membership, invitation, role, and removal operations.', guarantees: ['guarantee.team.membership.invite-team-members.017', 'guarantee.team.membership.change-member-role.019', 'guarantee.team.membership.remove-team-member.020'], knowledgePageIds: ['team.membership'] }), adminRoute('/app/services', 'pages/app/services/index.astro', { id: 'admin.services.collection', description: 'Active-team provider connections and capability availability.', guarantees: ['guarantee.service.connection.service-management-production-readiness.026'], knowledgePageIds: ['services.connections'] }), adminRoute('/app/services/new', 'pages/app/services/new.astro', { id: 'admin.services.create', description: 'Provider-first service connection wizard.', guarantees: ['guarantee.service.connection.connect-service.023'], knowledgePageIds: ['services.connect'] }), - adminRoute('/app/services/vault', 'pages/app/services/vault.astro', { id: 'admin.services.vault', description: 'Personal administrator key and team vault custody management.', guarantees: ['guarantee.service.vault.initialize-personal-vault.021', 'guarantee.service.vault.recover-vault-access.022'], knowledgePageIds: ['vault.overview'] }), adminRoute('/app/services/[connectionId]', 'pages/app/services/[connectionId].astro', { id: 'admin.services.detail', description: 'Provider connection, capabilities, encrypted credentials, activity, and settings.', guarantees: ['guarantee.service.connection.edit-service.024', 'guarantee.service.connection.disconnect-service.025'], knowledgePageIds: ['services.connection'] }), adminRoute('/app/feedback', 'pages/app/feedback/index.astro', { id: 'admin.feedback.collection', description: 'Platform-administrator feedback search, triage, and privacy-safe export.', accessPolicy: ['platform_admin'], guarantees: ['guarantee.admin.feedback.manage-feedback.030'], knowledgePageIds: ['feedback.administration'] }), adminRoute('/app/feedback/[feedbackId]', 'pages/app/feedback/[feedbackId].astro', { id: 'admin.feedback.detail', description: 'Private feedback context, attachment, timeline, and resolution workflow.', accessPolicy: ['platform_admin'], guarantees: ['guarantee.admin.feedback.manage-feedback.030'], knowledgePageIds: ['feedback.triage'] }), diff --git a/tests/contract/contextual-help/contextual-help-architecture.test.ts b/tests/contract/contextual-help/contextual-help-architecture.test.ts index 5fa17a30..4912c4f5 100644 --- a/tests/contract/contextual-help/contextual-help-architecture.test.ts +++ b/tests/contract/contextual-help/contextual-help-architecture.test.ts @@ -19,7 +19,7 @@ describe('Admin contextual help architecture', () => { const routedPages = [...routes.matchAll(/knowledgePageIds:\s*\['([^']+)'\]/gu)].map((match) => match[1]); expect(routedPages.length).toBeGreaterThanOrEqual(15); for (const id of routedPages) expect(id).toMatch(/^[a-z][a-z0-9-]*\.[a-z][a-z0-9-]*$/u); - for (const route of ['/app/account', '/app/teams', '/app/services', '/app/services/vault', '/team-invites/[token]/accept']) { + for (const route of ['/app/account', '/app/teams', '/app/services', '/team-invites/[token]/accept']) { const line = routes.split('\n').find((candidate) => candidate.includes(`adminRoute('${route}'`)); expect(line, route).toContain('knowledgePageIds'); } @@ -42,7 +42,6 @@ describe('Admin contextual help architecture', () => { 'src/pages/app/services/index.astro', 'src/pages/app/services/new.astro', 'src/pages/app/services/[connectionId].astro', - 'src/pages/app/services/vault.astro', ].map(read)).join('\n'); const literalIds = [...sources.matchAll(/knowledgePageId="([^"]+)"/gu)].map((match) => match[1]); expect(literalIds.length).toBeGreaterThan(20); @@ -50,15 +49,13 @@ describe('Admin contextual help architecture', () => { expect(read('src/lib/help/context.ts')).toContain('/v1/knowledge/pages/{pageId}'); }); - it('makes vault passphrase reuse explicit and uses shared form spacing', () => { - const vault = read('src/pages/app/services/vault.astro'); - expect(vault).toContain('Re-enter the personal vault passphrase you created in step 1.'); - expect(vault).toContain('This does not create a second or shared passphrase.'); - expect(vault).toContain('label="Step 1 personal vault passphrase"'); - expect(vault.match(/knowledgePageId="vault\.(?:personal-key|team-custody|recovery)"/gu)?.length).toBeGreaterThanOrEqual(3); - expect(vault).toContain('class="ts-form-stack"'); - expect(vault).toContain(' { + const page=read('src/pages/app/services/[connectionId].astro'); + expect(page).toContain('Core OpenBao stores encrypted team credentials.'); + expect(page).toContain('knowledgePageId="services.credentials"'); + expect(page).toContain('class="ts-form-stack"'); + expect(page).not.toContain('passphrase'); + }); it('has one shared dialog transport and no legacy help implementation', () => { const uiPackage = readDependency('@treeseed/ui', 'package.json'); diff --git a/tests/contract/package/admin-package.test.ts b/tests/contract/package/admin-package.test.ts index cb6e4d0f..7484cc68 100644 --- a/tests/contract/package/admin-package.test.ts +++ b/tests/contract/package/admin-package.test.ts @@ -28,7 +28,6 @@ const EXPECTED_ROUTES = [ '/app/feedback/[feedbackId]', '/app/services', '/app/services/new', - '/app/services/vault', '/app/services/[connectionId]', '/app/knowledge', '/app/knowledge/packs/[buildId]/download', diff --git a/tests/contract/service-management/service-management-architecture.test.ts b/tests/contract/service-management/service-management-architecture.test.ts index f5f8f8be..14cd0f94 100644 --- a/tests/contract/service-management/service-management-architecture.test.ts +++ b/tests/contract/service-management/service-management-architecture.test.ts @@ -9,7 +9,7 @@ const readDependency = (name: string, path: string) => readFileSync(resolve(root describe('service management architecture', () => { it('owns one provider-first route family with no legacy host route', () => { const routes = read('src/routes.ts'); - for (const route of ['/app/services', '/app/services/new', '/app/services/vault', '/app/services/[connectionId]']) { + for (const route of ['/app/services', '/app/services/new', '/app/services/[connectionId]']) { expect(routes).toContain(`'${route}'`); } expect(routes).not.toContain('/app/hosts'); @@ -31,11 +31,9 @@ describe('service management architecture', () => { read('src/pages/app/services/index.astro'), read('src/pages/app/services/new.astro'), read('src/pages/app/services/[connectionId].astro'), - read('src/pages/app/services/vault.astro'), ].join('\n'); expect(createSurface).toContain('ProviderCard'); expect(pages).toContain('@treeseed/ui/components/astro/templates/SettingsTemplate.astro'); - expect(pages).toContain('@treeseed/ui/components/astro/patterns/SetupProgress.astro'); expect(pages).toContain('data-ts-submit="enhanced"'); expect(pages).not.toMatch(/\bfetch\s*\(/u); expect(pages).not.toContain('window.alert'); @@ -43,10 +41,10 @@ describe('service management architecture', () => { it('uses one canonical routed tab model across collection, setup, detail, and vault pages', () => { const navigation = read('src/lib/services/navigation.ts'); - for (const label of ['Connections', 'Vault']) { + for (const label of ['Connections']) { expect(navigation).toContain(`'${label}'`); } - expect(navigation.match(/label: '/gu)).toHaveLength(2); + expect(navigation.match(/label: '/gu)).toHaveLength(1); expect(navigation).not.toContain('Connect service'); const detail = read('src/pages/app/services/[connectionId].astro'); expect(detail).not.toContain('mode="panels"'); @@ -54,27 +52,17 @@ describe('service management architecture', () => { expect(detail).not.toContain('searchParams.get(\'tab\')'); }); - it('guides vault setup through shared progress and explanation primitives', () => { - const vault = read('src/pages/app/services/vault.astro'); - expect(vault).toContain('Secure credential setup'); - expect(vault).toContain('Credentials stay under your control'); - expect(vault).toContain('TreeSeed never retains'); - expect(vault).toContain('Recovery and custody rules'); - expect(vault).toContain('Step 1 of 3'); - expect(vault).toContain('Step 2 of 3'); - expect(vault).toContain('Step 3 of 3'); - }); + it('uses core managed custody without a separate vault setup route', () => { + const detail=read('src/pages/app/services/[connectionId].astro'); + expect(detail).toContain('Core OpenBao');expect(detail).toContain('managed-credentials'); + expect(read('src/routes.ts')).not.toContain('/app/services/vault'); + }); - it('keeps secret operations in browser adapters and sends only envelopes', () => { - const adapters = read('src/lib/services/form-adapters.ts'); - expect(adapters).toContain('encryptServiceVaultPrivateKey'); - expect(adapters).toContain('encryptServiceCredential'); - expect(adapters).toContain('createTeamVaultGrant'); - expect(adapters).toContain('openTeamVaultGrant'); - expect(adapters).not.toContain('localStorage'); - expect(adapters).not.toContain('sessionStorage'); - expect(adapters).not.toContain('document.cookie'); - }); + it('sends credentials through authenticated enhanced forms without persistent browser custody', () => { + const adapters=read('src/lib/services/form-adapters.ts'); + expect(adapters).toContain('Idempotency-Key');expect(adapters).toContain('x-treeseed-csrf');expect(adapters).toContain('expectedVersion'); + for(const retired of ['encryptServiceCredential','createTeamVaultGrant','localStorage','sessionStorage','document.cookie'])expect(adapters).not.toContain(retired); + }); it('supports portable topology references and isolated R2 state metadata', () => { const createSurface = readDependency('@treeseed/ui', 'dist/astro/service/workspace/ServiceConnectionCreateSurface.astro'); @@ -88,7 +76,7 @@ describe('service management architecture', () => { }); it('renders service activity in the persisted user timezone', () => { - for (const page of ['src/pages/app/services/index.astro', 'src/pages/app/services/[connectionId].astro', 'src/pages/app/services/vault.astro']) { + for (const page of ['src/pages/app/services/index.astro', 'src/pages/app/services/[connectionId].astro']) { const source = read(page); expect(source).toContain('api.accountPreferences()'); expect(source).toContain('timeZone={preferences.timeZone}'); diff --git a/tests/unit/services/managed-credentials.test.ts b/tests/unit/services/managed-credentials.test.ts new file mode 100644 index 00000000..aa76e8ab --- /dev/null +++ b/tests/unit/services/managed-credentials.test.ts @@ -0,0 +1,32 @@ +import { describe, expect, it, vi } from 'vitest'; +const adapters = vi.hoisted(() => new Map()); +vi.mock('@treeseed/ui/forms/client', () => ({registerFormAdapter: (name:string, adapter:any) => { + adapters.set(name,adapter); return () => adapters.delete(name); +}})); +import { registerServiceFormAdapters } from '../../../src/lib/services/form-adapters'; +describe('managed credentials form boundary', () => { + it('sends CAS credentials to the same-origin API, clears inputs and retains no browser vault keys', () => { + const dispose=registerServiceFormAdapters(), formData=new FormData(); + formData.set('expectedVersion','3'); formData.set('csrfToken','synthetic-csrf'); + formData.set('secret.apiToken',' synthetic-token '); formData.set('secret.optional',''); + const input={value:' synthetic-token '}; + const request=adapters.get('managed-credentials').buildRequest({formData,form:{ + action:'https://local.example/v1/teams/team/services/connection/credentials/profile', + dataset:{tsMethod:'PUT'},querySelectorAll:()=>[input], + }}); + expect(request.init.method).toBe('PUT'); + expect(JSON.parse(request.init.body)).toEqual({expectedVersion:3,values:{apiToken:' synthetic-token '}}); + expect(request.init.headers['x-treeseed-csrf']).toBe('synthetic-csrf'); + expect(request.init.headers['Idempotency-Key']).toMatch(/^[a-f0-9-]{36}$/); + expect(input.value).toBe(''); dispose(); + }); + it('delete and validate send version only', () => { + const dispose=registerServiceFormAdapters(); + for(const method of ['DELETE','POST']) { + const formData=new FormData(); formData.set('expectedVersion','4'); formData.set('secret.apiToken','unused'); + const request=adapters.get('managed-credentials').buildRequest({formData,form:{action:'/credentials',dataset:{tsMethod:method},querySelectorAll:()=>[]}}); + expect(JSON.parse(request.init.body)).toEqual({expectedVersion:4}); + } + dispose(); + }); +}); From 417df0d0e4acca05020652c9d6b71f671158c167 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Sat, 5 Sep 2026 12:21:41 -0400 Subject: [PATCH 267/315] fix(services): consume canonical cursor collections before rendering (#76) --- package-lock.json | 4 +- package.json | 2 +- src/lib/services/collections.ts | 25 ++++++++++++ src/pages/app/services/[connectionId].astro | 3 +- src/pages/app/services/index.astro | 3 +- tests/unit/services/collections.test.ts | 45 +++++++++++++++++++++ 6 files changed, 77 insertions(+), 5 deletions(-) create mode 100644 src/lib/services/collections.ts create mode 100644 tests/unit/services/collections.test.ts diff --git a/package-lock.json b/package-lock.json index 0385ca56..c98d840a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@treeseed/admin", - "version": "0.12.59-rc.27", + "version": "0.12.59-rc.28", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@treeseed/admin", - "version": "0.12.59-rc.27", + "version": "0.12.59-rc.28", "license": "Apache-2.0", "dependencies": { "@astrojs/starlight": "0.37.6", diff --git a/package.json b/package.json index f04bd05d..a6950505 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@treeseed/admin", - "version": "0.12.59-rc.27", + "version": "0.12.59-rc.28", "description": "Treeseed administration portal framework built on @treeseed/core and @treeseed/ui.", "license": "Apache-2.0", "repository": { diff --git a/src/lib/services/collections.ts b/src/lib/services/collections.ts new file mode 100644 index 00000000..e0b66f9e --- /dev/null +++ b/src/lib/services/collections.ts @@ -0,0 +1,25 @@ +import { controlPlaneOperation } from '@treeseed/sdk/operator-contracts'; +import type { ApiClientFacade } from '../market/api-client'; + +type ServiceCollection = 'services.connections.list' | 'services.credential.authorities.list'; + +/** Service reads return cursor pages, never bare arrays. Reject incomplete reads. */ +export async function loadServiceItems(api: { invoke: OmitThisParameter }, operationId: ServiceCollection, + path: { teamId: string; connectionId?: string }): Promise { + const operation = controlPlaneOperation(operationId); + const items: any[] = [], seen = new Set(); + let cursor: string | undefined; + for (let count = 0; count < 100; count++) { + const page = await api.invoke(operation, { path, query: cursor ? { cursor } : {}, body: undefined }); + if (!page || typeof page !== 'object' || !Array.isArray(page.items) + || page.items.some((item: unknown) => !item || typeof item !== 'object' || Array.isArray(item)) + || !(page.cursor === null || typeof page.cursor === 'string' && page.cursor.length > 0)) { + throw new Error('Invalid service collection response.'); + } + items.push(...page.items); + if (page.cursor === null) return items; + if (seen.has(page.cursor)) throw new Error('Repeated service collection cursor.'); + seen.add(page.cursor); cursor = page.cursor; + } + throw new Error('Service collection pagination limit exceeded.'); +} diff --git a/src/pages/app/services/[connectionId].astro b/src/pages/app/services/[connectionId].astro index 3858ce68..57d3b4f0 100644 --- a/src/pages/app/services/[connectionId].astro +++ b/src/pages/app/services/[connectionId].astro @@ -17,6 +17,7 @@ import TreeseedAppLayout from '../../../layouts/AppLayout.astro'; import { ensureCsrfToken } from '../../../lib/auth/support/csrf'; import { ApiClientFacade } from '../../../lib/market/api-client'; import { serviceSections } from '../../../lib/services/navigation'; +import { loadServiceItems } from '../../../lib/services/collections'; import { loadAppContext } from '../../../view-models/app-access.js'; if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); @@ -40,8 +41,8 @@ if (team) { else unavailable = true; } if (connection && canManage) { - authorities = await api.request('GET', `/v1/teams/${encodeURIComponent(team.id)}/services/${encodeURIComponent(connectionId)}/credential-authorities`).catch(() => []); try { + authorities = await loadServiceItems(api, 'services.credential.authorities.list', { teamId: team.id, connectionId }); const profiles = getServiceProviderDefinition(connection.providerId)?.credentialProfiles.filter(profile => profile.authoritySchemes.includes('openbao') && connection.capabilities.some((binding: any) => binding.status === 'configured' && binding.credentialProfileId === profile.id)) ?? []; await Promise.all(profiles.map(async profile => { diff --git a/src/pages/app/services/index.astro b/src/pages/app/services/index.astro index 48620320..c8a7fb1b 100644 --- a/src/pages/app/services/index.astro +++ b/src/pages/app/services/index.astro @@ -4,6 +4,7 @@ import ServiceConnectionWorkspace from '@treeseed/ui/components/astro/service/wo import TreeseedAppLayout from '../../../layouts/AppLayout.astro'; import { ApiClientFacade } from '../../../lib/market/api-client'; import { serviceSections } from '../../../lib/services/navigation'; +import { loadServiceItems } from '../../../lib/services/collections'; import { loadAppContext } from '../../../view-models/app-access.js'; if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent('/app/services')}`); @@ -19,7 +20,7 @@ const managementRoles = new Set(['team_owner', 'project_lead', 'service_admin']) const canManage = Boolean(team?.roles?.some((role: string) => managementRoles.has(role)) || team?.currentUserRole && managementRoles.has(team.currentUserRole)); if (team) { try { - services = await api.request('GET', `/v1/teams/${encodeURIComponent(team.id)}/services`); + services = await loadServiceItems(api, 'services.connections.list', { teamId: team.id }); } catch { unavailable = true; } diff --git a/tests/unit/services/collections.test.ts b/tests/unit/services/collections.test.ts new file mode 100644 index 00000000..1d24bc60 --- /dev/null +++ b/tests/unit/services/collections.test.ts @@ -0,0 +1,45 @@ +import { readFileSync } from 'node:fs'; +import { describe, expect, it, vi } from 'vitest'; +import { loadServiceItems } from '../../../src/lib/services/collections'; + +describe('Services cursor page rendering boundary', () => { + for (const operationId of ['services.connections.list', 'services.credential.authorities.list'] as const) { + it(`${operationId}: supplies item arrays, retaining scope across pages`, async () => { + const first = { id: 'one', credentialProfileId: 'github-repository-app', status: 'ready' }; + const second = { id: 'two' }; + const invoke = vi.fn().mockResolvedValueOnce({ items: [first], cursor: 'next' }) + .mockResolvedValueOnce({ items: [second], cursor: null }); + const path = operationId === 'services.connections.list' ? { teamId: 'team' } : { teamId: 'team', connectionId: 'connection' }; + const items = await loadServiceItems({ invoke }, operationId, path); + expect(items.filter(item => item.id === 'one')).toEqual([first]); + expect(items.find(item => item.credentialProfileId === 'github-repository-app')?.status).toBe('ready'); + expect(invoke.mock.calls.map(([binding, input]) => [binding.descriptor.operationId, input])).toEqual([ + [operationId, { path, query: {}, body: undefined }], + [operationId, { path, query: { cursor: 'next' }, body: undefined }], + ]); + expect(await loadServiceItems({ invoke: vi.fn().mockResolvedValue({ items: [], cursor: null }) }, operationId, path)).toEqual([]); + }); + } + it('rejects legacy arrays, malformed pages and cursor loops instead of returning partial or empty success', async () => { + for (const page of [[], null, {}, { items: {}, cursor: null }, { items: [null], cursor: null }, { items: [], cursor: 1 }]) { + await expect(loadServiceItems({ invoke: vi.fn().mockResolvedValue(page) }, 'services.connections.list', { teamId: 'team' })).rejects.toThrow('Invalid service collection'); + } + const invoke = vi.fn().mockResolvedValue({ items: [], cursor: 'same' }); + await expect(loadServiceItems({ invoke }, 'services.connections.list', { teamId: 'team' })).rejects.toThrow('Repeated'); + expect(invoke).toHaveBeenCalledTimes(2); + }); + it('bounds pagination and propagates unavailable authority without hiding it as empty', async () => { + const invoke = vi.fn().mockImplementation(async () => ({ items: [], cursor: String(invoke.mock.calls.length) })); + await expect(loadServiceItems({ invoke }, 'services.connections.list', { teamId: 'team' })).rejects.toThrow('limit'); + expect(invoke).toHaveBeenCalledTimes(100); + await expect(loadServiceItems({ invoke: vi.fn().mockRejectedValue(new Error('denied')) }, 'services.credential.authorities.list', { teamId: 'team', connectionId: 'connection' })).rejects.toThrow('denied'); + }); + it('wires both rendered routes to the tested loader inside their unavailable-state boundary', () => { + for (const [file, operation] of [['index.astro', 'services.connections.list'], ['[connectionId].astro', 'services.credential.authorities.list']]) { + const source = readFileSync(`src/pages/app/services/${file}`, 'utf8'); + expect(source).toContain(`await loadServiceItems(api, '${operation}'`); + expect(source).not.toContain('api.request'); + expect(source.indexOf('try {')).toBeLessThan(source.indexOf('await loadServiceItems')); + } + }); +}); From 22e4436c53f88c73b80f22c890746772189358b1 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Sat, 5 Sep 2026 12:24:11 -0400 Subject: [PATCH 268/315] fix(services): consume canonical cursor collections before rendering (#76) (#77) --- package-lock.json | 4 +- package.json | 2 +- src/lib/services/collections.ts | 25 ++++++++++++ src/pages/app/services/[connectionId].astro | 3 +- src/pages/app/services/index.astro | 3 +- tests/unit/services/collections.test.ts | 45 +++++++++++++++++++++ 6 files changed, 77 insertions(+), 5 deletions(-) create mode 100644 src/lib/services/collections.ts create mode 100644 tests/unit/services/collections.test.ts diff --git a/package-lock.json b/package-lock.json index 0385ca56..c98d840a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@treeseed/admin", - "version": "0.12.59-rc.27", + "version": "0.12.59-rc.28", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@treeseed/admin", - "version": "0.12.59-rc.27", + "version": "0.12.59-rc.28", "license": "Apache-2.0", "dependencies": { "@astrojs/starlight": "0.37.6", diff --git a/package.json b/package.json index f04bd05d..a6950505 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@treeseed/admin", - "version": "0.12.59-rc.27", + "version": "0.12.59-rc.28", "description": "Treeseed administration portal framework built on @treeseed/core and @treeseed/ui.", "license": "Apache-2.0", "repository": { diff --git a/src/lib/services/collections.ts b/src/lib/services/collections.ts new file mode 100644 index 00000000..e0b66f9e --- /dev/null +++ b/src/lib/services/collections.ts @@ -0,0 +1,25 @@ +import { controlPlaneOperation } from '@treeseed/sdk/operator-contracts'; +import type { ApiClientFacade } from '../market/api-client'; + +type ServiceCollection = 'services.connections.list' | 'services.credential.authorities.list'; + +/** Service reads return cursor pages, never bare arrays. Reject incomplete reads. */ +export async function loadServiceItems(api: { invoke: OmitThisParameter }, operationId: ServiceCollection, + path: { teamId: string; connectionId?: string }): Promise { + const operation = controlPlaneOperation(operationId); + const items: any[] = [], seen = new Set(); + let cursor: string | undefined; + for (let count = 0; count < 100; count++) { + const page = await api.invoke(operation, { path, query: cursor ? { cursor } : {}, body: undefined }); + if (!page || typeof page !== 'object' || !Array.isArray(page.items) + || page.items.some((item: unknown) => !item || typeof item !== 'object' || Array.isArray(item)) + || !(page.cursor === null || typeof page.cursor === 'string' && page.cursor.length > 0)) { + throw new Error('Invalid service collection response.'); + } + items.push(...page.items); + if (page.cursor === null) return items; + if (seen.has(page.cursor)) throw new Error('Repeated service collection cursor.'); + seen.add(page.cursor); cursor = page.cursor; + } + throw new Error('Service collection pagination limit exceeded.'); +} diff --git a/src/pages/app/services/[connectionId].astro b/src/pages/app/services/[connectionId].astro index 3858ce68..57d3b4f0 100644 --- a/src/pages/app/services/[connectionId].astro +++ b/src/pages/app/services/[connectionId].astro @@ -17,6 +17,7 @@ import TreeseedAppLayout from '../../../layouts/AppLayout.astro'; import { ensureCsrfToken } from '../../../lib/auth/support/csrf'; import { ApiClientFacade } from '../../../lib/market/api-client'; import { serviceSections } from '../../../lib/services/navigation'; +import { loadServiceItems } from '../../../lib/services/collections'; import { loadAppContext } from '../../../view-models/app-access.js'; if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); @@ -40,8 +41,8 @@ if (team) { else unavailable = true; } if (connection && canManage) { - authorities = await api.request('GET', `/v1/teams/${encodeURIComponent(team.id)}/services/${encodeURIComponent(connectionId)}/credential-authorities`).catch(() => []); try { + authorities = await loadServiceItems(api, 'services.credential.authorities.list', { teamId: team.id, connectionId }); const profiles = getServiceProviderDefinition(connection.providerId)?.credentialProfiles.filter(profile => profile.authoritySchemes.includes('openbao') && connection.capabilities.some((binding: any) => binding.status === 'configured' && binding.credentialProfileId === profile.id)) ?? []; await Promise.all(profiles.map(async profile => { diff --git a/src/pages/app/services/index.astro b/src/pages/app/services/index.astro index 48620320..c8a7fb1b 100644 --- a/src/pages/app/services/index.astro +++ b/src/pages/app/services/index.astro @@ -4,6 +4,7 @@ import ServiceConnectionWorkspace from '@treeseed/ui/components/astro/service/wo import TreeseedAppLayout from '../../../layouts/AppLayout.astro'; import { ApiClientFacade } from '../../../lib/market/api-client'; import { serviceSections } from '../../../lib/services/navigation'; +import { loadServiceItems } from '../../../lib/services/collections'; import { loadAppContext } from '../../../view-models/app-access.js'; if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent('/app/services')}`); @@ -19,7 +20,7 @@ const managementRoles = new Set(['team_owner', 'project_lead', 'service_admin']) const canManage = Boolean(team?.roles?.some((role: string) => managementRoles.has(role)) || team?.currentUserRole && managementRoles.has(team.currentUserRole)); if (team) { try { - services = await api.request('GET', `/v1/teams/${encodeURIComponent(team.id)}/services`); + services = await loadServiceItems(api, 'services.connections.list', { teamId: team.id }); } catch { unavailable = true; } diff --git a/tests/unit/services/collections.test.ts b/tests/unit/services/collections.test.ts new file mode 100644 index 00000000..1d24bc60 --- /dev/null +++ b/tests/unit/services/collections.test.ts @@ -0,0 +1,45 @@ +import { readFileSync } from 'node:fs'; +import { describe, expect, it, vi } from 'vitest'; +import { loadServiceItems } from '../../../src/lib/services/collections'; + +describe('Services cursor page rendering boundary', () => { + for (const operationId of ['services.connections.list', 'services.credential.authorities.list'] as const) { + it(`${operationId}: supplies item arrays, retaining scope across pages`, async () => { + const first = { id: 'one', credentialProfileId: 'github-repository-app', status: 'ready' }; + const second = { id: 'two' }; + const invoke = vi.fn().mockResolvedValueOnce({ items: [first], cursor: 'next' }) + .mockResolvedValueOnce({ items: [second], cursor: null }); + const path = operationId === 'services.connections.list' ? { teamId: 'team' } : { teamId: 'team', connectionId: 'connection' }; + const items = await loadServiceItems({ invoke }, operationId, path); + expect(items.filter(item => item.id === 'one')).toEqual([first]); + expect(items.find(item => item.credentialProfileId === 'github-repository-app')?.status).toBe('ready'); + expect(invoke.mock.calls.map(([binding, input]) => [binding.descriptor.operationId, input])).toEqual([ + [operationId, { path, query: {}, body: undefined }], + [operationId, { path, query: { cursor: 'next' }, body: undefined }], + ]); + expect(await loadServiceItems({ invoke: vi.fn().mockResolvedValue({ items: [], cursor: null }) }, operationId, path)).toEqual([]); + }); + } + it('rejects legacy arrays, malformed pages and cursor loops instead of returning partial or empty success', async () => { + for (const page of [[], null, {}, { items: {}, cursor: null }, { items: [null], cursor: null }, { items: [], cursor: 1 }]) { + await expect(loadServiceItems({ invoke: vi.fn().mockResolvedValue(page) }, 'services.connections.list', { teamId: 'team' })).rejects.toThrow('Invalid service collection'); + } + const invoke = vi.fn().mockResolvedValue({ items: [], cursor: 'same' }); + await expect(loadServiceItems({ invoke }, 'services.connections.list', { teamId: 'team' })).rejects.toThrow('Repeated'); + expect(invoke).toHaveBeenCalledTimes(2); + }); + it('bounds pagination and propagates unavailable authority without hiding it as empty', async () => { + const invoke = vi.fn().mockImplementation(async () => ({ items: [], cursor: String(invoke.mock.calls.length) })); + await expect(loadServiceItems({ invoke }, 'services.connections.list', { teamId: 'team' })).rejects.toThrow('limit'); + expect(invoke).toHaveBeenCalledTimes(100); + await expect(loadServiceItems({ invoke: vi.fn().mockRejectedValue(new Error('denied')) }, 'services.credential.authorities.list', { teamId: 'team', connectionId: 'connection' })).rejects.toThrow('denied'); + }); + it('wires both rendered routes to the tested loader inside their unavailable-state boundary', () => { + for (const [file, operation] of [['index.astro', 'services.connections.list'], ['[connectionId].astro', 'services.credential.authorities.list']]) { + const source = readFileSync(`src/pages/app/services/${file}`, 'utf8'); + expect(source).toContain(`await loadServiceItems(api, '${operation}'`); + expect(source).not.toContain('api.request'); + expect(source.indexOf('try {')).toBeLessThan(source.indexOf('await loadServiceItems')); + } + }); +}); From 1a943b158a1868a4de0b4ffbe6ca2e8ac10fc071 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Sat, 5 Sep 2026 13:45:54 -0400 Subject: [PATCH 269/315] feat(services): guide account setup and remove duplicated credential panels --- package-lock.json | 13 +- package.json | 4 +- src/lib/services/form-adapters.ts | 11 + src/lib/services/setup.ts | 14 + src/pages/app/services/[connectionId].astro | 244 +++++++----------- src/pages/app/services/new.astro | 6 +- .../contextual-help-architecture.test.ts | 2 +- .../service-management-architecture.test.ts | 15 +- tests/unit/services/form-adapters.test.ts | 35 +++ tests/unit/services/setup.test.ts | 27 ++ 10 files changed, 202 insertions(+), 169 deletions(-) create mode 100644 src/lib/services/setup.ts create mode 100644 tests/unit/services/form-adapters.test.ts create mode 100644 tests/unit/services/setup.test.ts diff --git a/package-lock.json b/package-lock.json index c98d840a..5f6eeb61 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,19 +1,19 @@ { "name": "@treeseed/admin", - "version": "0.12.59-rc.28", + "version": "0.12.59-rc.29", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@treeseed/admin", - "version": "0.12.59-rc.28", + "version": "0.12.59-rc.29", "license": "Apache-2.0", "dependencies": { "@astrojs/starlight": "0.37.6", "@react-email/render": "^2.0.8", "@treeseed/core": ">=0.12.60-rc.1 <0.14.0", "@treeseed/sdk": "0.13.0-rc.87", - "@treeseed/ui": "0.12.18-rc.13", + "@treeseed/ui": "0.12.18-rc.14", "react": "^19.2.5", "react-dom": "^19.2.6" }, @@ -6986,9 +6986,10 @@ } }, "node_modules/@treeseed/ui": { - "version": "0.12.18-rc.13", - "resolved": "https://registry.npmjs.org/@treeseed/ui/-/ui-0.12.18-rc.13.tgz", - "integrity": "sha512-Zq6rg9ONtFAbSK6TGemuvoEPoC6ILvRdVzj1zFRonhxPwn1B8tXL3yBnP5DwmnqYY1T6wkajp1D3FvBIVKG8Cg==", + "version": "0.12.18-rc.14", + "resolved": "https://registry.npmjs.org/@treeseed/ui/-/ui-0.12.18-rc.14.tgz", + "integrity": "sha512-veQ3HdDigusCG1JF0h+1UtE/k2vHHfMlBS4R91coyBaSSkcDF//vQtR8KY2c7/AxtlNdLMhkK+Jwr7xwz0Gaug==", + "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", "@codemirror/language": "^6.12.3", diff --git a/package.json b/package.json index a6950505..bfc0f42c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@treeseed/admin", - "version": "0.12.59-rc.28", + "version": "0.12.59-rc.29", "description": "Treeseed administration portal framework built on @treeseed/core and @treeseed/ui.", "license": "Apache-2.0", "repository": { @@ -63,7 +63,7 @@ "@react-email/render": "^2.0.8", "@treeseed/core": ">=0.12.60-rc.1 <0.14.0", "@treeseed/sdk": "0.13.0-rc.87", - "@treeseed/ui": "0.12.18-rc.13", + "@treeseed/ui": "0.12.18-rc.14", "react": "^19.2.5", "react-dom": "^19.2.6" }, diff --git a/src/lib/services/form-adapters.ts b/src/lib/services/form-adapters.ts index 27d56b39..f3bc6cf6 100644 --- a/src/lib/services/form-adapters.ts +++ b/src/lib/services/form-adapters.ts @@ -22,6 +22,7 @@ export function registerServiceFormAdapters() { registerFormAdapter('service-connection', { buildRequest(context) { const capabilities = context.formData.getAll('capabilities').map(String); + if (!capabilities.length) throw new Error('Choose at least one task for this connection.'); const config = Object.fromEntries( [...context.formData.entries()] .filter(([key]) => key.startsWith('config.')) @@ -38,6 +39,16 @@ export function registerServiceFormAdapters() { if (version) body.version = Number(version); return jsonRequest(context.form.action, body, text(context.formData, 'csrfToken'), context.form.dataset.tsMethod || 'POST'); }, + async parseResponse(response, context) { + const body = await response.json().catch(() => null); + const payload = body?.data ?? body?.payload ?? body; + const ok = response.ok && body !== null && body?.ok !== false; + const creating = !context.form.dataset.tsMethod; + return {ok, code: ok ? 'saved' : 'save_failed', + message: ok ? 'Settings saved.' : String(body?.detail ?? body?.error?.message ?? body?.message ?? 'Could not save this connection.'), + fieldErrors: body?.fieldErrors, + redirect: ok && creating ? (typeof payload?.id === 'string' ? '/app/services/' + encodeURIComponent(payload.id) : '/app/services') : undefined}; + }, }), registerFormAdapter('managed-credentials', { diff --git a/src/lib/services/setup.ts b/src/lib/services/setup.ts new file mode 100644 index 00000000..76cd7f99 --- /dev/null +++ b/src/lib/services/setup.ts @@ -0,0 +1,14 @@ +import type {getServiceProviderDefinition} from '@treeseed/sdk/secrets-capability'; +type Provider = NonNullable>; +type Binding = {capabilityType: string; status: string; credentialProfileId?: string | null}; +/** Present only saved, enabled authority. Selecting tasks never creates a grant. */ +export function serviceSetup(provider: Provider | null | undefined, bindings: Binding[] = []) { + const enabled = bindings.filter(binding => binding.status === 'configured'); + const selectedProfiles = provider?.credentialProfiles.filter(profile => enabled.some(binding => binding.credentialProfileId === profile.id)) ?? []; + const taskOptions = provider?.capabilities.map(item => ({...item, + checked: enabled.some(binding => binding.capabilityType === item.type), + credentialProfileId: bindings.find(binding => binding.capabilityType === item.type)?.credentialProfileId, + credentialProfiles: item.credentialProfileIds.map(id => ({id, label: provider.credentialProfiles.find(profile => profile.id === id)?.label ?? id})), + })) ?? []; + return {selectedProfiles, taskOptions}; +} diff --git a/src/pages/app/services/[connectionId].astro b/src/pages/app/services/[connectionId].astro index 57d3b4f0..c84577d3 100644 --- a/src/pages/app/services/[connectionId].astro +++ b/src/pages/app/services/[connectionId].astro @@ -1,14 +1,14 @@ --- import { getServiceProviderDefinition } from '@treeseed/sdk/secrets-capability'; import Badge from '@treeseed/ui/components/astro/data/Badge.astro'; -import KeyValueList from '@treeseed/ui/components/astro/data/KeyValueList.astro'; import Timestamp from '@treeseed/ui/components/astro/data/Timestamp.astro'; import Button from '@treeseed/ui/components/astro/forms/Button.astro'; +import ConnectionFields from '@treeseed/ui/components/astro/service/ConnectionFields.astro'; +import HelpTrigger from '@treeseed/ui/components/astro/help/HelpTrigger.astro'; import Field from '@treeseed/ui/components/astro/forms/Field.astro'; import TextInput from '@treeseed/ui/components/astro/forms/TextInput.astro'; import CapabilitySelector from '@treeseed/ui/components/astro/service/CapabilitySelector.astro'; import PermissionChecklist from '@treeseed/ui/components/astro/service/PermissionChecklist.astro'; -import ProviderMark from '@treeseed/ui/components/astro/service/ProviderMark.astro'; import ProviderAuthorityPanel from '@treeseed/ui/components/astro/service/ProviderAuthorityPanel.astro'; import EmptyState from '@treeseed/ui/components/astro/surface/EmptyState.astro'; import Panel from '@treeseed/ui/components/astro/surface/Panel.astro'; @@ -18,6 +18,7 @@ import { ensureCsrfToken } from '../../../lib/auth/support/csrf'; import { ApiClientFacade } from '../../../lib/market/api-client'; import { serviceSections } from '../../../lib/services/navigation'; import { loadServiceItems } from '../../../lib/services/collections'; +import { serviceSetup } from '../../../lib/services/setup'; import { loadAppContext } from '../../../view-models/app-access.js'; if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); @@ -44,7 +45,7 @@ if (team) { try { authorities = await loadServiceItems(api, 'services.credential.authorities.list', { teamId: team.id, connectionId }); const profiles = getServiceProviderDefinition(connection.providerId)?.credentialProfiles.filter(profile => - profile.authoritySchemes.includes('openbao') && connection.capabilities.some((binding: any) => binding.status === 'configured' && binding.credentialProfileId === profile.id)) ?? []; + profile.authoritySchemes?.includes('openbao') && connection.capabilities.some((binding: any) => binding.status === 'configured' && binding.credentialProfileId === profile.id)) ?? []; await Promise.all(profiles.map(async profile => { credentials[profile.id] = await api.request('GET', `/v1/teams/${encodeURIComponent(team.id)}/services/${encodeURIComponent(connectionId)}/credentials/${encodeURIComponent(profile.id)}`); })); @@ -55,157 +56,100 @@ const provider = connection ? getServiceProviderDefinition(connection.providerId const csrfToken = ensureCsrfToken(Astro); const connectorConfig = (kind: 'repository' | 'workflow') => connection?.nonSecretConfig?.githubConnectors?.[kind] ?? {}; const authorityStatus = (profileId: string) => authorities.find((item) => item.credentialProfileId === profileId)?.status ?? null; ---- - - {!team ? ( - - ) : unavailable ? ( - -
-
- ) : !connection || !provider ? ( - - ) : ( - -
-
-
- - - typeof value !== 'object') - .map(([key, value]) => ({ key: provider.connectionFields.find((field) => field.key === key)?.label ?? key, value: String(value) })), - ]} /> - - - OpenBao +const {selectedProfiles, taskOptions} = serviceSetup(provider, connection?.capabilities); +const path = team ? '/v1/teams/' + encodeURIComponent(team.id) + '/services/' + encodeURIComponent(connectionId) : ''; +const needsAuthentication = selectedProfiles.some(profile => profile.authoritySchemes?.includes('openbao') + ? !credentials[profile.id]?.configured : authorityStatus(profile.id) !== 'ready'); +const profileTitle = (id: string, fallback: string) => id === 'github-repository-token' ? 'GitHub repository access' + : id === 'github-workflow-token' ? 'GitHub Actions access' : id === 'cloudflare-storage' ? 'Cloudflare storage access' : fallback; +--- + + {!team ? + : unavailable ?
+ : !connection || !provider ? + : +
+ {!canManage ? +

Ask a team administrator to change this connection.

+ +
: <> +
+ 1. Connection settings + +
+ + + + +
-
-
- -
- - ({ - ...item, - checked: connection.capabilities?.some((binding: any) => binding.capabilityType === item.type && binding.status === 'configured'), - credentialProfileId: connection.capabilities?.find((binding: any) => binding.capabilityType === item.type)?.credentialProfileId, - credentialProfiles: item.credentialProfileIds.map((id) => ({ id, - label: provider.credentialProfiles.find((profile) => profile.id === id)?.label ?? id })), - }))} readonly /> - -
- -
- {provider.id === 'github' && canManage ? ( -
- item.id === 'github-repository-app')?.permissions ?? []} /> - item.id === 'github-workflow-app')?.permissions ?? []} /> -
- ) : null} - {!canManage ? - : custodyUnavailable ? - :
- {provider.credentialProfiles.filter(profile => profile.authoritySchemes.includes('openbao') && credentials[profile.id]).map(profile => { - const status = credentials[profile.id]; - const action = `/v1/teams/${encodeURIComponent(team.id)}/services/${encodeURIComponent(connection.id)}/credentials/${encodeURIComponent(profile.id)}`; - return - {status.configured ? 'Configured in OpenBao' : 'Not configured'} -
- - - {profile.fields.filter(field => field.sensitive).map(field => - + +
+

2. Connect your account

+

{!selectedProfiles.length ? 'Choose at least one task in connection settings to continue.' : custodyUnavailable ? 'Account access could not be checked. Try again in a moment.' : needsAuthentication ? 'Complete the access below for your selected tasks.' : 'Account access is saved. You can check it or replace it below.'}

+
+ {custodyUnavailable ? : selectedProfiles.map(profile => { + if (profile.authoritySchemes?.includes('app-installation') && provider.id === 'github') { + const kind = profile.id === 'github-repository-app' ? 'repository' : 'workflow'; + return ; + } + const status = credentials[profile.id]; + if (!status) return null; + const action = path + '/credentials/' + encodeURIComponent(profile.id); + return + {status.configured ? 'Access saved' : 'Needs account access'} + +
+ {status.configured ? 'Replace access details' : 'Add access details'} + + + {profile.fields.filter(field => field.sensitive).map(field => + )} - + - - {status.configured && ['validate','delete'].map(operation =>
- - - -
)} - ; - })} -
} -
- -
- -
-
Connected
-
Last updated
-
Last validation
{connection.lastValidatedAt ? : 'Not validated'}
-
-
-
- - {canManage ? ( -
-
- -
- - - - - - - {provider.connectionFields.map((field) => ( - - - - ))} - ({ - ...item, - checked: connection.capabilities?.some((binding: any) => binding.capabilityType === item.type && binding.status === 'configured'), - credentialProfileId: connection.capabilities?.find((binding: any) => binding.capabilityType === item.type)?.credentialProfileId, - credentialProfiles: item.credentialProfileIds.map((id) => ({ id, - label: provider.credentialProfiles.find((profile) => profile.id === id)?.label ?? id })), - }))} /> - - -
- -
- - -
-
-
-
- ) : null} -
-
- )} + + {status.configured &&
+
+ + +
+
Remove access +

Tasks using these credentials will stop working. The connection itself will remain.

+
+ + +
+
+
} + ; + })} +
+ } +
Activity +

Last changed:

+

Last checked: {connection.lastValidatedAt ? : 'Not yet checked'}

+
+ {canManage &&
Disconnect this service +

This removes the team's connection. Projects must stop using it first.

+
+ +
+
} +
+ } - diff --git a/src/pages/app/services/new.astro b/src/pages/app/services/new.astro index bb1117a1..291c082a 100644 --- a/src/pages/app/services/new.astro +++ b/src/pages/app/services/new.astro @@ -14,18 +14,14 @@ const provider = getServiceProviderDefinition(selectedProvider); const csrfToken = ensureCsrfToken(Astro); const managementRoles = new Set(['team_owner', 'project_lead', 'service_admin']); const canManage = Boolean(team?.roles?.some((role: string) => managementRoles.has(role)) || team?.currentUserRole && managementRoles.has(team.currentUserRole)); -const permissions = provider ? [...new Set(provider.credentialProfiles.flatMap((profile) => profile.permissions))] : []; --- - + diff --git a/tests/contract/contextual-help/contextual-help-architecture.test.ts b/tests/contract/contextual-help/contextual-help-architecture.test.ts index 4912c4f5..c9deba5c 100644 --- a/tests/contract/contextual-help/contextual-help-architecture.test.ts +++ b/tests/contract/contextual-help/contextual-help-architecture.test.ts @@ -51,7 +51,7 @@ describe('Admin contextual help architecture', () => { it('explains managed custody without asking for personal vault keys', () => { const page=read('src/pages/app/services/[connectionId].astro'); - expect(page).toContain('Core OpenBao stores encrypted team credentials.'); + expect(page).not.toContain('Core OpenBao stores encrypted team credentials.'); expect(page).toContain('knowledgePageId="services.credentials"'); expect(page).toContain('class="ts-form-stack"'); expect(page).not.toContain('passphrase'); diff --git a/tests/contract/service-management/service-management-architecture.test.ts b/tests/contract/service-management/service-management-architecture.test.ts index 14cd0f94..0f54ba94 100644 --- a/tests/contract/service-management/service-management-architecture.test.ts +++ b/tests/contract/service-management/service-management-architecture.test.ts @@ -22,7 +22,8 @@ describe('service management architecture', () => { expect(collectionPage).not.toContain(component); } const workspace = readDependency('@treeseed/ui', 'dist/astro/service/workspace/ServiceConnectionWorkspace.astro'); - for (const component of ['ProviderCard', 'Panel', 'SettingsTemplate', 'SemanticCollectionSurface']) expect(workspace).toContain(component); + for (const component of ['ProviderCard', 'SettingsTemplate', 'SemanticCollectionSurface']) expect(workspace).toContain(component); + expect(workspace).not.toContain('Managed OpenBao'); const createPage = read('src/pages/app/services/new.astro'); expect(createPage).toContain('@treeseed/ui/components/astro/service/workspace/ServiceConnectionCreateSurface.astro'); const createSurface = readDependency('@treeseed/ui', 'dist/astro/service/workspace/ServiceConnectionCreateSurface.astro'); @@ -54,7 +55,10 @@ describe('service management architecture', () => { it('uses core managed custody without a separate vault setup route', () => { const detail=read('src/pages/app/services/[connectionId].astro'); - expect(detail).toContain('Core OpenBao');expect(detail).toContain('managed-credentials'); + expect(detail).not.toContain('Core OpenBao');expect(detail).toContain('managed-credentials'); + expect(detail).toContain('knowledgePageId="services.credentials"'); + expect(detail).toContain('data-service-disconnect'); + expect(detail).not.toContain('querySelectorAll(\'[data-ts-method="DELETE"]\')'); expect(read('src/routes.ts')).not.toContain('/app/services/vault'); }); @@ -67,9 +71,10 @@ describe('service management architecture', () => { it('supports portable topology references and isolated R2 state metadata', () => { const createSurface = readDependency('@treeseed/ui', 'dist/astro/service/workspace/ServiceConnectionCreateSurface.astro'); const providerContracts = readDependency('@treeseed/sdk', 'dist/secrets-capability/service-provider-contracts.js'); - expect(createSurface).toContain('Connection reference'); - expect(createSurface).toContain('exactly match the topology connectionRef'); - expect(createSurface).toContain('database IDs never belong in Platform'); + expect(createSurface).toContain('ConnectionFields'); + const fields = readDependency('@treeseed/ui', 'dist/astro/service/ConnectionFields.astro'); + expect(fields).toContain('name="displayName"'); + expect(fields).toContain('Keep it unchanged if a deployment already uses it.'); for (const field of ['stateBucket', 'stateEndpoint', 'stateRegion', 'stateEncryptionKeyRef']) { expect(providerContracts).toContain(`field("${field}"`); } diff --git a/tests/unit/services/form-adapters.test.ts b/tests/unit/services/form-adapters.test.ts new file mode 100644 index 00000000..35aa8683 --- /dev/null +++ b/tests/unit/services/form-adapters.test.ts @@ -0,0 +1,35 @@ +import {beforeEach, describe, expect, it, vi} from 'vitest'; +const {adapters} = vi.hoisted(() => ({adapters: new Map()})); +vi.mock('@treeseed/ui/forms/client', () => ({registerFormAdapter: (name: string, adapter: any) => { + adapters.set(name, adapter); return () => adapters.delete(name); +}})); +import {registerServiceFormAdapters} from '../../../src/lib/services/form-adapters'; +function context(method = '') { + const formData = new FormData(); + for (const [key, value] of Object.entries({csrfToken: 'fixture', providerId: 'github', displayName: 'source', version: '3', + capabilities: 'repository-hosting', 'capabilityProfile.repository-hosting': 'github-repository-token', 'config.organization': 'example'})) formData.set(key, value); + return {formData, form: {action: '/v1/teams/test/services/connection', dataset: {tsMethod: method}}}; +} +describe('guided service forms', () => { + beforeEach(() => {adapters.clear(); registerServiceFormAdapters();}); + it('retains selected authority, team path, CSRF and optimistic version', () => { + const request = adapters.get('service-connection').buildRequest(context('PUT')); + expect(request.url).toBe('/v1/teams/test/services/connection'); + expect(request.init.headers['x-treeseed-csrf']).toBe('fixture'); + expect(JSON.parse(request.init.body)).toMatchObject({version: 3, capabilities: [{credentialProfileId: 'github-repository-token'}]}); + }); + it('requires a task before creating a connection', () => { + const ctx = context(); ctx.formData.delete('capabilities'); + expect(() => adapters.get('service-connection').buildRequest(ctx)).toThrow('Choose at least one task'); + }); + it('continues creation directly to the newly created connection', async () => { + const result = await adapters.get('service-connection').parseResponse(Response.json({data: {id: 'new-connection'}}), context()); + expect(result).toMatchObject({ok: true, redirect: '/app/services/new-connection'}); + }); + it('does not redirect errors or edits', async () => { + const adapter = adapters.get('service-connection'); + expect(await adapter.parseResponse(Response.json({detail: 'Version changed'}, {status: 409}), context())).toMatchObject({ok: false, message: 'Version changed', redirect: undefined}); + expect(await adapter.parseResponse(Response.json({data: {id: 'existing'}}), context('PUT'))).toMatchObject({ok: true, redirect: undefined}); + expect(await adapter.parseResponse(new Response('error'), context())).toMatchObject({ok: false}); + }); +}); diff --git a/tests/unit/services/setup.test.ts b/tests/unit/services/setup.test.ts new file mode 100644 index 00000000..f7c031f1 --- /dev/null +++ b/tests/unit/services/setup.test.ts @@ -0,0 +1,27 @@ +import {describe, expect, it} from 'vitest'; +import {SERVICE_PROVIDER_CATALOG, getServiceProviderDefinition} from '@treeseed/sdk/secrets-capability'; +import {serviceSetup} from '../../../src/lib/services/setup'; +describe('service setup presentation', () => { + for (const provider of SERVICE_PROVIDER_CATALOG) { + for (const task of provider.capabilities.filter(task => task.status === 'available')) { + for (const profileId of task.credentialProfileIds) { + it(provider.id + '/' + task.type + '/' + profileId + ' shows only its selected method', () => { + const model = serviceSetup(provider, [{capabilityType: task.type, credentialProfileId: profileId, status: 'configured'}]); + expect(model.selectedProfiles.map(profile => profile.id)).toEqual([profileId]); + expect(model.taskOptions.filter(task => task.checked).map(task => task.type)).toEqual([task.type]); + }); + } + } + } + it('deduplicates shared workflow credentials and ignores disabled tasks', () => { + const model = serviceSetup(getServiceProviderDefinition('github'), [ + {capabilityType: 'workflow-execution', credentialProfileId: 'github-workflow-token', status: 'configured'}, + {capabilityType: 'workflow-configuration', credentialProfileId: 'github-workflow-token', status: 'configured'}, + {capabilityType: 'repository-hosting', credentialProfileId: 'github-repository-app', status: 'disabled'}, + ]); + expect(model.selectedProfiles.map(profile => profile.id)).toEqual(['github-workflow-token']); + }); + it('does not imply credentials exist for an empty connection', () => { + expect(serviceSetup(getServiceProviderDefinition('github')).selectedProfiles).toEqual([]); + }); +}); From 1b49ab7bf7db9269ecb6704bc15e18544cf0ce7d Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Sat, 5 Sep 2026 14:57:20 -0400 Subject: [PATCH 270/315] Guide service connections through one focused wizard step --- package-lock.json | 12 ++-- package.json | 4 +- src/lib/services/form-adapters.ts | 9 ++- src/pages/app/services/[connectionId].astro | 68 ++++++++++--------- .../service-management-architecture.test.ts | 7 +- tests/unit/services/form-adapters.test.ts | 17 ++++- 6 files changed, 74 insertions(+), 43 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5f6eeb61..fde4a799 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,19 +1,19 @@ { "name": "@treeseed/admin", - "version": "0.12.59-rc.29", + "version": "0.12.59-rc.30", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@treeseed/admin", - "version": "0.12.59-rc.29", + "version": "0.12.59-rc.30", "license": "Apache-2.0", "dependencies": { "@astrojs/starlight": "0.37.6", "@react-email/render": "^2.0.8", "@treeseed/core": ">=0.12.60-rc.1 <0.14.0", "@treeseed/sdk": "0.13.0-rc.87", - "@treeseed/ui": "0.12.18-rc.14", + "@treeseed/ui": "0.12.18-rc.15", "react": "^19.2.5", "react-dom": "^19.2.6" }, @@ -6986,9 +6986,9 @@ } }, "node_modules/@treeseed/ui": { - "version": "0.12.18-rc.14", - "resolved": "https://registry.npmjs.org/@treeseed/ui/-/ui-0.12.18-rc.14.tgz", - "integrity": "sha512-veQ3HdDigusCG1JF0h+1UtE/k2vHHfMlBS4R91coyBaSSkcDF//vQtR8KY2c7/AxtlNdLMhkK+Jwr7xwz0Gaug==", + "version": "0.12.18-rc.15", + "resolved": "https://registry.npmjs.org/@treeseed/ui/-/ui-0.12.18-rc.15.tgz", + "integrity": "sha512-AYlB7Yc76xVfwnI3rqwnzlf8ZVbudIdxxSfgv4swEqM3NxNa/kjdytckVHXvmthwIyaBTbuMxFJLmW8rQ0ehRA==", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", diff --git a/package.json b/package.json index bfc0f42c..e14c8dbb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@treeseed/admin", - "version": "0.12.59-rc.29", + "version": "0.12.59-rc.30", "description": "Treeseed administration portal framework built on @treeseed/core and @treeseed/ui.", "license": "Apache-2.0", "repository": { @@ -63,7 +63,7 @@ "@react-email/render": "^2.0.8", "@treeseed/core": ">=0.12.60-rc.1 <0.14.0", "@treeseed/sdk": "0.13.0-rc.87", - "@treeseed/ui": "0.12.18-rc.14", + "@treeseed/ui": "0.12.18-rc.15", "react": "^19.2.5", "react-dom": "^19.2.6" }, diff --git a/src/lib/services/form-adapters.ts b/src/lib/services/form-adapters.ts index f3bc6cf6..15ad19bd 100644 --- a/src/lib/services/form-adapters.ts +++ b/src/lib/services/form-adapters.ts @@ -21,7 +21,10 @@ export function registerServiceFormAdapters() { }), registerFormAdapter('service-connection', { buildRequest(context) { - const capabilities = context.formData.getAll('capabilities').map(String); + const capabilities = [...new Set(context.formData.getAll('capabilities').map(String))]; + if (text(context.formData, 'combinedWorkflowEnvironment') === 'true' && capabilities.includes('workflow-configuration')) capabilities.push('secret-enclave'); + const githubMethod = text(context.formData, 'githubAuthMethod'); + if (text(context.formData, 'providerId') === 'github' && !['app', 'token'].includes(githubMethod)) throw new Error('Choose how to connect to GitHub.'); if (!capabilities.length) throw new Error('Choose at least one task for this connection.'); const config = Object.fromEntries( [...context.formData.entries()] @@ -33,7 +36,9 @@ export function registerServiceFormAdapters() { displayName: text(context.formData, 'displayName'), nonSecretConfig: config, capabilities: capabilities.map((capabilityType) => ({ capabilityType, status: 'configured', - credentialProfileId: text(context.formData, `capabilityProfile.${capabilityType}`) || undefined })), + credentialProfileId: text(context.formData, 'providerId') === 'github' + ? `github-${capabilityType === 'repository-hosting' ? 'repository' : 'workflow'}-${githubMethod}` + : text(context.formData, `capabilityProfile.${capabilityType}`) || undefined })), }; const version = text(context.formData, 'version'); if (version) body.version = Number(version); diff --git a/src/pages/app/services/[connectionId].astro b/src/pages/app/services/[connectionId].astro index c84577d3..3e1f9785 100644 --- a/src/pages/app/services/[connectionId].astro +++ b/src/pages/app/services/[connectionId].astro @@ -3,6 +3,7 @@ import { getServiceProviderDefinition } from '@treeseed/sdk/secrets-capability'; import Badge from '@treeseed/ui/components/astro/data/Badge.astro'; import Timestamp from '@treeseed/ui/components/astro/data/Timestamp.astro'; import Button from '@treeseed/ui/components/astro/forms/Button.astro'; +import ServiceWizard from '@treeseed/ui/components/astro/service/ServiceWizard.astro'; import ConnectionFields from '@treeseed/ui/components/astro/service/ConnectionFields.astro'; import HelpTrigger from '@treeseed/ui/components/astro/help/HelpTrigger.astro'; import Field from '@treeseed/ui/components/astro/forms/Field.astro'; @@ -61,6 +62,11 @@ const {selectedProfiles, taskOptions} = serviceSetup(provider, connection?.capab const path = team ? '/v1/teams/' + encodeURIComponent(team.id) + '/services/' + encodeURIComponent(connectionId) : ''; const needsAuthentication = selectedProfiles.some(profile => profile.authoritySchemes?.includes('openbao') ? !credentials[profile.id]?.configured : authorityStatus(profile.id) !== 'ready'); +const profileReady = (profile: typeof selectedProfiles[number]) => profile.authoritySchemes?.includes('openbao') ? Boolean(credentials[profile.id]?.configured) : authorityStatus(profile.id) === 'ready'; +const requestedAccess = selectedProfiles.findIndex(profile => profile.id === Astro.url.searchParams.get('access')); +const accessIndex = requestedAccess >= 0 ? requestedAccess : Math.max(0, selectedProfiles.findIndex(profile => !profileReady(profile))); +const editing = Astro.url.searchParams.get('edit') === 'true' || needsAuthentication || custodyUnavailable || !selectedProfiles.length; +const initialStep = Astro.url.searchParams.get('step') === 'tasks' || !selectedProfiles.length ? 0 : 2; const profileTitle = (id: string, fallback: string) => id === 'github-repository-token' ? 'GitHub repository access' : id === 'github-workflow-token' ? 'GitHub Actions access' : id === 'cloudflare-storage' ? 'Cloudflare storage access' : fallback; --- @@ -69,27 +75,22 @@ const profileTitle = (id: string, fallback: string) => id === 'github-repository : unavailable ?
: !connection || !provider ? : -
- {!canManage ? -

Ask a team administrator to change this connection.

+
+ {!canManage || !editing ? + {!canManage &&

Ask a team administrator to change this connection.

} -
: <> -
- 1. Connection settings - + {canManage &&
} +
:
- - - + + - -
-
-

2. Connect your account

+ - } -
Activity + } + {!editing &&
Activity

Last changed:

Last checked: {connection.lastValidatedAt ? : 'Not yet checked'}

-
- {canManage &&
Disconnect this service +
} + {canManage && !editing &&
Disconnect this service

This removes the team's connection. Projects must stop using it first.

@@ -148,7 +153,8 @@ const profileTitle = (id: string, fallback: string) => id === 'github-repository document.querySelector('[data-service-disconnect]')?.addEventListener('treeseed:form-success', () => window.location.assign('/app/services')); document.querySelectorAll('[data-service-settings], [data-service-credentials]').forEach(form => form.addEventListener('treeseed:form-success', event => { - const url = new URL(window.location.href); + const url = new URL(window.location.pathname, window.location.origin); + if (form.hasAttribute('data-service-settings')) url.searchParams.set('edit', 'true'); url.searchParams.set('tsToastSuccess', (event as CustomEvent).detail?.message ?? 'Saved.'); window.location.assign(url.href); })); diff --git a/tests/contract/service-management/service-management-architecture.test.ts b/tests/contract/service-management/service-management-architecture.test.ts index 0f54ba94..bc8f799d 100644 --- a/tests/contract/service-management/service-management-architecture.test.ts +++ b/tests/contract/service-management/service-management-architecture.test.ts @@ -27,7 +27,12 @@ describe('service management architecture', () => { const createPage = read('src/pages/app/services/new.astro'); expect(createPage).toContain('@treeseed/ui/components/astro/service/workspace/ServiceConnectionCreateSurface.astro'); const createSurface = readDependency('@treeseed/ui', 'dist/astro/service/workspace/ServiceConnectionCreateSurface.astro'); - for (const component of ['ProviderCard', 'Panel', 'SettingsTemplate', 'CapabilitySelector']) expect(createSurface).toContain(component); + for (const component of ['ProviderCard', 'ServiceWizard', 'SettingsTemplate', 'CapabilitySelector']) expect(createSurface).toContain(component); + const detail = read('src/pages/app/services/[connectionId].astro'); + expect(detail).toContain('ServiceWizard'); + for (const step of [0, 1, 2]) expect(detail).toContain(`data-service-step="${step}"`); + expect(createSurface + detail).not.toContain('max-width: 48rem'); + expect(detail).toContain('selectedProfiles.filter((_, index) => index === accessIndex)'); const pages = [ read('src/pages/app/services/index.astro'), read('src/pages/app/services/new.astro'), diff --git a/tests/unit/services/form-adapters.test.ts b/tests/unit/services/form-adapters.test.ts index 35aa8683..17897837 100644 --- a/tests/unit/services/form-adapters.test.ts +++ b/tests/unit/services/form-adapters.test.ts @@ -7,7 +7,7 @@ import {registerServiceFormAdapters} from '../../../src/lib/services/form-adapte function context(method = '') { const formData = new FormData(); for (const [key, value] of Object.entries({csrfToken: 'fixture', providerId: 'github', displayName: 'source', version: '3', - capabilities: 'repository-hosting', 'capabilityProfile.repository-hosting': 'github-repository-token', 'config.organization': 'example'})) formData.set(key, value); + capabilities: 'repository-hosting', githubAuthMethod: 'token', 'config.organization': 'example'})) formData.set(key, value); return {formData, form: {action: '/v1/teams/test/services/connection', dataset: {tsMethod: method}}}; } describe('guided service forms', () => { @@ -18,6 +18,21 @@ describe('guided service forms', () => { expect(request.init.headers['x-treeseed-csrf']).toBe('fixture'); expect(JSON.parse(request.init.body)).toMatchObject({version: 3, capabilities: [{credentialProfileId: 'github-repository-token'}]}); }); + it.each(['app', 'token'])('maps one %s choice to all tasks and both environment capabilities', method => { + const ctx = context(); ctx.formData.set('githubAuthMethod', method); + ctx.formData.append('capabilities', 'workflow-execution'); + ctx.formData.append('capabilities', 'workflow-configuration'); + ctx.formData.set('combinedWorkflowEnvironment', 'true'); + const body = JSON.parse(adapters.get('service-connection').buildRequest(ctx).init.body); + expect(body.capabilities).toEqual([ + {capabilityType: 'repository-hosting', status: 'configured', credentialProfileId: 'github-repository-' + method}, + ...['workflow-execution', 'workflow-configuration', 'secret-enclave'].map(capabilityType => ({capabilityType, status: 'configured', credentialProfileId: 'github-workflow-' + method})), + ]); + }); + it('requires an explicit method when saved GitHub methods conflict', () => { + const ctx = context(); ctx.formData.delete('githubAuthMethod'); + expect(() => adapters.get('service-connection').buildRequest(ctx)).toThrow('Choose how to connect'); + }); it('requires a task before creating a connection', () => { const ctx = context(); ctx.formData.delete('capabilities'); expect(() => adapters.get('service-connection').buildRequest(ctx)).toThrow('Choose at least one task'); From 3ca242b75cd5f80f04cb04fa480e2cb242e056f9 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Sat, 5 Sep 2026 15:50:03 -0400 Subject: [PATCH 271/315] fix(services): send exact revisions for connection mutations --- src/lib/services/form-adapters.ts | 16 ++++++-- src/pages/app/services/[connectionId].astro | 4 +- tests/unit/services/form-adapters.test.ts | 44 +++++++++++++++++++++ 3 files changed, 59 insertions(+), 5 deletions(-) diff --git a/src/lib/services/form-adapters.ts b/src/lib/services/form-adapters.ts index 15ad19bd..55d6fcef 100644 --- a/src/lib/services/form-adapters.ts +++ b/src/lib/services/form-adapters.ts @@ -1,12 +1,21 @@ import { registerFormAdapter } from '@treeseed/ui/forms/client'; -function jsonRequest(url: string, body: unknown, csrfToken: string, method = 'POST') { +function jsonRequest(url: string, body: unknown, csrfToken: string, method = 'POST', ifMatch?: string) { return {url, init: {method, headers: {accept: 'application/json', 'content-type': 'application/json', - 'x-treeseed-csrf': csrfToken, 'x-treeseed-form': 'enhanced', 'Idempotency-Key': crypto.randomUUID()}, + 'x-treeseed-csrf': csrfToken, 'x-treeseed-form': 'enhanced', 'Idempotency-Key': crypto.randomUUID(), + ...(ifMatch === undefined ? {} : {'If-Match': ifMatch})}, body: JSON.stringify(body), credentials: 'same-origin' as const}}; } function text(data: FormData, key: string) { return String(data.get(key) ?? '').trim(); } +function connectionRevision(data: FormData) { + const revision = text(data, 'version'); + if (!/^\d+$/.test(revision) || !Number.isSafeInteger(Number(revision))) throw new Error('Reload this connection before saving; its revision is missing or invalid.'); + return revision; +} export function registerServiceFormAdapters() { const disposers = [ + registerFormAdapter('service-disconnect', { + buildRequest(context) { return jsonRequest(context.form.action, {}, text(context.formData, 'csrfToken'), 'DELETE', connectionRevision(context.formData)); }, + }), registerFormAdapter('github-connector', { buildRequest(context) { return jsonRequest(context.form.action, { @@ -42,7 +51,8 @@ export function registerServiceFormAdapters() { }; const version = text(context.formData, 'version'); if (version) body.version = Number(version); - return jsonRequest(context.form.action, body, text(context.formData, 'csrfToken'), context.form.dataset.tsMethod || 'POST'); + const method = context.form.dataset.tsMethod || 'POST'; + return jsonRequest(context.form.action, body, text(context.formData, 'csrfToken'), method, method === 'PUT' ? connectionRevision(context.formData) : undefined); }, async parseResponse(response, context) { const body = await response.json().catch(() => null); diff --git a/src/pages/app/services/[connectionId].astro b/src/pages/app/services/[connectionId].astro index 3e1f9785..cb00b0f5 100644 --- a/src/pages/app/services/[connectionId].astro +++ b/src/pages/app/services/[connectionId].astro @@ -139,8 +139,8 @@ const profileTitle = (id: string, fallback: string) => id === 'github-repository
} {canManage && !editing &&
Disconnect this service

This removes the team's connection. Projects must stop using it first.

- - + +
}
diff --git a/tests/unit/services/form-adapters.test.ts b/tests/unit/services/form-adapters.test.ts index 17897837..a19cb800 100644 --- a/tests/unit/services/form-adapters.test.ts +++ b/tests/unit/services/form-adapters.test.ts @@ -4,6 +4,13 @@ vi.mock('@treeseed/ui/forms/client', () => ({registerFormAdapter: (name: string, adapters.set(name, adapter); return () => adapters.delete(name); }})); import {registerServiceFormAdapters} from '../../../src/lib/services/form-adapters'; +import {ALL as proxy} from '../../../src/pages/v1/[...all]'; +vi.mock('../../../src/lib/market/api-client', () => ({ + apiAccessTokenFromCookies: () => 'fixture', apiServiceHeaders: () => new Headers(), + resolveApiBaseUrl: () => 'https://api.example.test', + clearApiAccessTokenCookie: vi.fn(), setApiAccessTokenCookie: vi.fn(), +})); +vi.mock('../../../src/lib/auth/support/csrf', () => ({WEB_CSRF_HEADER: 'x-treeseed-csrf', csrfMatches: () => true})); function context(method = '') { const formData = new FormData(); for (const [key, value] of Object.entries({csrfToken: 'fixture', providerId: 'github', displayName: 'source', version: '3', @@ -16,8 +23,45 @@ describe('guided service forms', () => { const request = adapters.get('service-connection').buildRequest(context('PUT')); expect(request.url).toBe('/v1/teams/test/services/connection'); expect(request.init.headers['x-treeseed-csrf']).toBe('fixture'); + expect(new Headers(request.init.headers).get('If-Match')).toBe('3'); expect(JSON.parse(request.init.body)).toMatchObject({version: 3, capabilities: [{credentialProfileId: 'github-repository-token'}]}); }); + it('does not attach a revision to connection creation', () => { + expect(new Headers(adapters.get('service-connection').buildRequest(context()).init.headers).has('If-Match')).toBe(false); + }); + it('carries the submitted revision through the real proxy and preserves stale-write failures', async () => { + const adapter = adapters.get('service-connection'); + const ctx = context('PUT'); + const built = adapter.buildRequest(ctx); + let version = 3; + const upstream = vi.spyOn(globalThis, 'fetch').mockImplementation(async (_url, init) => { + if (new Headers(init?.headers).get('If-Match') !== String(version)) + return Response.json({detail: 'The service connection changed after it was inspected.'}, {status: 412}); + version++; + return Response.json({data: {id: 'connection', version}}); + }); + try { + const submit = () => proxy({ + params: {all: 'teams/test/services/connection'}, locals: {}, + request: new Request('https://admin.example.test' + built.url, built.init), + url: new URL('https://admin.example.test' + built.url), + } as any); + expect(await adapter.parseResponse(await submit(), ctx)).toMatchObject({ok: true}); + expect(await adapter.parseResponse(await submit(), ctx)).toMatchObject({ok: false, message: 'The service connection changed after it was inspected.'}); + expect(version).toBe(4); + expect(upstream).toHaveBeenCalledTimes(2); + } finally { upstream.mockRestore(); } + }); + it.each(['', '*', '-1', 'not-a-version'])('rejects missing or invalid update revision %s', revision => { + const ctx = context('PUT'); ctx.formData.set('version', revision); + expect(() => adapters.get('service-connection').buildRequest(ctx)).toThrow('revision'); + }); + it('sends the exact revision when disconnecting without task fields', () => { + const ctx = context('DELETE'); ctx.formData.delete('capabilities'); + const request = adapters.get('service-disconnect').buildRequest(ctx); + expect(new Headers(request.init.headers).get('If-Match')).toBe('3'); + expect(request.init.method).toBe('DELETE'); + }); it.each(['app', 'token'])('maps one %s choice to all tasks and both environment capabilities', method => { const ctx = context(); ctx.formData.set('githubAuthMethod', method); ctx.formData.append('capabilities', 'workflow-execution'); From 1f24cdf778fa096e6bc97af2df0a69f065988264 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Sat, 5 Sep 2026 16:03:14 -0400 Subject: [PATCH 272/315] chore(release): pin verified UI theme fix for admin rc31 --- package-lock.json | 12 ++++++------ package.json | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index fde4a799..ddd5b1ef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,19 +1,19 @@ { "name": "@treeseed/admin", - "version": "0.12.59-rc.30", + "version": "0.12.59-rc.31", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@treeseed/admin", - "version": "0.12.59-rc.30", + "version": "0.12.59-rc.31", "license": "Apache-2.0", "dependencies": { "@astrojs/starlight": "0.37.6", "@react-email/render": "^2.0.8", "@treeseed/core": ">=0.12.60-rc.1 <0.14.0", "@treeseed/sdk": "0.13.0-rc.87", - "@treeseed/ui": "0.12.18-rc.15", + "@treeseed/ui": "0.12.18-rc.16", "react": "^19.2.5", "react-dom": "^19.2.6" }, @@ -6986,9 +6986,9 @@ } }, "node_modules/@treeseed/ui": { - "version": "0.12.18-rc.15", - "resolved": "https://registry.npmjs.org/@treeseed/ui/-/ui-0.12.18-rc.15.tgz", - "integrity": "sha512-AYlB7Yc76xVfwnI3rqwnzlf8ZVbudIdxxSfgv4swEqM3NxNa/kjdytckVHXvmthwIyaBTbuMxFJLmW8rQ0ehRA==", + "version": "0.12.18-rc.16", + "resolved": "https://registry.npmjs.org/@treeseed/ui/-/ui-0.12.18-rc.16.tgz", + "integrity": "sha512-+3xkv6qS482d1rvxSenKy2sM/UYey5gTpXS5RLiiFx4f+/PA7z7e1kL/+VUPvSfBEeMQMpUpvDgLHOX9xHI8lg==", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", diff --git a/package.json b/package.json index e14c8dbb..9e5bbe5d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@treeseed/admin", - "version": "0.12.59-rc.30", + "version": "0.12.59-rc.31", "description": "Treeseed administration portal framework built on @treeseed/core and @treeseed/ui.", "license": "Apache-2.0", "repository": { @@ -63,7 +63,7 @@ "@react-email/render": "^2.0.8", "@treeseed/core": ">=0.12.60-rc.1 <0.14.0", "@treeseed/sdk": "0.13.0-rc.87", - "@treeseed/ui": "0.12.18-rc.15", + "@treeseed/ui": "0.12.18-rc.16", "react": "^19.2.5", "react-dom": "^19.2.6" }, From 4890bed2675eed6ec6f4240f405b116e9b363f71 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Sat, 5 Sep 2026 16:04:56 -0400 Subject: [PATCH 273/315] fix(services): send If-Match for save and disconnect (#84) * fix(services): send exact revisions for connection mutations * chore(release): pin verified UI theme fix for admin rc31 --- package-lock.json | 12 +++--- package.json | 4 +- src/lib/services/form-adapters.ts | 16 ++++++-- src/pages/app/services/[connectionId].astro | 4 +- tests/unit/services/form-adapters.test.ts | 44 +++++++++++++++++++++ 5 files changed, 67 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index fde4a799..ddd5b1ef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,19 +1,19 @@ { "name": "@treeseed/admin", - "version": "0.12.59-rc.30", + "version": "0.12.59-rc.31", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@treeseed/admin", - "version": "0.12.59-rc.30", + "version": "0.12.59-rc.31", "license": "Apache-2.0", "dependencies": { "@astrojs/starlight": "0.37.6", "@react-email/render": "^2.0.8", "@treeseed/core": ">=0.12.60-rc.1 <0.14.0", "@treeseed/sdk": "0.13.0-rc.87", - "@treeseed/ui": "0.12.18-rc.15", + "@treeseed/ui": "0.12.18-rc.16", "react": "^19.2.5", "react-dom": "^19.2.6" }, @@ -6986,9 +6986,9 @@ } }, "node_modules/@treeseed/ui": { - "version": "0.12.18-rc.15", - "resolved": "https://registry.npmjs.org/@treeseed/ui/-/ui-0.12.18-rc.15.tgz", - "integrity": "sha512-AYlB7Yc76xVfwnI3rqwnzlf8ZVbudIdxxSfgv4swEqM3NxNa/kjdytckVHXvmthwIyaBTbuMxFJLmW8rQ0ehRA==", + "version": "0.12.18-rc.16", + "resolved": "https://registry.npmjs.org/@treeseed/ui/-/ui-0.12.18-rc.16.tgz", + "integrity": "sha512-+3xkv6qS482d1rvxSenKy2sM/UYey5gTpXS5RLiiFx4f+/PA7z7e1kL/+VUPvSfBEeMQMpUpvDgLHOX9xHI8lg==", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", diff --git a/package.json b/package.json index e14c8dbb..9e5bbe5d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@treeseed/admin", - "version": "0.12.59-rc.30", + "version": "0.12.59-rc.31", "description": "Treeseed administration portal framework built on @treeseed/core and @treeseed/ui.", "license": "Apache-2.0", "repository": { @@ -63,7 +63,7 @@ "@react-email/render": "^2.0.8", "@treeseed/core": ">=0.12.60-rc.1 <0.14.0", "@treeseed/sdk": "0.13.0-rc.87", - "@treeseed/ui": "0.12.18-rc.15", + "@treeseed/ui": "0.12.18-rc.16", "react": "^19.2.5", "react-dom": "^19.2.6" }, diff --git a/src/lib/services/form-adapters.ts b/src/lib/services/form-adapters.ts index 15ad19bd..55d6fcef 100644 --- a/src/lib/services/form-adapters.ts +++ b/src/lib/services/form-adapters.ts @@ -1,12 +1,21 @@ import { registerFormAdapter } from '@treeseed/ui/forms/client'; -function jsonRequest(url: string, body: unknown, csrfToken: string, method = 'POST') { +function jsonRequest(url: string, body: unknown, csrfToken: string, method = 'POST', ifMatch?: string) { return {url, init: {method, headers: {accept: 'application/json', 'content-type': 'application/json', - 'x-treeseed-csrf': csrfToken, 'x-treeseed-form': 'enhanced', 'Idempotency-Key': crypto.randomUUID()}, + 'x-treeseed-csrf': csrfToken, 'x-treeseed-form': 'enhanced', 'Idempotency-Key': crypto.randomUUID(), + ...(ifMatch === undefined ? {} : {'If-Match': ifMatch})}, body: JSON.stringify(body), credentials: 'same-origin' as const}}; } function text(data: FormData, key: string) { return String(data.get(key) ?? '').trim(); } +function connectionRevision(data: FormData) { + const revision = text(data, 'version'); + if (!/^\d+$/.test(revision) || !Number.isSafeInteger(Number(revision))) throw new Error('Reload this connection before saving; its revision is missing or invalid.'); + return revision; +} export function registerServiceFormAdapters() { const disposers = [ + registerFormAdapter('service-disconnect', { + buildRequest(context) { return jsonRequest(context.form.action, {}, text(context.formData, 'csrfToken'), 'DELETE', connectionRevision(context.formData)); }, + }), registerFormAdapter('github-connector', { buildRequest(context) { return jsonRequest(context.form.action, { @@ -42,7 +51,8 @@ export function registerServiceFormAdapters() { }; const version = text(context.formData, 'version'); if (version) body.version = Number(version); - return jsonRequest(context.form.action, body, text(context.formData, 'csrfToken'), context.form.dataset.tsMethod || 'POST'); + const method = context.form.dataset.tsMethod || 'POST'; + return jsonRequest(context.form.action, body, text(context.formData, 'csrfToken'), method, method === 'PUT' ? connectionRevision(context.formData) : undefined); }, async parseResponse(response, context) { const body = await response.json().catch(() => null); diff --git a/src/pages/app/services/[connectionId].astro b/src/pages/app/services/[connectionId].astro index 3e1f9785..cb00b0f5 100644 --- a/src/pages/app/services/[connectionId].astro +++ b/src/pages/app/services/[connectionId].astro @@ -139,8 +139,8 @@ const profileTitle = (id: string, fallback: string) => id === 'github-repository } {canManage && !editing &&
Disconnect this service

This removes the team's connection. Projects must stop using it first.

-
- + +
}
diff --git a/tests/unit/services/form-adapters.test.ts b/tests/unit/services/form-adapters.test.ts index 17897837..a19cb800 100644 --- a/tests/unit/services/form-adapters.test.ts +++ b/tests/unit/services/form-adapters.test.ts @@ -4,6 +4,13 @@ vi.mock('@treeseed/ui/forms/client', () => ({registerFormAdapter: (name: string, adapters.set(name, adapter); return () => adapters.delete(name); }})); import {registerServiceFormAdapters} from '../../../src/lib/services/form-adapters'; +import {ALL as proxy} from '../../../src/pages/v1/[...all]'; +vi.mock('../../../src/lib/market/api-client', () => ({ + apiAccessTokenFromCookies: () => 'fixture', apiServiceHeaders: () => new Headers(), + resolveApiBaseUrl: () => 'https://api.example.test', + clearApiAccessTokenCookie: vi.fn(), setApiAccessTokenCookie: vi.fn(), +})); +vi.mock('../../../src/lib/auth/support/csrf', () => ({WEB_CSRF_HEADER: 'x-treeseed-csrf', csrfMatches: () => true})); function context(method = '') { const formData = new FormData(); for (const [key, value] of Object.entries({csrfToken: 'fixture', providerId: 'github', displayName: 'source', version: '3', @@ -16,8 +23,45 @@ describe('guided service forms', () => { const request = adapters.get('service-connection').buildRequest(context('PUT')); expect(request.url).toBe('/v1/teams/test/services/connection'); expect(request.init.headers['x-treeseed-csrf']).toBe('fixture'); + expect(new Headers(request.init.headers).get('If-Match')).toBe('3'); expect(JSON.parse(request.init.body)).toMatchObject({version: 3, capabilities: [{credentialProfileId: 'github-repository-token'}]}); }); + it('does not attach a revision to connection creation', () => { + expect(new Headers(adapters.get('service-connection').buildRequest(context()).init.headers).has('If-Match')).toBe(false); + }); + it('carries the submitted revision through the real proxy and preserves stale-write failures', async () => { + const adapter = adapters.get('service-connection'); + const ctx = context('PUT'); + const built = adapter.buildRequest(ctx); + let version = 3; + const upstream = vi.spyOn(globalThis, 'fetch').mockImplementation(async (_url, init) => { + if (new Headers(init?.headers).get('If-Match') !== String(version)) + return Response.json({detail: 'The service connection changed after it was inspected.'}, {status: 412}); + version++; + return Response.json({data: {id: 'connection', version}}); + }); + try { + const submit = () => proxy({ + params: {all: 'teams/test/services/connection'}, locals: {}, + request: new Request('https://admin.example.test' + built.url, built.init), + url: new URL('https://admin.example.test' + built.url), + } as any); + expect(await adapter.parseResponse(await submit(), ctx)).toMatchObject({ok: true}); + expect(await adapter.parseResponse(await submit(), ctx)).toMatchObject({ok: false, message: 'The service connection changed after it was inspected.'}); + expect(version).toBe(4); + expect(upstream).toHaveBeenCalledTimes(2); + } finally { upstream.mockRestore(); } + }); + it.each(['', '*', '-1', 'not-a-version'])('rejects missing or invalid update revision %s', revision => { + const ctx = context('PUT'); ctx.formData.set('version', revision); + expect(() => adapters.get('service-connection').buildRequest(ctx)).toThrow('revision'); + }); + it('sends the exact revision when disconnecting without task fields', () => { + const ctx = context('DELETE'); ctx.formData.delete('capabilities'); + const request = adapters.get('service-disconnect').buildRequest(ctx); + expect(new Headers(request.init.headers).get('If-Match')).toBe('3'); + expect(request.init.method).toBe('DELETE'); + }); it.each(['app', 'token'])('maps one %s choice to all tasks and both environment capabilities', method => { const ctx = context(); ctx.formData.set('githubAuthMethod', method); ctx.formData.append('capabilities', 'workflow-execution'); From 9f0ff9ab2c600cd47766dd7bea8fade25e5108a7 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Sat, 5 Sep 2026 23:57:35 -0400 Subject: [PATCH 274/315] feat(services): adopt published responsive discovery controls (#85) --- package-lock.json | 12 ++++++------ package.json | 4 ++-- src/pages/app/services/index.astro | 4 ++-- .../service-management-architecture.test.ts | 4 +++- 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index ddd5b1ef..a5cb3245 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,19 +1,19 @@ { "name": "@treeseed/admin", - "version": "0.12.59-rc.31", + "version": "0.12.59-rc.32", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@treeseed/admin", - "version": "0.12.59-rc.31", + "version": "0.12.59-rc.32", "license": "Apache-2.0", "dependencies": { "@astrojs/starlight": "0.37.6", "@react-email/render": "^2.0.8", "@treeseed/core": ">=0.12.60-rc.1 <0.14.0", "@treeseed/sdk": "0.13.0-rc.87", - "@treeseed/ui": "0.12.18-rc.16", + "@treeseed/ui": "0.12.18-rc.17", "react": "^19.2.5", "react-dom": "^19.2.6" }, @@ -6986,9 +6986,9 @@ } }, "node_modules/@treeseed/ui": { - "version": "0.12.18-rc.16", - "resolved": "https://registry.npmjs.org/@treeseed/ui/-/ui-0.12.18-rc.16.tgz", - "integrity": "sha512-+3xkv6qS482d1rvxSenKy2sM/UYey5gTpXS5RLiiFx4f+/PA7z7e1kL/+VUPvSfBEeMQMpUpvDgLHOX9xHI8lg==", + "version": "0.12.18-rc.17", + "resolved": "https://registry.npmjs.org/@treeseed/ui/-/ui-0.12.18-rc.17.tgz", + "integrity": "sha512-FGKjsIs2jyzJSq+8WV1/paCtBW9OOCB4NTAYILuEELfxciJVL/dKCL7CiT3t2Ylt0alQuvWeobm5lKaBk9G0Lw==", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", diff --git a/package.json b/package.json index 9e5bbe5d..d4078e48 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@treeseed/admin", - "version": "0.12.59-rc.31", + "version": "0.12.59-rc.32", "description": "Treeseed administration portal framework built on @treeseed/core and @treeseed/ui.", "license": "Apache-2.0", "repository": { @@ -63,7 +63,7 @@ "@react-email/render": "^2.0.8", "@treeseed/core": ">=0.12.60-rc.1 <0.14.0", "@treeseed/sdk": "0.13.0-rc.87", - "@treeseed/ui": "0.12.18-rc.16", + "@treeseed/ui": "0.12.18-rc.17", "react": "^19.2.5", "react-dom": "^19.2.6" }, diff --git a/src/pages/app/services/index.astro b/src/pages/app/services/index.astro index c8a7fb1b..1404b43b 100644 --- a/src/pages/app/services/index.astro +++ b/src/pages/app/services/index.astro @@ -13,7 +13,7 @@ const team = context.activeTeam; const api = new ApiClientFacade(Astro); const preferences = await api.accountPreferences().catch(() => ({ timeZone: 'UTC' })); const providerFilter = Astro.url.searchParams.get('provider') ?? ''; -const capabilityFilter = Astro.url.searchParams.get('capability') ?? ''; +const capabilityFilters = Astro.url.searchParams.getAll('capability').filter(Boolean); let services: any[] = []; let unavailable = false; const managementRoles = new Set(['team_owner', 'project_lead', 'service_admin']); @@ -28,5 +28,5 @@ if (team) { --- - + diff --git a/tests/contract/service-management/service-management-architecture.test.ts b/tests/contract/service-management/service-management-architecture.test.ts index bc8f799d..cf318089 100644 --- a/tests/contract/service-management/service-management-architecture.test.ts +++ b/tests/contract/service-management/service-management-architecture.test.ts @@ -22,7 +22,9 @@ describe('service management architecture', () => { expect(collectionPage).not.toContain(component); } const workspace = readDependency('@treeseed/ui', 'dist/astro/service/workspace/ServiceConnectionWorkspace.astro'); - for (const component of ['ProviderCard', 'SettingsTemplate', 'SemanticCollectionSurface']) expect(workspace).toContain(component); + for (const component of ['ProviderCard', 'SettingsTemplate', 'SemanticCollectionSurface', 'ItemPicker', 'CollapsibleMultiSelect']) expect(workspace).toContain(component); + expect(collectionPage).toContain("searchParams.getAll('capability')"); + expect(collectionPage).toContain('capabilityFilters'); expect(workspace).not.toContain('Managed OpenBao'); const createPage = read('src/pages/app/services/new.astro'); expect(createPage).toContain('@treeseed/ui/components/astro/service/workspace/ServiceConnectionCreateSurface.astro'); From 231c7d4742e061b9ce912cbb2ec40e1817f62e09 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Sun, 6 Sep 2026 00:00:01 -0400 Subject: [PATCH 275/315] feat(services): adopt published responsive discovery controls (#85) (#86) --- package-lock.json | 12 ++++++------ package.json | 4 ++-- src/pages/app/services/index.astro | 4 ++-- .../service-management-architecture.test.ts | 4 +++- 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index ddd5b1ef..a5cb3245 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,19 +1,19 @@ { "name": "@treeseed/admin", - "version": "0.12.59-rc.31", + "version": "0.12.59-rc.32", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@treeseed/admin", - "version": "0.12.59-rc.31", + "version": "0.12.59-rc.32", "license": "Apache-2.0", "dependencies": { "@astrojs/starlight": "0.37.6", "@react-email/render": "^2.0.8", "@treeseed/core": ">=0.12.60-rc.1 <0.14.0", "@treeseed/sdk": "0.13.0-rc.87", - "@treeseed/ui": "0.12.18-rc.16", + "@treeseed/ui": "0.12.18-rc.17", "react": "^19.2.5", "react-dom": "^19.2.6" }, @@ -6986,9 +6986,9 @@ } }, "node_modules/@treeseed/ui": { - "version": "0.12.18-rc.16", - "resolved": "https://registry.npmjs.org/@treeseed/ui/-/ui-0.12.18-rc.16.tgz", - "integrity": "sha512-+3xkv6qS482d1rvxSenKy2sM/UYey5gTpXS5RLiiFx4f+/PA7z7e1kL/+VUPvSfBEeMQMpUpvDgLHOX9xHI8lg==", + "version": "0.12.18-rc.17", + "resolved": "https://registry.npmjs.org/@treeseed/ui/-/ui-0.12.18-rc.17.tgz", + "integrity": "sha512-FGKjsIs2jyzJSq+8WV1/paCtBW9OOCB4NTAYILuEELfxciJVL/dKCL7CiT3t2Ylt0alQuvWeobm5lKaBk9G0Lw==", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", diff --git a/package.json b/package.json index 9e5bbe5d..d4078e48 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@treeseed/admin", - "version": "0.12.59-rc.31", + "version": "0.12.59-rc.32", "description": "Treeseed administration portal framework built on @treeseed/core and @treeseed/ui.", "license": "Apache-2.0", "repository": { @@ -63,7 +63,7 @@ "@react-email/render": "^2.0.8", "@treeseed/core": ">=0.12.60-rc.1 <0.14.0", "@treeseed/sdk": "0.13.0-rc.87", - "@treeseed/ui": "0.12.18-rc.16", + "@treeseed/ui": "0.12.18-rc.17", "react": "^19.2.5", "react-dom": "^19.2.6" }, diff --git a/src/pages/app/services/index.astro b/src/pages/app/services/index.astro index c8a7fb1b..1404b43b 100644 --- a/src/pages/app/services/index.astro +++ b/src/pages/app/services/index.astro @@ -13,7 +13,7 @@ const team = context.activeTeam; const api = new ApiClientFacade(Astro); const preferences = await api.accountPreferences().catch(() => ({ timeZone: 'UTC' })); const providerFilter = Astro.url.searchParams.get('provider') ?? ''; -const capabilityFilter = Astro.url.searchParams.get('capability') ?? ''; +const capabilityFilters = Astro.url.searchParams.getAll('capability').filter(Boolean); let services: any[] = []; let unavailable = false; const managementRoles = new Set(['team_owner', 'project_lead', 'service_admin']); @@ -28,5 +28,5 @@ if (team) { --- - + diff --git a/tests/contract/service-management/service-management-architecture.test.ts b/tests/contract/service-management/service-management-architecture.test.ts index bc8f799d..cf318089 100644 --- a/tests/contract/service-management/service-management-architecture.test.ts +++ b/tests/contract/service-management/service-management-architecture.test.ts @@ -22,7 +22,9 @@ describe('service management architecture', () => { expect(collectionPage).not.toContain(component); } const workspace = readDependency('@treeseed/ui', 'dist/astro/service/workspace/ServiceConnectionWorkspace.astro'); - for (const component of ['ProviderCard', 'SettingsTemplate', 'SemanticCollectionSurface']) expect(workspace).toContain(component); + for (const component of ['ProviderCard', 'SettingsTemplate', 'SemanticCollectionSurface', 'ItemPicker', 'CollapsibleMultiSelect']) expect(workspace).toContain(component); + expect(collectionPage).toContain("searchParams.getAll('capability')"); + expect(collectionPage).toContain('capabilityFilters'); expect(workspace).not.toContain('Managed OpenBao'); const createPage = read('src/pages/app/services/new.astro'); expect(createPage).toContain('@treeseed/ui/components/astro/service/workspace/ServiceConnectionCreateSurface.astro'); From 2d4541e1d5d7e7d9d81c7c19e8d05e3e7350e6f0 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Sun, 6 Sep 2026 00:24:00 -0400 Subject: [PATCH 276/315] fix(services): retain form adapters across navigation (#87) --- package-lock.json | 4 +-- package.json | 2 +- src/lib/services/form-lifecycle.ts | 22 +++++++++++++ src/pages/app/services/[connectionId].astro | 13 ++------ src/pages/app/services/new.astro | 5 ++- tests/unit/services/form-adapters.test.ts | 1 + tests/unit/services/form-lifecycle.test.ts | 35 +++++++++++++++++++++ 7 files changed, 65 insertions(+), 17 deletions(-) create mode 100644 src/lib/services/form-lifecycle.ts create mode 100644 tests/unit/services/form-lifecycle.test.ts diff --git a/package-lock.json b/package-lock.json index a5cb3245..55a38405 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@treeseed/admin", - "version": "0.12.59-rc.32", + "version": "0.12.59-rc.33", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@treeseed/admin", - "version": "0.12.59-rc.32", + "version": "0.12.59-rc.33", "license": "Apache-2.0", "dependencies": { "@astrojs/starlight": "0.37.6", diff --git a/package.json b/package.json index d4078e48..fa4feb05 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@treeseed/admin", - "version": "0.12.59-rc.32", + "version": "0.12.59-rc.33", "description": "Treeseed administration portal framework built on @treeseed/core and @treeseed/ui.", "license": "Apache-2.0", "repository": { diff --git a/src/lib/services/form-lifecycle.ts b/src/lib/services/form-lifecycle.ts new file mode 100644 index 00000000..4f79e27a --- /dev/null +++ b/src/lib/services/form-lifecycle.ts @@ -0,0 +1,22 @@ +import { registerServiceFormAdapters } from './form-adapters'; + +const initialized = new WeakSet(); + +/** Adapters are stateless and belong to the document, not a routed page. */ +export function initializeServiceForms(root: Document = document) { + if (initialized.has(root)) return; + initialized.add(root); + registerServiceFormAdapters(); + root.addEventListener('treeseed:form-success', event => { + const form = event.target; + if (!(form instanceof HTMLFormElement)) return; + if (form.hasAttribute('data-service-disconnect')) { + window.location.assign('/app/services'); + } else if (form.matches('[data-service-settings], [data-service-credentials]')) { + const url = new URL(window.location.pathname, window.location.origin); + if (form.hasAttribute('data-service-settings')) url.searchParams.set('edit', 'true'); + url.searchParams.set('tsToastSuccess', (event as CustomEvent).detail?.message ?? 'Saved.'); + window.location.assign(url.href); + } + }); +} diff --git a/src/pages/app/services/[connectionId].astro b/src/pages/app/services/[connectionId].astro index cb00b0f5..3386401f 100644 --- a/src/pages/app/services/[connectionId].astro +++ b/src/pages/app/services/[connectionId].astro @@ -147,15 +147,6 @@ const profileTitle = (id: string, fallback: string) => id === 'github-repository } diff --git a/src/pages/app/services/new.astro b/src/pages/app/services/new.astro index 291c082a..f20a0a16 100644 --- a/src/pages/app/services/new.astro +++ b/src/pages/app/services/new.astro @@ -21,7 +21,6 @@ const canManage = Boolean(team?.roles?.some((role: string) => managementRoles.ha diff --git a/tests/unit/services/form-adapters.test.ts b/tests/unit/services/form-adapters.test.ts index a19cb800..89f038b7 100644 --- a/tests/unit/services/form-adapters.test.ts +++ b/tests/unit/services/form-adapters.test.ts @@ -35,6 +35,7 @@ describe('guided service forms', () => { const built = adapter.buildRequest(ctx); let version = 3; const upstream = vi.spyOn(globalThis, 'fetch').mockImplementation(async (_url, init) => { + expect(new Headers(init?.headers).get('Idempotency-Key')).toBe(new Headers(built.init.headers).get('Idempotency-Key')); if (new Headers(init?.headers).get('If-Match') !== String(version)) return Response.json({detail: 'The service connection changed after it was inspected.'}, {status: 412}); version++; diff --git a/tests/unit/services/form-lifecycle.test.ts b/tests/unit/services/form-lifecycle.test.ts new file mode 100644 index 00000000..bfa8d10a --- /dev/null +++ b/tests/unit/services/form-lifecycle.test.ts @@ -0,0 +1,35 @@ +import { describe, expect, it, vi } from 'vitest'; +const { adapters } = vi.hoisted(() => ({ adapters: new Map() })); +vi.mock('@treeseed/ui/forms/client', () => ({ registerFormAdapter(name: string, adapter: any) { + adapters.set(name, adapter); return () => adapters.delete(name); +} })); +import { initializeServiceForms } from '../../../src/lib/services/form-lifecycle'; + +describe('service form document lifetime', () => { + it('retains Cloudflare request contracts after swaps and repeat visits without duplicate listeners', () => { + const root = new EventTarget() as Document; + const listeners = vi.spyOn(root, 'addEventListener'); + initializeServiceForms(root); + const adapter = adapters.get('service-connection'); + for (let visit = 0; visit < 3; visit++) { + root.dispatchEvent(new Event('astro:before-swap')); + root.dispatchEvent(new Event('astro:page-load')); + initializeServiceForms(root); + expect(adapters.get('service-connection')).toBe(adapter); + for (const method of ['', 'PUT']) { + const formData = new FormData(); + for (const [key, value] of Object.entries({ providerId: 'cloudflare', displayName: 'storage', + capabilities: 'object-storage', 'config.accountId': 'fixture-account', version: '2', csrfToken: 'fixture' })) + formData.set(key, value); + const request = adapter.buildRequest({ formData, form: { action: '/v1/teams/test/services', dataset: { tsMethod: method } } }); + const headers = new Headers(request.init.headers); + expect(headers.get('Idempotency-Key')).toMatch(/^[0-9a-f-]{36}$/); + expect(headers.get('If-Match')).toBe(method ? '2' : null); + expect(headers.get('x-treeseed-csrf')).toBe('fixture'); + expect(JSON.parse(request.init.body)).toMatchObject({ nonSecretConfig: { accountId: 'fixture-account' }, + capabilities: [{ capabilityType: 'object-storage' }] }); + } + } + expect(listeners.mock.calls.filter(([name]) => name === 'treeseed:form-success')).toHaveLength(1); + }); +}); From 1590afec3123e1c1c886fbdd65a820d1ff40e527 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Sun, 6 Sep 2026 00:26:11 -0400 Subject: [PATCH 277/315] fix(services): retain form adapters across navigation (#87) (#88) --- package-lock.json | 4 +-- package.json | 2 +- src/lib/services/form-lifecycle.ts | 22 +++++++++++++ src/pages/app/services/[connectionId].astro | 13 ++------ src/pages/app/services/new.astro | 5 ++- tests/unit/services/form-adapters.test.ts | 1 + tests/unit/services/form-lifecycle.test.ts | 35 +++++++++++++++++++++ 7 files changed, 65 insertions(+), 17 deletions(-) create mode 100644 src/lib/services/form-lifecycle.ts create mode 100644 tests/unit/services/form-lifecycle.test.ts diff --git a/package-lock.json b/package-lock.json index a5cb3245..55a38405 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@treeseed/admin", - "version": "0.12.59-rc.32", + "version": "0.12.59-rc.33", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@treeseed/admin", - "version": "0.12.59-rc.32", + "version": "0.12.59-rc.33", "license": "Apache-2.0", "dependencies": { "@astrojs/starlight": "0.37.6", diff --git a/package.json b/package.json index d4078e48..fa4feb05 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@treeseed/admin", - "version": "0.12.59-rc.32", + "version": "0.12.59-rc.33", "description": "Treeseed administration portal framework built on @treeseed/core and @treeseed/ui.", "license": "Apache-2.0", "repository": { diff --git a/src/lib/services/form-lifecycle.ts b/src/lib/services/form-lifecycle.ts new file mode 100644 index 00000000..4f79e27a --- /dev/null +++ b/src/lib/services/form-lifecycle.ts @@ -0,0 +1,22 @@ +import { registerServiceFormAdapters } from './form-adapters'; + +const initialized = new WeakSet(); + +/** Adapters are stateless and belong to the document, not a routed page. */ +export function initializeServiceForms(root: Document = document) { + if (initialized.has(root)) return; + initialized.add(root); + registerServiceFormAdapters(); + root.addEventListener('treeseed:form-success', event => { + const form = event.target; + if (!(form instanceof HTMLFormElement)) return; + if (form.hasAttribute('data-service-disconnect')) { + window.location.assign('/app/services'); + } else if (form.matches('[data-service-settings], [data-service-credentials]')) { + const url = new URL(window.location.pathname, window.location.origin); + if (form.hasAttribute('data-service-settings')) url.searchParams.set('edit', 'true'); + url.searchParams.set('tsToastSuccess', (event as CustomEvent).detail?.message ?? 'Saved.'); + window.location.assign(url.href); + } + }); +} diff --git a/src/pages/app/services/[connectionId].astro b/src/pages/app/services/[connectionId].astro index cb00b0f5..3386401f 100644 --- a/src/pages/app/services/[connectionId].astro +++ b/src/pages/app/services/[connectionId].astro @@ -147,15 +147,6 @@ const profileTitle = (id: string, fallback: string) => id === 'github-repository } diff --git a/src/pages/app/services/new.astro b/src/pages/app/services/new.astro index 291c082a..f20a0a16 100644 --- a/src/pages/app/services/new.astro +++ b/src/pages/app/services/new.astro @@ -21,7 +21,6 @@ const canManage = Boolean(team?.roles?.some((role: string) => managementRoles.ha diff --git a/tests/unit/services/form-adapters.test.ts b/tests/unit/services/form-adapters.test.ts index a19cb800..89f038b7 100644 --- a/tests/unit/services/form-adapters.test.ts +++ b/tests/unit/services/form-adapters.test.ts @@ -35,6 +35,7 @@ describe('guided service forms', () => { const built = adapter.buildRequest(ctx); let version = 3; const upstream = vi.spyOn(globalThis, 'fetch').mockImplementation(async (_url, init) => { + expect(new Headers(init?.headers).get('Idempotency-Key')).toBe(new Headers(built.init.headers).get('Idempotency-Key')); if (new Headers(init?.headers).get('If-Match') !== String(version)) return Response.json({detail: 'The service connection changed after it was inspected.'}, {status: 412}); version++; diff --git a/tests/unit/services/form-lifecycle.test.ts b/tests/unit/services/form-lifecycle.test.ts new file mode 100644 index 00000000..bfa8d10a --- /dev/null +++ b/tests/unit/services/form-lifecycle.test.ts @@ -0,0 +1,35 @@ +import { describe, expect, it, vi } from 'vitest'; +const { adapters } = vi.hoisted(() => ({ adapters: new Map() })); +vi.mock('@treeseed/ui/forms/client', () => ({ registerFormAdapter(name: string, adapter: any) { + adapters.set(name, adapter); return () => adapters.delete(name); +} })); +import { initializeServiceForms } from '../../../src/lib/services/form-lifecycle'; + +describe('service form document lifetime', () => { + it('retains Cloudflare request contracts after swaps and repeat visits without duplicate listeners', () => { + const root = new EventTarget() as Document; + const listeners = vi.spyOn(root, 'addEventListener'); + initializeServiceForms(root); + const adapter = adapters.get('service-connection'); + for (let visit = 0; visit < 3; visit++) { + root.dispatchEvent(new Event('astro:before-swap')); + root.dispatchEvent(new Event('astro:page-load')); + initializeServiceForms(root); + expect(adapters.get('service-connection')).toBe(adapter); + for (const method of ['', 'PUT']) { + const formData = new FormData(); + for (const [key, value] of Object.entries({ providerId: 'cloudflare', displayName: 'storage', + capabilities: 'object-storage', 'config.accountId': 'fixture-account', version: '2', csrfToken: 'fixture' })) + formData.set(key, value); + const request = adapter.buildRequest({ formData, form: { action: '/v1/teams/test/services', dataset: { tsMethod: method } } }); + const headers = new Headers(request.init.headers); + expect(headers.get('Idempotency-Key')).toMatch(/^[0-9a-f-]{36}$/); + expect(headers.get('If-Match')).toBe(method ? '2' : null); + expect(headers.get('x-treeseed-csrf')).toBe('fixture'); + expect(JSON.parse(request.init.body)).toMatchObject({ nonSecretConfig: { accountId: 'fixture-account' }, + capabilities: [{ capabilityType: 'object-storage' }] }); + } + } + expect(listeners.mock.calls.filter(([name]) => name === 'treeseed:form-success')).toHaveLength(1); + }); +}); From 4c3bf78db9a52d4fd5d14fbc71234f1c0e335a2e Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Sun, 6 Sep 2026 01:51:08 -0400 Subject: [PATCH 278/315] feat(services): open existing connections directly in guided editor (#89) --- src/pages/app/services/[connectionId].astro | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/pages/app/services/[connectionId].astro b/src/pages/app/services/[connectionId].astro index 3386401f..b910c75a 100644 --- a/src/pages/app/services/[connectionId].astro +++ b/src/pages/app/services/[connectionId].astro @@ -65,8 +65,8 @@ const needsAuthentication = selectedProfiles.some(profile => profile.authoritySc const profileReady = (profile: typeof selectedProfiles[number]) => profile.authoritySchemes?.includes('openbao') ? Boolean(credentials[profile.id]?.configured) : authorityStatus(profile.id) === 'ready'; const requestedAccess = selectedProfiles.findIndex(profile => profile.id === Astro.url.searchParams.get('access')); const accessIndex = requestedAccess >= 0 ? requestedAccess : Math.max(0, selectedProfiles.findIndex(profile => !profileReady(profile))); -const editing = Astro.url.searchParams.get('edit') === 'true' || needsAuthentication || custodyUnavailable || !selectedProfiles.length; -const initialStep = Astro.url.searchParams.get('step') === 'tasks' || !selectedProfiles.length ? 0 : 2; +const initialStep = Astro.url.searchParams.get('step') === 'tasks' || !selectedProfiles.length ? 0 + : needsAuthentication || custodyUnavailable || Astro.url.searchParams.get('access') || Astro.url.searchParams.get('edit') === 'true' ? 2 : 1; const profileTitle = (id: string, fallback: string) => id === 'github-repository-token' ? 'GitHub repository access' : id === 'github-workflow-token' ? 'GitHub Actions access' : id === 'cloudflare-storage' ? 'Cloudflare storage access' : fallback; --- @@ -76,15 +76,14 @@ const profileTitle = (id: string, fallback: string) => id === 'github-repository : !connection || !provider ? :
- {!canManage || !editing ? + {!canManage ? {!canManage &&

Ask a team administrator to change this connection.

} - {canManage &&
}
:
- - + +
} - {!editing &&
Activity +
Activity

Last changed:

Last checked: {connection.lastValidatedAt ? : 'Not yet checked'}

-
} - {canManage && !editing &&
Disconnect this service +
+ {canManage &&
Disconnect this service

This removes the team's connection. Projects must stop using it first.

diff --git a/tests/contract/service-management/service-management-architecture.test.ts b/tests/contract/service-management/service-management-architecture.test.ts index cf318089..7339fa87 100644 --- a/tests/contract/service-management/service-management-architecture.test.ts +++ b/tests/contract/service-management/service-management-architecture.test.ts @@ -60,6 +60,16 @@ describe('service management architecture', () => { expect(detail).not.toContain('searchParams.get(\'tab\')'); }); + it('opens the editable wizard directly while preserving read-only access', () => { + const detail = read('src/pages/app/services/[connectionId].astro'); + expect(detail).not.toMatch(/\bediting\b/); + expect(detail).not.toContain('Account access saved'); + expect(detail).toContain('!canManage ? { const detail=read('src/pages/app/services/[connectionId].astro'); expect(detail).not.toContain('Core OpenBao');expect(detail).toContain('managed-credentials'); From 46b868db05a1d7b9c1a4f9143b83d07f99866c9e Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Sun, 6 Sep 2026 03:15:46 -0400 Subject: [PATCH 280/315] fix(dev): restore native managed Admin feedback loop (#91) --- astro.config.ts | 1 + src/layouts/AppLayout.astro | 2 ++ tests/contract/package/admin-package.test.ts | 3 +++ treeseed.package.yaml | 3 +-- 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/astro.config.ts b/astro.config.ts index 47cb48a6..503980d8 100644 --- a/astro.config.ts +++ b/astro.config.ts @@ -19,6 +19,7 @@ export default { ssr: { ...site.vite?.ssr, noExternal: ['@treeseed/ui'] }, server: { ...site.vite?.server, + allowedHosts: ['admin.treeseed.localhost'], fs: { ...site.vite?.server?.fs, allow: [...(site.vite?.server?.fs?.allow ?? []), developmentWorkspaceRoot] }, }, }, diff --git a/src/layouts/AppLayout.astro b/src/layouts/AppLayout.astro index ab774b7c..b12e2b52 100644 --- a/src/layouts/AppLayout.astro +++ b/src/layouts/AppLayout.astro @@ -10,6 +10,7 @@ import '@treeseed/ui/styles/account/forms.css'; import '@treeseed/ui/styles/auth.css'; import ProductShell from '@treeseed/ui/components/astro/shell/ProductShell.astro'; import ShellIcon from '@treeseed/ui/components/astro/shell/navigation/ShellIcon.astro'; +import Badge from '@treeseed/ui/components/astro/data/Badge.astro'; import { AppearancePersistenceIsland } from '@treeseed/ui/components/react/progressive'; import { resolveAuthenticatedThemePreference } from '../lib/auth/accounts/appearance'; import { compileGuidedThemePalette } from '@treeseed/ui/theme'; @@ -169,6 +170,7 @@ try { )}
+ {import.meta.env.DEV && process.env.TREESEED_DEVELOPMENT_MODE === 'live' &&

Live development Local source · not a released build

} diff --git a/tests/contract/package/admin-package.test.ts b/tests/contract/package/admin-package.test.ts index 7484cc68..dee1956c 100644 --- a/tests/contract/package/admin-package.test.ts +++ b/tests/contract/package/admin-package.test.ts @@ -411,6 +411,9 @@ describe('@treeseed/admin identity and team surface', () => { expect(astroConfig).toContain('vite:'); expect(astroConfig).toContain('fs:'); expect(astroConfig).toContain('allow:'); + expect(astroConfig).toContain("allowedHosts: ['admin.treeseed.localhost']"); + expect(manifest).toContain('start: { command: node, args: [--import, tsx, scripts/development/live-web.ts]'); + expect(manifest).not.toContain('command: docker'); const developmentCompose = readFileSync('compose.development.yml', 'utf8'); expect(developmentCompose).toContain('TREESEED_DEVELOPMENT_WORKSPACE_ROOT:'); expect(developmentCompose).toContain('TREESEED_DEVELOPMENT_WORKTREE:'); diff --git a/treeseed.package.yaml b/treeseed.package.yaml index 510c18d2..256b10dc 100644 --- a/treeseed.package.yaml +++ b/treeseed.package.yaml @@ -37,8 +37,7 @@ development: ignoredPaths: [dist, node_modules] operations: setup: { command: npm, args: [run, brand:sync], environment: {}, timeoutSeconds: 120 } - start: { command: docker, args: [compose, --file, compose.development.yml, --project-name, treeseed-admin-development, up, --abort-on-container-exit, --exit-code-from, admin-live], environment: { TREESEED_DEVELOPMENT_EDGE_HOST: admin-live }, timeoutSeconds: 86400 } - cleanup: { command: docker, args: [compose, --file, compose.development.yml, --project-name, treeseed-admin-development, down, --remove-orphans], environment: {}, timeoutSeconds: 120 } + start: { command: node, args: [--import, tsx, scripts/development/live-web.ts], environment: { TREESEED_WEB_RUNTIME_TARGET: managed-node }, timeoutSeconds: 86400 } build: { command: npm, args: [run, build], environment: {}, timeoutSeconds: 1800 } verify: { command: npm, args: [run, test:unit], environment: {}, timeoutSeconds: 900 } ready: { kind: http, path: /healthz, expectedStatus: 200, timeoutSeconds: 120 } From 32b7bf73e199df578ffcb05b35df9341ae2bacb6 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Sun, 6 Sep 2026 04:27:18 -0400 Subject: [PATCH 281/315] fix: clarify connection details and isolate confirmed disconnect --- astro.config.ts | 11 ++++- scripts/development/source-updates.ts | 19 ++++++++ src/components/LiveDevelopmentIndicator.astro | 22 +++++++++ src/env.d.ts | 1 + src/layouts/AppLayout.astro | 4 +- src/lib/services/form-adapters.ts | 7 ++- src/pages/app/services/[connectionId].astro | 47 ++++++++++++++----- .../service-management-architecture.test.ts | 9 ++++ tests/unit/services/form-adapters.test.ts | 7 ++- tests/unit/services/source-updates.test.ts | 22 +++++++++ 10 files changed, 130 insertions(+), 19 deletions(-) create mode 100644 scripts/development/source-updates.ts create mode 100644 src/components/LiveDevelopmentIndicator.astro create mode 100644 tests/unit/services/source-updates.test.ts diff --git a/astro.config.ts b/astro.config.ts index 503980d8..8606a070 100644 --- a/astro.config.ts +++ b/astro.config.ts @@ -1,5 +1,7 @@ -import { dirname } from 'node:path'; +import { dirname, resolve } from 'node:path'; +import { realpathSync } from 'node:fs'; import { fileURLToPath } from 'node:url'; +import { sourceUpdates } from './scripts/development/source-updates'; const tenantRoot = dirname(fileURLToPath(import.meta.url)); process.env.TREESEED_TENANT_ROOT = tenantRoot; @@ -8,14 +10,19 @@ process.chdir(tenantRoot); const { createTenantSite } = await import('@treeseed/core/config'); const site = createTenantSite(); const developmentWorkspaceRoot = process.env.TREESEED_DEVELOPMENT_WORKSPACE_ROOT?.trim(); +const aliases = site.vite?.resolve?.alias ?? []; +const existingAliases = Array.isArray(aliases) ? aliases : Object.entries(aliases).map(([find, replacement]) => ({find, replacement})); export default { ...site, devToolbar: { enabled: false }, + vite: {...site.vite, plugins: [...(site.vite?.plugins ?? []), sourceUpdates(false)]}, ...(developmentWorkspaceRoot ? { vite: { ...site.vite, - resolve: { ...site.vite?.resolve, preserveSymlinks: true }, + plugins: [...(site.vite?.plugins ?? []), sourceUpdates(process.env.TREESEED_DEVELOPMENT_MODE === 'live')], + resolve: { ...site.vite?.resolve, preserveSymlinks: true, dedupe: [...(site.vite?.resolve?.dedupe ?? []), '@treeseed/ui'], + alias: [{find: '@treeseed/ui/forms/client', replacement: realpathSync(resolve(tenantRoot, 'node_modules/@treeseed/ui/dist/forms-client.js'))}, ...existingAliases] }, ssr: { ...site.vite?.ssr, noExternal: ['@treeseed/ui'] }, server: { ...site.vite?.server, diff --git a/scripts/development/source-updates.ts b/scripts/development/source-updates.ts new file mode 100644 index 00000000..a84f7d9f --- /dev/null +++ b/scripts/development/source-updates.ts @@ -0,0 +1,19 @@ +const publicId = 'virtual:treeseed-source-update'; +const resolvedId = '\0' + publicId; + +/** Timestamp of the source generation served by Vite, not of the HTTP request. */ +export function sourceUpdates(enabled: boolean, clock = () => Date.now()) { + let updatedAt = enabled ? new Date(clock()).toISOString() : null; + return { + name: 'treeseed-source-updates', + resolveId(id: string) { if (id === publicId) return resolvedId; }, + load(id: string) { if (id === resolvedId) return `export default ${JSON.stringify(updatedAt)};`; }, + handleHotUpdate(context: any) { + if (!enabled) return; + updatedAt = new Date(clock()).toISOString(); + const module = context.server.moduleGraph.getModuleById(resolvedId); + if (module) context.server.moduleGraph.invalidateModule(module); + context.server.ws.send({type: 'custom', event: 'treeseed:source-update', data: {updatedAt}}); + }, + }; +} diff --git a/src/components/LiveDevelopmentIndicator.astro b/src/components/LiveDevelopmentIndicator.astro new file mode 100644 index 00000000..2d19fde8 --- /dev/null +++ b/src/components/LiveDevelopmentIndicator.astro @@ -0,0 +1,22 @@ +--- +import Badge from '@treeseed/ui/components/astro/data/Badge.astro'; +import Timestamp from '@treeseed/ui/components/astro/data/Timestamp.astro'; +import updatedAt from 'virtual:treeseed-source-update'; +interface Props { timeZone?: string } +const {timeZone = 'UTC'} = Astro.props; +--- +{import.meta.env.DEV && updatedAt &&

+ Live development Local source - last updated: +

} + diff --git a/src/env.d.ts b/src/env.d.ts index 670528b5..e1ad952c 100644 --- a/src/env.d.ts +++ b/src/env.d.ts @@ -1,4 +1,5 @@ /// +declare module 'virtual:treeseed-source-update' { const updatedAt: string | null; export default updatedAt; } declare module 'astro:middleware' { import type { MiddlewareHandler } from 'astro'; diff --git a/src/layouts/AppLayout.astro b/src/layouts/AppLayout.astro index b12e2b52..5c2832a1 100644 --- a/src/layouts/AppLayout.astro +++ b/src/layouts/AppLayout.astro @@ -10,7 +10,7 @@ import '@treeseed/ui/styles/account/forms.css'; import '@treeseed/ui/styles/auth.css'; import ProductShell from '@treeseed/ui/components/astro/shell/ProductShell.astro'; import ShellIcon from '@treeseed/ui/components/astro/shell/navigation/ShellIcon.astro'; -import Badge from '@treeseed/ui/components/astro/data/Badge.astro'; +import LiveDevelopmentIndicator from '../components/LiveDevelopmentIndicator.astro'; import { AppearancePersistenceIsland } from '@treeseed/ui/components/react/progressive'; import { resolveAuthenticatedThemePreference } from '../lib/auth/accounts/appearance'; import { compileGuidedThemePalette } from '@treeseed/ui/theme'; @@ -170,7 +170,7 @@ try { )}
- {import.meta.env.DEV && process.env.TREESEED_DEVELOPMENT_MODE === 'live' &&

Live development Local source · not a released build

} + diff --git a/src/lib/services/form-adapters.ts b/src/lib/services/form-adapters.ts index 55d6fcef..634f6737 100644 --- a/src/lib/services/form-adapters.ts +++ b/src/lib/services/form-adapters.ts @@ -14,7 +14,12 @@ function connectionRevision(data: FormData) { export function registerServiceFormAdapters() { const disposers = [ registerFormAdapter('service-disconnect', { - buildRequest(context) { return jsonRequest(context.form.action, {}, text(context.formData, 'csrfToken'), 'DELETE', connectionRevision(context.formData)); }, + buildRequest(context) { + const expected = context.form.dataset.connectionName; + if (!expected || String(context.formData.get('confirmation') ?? '') !== expected) + throw new Error('Type the connection name exactly to confirm disconnection.'); + return jsonRequest(context.form.action, {}, text(context.formData, 'csrfToken'), 'DELETE', connectionRevision(context.formData)); + }, }), registerFormAdapter('github-connector', { buildRequest(context) { diff --git a/src/pages/app/services/[connectionId].astro b/src/pages/app/services/[connectionId].astro index c8c91020..07d12716 100644 --- a/src/pages/app/services/[connectionId].astro +++ b/src/pages/app/services/[connectionId].astro @@ -79,11 +79,22 @@ const profileTitle = (id: string, fallback: string) => id === 'github-repository {!canManage ? {!canManage &&

Ask a team administrator to change this connection.

} -
: + : - + + } -
Activity -

Last changed:

-

Last checked: {connection.lastValidatedAt ? : 'Not yet checked'}

-
- {canManage &&
Disconnect this service -

This removes the team's connection. Projects must stop using it first.

-
- -
-
}
} + + diff --git a/src/pages/app/capacity/index.astro b/src/pages/app/capacity/index.astro index e4ecf0dd..591d5dd1 100644 --- a/src/pages/app/capacity/index.astro +++ b/src/pages/app/capacity/index.astro @@ -1,50 +1,54 @@ --- -import CapacityWorkspace from '@treeseed/ui/components/astro/capacity/CapacityWorkspace.astro'; import TreeseedAppLayout from '../../../layouts/AppLayout.astro'; -import { ensureCsrfToken } from '../../../lib/auth/support/csrf.ts'; -import { ApiClientFacade } from '../../../lib/market/api-client.ts'; -import { items, text } from '../../../lib/operations/records.ts'; -import { loadAppContext } from '../../../view-models/app-access.ts'; -import { loadCommandSnapshot } from '../../../view-models/command/command-state.ts'; - -if (!Astro.locals.auth?.principal) return Astro.redirect(`/auth/sign-in?returnTo=${encodeURIComponent(Astro.url.pathname)}`); -const context = await loadAppContext(Astro); const api = new ApiClientFacade(Astro); const team = context.activeTeam; const base = team ? `/v1/teams/${encodeURIComponent(team.id)}/capacity` : ''; -const [snapshot, access, preferences, registrationKey, requestPage, membershipPage] = await Promise.all([ - team ? loadCommandSnapshot(api, team.id) : null, - team ? api.getTeamAccessSummary(team.id).catch(() => null) : null, - api.accountPreferences().catch(() => ({ timeZone: 'UTC' })), - team ? api.request('GET', `/v1/teams/${encodeURIComponent(team.id)}/capacity-registration-key`).catch(() => null) : null, - team ? api.request('GET', `/v1/teams/${encodeURIComponent(team.id)}/capacity-provider-requests?limit=100`).catch(() => null) : null, - team ? api.request('GET', `/v1/teams/${encodeURIComponent(team.id)}/capacity-provider-memberships?limit=100`).catch(() => null) : null, -]); -const usagePages = team && snapshot ? await Promise.all(snapshot.projects.map((project) => api.request('GET', `${base}/usage?projectId=${encodeURIComponent(String(project.id))}&limit=100`).catch(() => null))) : []; -const providerStatuses = team && snapshot ? await Promise.all(snapshot.providers.map((provider: any) => { - const providerId=String(provider.providerId ?? provider.id ?? ''); - return providerId?api.request('GET',`/v1/teams/${encodeURIComponent(team.id)}/capacity-providers/${encodeURIComponent(providerId)}/status`).catch(()=>null):null; -})) : []; -const reservationItems = snapshot?.reservations ?? []; const usageItems = usagePages.flatMap(items); const ledgerItems = snapshot?.ledger ?? []; -const canManage = Boolean((access?.roles ?? access?.access?.roles ?? []).some((role: string) => ['team_owner', 'project_lead'].includes(role))); const csrfToken = ensureCsrfToken(Astro); -const providerRequests = items(requestPage); const memberships = items(membershipPage); -const providerAlerts=providerStatuses.flatMap((status:any)=>Array.isArray(status?.alerts)?status.alerts:[]); -const object = (value: unknown) => value && typeof value === 'object' && !Array.isArray(value) ? value as Record : {}; -const number = (...values: unknown[]) => values.map(Number).find(Number.isFinite) ?? 0; -const fleet = (snapshot?.providers ?? []).map((provider: any) => { - const native = object(provider.nativeCapacity ?? provider.capacity ?? provider.supply); const budget = object(provider.budget ?? native.budget); - const membership = memberships.find((entry: any) => String(entry.providerId) === String(provider.providerId)); - const concurrency = number(native.maxConcurrentRunners, provider.maxConcurrentRunners, object(membership?.supplyOffer).maxConcurrentRunners, 1); - return { id: String(provider.providerId ?? provider.id), name: text(provider.providerName, provider.displayName, provider.providerId, 'Capacity provider'), - providerClass: String(object(provider.metadata).providerClass ?? object(membership?.metadata).providerClass ?? 'agent'), status: String(provider.status ?? 'unknown'), - owner: object(membership?.metadata).ownerType === 'team' ? 'team owned' : 'approved provider', assignments: number(provider.activeAssignmentCount), - capabilities: Array.isArray(provider.capabilitySummary) ? provider.capabilitySummary.map(String) : Array.isArray(provider.capabilities) ? provider.capabilities.map(String) : [], - updatedAt: provider.updatedAt ?? provider.lastHeartbeatAt ?? null, - meters: [ - { label: 'Runner lanes', used: number(provider.activeAssignmentCount), reserved: number(provider.reservedAssignmentCount), total: concurrency, unit: '' }, - ...(number(budget.inputTokens, native.inputTokens) ? [{ label: 'Input tokens', used: number(provider.usedInputTokens), reserved: number(provider.reservedInputTokens), total: number(budget.inputTokens, native.inputTokens), tone: 'violet' as const }] : []), - ...(number(budget.usd, native.usd) ? [{ label: 'Cost', used: number(provider.usedUsd), reserved: number(provider.reservedUsd), total: number(budget.usd, native.usd), unit: ' USD', tone: 'amber' as const }] : []), - ], - }; -}); +import OperationalList from '@treeseed/ui/components/astro/surface/OperationalList.astro'; +import Panel from '@treeseed/ui/components/astro/surface/Panel.astro'; +import PageHeader from '@treeseed/ui/components/astro/layout/PageHeader.astro'; +import Button from '@treeseed/ui/components/astro/forms/Button.astro'; +import Timestamp from '@treeseed/ui/components/astro/data/Timestamp.astro'; +import ManagementWizard from '@treeseed/ui/components/astro/navigation/ManagementWizard.astro'; +import {ApiClientFacade} from '../../../lib/market/api-client'; +import {loadAppContext} from '../../../view-models/app-access'; +import {capacityRows} from '../../../view-models/capacity-list'; +import {items} from '../../../lib/operations/records'; +import {ensureCsrfToken} from '../../../lib/auth/support/csrf'; +if(!Astro.locals.auth?.principal)return Astro.redirect('/auth/sign-in'); +const context=await loadAppContext(Astro),team=context.activeTeam,api=new ApiClientFacade(Astro); +const base='/v1/teams/'+encodeURIComponent(team?.id??''); +let providers:any[]=[],sessions:any[]=[],requests:any[]=[],unavailable=false; +if(team)try{const results=await Promise.all(['capacity-providers','capacity/availability-sessions','capacity-provider-requests'].map(path=>api.request('GET',base+'/'+path+'?limit=100')));[providers,sessions,requests]=results.map(items);}catch{unavailable=true;} +const rows=capacityRows(providers,sessions,requests),selected=providers.find(p=>p.providerId===Astro.url.searchParams.get('provider')),request=requests.find(r=>r.id===Astro.url.searchParams.get('request')); +const selectedRow=selected&&rows.find(r=>r.id===selected.providerId); +const latest=selected&&sessions.filter(s=>s.providerId===selected.providerId).sort((a,b)=>Date.parse(b.refreshedAt)-Date.parse(a.refreshedAt))[0]; +const preferences=await api.accountPreferences().catch(()=>({timeZone:'UTC'})); +const csrfToken=ensureCsrfToken(Astro),canManage=Boolean(team?.roles?.some((r:string)=>['team_owner','project_lead'].includes(r))||['team_owner','project_lead'].includes(team?.currentUserRole)); +let status:any=null,profiles:any[]=[],detailUnavailable=false; +if(selected)try{[status,profiles]=await Promise.all([api.request('GET',base+'/capacity-providers/'+encodeURIComponent(selected.providerId)+'/status'),api.request('GET',base+'/capacity-providers/'+encodeURIComponent(selected.providerId)+'/environment-profiles').then(items)]);}catch{detailUnavailable=true;} --- - - + +
+ +{selected||request?:canManage&&} + +{!team?

Choose a team to see its providers.

:selected? +
+ +
Connection
{selectedRow?.status}
Accepting work
{selectedRow?.description}
Last contact
{latest?.refreshedAt?:'Unknown'}
Identity
{selected.providerId}
Team approval
{selected.status}
+{detailUnavailable&&

Detailed health or environment profiles could not be loaded. No permissions have been inferred.

} +{(status?.alerts??[]).map((alert:any)=>

{alert.message??alert.code}

)} +
+
+ + +{canManage&&} +
:request? +
Status
{request.status}
Identity
{request.providerId}
+
Offered capabilities ({request.capabilitySummary?.length??0})
    {(request.capabilitySummary??[]).map((cap:string)=>
  • {cap}
  • )}
+{canManage&&request.status==='pending'&&
{['approve','reject'].map(action=>
{action==='reject'&&}
)}
} +
:} +
+ diff --git a/src/pages/app/capacity/registration.astro b/src/pages/app/capacity/registration.astro new file mode 100644 index 00000000..d963f49a --- /dev/null +++ b/src/pages/app/capacity/registration.astro @@ -0,0 +1,45 @@ +--- +import TreeseedAppLayout from '../../../layouts/AppLayout.astro'; +import Panel from '@treeseed/ui/components/astro/surface/Panel.astro'; +import Button from '@treeseed/ui/components/astro/forms/Button.astro'; +import {loadAppContext} from '../../../view-models/app-access'; +import {ensureCsrfToken} from '../../../lib/auth/support/csrf'; +if(!Astro.locals.auth?.principal)return Astro.redirect('/auth/sign-in'); +const context=await loadAppContext(Astro),team=context.activeTeam,csrfToken=ensureCsrfToken(Astro); +Astro.response.headers.set('Cache-Control','private, no-store'); +--- + +
+ +

Install TreeSeed on your machine and supply this team's code. It requests a connection; you must still approve the provider before it can work.

+{team?
+ + +
+

Rotation immediately invalidates the old code and unused installation files. Already-approved providers stay connected.

+

+
:

Choose a team first.

} +
+
+
+
+ + diff --git a/src/routes.ts b/src/routes.ts index c5c077e2..dc1d74de 100644 --- a/src/routes.ts +++ b/src/routes.ts @@ -73,7 +73,10 @@ export const ADMIN_ROUTES: readonly SiteRouteContribution[] = validateRouteCapab adminRoute('/app/projects/[projectId]/agents/[agentId]', 'pages/app/projects/[projectId]/agents/[agentId].astro', { id: 'admin.projects.agent-studio', description: 'Read-only Agent Studio with execution and TreeDX trace evidence.', guarantees: ['guarantee.work.command.inspect-assignment.034'] }), adminRoute('/app/projects/[projectId]/books', 'pages/app/projects/[projectId]/books/index.astro', { id: 'admin.knowledge.project-books', description: 'Project-scoped repository-native book management.', guarantees: ['guarantee.project.book.create-book.065', 'guarantee.project.book.edit-book.066', 'guarantee.project.book.delete-book.067', 'guarantee.project.book.search-books.068'], knowledgePageIds: ['knowledge.authoring'] }), adminRoute('/app/projects/[projectId]/workflows', 'pages/app/projects/[projectId]/workflows.astro', { id: 'admin.projects.workflows', description: 'Project repository binding, remote workflow operation, secret, and variable administration.', guarantees: [], knowledgePageIds: ['services.workflow-execution', 'services.workflow-configuration'] }), - adminRoute('/app/capacity', 'pages/app/capacity/index.astro', { id: 'admin.domain.capacity', description: 'Provider availability, reservations, usage, routing, and ledger.', guarantees: ['guarantee.work.command.monitor-team-operations.033'] }), + adminRoute('/app/capacity', 'pages/app/capacity/index.astro', { id: 'admin.domain.capacity', description: 'Provider list, health and pending approval.', guarantees: ['guarantee.work.command.monitor-team-operations.033'] }), + adminRoute('/app/capacity/registration', 'pages/app/capacity/registration.astro', { id: 'admin.capacity.registration', description: 'Team provider registration code and installation.' }), + adminRoute('/app/ai', 'pages/app/ai/index.astro', { id: 'admin.domain.ai', description: 'Team inference and training instances.' }), + adminRoute('/app/ai/new', 'pages/app/ai/new.astro', { id: 'admin.ai.setup', description: 'Connection-backed AI instance setup.' }), adminRoute('/app/chat', 'pages/app/chat/index.astro', { id: 'admin.workspace.chat', description: 'Persistent team and agent correspondence workspace.' }), adminRoute('/app/work', 'pages/app/work/index.astro', { id: 'admin.agent-lab.monitor', description: 'Team Agent Lab monitoring foundation and workday control.', guarantees: ['guarantee.work.command.monitor-team-operations.033', 'guarantee.work.agent-lab.monitor-agent-lab.035'] }), adminRoute('/app/work/inbox', 'pages/app/work/inbox/index.astro', { id: 'admin.agent-lab.inbox', description: 'Agent Lab proposals and operational errors.' }), diff --git a/src/view-models/capacity-list.ts b/src/view-models/capacity-list.ts new file mode 100644 index 00000000..b7890d60 --- /dev/null +++ b/src/view-models/capacity-list.ts @@ -0,0 +1,11 @@ +export function capacityRows(providers:any[],sessions:any[],requests:any[],now=Date.now()) { +const rows=providers.map(provider=>{ +const session=sessions.filter(item=>item.providerId===provider.providerId).sort((a,b)=>Date.parse(b.refreshedAt??b.openedAt)-Date.parse(a.refreshedAt??a.openedAt))[0]; +const online=session?.status==='active'&&Date.parse(session.expiresAt)>now; +const status=provider.status!=='approved'?provider.status:!session?'Unknown':online?'Online':'Offline'; +return {id:provider.providerId,name:provider.teamAlias??provider.displayName??'Capacity provider',status, +description:online?`${session.snapshot?.availableWorkers??'Unknown'} workers available · ${session.snapshot?.activeAssignmentIds?.length??'Unknown'} running assignments`:session?'Availability expired. This provider cannot accept new work.':'No availability report received.', +href:`/app/capacity?provider=${encodeURIComponent(provider.providerId)}`,meta:provider.providerId}; +}); +return [...requests.filter(request=>request.status==='pending').map(request=>({id:request.id,name:request.displayName??'New provider request',status:'Pending approval',description:'Review this identity and its offered capabilities before approving.',href:`/app/capacity?request=${encodeURIComponent(request.id)}`,meta:request.providerId})),...rows]; +} diff --git a/tests/contract/team-management/capacity-ai-workspaces.test.ts b/tests/contract/team-management/capacity-ai-workspaces.test.ts new file mode 100644 index 00000000..78de690b --- /dev/null +++ b/tests/contract/team-management/capacity-ai-workspaces.test.ts @@ -0,0 +1,15 @@ +import {readFileSync} from 'node:fs'; +import {expect,it} from 'vitest'; +const read=(path:string)=>readFileSync('src/'+path,'utf8'); +it('uses authoritative provider inventory rather than retired memberships or the command dashboard',()=>{ +const page=read('pages/app/capacity/index.astro'); +expect(page).toContain("'capacity-providers'");expect(page).not.toContain('capacity-provider-memberships');expect(page).not.toContain('loadCommandSnapshot'); +expect(page).toContain('OperationalList');expect(page).toContain("['Overview','Permissions','Activity'"); +}); +it('reveals registration codes only after explicit action and sends mutation protections',()=>{ +const page=read('pages/app/capacity/registration.astro'); +expect(page).toContain("'private, no-store'");expect(page).toContain("'If-Match'");expect(page).toContain("'Idempotency-Key'");expect(page).toContain("'x-treeseed-csrf'");expect(page).not.toContain('localStorage'); +}); +it('reuses the UI wizard and keeps unpaid setup separate from cloud activation',()=>{ +const page=read('pages/app/ai/new.astro');expect(page).toContain('ManagementWizard');expect(page).toContain("'services.connections.list'");expect(page).toContain('Create instance · not available yet');expect(page).toContain('data-ai-review'); +}); diff --git a/tests/unit/capacity-list.test.ts b/tests/unit/capacity-list.test.ts new file mode 100644 index 00000000..ab432fa0 --- /dev/null +++ b/tests/unit/capacity-list.test.ts @@ -0,0 +1,18 @@ +import {expect,it} from 'vitest'; +import {capacityRows} from '../../src/view-models/capacity-list'; +const provider={providerId:'p',status:'approved'}; +it('does not count approval as a live provider',()=>{ +expect(capacityRows([provider],[],[])[0].status).toBe('Unknown'); +expect(capacityRows([provider],[{providerId:'p',status:'expired',expiresAt:'2020-01-01'}],[])[0].status).toBe('Offline'); +}); +it('requires a fresh active report and uses the actual reported worker counts',()=>{ +const rows=capacityRows([provider],[{providerId:'p',status:'active',expiresAt:'2030-01-01',snapshot:{availableWorkers:2,activeAssignmentIds:['a']}}],[],0); +expect(rows[0].status).toBe('Online');expect(rows[0].description).toContain('2 workers available · 1 running'); +}); +it('shows only pending requests, alongside memberships rather than duplicate sessions',()=>{ +const rows=capacityRows([provider],[],[{id:'a',status:'approved'},{id:'b',status:'pending'}]); +expect(rows).toHaveLength(2);expect(rows[0].status).toBe('Pending approval'); +}); +it('does not report a suspended provider as online',()=>{ +expect(capacityRows([{...provider,status:'suspended'}],[{providerId:'p',status:'active',expiresAt:'2030-01-01'}],[],0)[0].status).toBe('suspended'); +}); From 9d7f16485f30ca939ec32f6de81a5a0ad3ce1f9b Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Sun, 6 Sep 2026 22:32:34 -0400 Subject: [PATCH 291/315] fix(capacity): complete inventory and expose scoped grant state (#96) --- src/lib/operations/cursor-items.ts | 16 ++++++++++++++++ src/pages/app/capacity/index.astro | 19 ++++++++++++++----- src/view-models/capacity-list.ts | 6 +++--- src/view-models/provider-permissions.ts | 14 ++++++++++++++ tests/unit/capacity-list.test.ts | 6 ++++++ tests/unit/cursor-items.test.ts | 15 +++++++++++++++ tests/unit/provider-permissions.test.ts | 14 ++++++++++++++ 7 files changed, 82 insertions(+), 8 deletions(-) create mode 100644 src/lib/operations/cursor-items.ts create mode 100644 src/view-models/provider-permissions.ts create mode 100644 tests/unit/cursor-items.test.ts create mode 100644 tests/unit/provider-permissions.test.ts diff --git a/src/lib/operations/cursor-items.ts b/src/lib/operations/cursor-items.ts new file mode 100644 index 00000000..d3d1f89c --- /dev/null +++ b/src/lib/operations/cursor-items.ts @@ -0,0 +1,16 @@ +/** Read complete inventories; never present a truncated or malformed page as an empty fleet. */ +export async function loadCursorItems(api:{request:(method:string,path:string)=>Promise},path:string):Promise { + const rows:any[]=[],seen=new Set();let cursor:string|null=null; + for(let pageIndex=0;pageIndex<100;pageIndex++){ + const separator=path.includes('?')?'&':'?'; + const page=await api.request('GET',path+separator+'limit=100'+(cursor?'&cursor='+encodeURIComponent(cursor):'')); + if(!page||!Array.isArray(page.items)||page.items.some((row:unknown)=>!row||typeof row!=='object'||Array.isArray(row)))throw new Error('Invalid inventory page.'); + rows.push(...page.items); + const next=page.page&&'nextCursor' in page.page?page.page.nextCursor:'nextCursor' in page?page.nextCursor:page.cursor; + const hasMore=page.page?.hasMore; + if(hasMore===false||hasMore!==true&&next===null)return rows; + if(typeof next!=='string'||!next||seen.has(next))throw new Error('Invalid inventory cursor.'); + seen.add(next);cursor=next; + } + throw new Error('Inventory pagination limit exceeded.'); +} diff --git a/src/pages/app/capacity/index.astro b/src/pages/app/capacity/index.astro index 591d5dd1..3cdf73a4 100644 --- a/src/pages/app/capacity/index.astro +++ b/src/pages/app/capacity/index.astro @@ -10,19 +10,24 @@ import {ApiClientFacade} from '../../../lib/market/api-client'; import {loadAppContext} from '../../../view-models/app-access'; import {capacityRows} from '../../../view-models/capacity-list'; import {items} from '../../../lib/operations/records'; +import {loadCursorItems} from '../../../lib/operations/cursor-items'; +import {providerPermissions} from '../../../view-models/provider-permissions'; import {ensureCsrfToken} from '../../../lib/auth/support/csrf'; if(!Astro.locals.auth?.principal)return Astro.redirect('/auth/sign-in'); const context=await loadAppContext(Astro),team=context.activeTeam,api=new ApiClientFacade(Astro); const base='/v1/teams/'+encodeURIComponent(team?.id??''); let providers:any[]=[],sessions:any[]=[],requests:any[]=[],unavailable=false; -if(team)try{const results=await Promise.all(['capacity-providers','capacity/availability-sessions','capacity-provider-requests'].map(path=>api.request('GET',base+'/'+path+'?limit=100')));[providers,sessions,requests]=results.map(items);}catch{unavailable=true;} -const rows=capacityRows(providers,sessions,requests),selected=providers.find(p=>p.providerId===Astro.url.searchParams.get('provider')),request=requests.find(r=>r.id===Astro.url.searchParams.get('request')); +if(team)try{[providers,sessions,requests]=await Promise.all(['capacity-providers','capacity/availability-sessions','capacity-provider-requests'].map(path=>loadCursorItems(api,base+'/'+path)));}catch{unavailable=true;} +const health=Object.fromEntries(await Promise.all(providers.map(async provider=>[provider.providerId,await api.request('GET',base+'/capacity-providers/'+encodeURIComponent(provider.providerId)+'/status').catch(()=>null)]))); +const rows=capacityRows(providers,sessions,requests,Date.now(),health),selected=providers.find(p=>p.providerId===Astro.url.searchParams.get('provider')),request=requests.find(r=>r.id===Astro.url.searchParams.get('request')); const selectedRow=selected&&rows.find(r=>r.id===selected.providerId); const latest=selected&&sessions.filter(s=>s.providerId===selected.providerId).sort((a,b)=>Date.parse(b.refreshedAt)-Date.parse(a.refreshedAt))[0]; const preferences=await api.accountPreferences().catch(()=>({timeZone:'UTC'})); const csrfToken=ensureCsrfToken(Astro),canManage=Boolean(team?.roles?.some((r:string)=>['team_owner','project_lead'].includes(r))||['team_owner','project_lead'].includes(team?.currentUserRole)); -let status:any=null,profiles:any[]=[],detailUnavailable=false; -if(selected)try{[status,profiles]=await Promise.all([api.request('GET',base+'/capacity-providers/'+encodeURIComponent(selected.providerId)+'/status'),api.request('GET',base+'/capacity-providers/'+encodeURIComponent(selected.providerId)+'/environment-profiles').then(items)]);}catch{detailUnavailable=true;} +let status:any=selected?health[selected.providerId]:null,profiles:any[]=[],detailUnavailable=false; +if(selected)try{profiles=await loadCursorItems(api,base+'/capacity-providers/'+encodeURIComponent(selected.providerId)+'/environment-profiles');detailUnavailable=!status;}catch{detailUnavailable=true;} +let permissionState:any=null,permissionUnavailable=false; +if(selected)try{permissionState=await providerPermissions(api,team.id,selected.providerId);}catch{permissionUnavailable=true;} ---
@@ -40,7 +45,11 @@ if(selected)try{[status,profiles]=await Promise.all([api.request('GET',base+'/ca {canManage&&} diff --git a/src/view-models/capacity-list.ts b/src/view-models/capacity-list.ts index b7890d60..ebf52c1b 100644 --- a/src/view-models/capacity-list.ts +++ b/src/view-models/capacity-list.ts @@ -1,10 +1,10 @@ -export function capacityRows(providers:any[],sessions:any[],requests:any[],now=Date.now()) { +export function capacityRows(providers:any[],sessions:any[],requests:any[],now=Date.now(),health?:Record) { const rows=providers.map(provider=>{ const session=sessions.filter(item=>item.providerId===provider.providerId).sort((a,b)=>Date.parse(b.refreshedAt??b.openedAt)-Date.parse(a.refreshedAt??a.openedAt))[0]; const online=session?.status==='active'&&Date.parse(session.expiresAt)>now; -const status=provider.status!=='approved'?provider.status:!session?'Unknown':online?'Online':'Offline'; +const status=provider.status!=='approved'?provider.status:!session?'Unknown':!online?'Offline':health&&health[provider.providerId]==null?'Unknown':health&&health[provider.providerId].healthy!==true?'Needs attention':'Online'; return {id:provider.providerId,name:provider.teamAlias??provider.displayName??'Capacity provider',status, -description:online?`${session.snapshot?.availableWorkers??'Unknown'} workers available · ${session.snapshot?.activeAssignmentIds?.length??'Unknown'} running assignments`:session?'Availability expired. This provider cannot accept new work.':'No availability report received.', +description:provider.status!=='approved'?'This connection is not approved to accept work.':status==='Unknown'?'Current health could not be verified.':status==='Needs attention'?'Connected, but execution readiness checks are not passing.':online?`${session.snapshot?.availableWorkers??'Unknown'} workers available · ${session.snapshot?.activeAssignmentIds?.length??'Unknown'} running assignments`:session?'Availability expired. This provider cannot accept new work.':'No availability report received.', href:`/app/capacity?provider=${encodeURIComponent(provider.providerId)}`,meta:provider.providerId}; }); return [...requests.filter(request=>request.status==='pending').map(request=>({id:request.id,name:request.displayName??'New provider request',status:'Pending approval',description:'Review this identity and its offered capabilities before approving.',href:`/app/capacity?request=${encodeURIComponent(request.id)}`,meta:request.providerId})),...rows]; diff --git a/src/view-models/provider-permissions.ts b/src/view-models/provider-permissions.ts new file mode 100644 index 00000000..7df5e87b --- /dev/null +++ b/src/view-models/provider-permissions.ts @@ -0,0 +1,14 @@ +import {loadCursorItems} from '../lib/operations/cursor-items'; +/** Descriptor-only projection. Never reads provider-local variable values. */ +export async function providerPermissions(api:{request:(method:string,path:string)=>Promise},teamId:string,providerId:string){ + const base='/v1/teams/'+encodeURIComponent(teamId); + const assignments=(await loadCursorItems(api,base+'/capacity/assignments')).filter(assignment=>assignment.capacityProviderId===providerId); + const grants=[]; + for(const assignment of assignments){ + try{const grant=await api.request('GET',base+'/assignments/'+encodeURIComponent(assignment.id)+'/environment-grant'); + if(grant.providerId!==providerId||grant.teamId!==teamId||grant.assignmentId!==assignment.id)throw new Error('Environment grant scope mismatch.'); + grants.push({assignment,grant}); + }catch(error){if(Number((error as any)?.status)!==404)throw error;} + } + return {assignments,grants}; +} diff --git a/tests/unit/capacity-list.test.ts b/tests/unit/capacity-list.test.ts index ab432fa0..c81c1d35 100644 --- a/tests/unit/capacity-list.test.ts +++ b/tests/unit/capacity-list.test.ts @@ -16,3 +16,9 @@ expect(rows).toHaveLength(2);expect(rows[0].status).toBe('Pending approval'); it('does not report a suspended provider as online',()=>{ expect(capacityRows([{...provider,status:'suspended'}],[{providerId:'p',status:'active',expiresAt:'2030-01-01'}],[],0)[0].status).toBe('suspended'); }); +it('requires authoritative execution readiness in addition to a fresh heartbeat',()=>{ + const sessions=[{providerId:'p',status:'active',expiresAt:'2030-01-01'}]; + expect(capacityRows([provider],sessions,[],0,{p:{healthy:false}})[0].status).toBe('Needs attention'); + expect(capacityRows([provider],sessions,[],0,{p:null})[0].status).toBe('Unknown'); + expect(capacityRows([provider],sessions,[],0,{p:{healthy:true}})[0].status).toBe('Online'); +}); diff --git a/tests/unit/cursor-items.test.ts b/tests/unit/cursor-items.test.ts new file mode 100644 index 00000000..5d4e8d5e --- /dev/null +++ b/tests/unit/cursor-items.test.ts @@ -0,0 +1,15 @@ +import {expect,it,vi} from 'vitest'; +import {loadCursorItems} from '../../src/lib/operations/cursor-items'; +it('reads every page and encodes cursor values',async()=>{ + const request=vi.fn().mockResolvedValueOnce({items:[{id:1}],page:{hasMore:true,nextCursor:'a+b'}}).mockResolvedValueOnce({items:[{id:2}],page:{hasMore:false,nextCursor:null}}); + expect(await loadCursorItems({request},'/inventory')).toEqual([{id:1},{id:2}]);expect(request.mock.calls[1][1]).toContain('a%2Bb'); +}); +it.each([{items:[]},{items:[null],cursor:null},{items:[],page:{hasMore:true,nextCursor:null}}])('rejects incomplete inventory metadata',async page=>{ + await expect(loadCursorItems({request:vi.fn(async()=>page)},'/inventory')).rejects.toThrow(); +}); +it('rejects cursor loops rather than returning duplicate rows',async()=>{ + await expect(loadCursorItems({request:vi.fn(async()=>({items:[],cursor:'repeat'}))},'/inventory')).rejects.toThrow('cursor'); +}); +it.each([{items:[],nextCursor:null},{items:[],cursor:null}])('accepts an explicitly terminated cursor page',async page=>{ + expect(await loadCursorItems({request:vi.fn(async()=>page)},'/inventory')).toEqual([]); +}); diff --git a/tests/unit/provider-permissions.test.ts b/tests/unit/provider-permissions.test.ts new file mode 100644 index 00000000..5628c23c --- /dev/null +++ b/tests/unit/provider-permissions.test.ts @@ -0,0 +1,14 @@ +import {expect,it,vi} from 'vitest'; +import {providerPermissions} from '../../src/view-models/provider-permissions'; +it('only reads grants for the selected provider and preserves missing grants',async()=>{ + const request=vi.fn().mockResolvedValueOnce({items:[{id:'a',capacityProviderId:'p'},{id:'b',capacityProviderId:'other'}],cursor:null}).mockRejectedValueOnce({status:404}); + expect(await providerPermissions({request},'t','p')).toMatchObject({grants:[],assignments:[{id:'a'}]});expect(request).toHaveBeenCalledTimes(2); +}); +it('does not turn permission/service failures into an empty grant list',async()=>{ + const request=vi.fn().mockResolvedValueOnce({items:[{id:'a',capacityProviderId:'p'}],cursor:null}).mockRejectedValueOnce({status:403}); + await expect(providerPermissions({request},'t','p')).rejects.toMatchObject({status:403}); +}); +it('rejects a grant for another team or provider',async()=>{ + const request=vi.fn().mockResolvedValueOnce({items:[{id:'a',capacityProviderId:'p'}],cursor:null}).mockResolvedValueOnce({teamId:'other',providerId:'p',assignmentId:'a'}); + await expect(providerPermissions({request},'t','p')).rejects.toThrow('scope mismatch'); +}); From dfc7e4af00b3b726e07da33d30579ddac75463ac Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Sun, 6 Sep 2026 23:08:20 -0400 Subject: [PATCH 292/315] feat: save and manage AI drafts through the live API (#96) --- src/pages/app/ai/index.astro | 9 +++-- src/pages/app/ai/new.astro | 33 +++++++++++++++---- .../capacity-ai-workspaces.test.ts | 2 +- 3 files changed, 31 insertions(+), 13 deletions(-) diff --git a/src/pages/app/ai/index.astro b/src/pages/app/ai/index.astro index df165017..a168e1fd 100644 --- a/src/pages/app/ai/index.astro +++ b/src/pages/app/ai/index.astro @@ -1,21 +1,20 @@ --- import TreeseedAppLayout from '../../../layouts/AppLayout.astro'; -import { AI_HOSTING_TARGETS } from '@treeseed/sdk/deployment'; import AiDeploymentWorkspace from '@treeseed/ui/components/astro/capacity/AiDeploymentWorkspace.astro'; import { ApiClientFacade } from '../../../lib/market/api-client'; -import { loadServiceItems } from '../../../lib/services/collections'; +import {loadCursorItems} from '../../../lib/operations/cursor-items'; import { loadAppContext } from '../../../view-models/app-access'; if (!Astro.locals.auth?.principal) return Astro.redirect('/auth/sign-in?returnTo=%2Fapp%2Fai'); const context = await loadAppContext(Astro), team = context.activeTeam; const api = new ApiClientFacade(Astro); -let connections:any[] = [], unavailable = false; +let instances:any[] = [], unavailable = false; if (team) { - try { connections = (await loadServiceItems(api,'services.connections.list',{teamId:team.id})).filter((connection:any)=>connection.providerId==='hyperstack'&&connection.status!=='disconnected'); } + try { instances = await loadCursorItems(api,'/v1/teams/'+encodeURIComponent(team.id)+'/ai-instances'); } catch { unavailable = true; } } const roles = new Set(['team_owner','project_lead','service_admin']); const canManage = Boolean(team?.roles?.some((role:string)=>roles.has(role)) || team?.currentUserRole&&roles.has(team.currentUserRole)); --- - + diff --git a/src/pages/app/ai/new.astro b/src/pages/app/ai/new.astro index f9a3e2b9..c781f131 100644 --- a/src/pages/app/ai/new.astro +++ b/src/pages/app/ai/new.astro @@ -1,4 +1,7 @@ --- +import {randomUUID} from 'node:crypto'; +import {ensureCsrfToken} from '../../../lib/auth/support/csrf'; +import {items} from '../../../lib/operations/records'; import TreeseedAppLayout from '../../../layouts/AppLayout.astro'; import ManagementWizard from '@treeseed/ui/components/astro/navigation/ManagementWizard.astro'; import Panel from '@treeseed/ui/components/astro/surface/Panel.astro'; @@ -8,31 +11,47 @@ import {loadServiceItems} from '../../../lib/services/collections'; import {loadAppContext} from '../../../view-models/app-access'; if(!Astro.locals.auth?.principal)return Astro.redirect('/auth/sign-in'); const context=await loadAppContext(Astro),team=context.activeTeam,api=new ApiClientFacade(Astro); -let services:any[]=[],unavailable=false; +const managementRoles=new Set(['team_owner','project_lead','service_admin']); +const canManage=Boolean(team?.roles?.some((role:string)=>managementRoles.has(role))||managementRoles.has(team?.currentUserRole)); +if(team&&!canManage)return Astro.redirect('/app/ai'); +let services:any[]=[],projects:any[]=[],existing:any=null,unavailable=false; +const requestedId=Astro.url.searchParams.get('instance'),instanceId=requestedId??randomUUID(),csrfToken=ensureCsrfToken(Astro); +if(team)try{projects=items(await api.listTeamProjects(team.id));if(requestedId)existing=await api.request('GET','/v1/teams/'+encodeURIComponent(team.id)+'/ai-instances/'+encodeURIComponent(requestedId));}catch{unavailable=true;} if(team)try{services=await loadServiceItems(api,'services.connections.list',{teamId:team.id});}catch{unavailable=true;} const offers=(cap:string)=>services.filter(service=>service.status==='active'&&service.capabilities?.some((binding:any)=>binding.status==='configured'&&binding.capabilityType===cap)); const hosting=services.filter(service=>service.providerId==='hyperstack'&&service.status==='active'&&service.capabilities?.some((binding:any)=>binding.status==='configured'&&['ai-inference-hosting','ai-training-hosting'].includes(binding.capabilityType))); --- -
-{!team?

Choose a team first.

:unavailable?

Connections could not be loaded. Reload before continuing.

: -
+
+{!team?

Choose a team first.

:unavailable?

Connections could not be loaded. Reload before continuing.

: +
- - + +
}