Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
5ed4d64
feat(chat): implement message editing and copying functionality in Us…
NekoWings Oct 9, 2025
88ed48d
feat(chat): enhance message editing UI with scroll container and impr…
NekoWings Oct 10, 2025
ccdf982
feat(selection): implement selection text tracking and integrate with…
NekoWings Oct 16, 2025
2c551a3
feat: Add camera functionality and support for captured pages
NekoWings Oct 16, 2025
11d3e19
feat: Introduce effort selection for gpt-oss in chat
NekoWings Oct 12, 2025
2a53084
chore(release): v1.11.0-beta.0
github-actions[bot] Oct 17, 2025
befb170
fix(chat): add cleanup method for loading attachments in ReactiveHist…
NekoWings Oct 20, 2025
eec015b
feat: Add copy and retry actions for AI messages component.
NekoWings Oct 21, 2025
e5c6dc4
chore(release): v1.11.0-beta.1
github-actions[bot] Oct 22, 2025
32d389d
fix: Enhance tab capture functionality with cached window ID and opti…
NekoWings Oct 22, 2025
4f6c6af
chore(release): v1.11.0-beta.2
github-actions[bot] Oct 22, 2025
911d45d
fix: Update attachment limit to include captured-page type and improv…
NekoWings Oct 22, 2025
e9c6c52
chore(release): v1.11.0-beta.3
github-actions[bot] Oct 22, 2025
97fcf41
fix: Clean up incomplete agent task groups in history management
NekoWings Oct 23, 2025
82efecc
chore(release): v1.11.0-beta.4
github-actions[bot] Oct 23, 2025
03b4115
fix: Improve tooltip boundary detection with container bounds for sid…
NekoWings Oct 24, 2025
0803ee2
fix: Exclude welcome and quick action messages from assistant action …
NekoWings Oct 24, 2025
33e5fa7
chore(release): v1.11.0-beta.5
github-actions[bot] Oct 24, 2025
9b397f9
feat(writing-tools): Add button to open writing tools settings
NekoWings Oct 28, 2025
f7c0a93
fix: Exclude reasoning parameter for WebLLM model compatibility
NekoWings Oct 28, 2025
20f4390
chore(release): v1.11.0-beta.6
github-actions[bot] Oct 28, 2025
277e38a
fix: Add fill attribute to path in dots-vertical icon for color consi…
NekoWings Oct 28, 2025
ee19549
fix: Improve model user config handling and fix webllm broken issue
NekoWings Oct 31, 2025
c823e83
chore(release): v1.11.0-beta.7
github-actions[bot] Oct 31, 2025
2cd619a
chore(release): v1.11.0
github-actions[bot] Nov 3, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
124 changes: 124 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,129 @@
# Changelog

## v1.11.0

[compare changes](https://github.com/NativeMindBrowser/NativeMindExtension/compare/v1.11.0-beta.7...v1.11.0)

## v1.11.0-beta.7

[compare changes](https://github.com/NativeMindBrowser/NativeMindExtension/compare/v1.11.0-beta.6...v1.11.0-beta.7)

### 🩹 Fixes

- Add fill attribute to path in dots-vertical icon for color consistency ([277e38a](https://github.com/NativeMindBrowser/NativeMindExtension/commit/277e38a))
- Improve model user config handling and fix webllm broken issue ([ee19549](https://github.com/NativeMindBrowser/NativeMindExtension/commit/ee19549))

### ❤️ Contributors

- NekoWings ([@NekoWings](http://github.com/NekoWings))

## v1.11.0-beta.6

[compare changes](https://github.com/NativeMindBrowser/NativeMindExtension/compare/v1.11.0-beta.5...v1.11.0-beta.6)

### 🚀 Enhancements

- **writing-tools:** Add button to open writing tools settings ([9b397f9](https://github.com/NativeMindBrowser/NativeMindExtension/commit/9b397f9))

### 🩹 Fixes

- Exclude reasoning parameter for WebLLM model compatibility ([f7c0a93](https://github.com/NativeMindBrowser/NativeMindExtension/commit/f7c0a93))

### ❤️ Contributors

- NekoWings ([@NekoWings](http://github.com/NekoWings))

## v1.11.0-beta.5

[compare changes](https://github.com/NativeMindBrowser/NativeMindExtension/compare/v1.11.0-beta.4...v1.11.0-beta.5)

### 🩹 Fixes

- Improve tooltip boundary detection with container bounds for sidepanel ([03b4115](https://github.com/NativeMindBrowser/NativeMindExtension/commit/03b4115))
- Exclude welcome and quick action messages from assistant action history ([0803ee2](https://github.com/NativeMindBrowser/NativeMindExtension/commit/0803ee2))

### ❤️ Contributors

- NekoWings ([@NekoWings](http://github.com/NekoWings))

## v1.11.0-beta.4

[compare changes](https://github.com/NativeMindBrowser/NativeMindExtension/compare/v1.11.0-beta.3...v1.11.0-beta.4)

### 🩹 Fixes

- Clean up incomplete agent task groups in history management ([97fcf41](https://github.com/NativeMindBrowser/NativeMindExtension/commit/97fcf41))

### ❤️ Contributors

- NekoWings ([@NekoWings](http://github.com/NekoWings))

## v1.11.0-beta.3

[compare changes](https://github.com/NativeMindBrowser/NativeMindExtension/compare/v1.11.0-beta.2...v1.11.0-beta.3)

### 🩹 Fixes

- Update attachment limit to include captured-page type and improve error handling ([911d45d](https://github.com/NativeMindBrowser/NativeMindExtension/commit/911d45d))

### ❤️ Contributors

- NekoWings ([@NekoWings](http://github.com/NekoWings))

## v1.11.0-beta.2

[compare changes](https://github.com/NativeMindBrowser/NativeMindExtension/compare/v1.11.0-beta.1...v1.11.0-beta.2)

### 🩹 Fixes

- Enhance tab capture functionality with cached window ID and optional host permissions ([32d389d](https://github.com/NativeMindBrowser/NativeMindExtension/commit/32d389d))

### ❤️ Contributors

- NekoWings ([@NekoWings](http://github.com/NekoWings))

## v1.11.0-beta.1

[compare changes](https://github.com/NativeMindBrowser/NativeMindExtension/compare/v1.11.0-beta.0...v1.11.0-beta.1)

### 🚀 Enhancements

- Add copy and retry actions for AI messages component. ([eec015b](https://github.com/NativeMindBrowser/NativeMindExtension/commit/eec015b))

### 🩹 Fixes

- **chat:** Add cleanup method for loading attachments in ReactiveHistoryManager ([befb170](https://github.com/NativeMindBrowser/NativeMindExtension/commit/befb170))

### ❤️ Contributors

- NekoWings ([@NekoWings](http://github.com/NekoWings))

## v1.11.0-beta.0

[compare changes](https://github.com/NativeMindBrowser/NativeMindExtension/compare/v1.10.1...v1.11.0-beta.0)

### 🚀 Enhancements

- **chat:** Implement message editing and copying functionality in User component ([5ed4d64](https://github.com/NativeMindBrowser/NativeMindExtension/commit/5ed4d64))
- **chat:** Enhance message editing UI with scroll container and improved button functionality ([88ed48d](https://github.com/NativeMindBrowser/NativeMindExtension/commit/88ed48d))
- **selection:** Implement selection text tracking and integrate with llm ([ccdf982](https://github.com/NativeMindBrowser/NativeMindExtension/commit/ccdf982))
- Add camera functionality and support for captured pages ([2c551a3](https://github.com/NativeMindBrowser/NativeMindExtension/commit/2c551a3))
- Introduce effort selection for gpt-oss in chat ([11d3e19](https://github.com/NativeMindBrowser/NativeMindExtension/commit/11d3e19))

### 🩹 Fixes

- **web-llm:** Fix infinite loading when local model cache is invalid ([66239b1](https://github.com/NativeMindBrowser/NativeMindExtension/commit/66239b1))

### 🏡 Chore

- **release:** V1.9.5 ([c7afaef](https://github.com/NativeMindBrowser/NativeMindExtension/commit/c7afaef))

### ❤️ Contributors

- NekoWings ([@NekoWings](http://github.com/NekoWings))
- Neko Liu ([@NekoWings](http://github.com/NekoWings))
- Tony Hu ([@tonyhu-012](http://github.com/tonyhu-012))

## v1.10.1

[compare changes](https://github.com/NativeMindBrowser/NativeMindExtension/compare/v1.10.1-beta.2...v1.10.1)
Expand Down
8 changes: 8 additions & 0 deletions assets/icons/camera.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
16 changes: 16 additions & 0 deletions assets/icons/captured-page.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
7 changes: 5 additions & 2 deletions assets/icons/copy.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 2 additions & 1 deletion assets/icons/dots-vertical.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
8 changes: 8 additions & 0 deletions assets/icons/retry.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
13 changes: 13 additions & 0 deletions assets/icons/selected-text.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
17 changes: 15 additions & 2 deletions components/Selector.vue
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<template>
<div
class="relative"
class="relative flex"
data-nativemind-selector
>
<div
Expand Down Expand Up @@ -31,6 +31,18 @@
</slot>
</div>
</div>
<div
v-else-if="isCustomizedBtn"
ref="selectorRef"
:class="classNames('inline-flex items-center cursor-pointer', containerClass)"
@click="toggleDropdown"
>
<slot
name="button"
:option="selectedOption"
/>
</div>

<Button
v-else
variant="secondary"
Expand Down Expand Up @@ -151,7 +163,7 @@ interface Props {
disabled?: boolean
listenScrollElements?: HTMLElement[]
onChange?: (value: Option, oldValue?: Option) => Promise<boolean> | boolean // function to call when the value changes, return false to prevent the change
triggerStyle?: 'normal' | 'ghost'
triggerStyle?: 'normal' | 'ghost' | 'customized'
}

const props = withDefaults(defineProps<Props>(), {
Expand All @@ -170,6 +182,7 @@ const emit = defineEmits<{
}>()

const isGhostBtn = computed(() => props.triggerStyle === 'ghost')
const isCustomizedBtn = computed(() => props.triggerStyle === 'customized')

const options = computed(() => {
return props.options
Expand Down
62 changes: 52 additions & 10 deletions components/ui/Tooltip.vue
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,35 @@ const hideTooltip = () => {
tooltipStyle.value.visibility = 'hidden'
}

/**
* Get container bounds for boundary detection
* Works with both regular containers and sidepanel
*/
const getContainerBounds = () => {
const container = rootElement as HTMLElement
if (!container || !container.getBoundingClientRect) {
// Fallback to window bounds if container is not available
return {
left: 0,
right: window.innerWidth,
top: 0,
bottom: window.innerHeight,
width: window.innerWidth,
height: window.innerHeight,
}
}

const containerRect = container.getBoundingClientRect()
return {
left: containerRect.left,
right: containerRect.right,
top: containerRect.top,
bottom: containerRect.bottom,
width: containerRect.width,
height: containerRect.height,
}
}

/**
* Update tooltip position
* @param useEstimatedSize - Whether to use estimated size
Expand All @@ -136,6 +165,7 @@ const updateTooltipPosition = (useEstimatedSize = false) => {
if (!triggerRef.value) return

const triggerRect = triggerRef.value.getBoundingClientRect()
const containerBounds = getContainerBounds()

// Get tooltip dimensions
let tooltipWidth: number
Expand Down Expand Up @@ -202,23 +232,35 @@ const updateTooltipPosition = (useEstimatedSize = false) => {
break
}

// Boundary checks
// Boundary checks based on container bounds
if (['top', 'bottom', 'auto'].includes(positionToUse)) {
if (left < BOUNDARY_PADDING) left = BOUNDARY_PADDING
if (left + tooltipWidth / 2 > window.innerWidth - BOUNDARY_PADDING) {
left = window.innerWidth - tooltipWidth / 2 - BOUNDARY_PADDING
// For top/bottom positions with centered left: left value is center point
const leftEdge = left - tooltipWidth / 2
const rightEdge = left + tooltipWidth / 2

if (leftEdge < containerBounds.left + BOUNDARY_PADDING) {
left = containerBounds.left + BOUNDARY_PADDING + tooltipWidth / 2
}
if (rightEdge > containerBounds.right - BOUNDARY_PADDING) {
left = containerBounds.right - BOUNDARY_PADDING - tooltipWidth / 2
}
}
else {
if (left < BOUNDARY_PADDING) left = BOUNDARY_PADDING
if (left + tooltipWidth > window.innerWidth - BOUNDARY_PADDING) {
left = window.innerWidth - tooltipWidth - BOUNDARY_PADDING
// For left/right positions: left value is the actual left edge
if (left < containerBounds.left + BOUNDARY_PADDING) {
left = containerBounds.left + BOUNDARY_PADDING
}
if (left + tooltipWidth > containerBounds.right - BOUNDARY_PADDING) {
left = containerBounds.right - tooltipWidth - BOUNDARY_PADDING
}
}

if (top < BOUNDARY_PADDING) top = BOUNDARY_PADDING
if (top + tooltipHeight > window.innerHeight - BOUNDARY_PADDING) {
top = window.innerHeight - tooltipHeight - BOUNDARY_PADDING
// Vertical boundary checks
if (top < containerBounds.top + BOUNDARY_PADDING) {
top = containerBounds.top + BOUNDARY_PADDING
}
if (top + tooltipHeight > containerBounds.bottom - BOUNDARY_PADDING) {
top = containerBounds.bottom - tooltipHeight - BOUNDARY_PADDING
}

tooltipStyle.value = {
Expand Down
4 changes: 3 additions & 1 deletion entrypoints/background/database/types.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { StoredReasoningPreference } from '@/types/reasoning'

// Database configuration
export const DB_NAME = 'NativeMindExtension'
export const DB_VERSION = 2
Expand All @@ -9,7 +11,7 @@ export interface ChatHistoryRecord {
lastInteractedAt?: number
history: string // JSON serialized HistoryItemV1[]
contextUpdateInfo?: string // JSON serialized contextUpdateInfo from ChatHistoryV1
reasoningEnabled?: boolean // reasoning setting for this chat
reasoningEnabled?: StoredReasoningPreference // reasoning setting for this chat
onlineSearchEnabled?: boolean // online search setting for this chat, default is true
createdAt: number
updatedAt: number
Expand Down
7 changes: 6 additions & 1 deletion entrypoints/background/services/chat-history-service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
*/

import { ChatHistoryV1, ChatList, ContextAttachment, ContextAttachmentStorage, HistoryItemV1 } from '@/types/chat'
import { normalizeReasoningPreference } from '@/types/reasoning'
import { useGlobalI18n } from '@/utils/i18n'
import { getLocaleName } from '@/utils/i18n/constants'
import logger from '@/utils/logger'
Expand Down Expand Up @@ -65,12 +66,16 @@ export class BackgroundChatHistoryService {
}

migrateFromOldHistoryRecord(record: ChatHistoryRecord): ChatHistoryV1 {
const reasoningPreference = record.reasoningEnabled === undefined
? undefined
: normalizeReasoningPreference(record.reasoningEnabled)

return {
id: record.id,
title: record.title,
lastInteractedAt: record.lastInteractedAt,
contextUpdateInfo: record.contextUpdateInfo ? JSON.parse(record.contextUpdateInfo) : undefined,
reasoningEnabled: record.reasoningEnabled,
reasoningEnabled: reasoningPreference,
onlineSearchEnabled: record.onlineSearchEnabled ?? true, // default to true if undefined for backward compatibility
history: JSON.parse(record.history) as HistoryItemV1[],
}
Expand Down
2 changes: 2 additions & 0 deletions entrypoints/content/App.vue
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,13 @@ import { useTranslator } from './composables/useTranslator'
import { initContextMenu } from './utils/context-menu'
import { useInjectGmailTools } from './utils/page-injection/gmail-tools'
import { useInjectOllamaDownloadButtons } from './utils/page-injection/ollama-search-page'
import { useInjectSelectionTracker } from './utils/page-injection/selection-tracker'

// init translator global event listeners
useTranslator()
useInjectOllamaDownloadButtons()
useInjectGmailTools()
useInjectSelectionTracker()
initContextMenu()
const toast = useToast()

Expand Down
Loading
Loading