release: 0.1.5 — hide IM adapter UI (out of product scope)
Per product-package design docs, IM integration (Lark / Feishu / Telegram) is not a Heicode surface. Hide UI without ripping out plumbing — keep AdapterSettings.tsx + adapterStore + types in the source tree so re-enabling is a one-flag flip. - Settings.tsx: drop the "IM 接入" tab button (`'adapters'` route still resolves internally if someone forces it, but no nav). - NewTaskModal.tsx: remove the IM notification channel pickers (Feishu / Telegram checkboxes + "no channel configured" warning). Existing task `notification` config is preserved on edit; it's just no longer mutable from this UI. - Unused imports (useEffect, useAdapterStore) cleaned to satisfy TS strict mode. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "heicode-desktop",
|
"name": "heicode-desktop",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "0.1.4",
|
"version": "0.1.5",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite",
|
"dev": "vite",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "heicode-desktop"
|
name = "heicode-desktop"
|
||||||
version = "0.1.4"
|
version = "0.1.5"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"$schema": "https://raw.githubusercontent.com/nicegui/nicegui/main/nicegui/static/tauri-schema-v2.json",
|
"$schema": "https://raw.githubusercontent.com/nicegui/nicegui/main/nicegui/static/tauri-schema-v2.json",
|
||||||
"productName": "HeiCode",
|
"productName": "HeiCode",
|
||||||
"version": "0.1.4",
|
"version": "0.1.5",
|
||||||
"identifier": "com.heicode.desktop",
|
"identifier": "com.heicode.desktop",
|
||||||
"build": {
|
"build": {
|
||||||
"frontendDist": "../dist",
|
"frontendDist": "../dist",
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import { useState, useEffect } from 'react'
|
import { useState } from 'react'
|
||||||
import { useTaskStore } from '../../stores/taskStore'
|
import { useTaskStore } from '../../stores/taskStore'
|
||||||
import { useSessionStore } from '../../stores/sessionStore'
|
import { useSessionStore } from '../../stores/sessionStore'
|
||||||
import { useAdapterStore } from '../../stores/adapterStore'
|
|
||||||
import { Modal } from '../shared/Modal'
|
import { Modal } from '../shared/Modal'
|
||||||
import { Input } from '../shared/Input'
|
import { Input } from '../shared/Input'
|
||||||
import { Button } from '../shared/Button'
|
import { Button } from '../shared/Button'
|
||||||
@@ -60,17 +59,11 @@ export function NewTaskModal({ open, onClose, editTask }: Props) {
|
|||||||
const activeSessionId = useSessionStore((s) => s.activeSessionId)
|
const activeSessionId = useSessionStore((s) => s.activeSessionId)
|
||||||
const activeSession = sessions.find((s) => s.id === activeSessionId)
|
const activeSession = sessions.find((s) => s.id === activeSessionId)
|
||||||
const defaultWorkDir = activeSession?.workDir || ''
|
const defaultWorkDir = activeSession?.workDir || ''
|
||||||
const adapterConfig = useAdapterStore((s) => s.config)
|
// IM adapter config previously used here for the "notify on complete"
|
||||||
const fetchAdapterConfig = useAdapterStore((s) => s.fetchConfig)
|
// channel pickers. UI hidden — adapter integration is out of scope per
|
||||||
|
// product-package docs. Keeping the imports/state removed to keep TS
|
||||||
useEffect(() => {
|
// strict-mode happy; the adapterStore itself stays in tree for any
|
||||||
if (open) fetchAdapterConfig()
|
// future re-enable.
|
||||||
}, [open])
|
|
||||||
|
|
||||||
const isFeishuConfigured = !!(adapterConfig.feishu?.appId && adapterConfig.feishu?.appSecret
|
|
||||||
&& ((adapterConfig.feishu?.pairedUsers?.length ?? 0) > 0 || (adapterConfig.feishu?.allowedUsers?.length ?? 0) > 0))
|
|
||||||
const isTelegramConfigured = !!(adapterConfig.telegram?.botToken
|
|
||||||
&& ((adapterConfig.telegram?.pairedUsers?.length ?? 0) > 0 || (adapterConfig.telegram?.allowedUsers?.length ?? 0) > 0))
|
|
||||||
|
|
||||||
const isEdit = !!editTask
|
const isEdit = !!editTask
|
||||||
const parsed = editTask ? parseCron(editTask.cron) : null
|
const parsed = editTask ? parseCron(editTask.cron) : null
|
||||||
@@ -94,8 +87,10 @@ export function NewTaskModal({ open, onClose, editTask }: Props) {
|
|||||||
const [permissionMode, setPermissionMode] = useState<PermissionMode>((editTask?.permissionMode as PermissionMode) || 'default')
|
const [permissionMode, setPermissionMode] = useState<PermissionMode>((editTask?.permissionMode as PermissionMode) || 'default')
|
||||||
const [folderPath, setFolderPath] = useState(editTask?.folderPath || defaultWorkDir)
|
const [folderPath, setFolderPath] = useState(editTask?.folderPath || defaultWorkDir)
|
||||||
const [useWorktree, setUseWorktree] = useState(editTask?.useWorktree || false)
|
const [useWorktree, setUseWorktree] = useState(editTask?.useWorktree || false)
|
||||||
const [notifyEnabled, setNotifyEnabled] = useState(editTask?.notification?.enabled || false)
|
// Preserve any existing IM notification config on edit, but the UI no
|
||||||
const [notifyChannels, setNotifyChannels] = useState<('telegram' | 'feishu')[]>(editTask?.notification?.channels || [])
|
// longer exposes a way to change these — they pass through unchanged.
|
||||||
|
const [notifyEnabled] = useState(editTask?.notification?.enabled || false)
|
||||||
|
const [notifyChannels] = useState<('telegram' | 'feishu')[]>(editTask?.notification?.channels || [])
|
||||||
const [isSubmitting, setIsSubmitting] = useState(false)
|
const [isSubmitting, setIsSubmitting] = useState(false)
|
||||||
|
|
||||||
// Enhanced scheduling state
|
// Enhanced scheduling state
|
||||||
@@ -325,67 +320,9 @@ export function NewTaskModal({ open, onClose, editTask }: Props) {
|
|||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{/* Notification */}
|
{/* IM notification channel UI removed — product-package design docs
|
||||||
<div className="flex flex-col gap-3 rounded-[var(--radius-md)] border border-[var(--color-border)] p-3">
|
do not include Lark/Feishu/Telegram as a Heicode surface. Underlying
|
||||||
<label className="flex items-center gap-3 cursor-pointer">
|
adapter store + types stay in tree; just the UI is hidden. */}
|
||||||
<input
|
|
||||||
type="checkbox"
|
|
||||||
checked={notifyEnabled}
|
|
||||||
onChange={(e) => setNotifyEnabled(e.target.checked)}
|
|
||||||
className="w-4 h-4 rounded border-[var(--color-border)] accent-[var(--color-brand)]"
|
|
||||||
/>
|
|
||||||
<div>
|
|
||||||
<span className="text-sm font-medium text-[var(--color-text-primary)]">{t('newTask.notifyOnComplete')}</span>
|
|
||||||
<p className="text-xs text-[var(--color-text-tertiary)]">{t('newTask.notifyHint')}</p>
|
|
||||||
</div>
|
|
||||||
</label>
|
|
||||||
{notifyEnabled && (
|
|
||||||
<div className="flex flex-col gap-2 pl-7">
|
|
||||||
<div className="flex items-center gap-4">
|
|
||||||
<label className={`flex items-center gap-2 ${isFeishuConfigured ? 'cursor-pointer' : 'opacity-50 cursor-not-allowed'}`}>
|
|
||||||
<input
|
|
||||||
type="checkbox"
|
|
||||||
checked={notifyChannels.includes('feishu')}
|
|
||||||
disabled={!isFeishuConfigured}
|
|
||||||
onChange={(e) => {
|
|
||||||
setNotifyChannels((prev) =>
|
|
||||||
e.target.checked ? [...prev, 'feishu'] : prev.filter((c) => c !== 'feishu'),
|
|
||||||
)
|
|
||||||
}}
|
|
||||||
className="w-3.5 h-3.5 rounded border-[var(--color-border)] accent-[var(--color-brand)]"
|
|
||||||
/>
|
|
||||||
<span className="text-sm text-[var(--color-text-primary)]">{t('settings.adapters.feishu')}</span>
|
|
||||||
{!isFeishuConfigured && (
|
|
||||||
<span className="text-[10px] text-[var(--color-warning)]">{t('newTask.notConfigured')}</span>
|
|
||||||
)}
|
|
||||||
</label>
|
|
||||||
<label className={`flex items-center gap-2 ${isTelegramConfigured ? 'cursor-pointer' : 'opacity-50 cursor-not-allowed'}`}>
|
|
||||||
<input
|
|
||||||
type="checkbox"
|
|
||||||
checked={notifyChannels.includes('telegram')}
|
|
||||||
disabled={!isTelegramConfigured}
|
|
||||||
onChange={(e) => {
|
|
||||||
setNotifyChannels((prev) =>
|
|
||||||
e.target.checked ? [...prev, 'telegram'] : prev.filter((c) => c !== 'telegram'),
|
|
||||||
)
|
|
||||||
}}
|
|
||||||
className="w-3.5 h-3.5 rounded border-[var(--color-border)] accent-[var(--color-brand)]"
|
|
||||||
/>
|
|
||||||
<span className="text-sm text-[var(--color-text-primary)]">{t('settings.adapters.telegram')}</span>
|
|
||||||
{!isTelegramConfigured && (
|
|
||||||
<span className="text-[10px] text-[var(--color-warning)]">{t('newTask.notConfigured')}</span>
|
|
||||||
)}
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
{!isFeishuConfigured && !isTelegramConfigured && (
|
|
||||||
<p className="text-xs text-[var(--color-warning)]">
|
|
||||||
<span className="material-symbols-outlined text-[12px] align-middle mr-1">warning</span>
|
|
||||||
{t('newTask.noChannelConfigured')}
|
|
||||||
</p>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{/* Cron preview */}
|
{/* Cron preview */}
|
||||||
<div className="flex items-center gap-2 px-3 py-2 rounded-[var(--radius-md)] bg-[var(--color-surface-container)] text-xs text-[var(--color-text-secondary)]">
|
<div className="flex items-center gap-2 px-3 py-2 rounded-[var(--radius-md)] bg-[var(--color-surface-container)] text-xs text-[var(--color-text-secondary)]">
|
||||||
|
|||||||
@@ -49,7 +49,10 @@ export function Settings() {
|
|||||||
<div className="flex-1">
|
<div className="flex-1">
|
||||||
<TabButton icon="shield" label={t('settings.tab.permissions')} active={activeTab === 'permissions'} onClick={() => setActiveTab('permissions')} />
|
<TabButton icon="shield" label={t('settings.tab.permissions')} active={activeTab === 'permissions'} onClick={() => setActiveTab('permissions')} />
|
||||||
<TabButton icon="tune" label={t('settings.tab.general')} active={activeTab === 'general'} onClick={() => setActiveTab('general')} />
|
<TabButton icon="tune" label={t('settings.tab.general')} active={activeTab === 'general'} onClick={() => setActiveTab('general')} />
|
||||||
<TabButton icon="chat" label={t('settings.tab.adapters')} active={activeTab === 'adapters'} onClick={() => setActiveTab('adapters')} />
|
{/* IM 接入 (Lark / Feishu / Telegram adapter settings) is hidden —
|
||||||
|
the product-package design docs do not include IM as a Heicode
|
||||||
|
surface. Underlying AdapterSettings.tsx + adapterStore stay in
|
||||||
|
the source tree so we can bring it back if product reverses. */}
|
||||||
<TabButton icon="dns" label={t('settings.tab.mcp')} active={activeTab === 'mcp'} onClick={() => setActiveTab('mcp')} />
|
<TabButton icon="dns" label={t('settings.tab.mcp')} active={activeTab === 'mcp'} onClick={() => setActiveTab('mcp')} />
|
||||||
<TabButton icon="smart_toy" label={t('settings.tab.agents')} active={activeTab === 'agents'} onClick={() => setActiveTab('agents')} />
|
<TabButton icon="smart_toy" label={t('settings.tab.agents')} active={activeTab === 'agents'} onClick={() => setActiveTab('agents')} />
|
||||||
<TabButton icon="auto_awesome" label={t('settings.tab.skills')} active={activeTab === 'skills'} onClick={() => setActiveTab('skills')} />
|
<TabButton icon="auto_awesome" label={t('settings.tab.skills')} active={activeTab === 'skills'} onClick={() => setActiveTab('skills')} />
|
||||||
|
|||||||
Reference in New Issue
Block a user