diff --git a/mateclaw-ui/package.json b/mateclaw-ui/package.json index 7776b5df..26294ee3 100644 --- a/mateclaw-ui/package.json +++ b/mateclaw-ui/package.json @@ -13,6 +13,7 @@ "dependencies": { "@element-plus/icons-vue": "^2.3.1", "@google/model-viewer": "^4.2.0", + "@guolao/vue-monaco-editor": "^1.6.0", "@vue-flow/background": "^1.3.2", "@vue-flow/controls": "^1.1.3", "@vue-flow/core": "^1.48.2", @@ -30,6 +31,7 @@ "marked": "^15.0.6", "marked-highlight": "^2.2.3", "mermaid": "^11.14.0", + "monaco-editor": "^0.55.1", "pinia": "^3.0.1", "pixelarticons": "2.1.0", "vue": "^3.5.13", diff --git a/mateclaw-ui/pnpm-lock.yaml b/mateclaw-ui/pnpm-lock.yaml index c02f3fbf..07dcdf84 100644 --- a/mateclaw-ui/pnpm-lock.yaml +++ b/mateclaw-ui/pnpm-lock.yaml @@ -14,6 +14,9 @@ importers: '@google/model-viewer': specifier: ^4.2.0 version: 4.2.0(three@0.182.0) + '@guolao/vue-monaco-editor': + specifier: ^1.6.0 + version: 1.6.0(monaco-editor@0.55.1)(vue@3.5.31(typescript@5.7.3)) '@vue-flow/background': specifier: ^1.3.2 version: 1.3.2(@vue-flow/core@1.48.2(vue@3.5.31(typescript@5.7.3)))(vue@3.5.31(typescript@5.7.3)) @@ -65,6 +68,9 @@ importers: mermaid: specifier: ^11.14.0 version: 11.14.0 + monaco-editor: + specifier: ^0.55.1 + version: 0.55.1 pinia: specifier: ^3.0.1 version: 3.0.4(typescript@5.7.3)(vue@3.5.31(typescript@5.7.3)) @@ -376,6 +382,16 @@ packages: peerDependencies: three: ^0.182.0 + '@guolao/vue-monaco-editor@1.6.0': + resolution: {integrity: sha512-w2IiJ6eJGGeuIgCK6EKZOAfhHTTUB5aZwslzwGbZ5e89Hb4avx6++GkLTW8p84Sng/arFMjLPPxSBI56cFudyQ==} + peerDependencies: + '@vue/composition-api': ^1.7.2 + monaco-editor: '>=0.43.0' + vue: ^2.6.14 || >=3.0.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} @@ -435,6 +451,9 @@ packages: '@mermaid-js/parser@1.1.0': resolution: {integrity: sha512-gxK9ZX2+Fex5zu8LhRQoMeMPEHbc73UKZ0FQ54YrQtUxE1VVhMwzeNtKRPAu5aXks4FasbMe4xB4bWrmq6Jlxw==} + '@monaco-editor/loader@1.7.0': + resolution: {integrity: sha512-gIwR1HrJrrx+vfyOhYmCZ0/JcWqG5kbfG7+d3f/C1LXk2EvzAbHSg3MQ5lO2sMlo9izoAZ04shohfKLVT6crVA==} + '@monogrid/gainmap-js@3.4.0': resolution: {integrity: sha512-2Z0FATFHaoYJ8b+Y4y4Hgfn3FRFwuU5zRrk+9dFWp4uGAdHGqVEdP7HP+gLA3X469KXHmfupJaUbKo1b/aDKIg==} peerDependencies: @@ -1230,6 +1249,9 @@ packages: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} + dompurify@3.2.7: + resolution: {integrity: sha512-WhL/YuveyGXJaerVlMYGWhvQswa7myDG17P7Vu65EWC05o8vfeNbvNf4d/BOvH99+ZW+LlQsc1GDKMa1vNK6dw==} + dompurify@3.3.3: resolution: {integrity: sha512-Oj6pzI2+RqBfFG+qOaOLbFXLQ90ARpcGG6UePL82bJLtdsa6CYJD7nmiU8MW9nQNOtCHV3lZ/Bzq1X0QYbBZCA==} @@ -1656,6 +1678,11 @@ packages: peerDependencies: marked: '>=4 <18' + marked@14.0.0: + resolution: {integrity: sha512-uIj4+faQ+MgHgwUW1l2PsPglZLOLOT1uErt06dAPtx2kjteLAkbsd/0FiYg/MGS+i7ZKLb7w2WClxHkzOOuryQ==} + engines: {node: '>= 18'} + hasBin: true + marked@15.0.12: resolution: {integrity: sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==} engines: {node: '>= 18'} @@ -1693,6 +1720,9 @@ packages: mlly@1.8.2: resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} + monaco-editor@0.55.1: + resolution: {integrity: sha512-jz4x+TJNFHwHtwuV9vA9rMujcZRb0CEilTEwG2rRSpe/A7Jdkuj8xPKttCgOh+v/lkHy7HsZ64oj+q3xoAFl9A==} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -1861,6 +1891,9 @@ packages: resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} engines: {node: '>=0.10.0'} + state-local@1.0.7: + resolution: {integrity: sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==} + strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -2242,6 +2275,13 @@ snapshots: lit: 3.3.2 three: 0.182.0 + '@guolao/vue-monaco-editor@1.6.0(monaco-editor@0.55.1)(vue@3.5.31(typescript@5.7.3))': + dependencies: + '@monaco-editor/loader': 1.7.0 + monaco-editor: 0.55.1 + vue: 3.5.31(typescript@5.7.3) + vue-demi: 0.14.10(vue@3.5.31(typescript@5.7.3)) + '@humanfs/core@0.19.1': {} '@humanfs/node@0.16.7': @@ -2302,6 +2342,10 @@ snapshots: dependencies: langium: 4.2.2 + '@monaco-editor/loader@1.7.0': + dependencies: + state-local: 1.0.7 + '@monogrid/gainmap-js@3.4.0(three@0.182.0)': dependencies: promise-worker-transferable: 1.0.4 @@ -3102,6 +3146,10 @@ snapshots: detect-libc@2.1.2: {} + dompurify@3.2.7: + optionalDependencies: + '@types/trusted-types': 2.0.7 + dompurify@3.3.3: optionalDependencies: '@types/trusted-types': 2.0.7 @@ -3551,6 +3599,8 @@ snapshots: dependencies: marked: 15.0.12 + marked@14.0.0: {} + marked@15.0.12: {} marked@16.4.2: {} @@ -3602,6 +3652,11 @@ snapshots: pkg-types: 1.3.1 ufo: 1.6.3 + monaco-editor@0.55.1: + dependencies: + dompurify: 3.2.7 + marked: 14.0.0 + ms@2.1.3: {} muggle-string@0.4.1: {} @@ -3767,6 +3822,8 @@ snapshots: speakingurl@14.0.1: {} + state-local@1.0.7: {} + strip-json-comments@3.1.1: {} stylis@4.4.0: {} diff --git a/mateclaw-ui/src/components/workflow/StepNode.vue b/mateclaw-ui/src/components/workflow/StepNode.vue index 51977b73..80a4726f 100644 --- a/mateclaw-ui/src/components/workflow/StepNode.vue +++ b/mateclaw-ui/src/components/workflow/StepNode.vue @@ -74,7 +74,11 @@ const targetPosition = computed(() => props.targetPosition ?? Position.Left) const data = computed(() => props.data as StepNodeData) -const agentSlug = computed(() => data.value.agentName?.trim() || '') +const agentSlug = computed(() => { + const name = data.value.agentName?.trim() + if (name) return name + return data.value.agentId != null ? `#${data.value.agentId}` : '' +}) const approverHint = computed(() => { if (data.value.modeType !== 'await_approval') return '' diff --git a/mateclaw-ui/src/components/workflow/StepPropertyPanel.vue b/mateclaw-ui/src/components/workflow/StepPropertyPanel.vue index 20b700c8..202f10cb 100644 --- a/mateclaw-ui/src/components/workflow/StepPropertyPanel.vue +++ b/mateclaw-ui/src/components/workflow/StepPropertyPanel.vue @@ -39,41 +39,22 @@ @@ -109,7 +90,6 @@ > - @@ -189,14 +169,40 @@ @@ -502,6 +585,35 @@ function onAgentSelect(e: Event) { gap: 4px; } .agent-picker .mc-input { flex: 1; min-width: 0; } +.channel-picker { + display: grid; + gap: 6px; +} +.channel-option { + display: flex; + align-items: center; + gap: 8px; + min-height: 30px; + padding: 6px 8px; + border: 1px solid var(--mc-border, rgba(0, 0, 0, 0.12)); + border-radius: 6px; + background: var(--mc-bg, transparent); + cursor: pointer; +} +.channel-option input { + flex: 0 0 auto; +} +.channel-name { + flex: 1; + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.channel-type { + font-size: 10.5px; + color: var(--mc-text-tertiary, #888); +} .agent-toggle { width: 24px; height: 28px; @@ -522,6 +634,9 @@ function onAgentSelect(e: Event) { font-style: italic; margin: 0; } +.panel-hint.danger { + color: var(--mc-danger, #c0392b); +} .raw-section summary { font-size: 11px; color: var(--mc-text-tertiary, #888); diff --git a/mateclaw-ui/src/components/workflow/WorkflowCanvas.vue b/mateclaw-ui/src/components/workflow/WorkflowCanvas.vue index b3ffbad2..72fab20f 100644 --- a/mateclaw-ui/src/components/workflow/WorkflowCanvas.vue +++ b/mateclaw-ui/src/components/workflow/WorkflowCanvas.vue @@ -8,13 +8,13 @@ {{ t('workflows.canvas.addNode') }} - -
- - -
- {{ t('triggers.fields.patternJson') }} - -
- - - - - - -