From 698ce546f7f0dda2908c416e22dae6ce57b2a150 Mon Sep 17 00:00:00 2001
From: Rafael Sales
Date: Wed, 24 Jun 2026 06:38:23 -0300
Subject: [PATCH 1/2] feat: implement AWS Glue integration and GlueStudioPanel
---
package.json | 1 +
pnpm-lock.yaml | 208 ++++++-
src/app/page.tsx | 16 +
src/components/diagram/PropertiesPanel.tsx | 13 +-
src/components/layout/UnifiedToolbar.tsx | 10 +-
src/components/ministack/GlueStudioPanel.tsx | 197 +++++++
.../ministack/MiniConsoleDialog.tsx | 2 +
src/components/ministack/glue/CatalogTab.tsx | 133 +++++
src/components/ministack/glue/JobsTab.tsx | 212 ++++++++
.../ministack/glue/PySparkEditor.tsx | 143 +++++
src/components/ministack/glue/RunsTab.tsx | 238 ++++++++
src/components/ministack/glue/TablesTab.tsx | 218 ++++++++
src/lib/ministack/browser-actions.ts | 10 +-
src/lib/ministack/client.ts | 4 +
src/lib/ministack/glue-actions.ts | 508 ++++++++++++++++++
src/lib/ministack/service-map.ts | 5 +-
src/lib/store.ts | 60 +++
17 files changed, 1960 insertions(+), 18 deletions(-)
create mode 100644 src/components/ministack/GlueStudioPanel.tsx
create mode 100644 src/components/ministack/glue/CatalogTab.tsx
create mode 100644 src/components/ministack/glue/JobsTab.tsx
create mode 100644 src/components/ministack/glue/PySparkEditor.tsx
create mode 100644 src/components/ministack/glue/RunsTab.tsx
create mode 100644 src/components/ministack/glue/TablesTab.tsx
create mode 100644 src/lib/ministack/glue-actions.ts
diff --git a/package.json b/package.json
index e2ef192..a78811e 100644
--- a/package.json
+++ b/package.json
@@ -38,6 +38,7 @@
"@aws-sdk/client-elastic-load-balancing-v2": "^3.1073.0",
"@aws-sdk/client-elasticache": "^3.1073.0",
"@aws-sdk/client-eventbridge": "^3.1073.0",
+ "@aws-sdk/client-glue": "^3.1075.0",
"@aws-sdk/client-iam": "^3.1073.0",
"@aws-sdk/client-kinesis": "^3.1073.0",
"@aws-sdk/client-kms": "^3.1073.0",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 924bb70..110eb54 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -47,6 +47,9 @@ importers:
'@aws-sdk/client-eventbridge':
specifier: ^3.1073.0
version: 3.1073.0
+ '@aws-sdk/client-glue':
+ specifier: ^3.1075.0
+ version: 3.1075.0
'@aws-sdk/client-iam':
specifier: ^3.1073.0
version: 3.1073.0
@@ -368,6 +371,10 @@ packages:
resolution: {integrity: sha512-h37GDGdaWifY7MxGDdgN9byhMZ6qqwxZ8KuE6/l/NYeFYv7LsXXa3FJp/EruiH+U78EQdOFYbfyO/mMxCZJewQ==}
engines: {node: '>=20.0.0'}
+ '@aws-sdk/client-glue@3.1075.0':
+ resolution: {integrity: sha512-10849e8XW/iMgvGjo8EIsisFWetzMzgUuDl42Gdu64AtVNfRU0WSEvRxMyzBkaM1xy7czgs7s5d7BvB25RXB4A==}
+ engines: {node: '>=20.0.0'}
+
'@aws-sdk/client-iam@3.1073.0':
resolution: {integrity: sha512-TEovDL6IPOiThcSWj0xVJe0Mffc06xFD1xEry+kAREra0d8ArxGFnYeCRBOxQkGpw0H3z0T8STWxw73ibkm/Mw==}
engines: {node: '>=20.0.0'}
@@ -432,38 +439,74 @@ packages:
resolution: {integrity: sha512-YofH63shc6YRdXjz80BJkpJW+Bkn0Cuu2dn4Rv7s9G2Idt58tgtzQEWxrR2xVljlVfIBeUjPuULnSVYLke3sUQ==}
engines: {node: '>=20.0.0'}
+ '@aws-sdk/core@3.974.23':
+ resolution: {integrity: sha512-MiWR/uWjxjFXGzrE0Ghc5lWxUxzHsUWFhV+OX7M4cR9SrmrnZs6TXavnCWnzzdwJeFri34xQo81rvGNzK3c4BQ==}
+ engines: {node: '>=20.0.0'}
+
'@aws-sdk/credential-provider-env@3.972.48':
resolution: {integrity: sha512-h6FEC95fbexUd6zxm4PdgS82bTcI2PRtUb2ZwMipb/Xr8bPwtf0G8rBo2jp7NA24Mbx2JA8/WingiYpA9RCCyw==}
engines: {node: '>=20.0.0'}
+ '@aws-sdk/credential-provider-env@3.972.49':
+ resolution: {integrity: sha512-liB3yQNHCM9k/gu/w36XHMKPluT7HTlnGUhRbBGSISDQkcr/Sy1zsZabiuvQj8WG5yW573u9RehrBvvnIQ9OEQ==}
+ engines: {node: '>=20.0.0'}
+
'@aws-sdk/credential-provider-http@3.972.50':
resolution: {integrity: sha512-lJO3OLpjvz5m/RSBQmsG/CEUGsvCy5ruxKwPQaOCqxqCMuyYT2BZwQUTDZVVwqQ9LrZKuK24JSa6r31hL/tvkg==}
engines: {node: '>=20.0.0'}
+ '@aws-sdk/credential-provider-http@3.972.51':
+ resolution: {integrity: sha512-XET0H2oofciJ5lMRWNIvRjAP7Q3wv2XT+JtJJEdhPWUMwe3TvQ9qcxonpu7vXmNngncvFpi4E2It+Tamas/naA==}
+ engines: {node: '>=20.0.0'}
+
'@aws-sdk/credential-provider-ini@3.972.55':
resolution: {integrity: sha512-TBoF4buBGYhXjdZAryayY2TrkQj2B2KfE/msG4V53XCt+w0EhEwM2JRjx8p2grJ2C6gtH5++SAwEvGMRdi0yyw==}
engines: {node: '>=20.0.0'}
+ '@aws-sdk/credential-provider-ini@3.972.56':
+ resolution: {integrity: sha512-IAmc61hbgQiHht9U3x0tnRwz0lzdwOwD/i9voRgdJrKamF+JtmrBOsW9GwB7mfFonNWOWL4qARWYrF8veEMe3w==}
+ engines: {node: '>=20.0.0'}
+
'@aws-sdk/credential-provider-login@3.972.54':
resolution: {integrity: sha512-hBWI3wZTdTGiuMfmPts6AWbAjFfRniOQnqx68tc2cQvRKWawFbN9wkLOVPWM1FAOyowZU73mC6Fi+rHSHNyLFw==}
engines: {node: '>=20.0.0'}
+ '@aws-sdk/credential-provider-login@3.972.55':
+ resolution: {integrity: sha512-hBBkANo3cDn+h2qxxzER4a+J8JCO9o9Z/YYmU7iky6AcaarX5RRdRcHNC6SLdwY0vAXQygn6soUbDqPn3GghaA==}
+ engines: {node: '>=20.0.0'}
+
'@aws-sdk/credential-provider-node@3.972.57':
resolution: {integrity: sha512-u6dClpzNdWf1HGWz4wwhdXi1wiOofCLniM9S4BQQGlLAN9TW7VB+ld5V533GdKrYMaFeBGFqKnj0JCYvynLqwQ==}
engines: {node: '>=20.0.0'}
+ '@aws-sdk/credential-provider-node@3.972.58':
+ resolution: {integrity: sha512-OyCLVmSI7pZO8hxwNVX6pXhTVlJqRBTp+ijdEfJSUj0RyjHnF602OfAarOzGq6wkGodeFkYBt8MmJ6A6ycRgWw==}
+ engines: {node: '>=20.0.0'}
+
'@aws-sdk/credential-provider-process@3.972.48':
resolution: {integrity: sha512-w6VZwojPt12WnEkAUy6Nu4K6sWCbBmR7QX390b0nE6vRvkXbrYr9Lq9VySGkfjiMjpUA87op+J4EgvRmtWIDoQ==}
engines: {node: '>=20.0.0'}
+ '@aws-sdk/credential-provider-process@3.972.49':
+ resolution: {integrity: sha512-C8h36lBuC/RnBSsjlO+dn6xZm3KbAl5vpJaVPAfQnMmz2/OISmKOc8XZcqMQgO2ADwBYNRMM6Kf3vz9G/TulMQ==}
+ engines: {node: '>=20.0.0'}
+
'@aws-sdk/credential-provider-sso@3.972.54':
resolution: {integrity: sha512-23uZpIpF2SIFDCa1fcWa202tK4gGeyvX6GIIAjiB8WBsvsVRBMnJ/7dCxHzxf7eZT7GToJg837LDIBnZsl/VUg==}
engines: {node: '>=20.0.0'}
+ '@aws-sdk/credential-provider-sso@3.972.55':
+ resolution: {integrity: sha512-1FkOz74Ea5QGS9jtIoXp55T/IkSS3spv+nLTT07fRY/+T5xmEOqaYBVIaEmX4zTNvbV6g2lrtlaVKWEoNyJt3w==}
+ engines: {node: '>=20.0.0'}
+
'@aws-sdk/credential-provider-web-identity@3.972.54':
resolution: {integrity: sha512-0Iv5QttS6wcATlodYKgvQj6B9Db51rx7NU9fqu0PoLeS4BIgdYMc/QK4smwLwpm5RFrs02V/eLyEFp3FklvlNQ==}
engines: {node: '>=20.0.0'}
+ '@aws-sdk/credential-provider-web-identity@3.972.55':
+ resolution: {integrity: sha512-g2BoECD1q01kTPByi56+VLVvdWDzMkKIcr77qixpqH0okw2t0U5CoPv+6S8v/D1Y2Wa6QKKtn6XAtDzP+Kfpvg==}
+ engines: {node: '>=20.0.0'}
+
'@aws-sdk/dynamodb-codec@3.973.22':
resolution: {integrity: sha512-QBs7/nWHsPA0wTEqhU5iPgaDjeZzQHhmwJr6Q0f56rW3Fk8ExJQgXFzEg/l48iDwJVUIMLjPqhw7dNP3cShUxA==}
engines: {node: '>=20.0.0'}
@@ -520,6 +563,10 @@ packages:
resolution: {integrity: sha512-4IwtcYSxEIVw5hcp8ogq0CMbFNZFw7jJUetpfFUhFFeqsa1K8j2Ihg2hnxLyOp3stMZnXda6VzOmPi1AFZQXcg==}
engines: {node: '>=20.0.0'}
+ '@aws-sdk/nested-clients@3.997.23':
+ resolution: {integrity: sha512-gO93ZPsI2bxeFZD42f1/qjDw6FAZkNZcKRO94LIiT03fzOmcJ9e/tunxjVjA1Rl69ClmVJzz8H3G9CdKef10PA==}
+ engines: {node: '>=20.0.0'}
+
'@aws-sdk/signature-v4-multi-region@3.996.35':
resolution: {integrity: sha512-6L/VWs+Wch2stHemCGTmUNqKLMzURxQDK5boNG3Jn3kAOp71meDUuS5sbObpEvFxHDq0uWeSLFDNSYsjNt+Dlg==}
engines: {node: '>=20.0.0'}
@@ -532,6 +579,10 @@ packages:
resolution: {integrity: sha512-Tolawuc3I9Q6pElcqoBQMLCiCOfKn3eqG4oNIRci4BurhsrJmzXkhF3N+6LRXJrWYFtJKfTkBuLbYCLr8+pwig==}
engines: {node: '>=20.0.0'}
+ '@aws-sdk/token-providers@3.1074.0':
+ resolution: {integrity: sha512-pv80IzgGW4RnXWtft692chZOM9i6PhebVsLCcnaM4dBEPZva2fE6FXAHs76G7Rc7s3yGyX/68G0nZMrUy+Vmpg==}
+ engines: {node: '>=20.0.0'}
+
'@aws-sdk/types@3.973.13':
resolution: {integrity: sha512-pEHZqRkAlHfnfAU9tK+WpKv/gBNjGJrHMgA3A0iYRGyswBS2t0pfez+lWlwktb3Bqa0ovh7w/QJTFwp3fDxLNg==}
engines: {node: '>=20.0.0'}
@@ -548,6 +599,10 @@ packages:
resolution: {integrity: sha512-StElZPEoBquWwNqw1AcfpzEyZqJvFxouG+mpDNYlcH6ZOrqd2CuIryv+8LV8gNHZUOyKyJF3Dq9vxaXEmDR9TQ==}
engines: {node: '>=20.0.0'}
+ '@aws-sdk/xml-builder@3.972.31':
+ resolution: {integrity: sha512-SzE4Pgyl+hDF+BuyuzxUSpwnuUu9lJuO1YGgteG89/4Qv0+2IQiVQqdbPV32IozLvXWQChPQcdkk/sKvb1QHiQ==}
+ engines: {node: '>=20.0.0'}
+
'@aws/lambda-invoke-store@0.2.4':
resolution: {integrity: sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ==}
engines: {node: '>=18.0.0'}
@@ -1471,10 +1526,6 @@ packages:
resolution: {integrity: sha512-X9rVls3En0z3NtrmguTmpRM0/NqtWUxBjal6fcAkwtsub+gOdLZ6kD+V7xhUgFMGdG14bHbZ7M5QjaRI1+DatQ==}
engines: {node: '>=18.0.0'}
- '@smithy/types@4.14.2':
- resolution: {integrity: sha512-P+otAxbV4CqBybp7EkcJCrig63yE2E7PuNVOmilVMRcx/O+QDzGULTrKsq4DV13gSfak9ObPrWaHl/9bL5YcWw==}
- engines: {node: '>=18.0.0'}
-
'@smithy/types@4.15.0':
resolution: {integrity: sha512-Z5TAOxygoFvybJV3igo5SloFflSokHx2hu1eFA+DxDTcn+FtKxUSui+rbTRG1pAafMA888Z3MVvCWUuvCrTXjg==}
engines: {node: '>=18.0.0'}
@@ -4240,7 +4291,7 @@ snapshots:
'@aws-crypto/crc32c@5.2.0':
dependencies:
'@aws-crypto/util': 5.2.0
- '@aws-sdk/types': 3.973.8
+ '@aws-sdk/types': 3.973.13
tslib: 2.8.1
'@aws-crypto/sha1-browser@5.2.0':
@@ -4257,7 +4308,7 @@ snapshots:
'@aws-crypto/sha256-js': 5.2.0
'@aws-crypto/supports-web-crypto': 5.2.0
'@aws-crypto/util': 5.2.0
- '@aws-sdk/types': 3.973.8
+ '@aws-sdk/types': 3.973.13
'@aws-sdk/util-locate-window': 3.965.5
'@smithy/util-utf8': 2.3.0
tslib: 2.8.1
@@ -4265,7 +4316,7 @@ snapshots:
'@aws-crypto/sha256-js@5.2.0':
dependencies:
'@aws-crypto/util': 5.2.0
- '@aws-sdk/types': 3.973.8
+ '@aws-sdk/types': 3.973.13
tslib: 2.8.1
'@aws-crypto/supports-web-crypto@5.2.0':
@@ -4274,7 +4325,7 @@ snapshots:
'@aws-crypto/util@5.2.0':
dependencies:
- '@aws-sdk/types': 3.973.8
+ '@aws-sdk/types': 3.973.13
'@smithy/util-utf8': 2.3.0
tslib: 2.8.1
@@ -4468,6 +4519,19 @@ snapshots:
'@smithy/types': 4.15.0
tslib: 2.8.1
+ '@aws-sdk/client-glue@3.1075.0':
+ dependencies:
+ '@aws-crypto/sha256-browser': 5.2.0
+ '@aws-crypto/sha256-js': 5.2.0
+ '@aws-sdk/core': 3.974.23
+ '@aws-sdk/credential-provider-node': 3.972.58
+ '@aws-sdk/types': 3.973.13
+ '@smithy/core': 3.25.1
+ '@smithy/fetch-http-handler': 5.5.1
+ '@smithy/node-http-handler': 4.8.1
+ '@smithy/types': 4.15.0
+ tslib: 2.8.1
+
'@aws-sdk/client-iam@3.1073.0':
dependencies:
'@aws-crypto/sha256-browser': 5.2.0
@@ -4680,6 +4744,17 @@ snapshots:
bowser: 2.14.1
tslib: 2.8.1
+ '@aws-sdk/core@3.974.23':
+ dependencies:
+ '@aws-sdk/types': 3.973.13
+ '@aws-sdk/xml-builder': 3.972.31
+ '@aws/lambda-invoke-store': 0.2.4
+ '@smithy/core': 3.25.1
+ '@smithy/signature-v4': 5.5.1
+ '@smithy/types': 4.15.0
+ bowser: 2.14.1
+ tslib: 2.8.1
+
'@aws-sdk/credential-provider-env@3.972.48':
dependencies:
'@aws-sdk/core': 3.974.22
@@ -4688,6 +4763,14 @@ snapshots:
'@smithy/types': 4.15.0
tslib: 2.8.1
+ '@aws-sdk/credential-provider-env@3.972.49':
+ dependencies:
+ '@aws-sdk/core': 3.974.23
+ '@aws-sdk/types': 3.973.13
+ '@smithy/core': 3.25.1
+ '@smithy/types': 4.15.0
+ tslib: 2.8.1
+
'@aws-sdk/credential-provider-http@3.972.50':
dependencies:
'@aws-sdk/core': 3.974.22
@@ -4698,6 +4781,16 @@ snapshots:
'@smithy/types': 4.15.0
tslib: 2.8.1
+ '@aws-sdk/credential-provider-http@3.972.51':
+ dependencies:
+ '@aws-sdk/core': 3.974.23
+ '@aws-sdk/types': 3.973.13
+ '@smithy/core': 3.25.1
+ '@smithy/fetch-http-handler': 5.5.1
+ '@smithy/node-http-handler': 4.8.1
+ '@smithy/types': 4.15.0
+ tslib: 2.8.1
+
'@aws-sdk/credential-provider-ini@3.972.55':
dependencies:
'@aws-sdk/core': 3.974.22
@@ -4714,6 +4807,22 @@ snapshots:
'@smithy/types': 4.15.0
tslib: 2.8.1
+ '@aws-sdk/credential-provider-ini@3.972.56':
+ dependencies:
+ '@aws-sdk/core': 3.974.23
+ '@aws-sdk/credential-provider-env': 3.972.49
+ '@aws-sdk/credential-provider-http': 3.972.51
+ '@aws-sdk/credential-provider-login': 3.972.55
+ '@aws-sdk/credential-provider-process': 3.972.49
+ '@aws-sdk/credential-provider-sso': 3.972.55
+ '@aws-sdk/credential-provider-web-identity': 3.972.55
+ '@aws-sdk/nested-clients': 3.997.23
+ '@aws-sdk/types': 3.973.13
+ '@smithy/core': 3.25.1
+ '@smithy/credential-provider-imds': 4.4.1
+ '@smithy/types': 4.15.0
+ tslib: 2.8.1
+
'@aws-sdk/credential-provider-login@3.972.54':
dependencies:
'@aws-sdk/core': 3.974.22
@@ -4723,6 +4832,15 @@ snapshots:
'@smithy/types': 4.15.0
tslib: 2.8.1
+ '@aws-sdk/credential-provider-login@3.972.55':
+ dependencies:
+ '@aws-sdk/core': 3.974.23
+ '@aws-sdk/nested-clients': 3.997.23
+ '@aws-sdk/types': 3.973.13
+ '@smithy/core': 3.25.1
+ '@smithy/types': 4.15.0
+ tslib: 2.8.1
+
'@aws-sdk/credential-provider-node@3.972.57':
dependencies:
'@aws-sdk/credential-provider-env': 3.972.48
@@ -4737,6 +4855,20 @@ snapshots:
'@smithy/types': 4.15.0
tslib: 2.8.1
+ '@aws-sdk/credential-provider-node@3.972.58':
+ dependencies:
+ '@aws-sdk/credential-provider-env': 3.972.49
+ '@aws-sdk/credential-provider-http': 3.972.51
+ '@aws-sdk/credential-provider-ini': 3.972.56
+ '@aws-sdk/credential-provider-process': 3.972.49
+ '@aws-sdk/credential-provider-sso': 3.972.55
+ '@aws-sdk/credential-provider-web-identity': 3.972.55
+ '@aws-sdk/types': 3.973.13
+ '@smithy/core': 3.25.1
+ '@smithy/credential-provider-imds': 4.4.1
+ '@smithy/types': 4.15.0
+ tslib: 2.8.1
+
'@aws-sdk/credential-provider-process@3.972.48':
dependencies:
'@aws-sdk/core': 3.974.22
@@ -4745,6 +4877,14 @@ snapshots:
'@smithy/types': 4.15.0
tslib: 2.8.1
+ '@aws-sdk/credential-provider-process@3.972.49':
+ dependencies:
+ '@aws-sdk/core': 3.974.23
+ '@aws-sdk/types': 3.973.13
+ '@smithy/core': 3.25.1
+ '@smithy/types': 4.15.0
+ tslib: 2.8.1
+
'@aws-sdk/credential-provider-sso@3.972.54':
dependencies:
'@aws-sdk/core': 3.974.22
@@ -4755,6 +4895,16 @@ snapshots:
'@smithy/types': 4.15.0
tslib: 2.8.1
+ '@aws-sdk/credential-provider-sso@3.972.55':
+ dependencies:
+ '@aws-sdk/core': 3.974.23
+ '@aws-sdk/nested-clients': 3.997.23
+ '@aws-sdk/token-providers': 3.1074.0
+ '@aws-sdk/types': 3.973.13
+ '@smithy/core': 3.25.1
+ '@smithy/types': 4.15.0
+ tslib: 2.8.1
+
'@aws-sdk/credential-provider-web-identity@3.972.54':
dependencies:
'@aws-sdk/core': 3.974.22
@@ -4764,6 +4914,15 @@ snapshots:
'@smithy/types': 4.15.0
tslib: 2.8.1
+ '@aws-sdk/credential-provider-web-identity@3.972.55':
+ dependencies:
+ '@aws-sdk/core': 3.974.23
+ '@aws-sdk/nested-clients': 3.997.23
+ '@aws-sdk/types': 3.973.13
+ '@smithy/core': 3.25.1
+ '@smithy/types': 4.15.0
+ tslib: 2.8.1
+
'@aws-sdk/dynamodb-codec@3.973.22':
dependencies:
'@aws-sdk/core': 3.974.22
@@ -4873,6 +5032,19 @@ snapshots:
'@smithy/types': 4.15.0
tslib: 2.8.1
+ '@aws-sdk/nested-clients@3.997.23':
+ dependencies:
+ '@aws-crypto/sha256-browser': 5.2.0
+ '@aws-crypto/sha256-js': 5.2.0
+ '@aws-sdk/core': 3.974.23
+ '@aws-sdk/signature-v4-multi-region': 3.996.35
+ '@aws-sdk/types': 3.973.13
+ '@smithy/core': 3.25.1
+ '@smithy/fetch-http-handler': 5.5.1
+ '@smithy/node-http-handler': 4.8.1
+ '@smithy/types': 4.15.0
+ tslib: 2.8.1
+
'@aws-sdk/signature-v4-multi-region@3.996.35':
dependencies:
'@aws-sdk/types': 3.973.13
@@ -4898,6 +5070,15 @@ snapshots:
'@smithy/types': 4.15.0
tslib: 2.8.1
+ '@aws-sdk/token-providers@3.1074.0':
+ dependencies:
+ '@aws-sdk/core': 3.974.23
+ '@aws-sdk/nested-clients': 3.997.23
+ '@aws-sdk/types': 3.973.13
+ '@smithy/core': 3.25.1
+ '@smithy/types': 4.15.0
+ tslib: 2.8.1
+
'@aws-sdk/types@3.973.13':
dependencies:
'@smithy/types': 4.15.0
@@ -4905,7 +5086,7 @@ snapshots:
'@aws-sdk/types@3.973.8':
dependencies:
- '@smithy/types': 4.14.2
+ '@smithy/types': 4.15.0
tslib: 2.8.1
'@aws-sdk/util-locate-window@3.965.5':
@@ -4918,6 +5099,11 @@ snapshots:
fast-xml-parser: 5.7.3
tslib: 2.8.1
+ '@aws-sdk/xml-builder@3.972.31':
+ dependencies:
+ '@smithy/types': 4.15.0
+ tslib: 2.8.1
+
'@aws/lambda-invoke-store@0.2.4': {}
'@babel/code-frame@7.29.0':
@@ -5856,10 +6042,6 @@ snapshots:
'@smithy/types': 4.15.0
tslib: 2.8.1
- '@smithy/types@4.14.2':
- dependencies:
- tslib: 2.8.1
-
'@smithy/types@4.15.0':
dependencies:
tslib: 2.8.1
diff --git a/src/app/page.tsx b/src/app/page.tsx
index 12393aa..a02043e 100644
--- a/src/app/page.tsx
+++ b/src/app/page.tsx
@@ -26,6 +26,7 @@ import KeyboardShortcutsDialog from "@/components/layout/KeyboardShortcutsDialog
import TemplatesDialog from "@/components/diagram/TemplatesDialog";
import TerraformPanel from "@/components/diagram/TerraformPanel";
import MiniStackPanel from "@/components/ministack/MiniStackPanel";
+import GlueStudioPanel from "@/components/ministack/GlueStudioPanel";
import { OnboardingTour } from "@/components/layout/OnboardingTour";
// Service
@@ -93,6 +94,15 @@ function HomeContent() {
return () => window.removeEventListener("openShortcutsDialog", handler);
}, []);
+ useEffect(() => {
+ const handler = (e: Event) => {
+ const panel = (e as CustomEvent).detail;
+ if (panel) setActivePanel(panel);
+ };
+ window.addEventListener("openarchflow:open-panel", handler);
+ return () => window.removeEventListener("openarchflow:open-panel", handler);
+ }, []);
+
// Initialize Local AI model if needed
useEffect(() => {
if (aiProvider === "local") {
@@ -410,6 +420,12 @@ function HomeContent() {
nodes={currentNodes}
/>
+ setActivePanel(null)}
+ nodes={currentNodes}
+ />
+
{/* Sidebar (Left Drawer) */}
diff --git a/src/components/diagram/PropertiesPanel.tsx b/src/components/diagram/PropertiesPanel.tsx
index 652344f..107b18f 100644
--- a/src/components/diagram/PropertiesPanel.tsx
+++ b/src/components/diagram/PropertiesPanel.tsx
@@ -694,8 +694,13 @@ function MiniStackSection({ nodeId, node }: { nodeId: string; node: any }) {
const isDeployed = status === "deployed";
const isError = status === "error";
const service = (node.data.service ?? "").toLowerCase();
+ const isGlue = service === "glue";
const resourceId = ms?.resourceId ?? "";
+ const openGlueStudio = React.useCallback(() => {
+ window.dispatchEvent(new CustomEvent("openarchflow:open-panel", { detail: "glue" }));
+ }, []);
+
const handleQuickInvoke = React.useCallback(async () => {
let body: unknown;
try { body = JSON.parse(invokePayload); } catch { toast.error("Invalid JSON payload"); return; }
@@ -872,7 +877,13 @@ function MiniStackSection({ nodeId, node }: { nodeId: string; node: any }) {
{INVOKE_LABEL[service] ?? "Invoke"}
)}
- {isDeployed && (
+ {isGlue && (
+
+ )}
+ {isDeployed && !isGlue && (
-
+
diff --git a/package.json b/package.json
index a78811e..76099fc 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "open-arch-flow",
- "version": "0.12.0",
+ "version": "0.12.1",
"private": true,
"packageManager": "pnpm@11.1.2",
"author": "Rafael Sales ",