Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
04260ac
feat: add web viewer warning message in settings
miaobuao Sep 8, 2026
21f2683
fix: update visibility check for NutstoreSettingTab to use ownerDocument
miaobuao Sep 8, 2026
33b70cd
refactor: streamline TypeScript linting configuration and remove redu…
miaobuao Sep 8, 2026
1fc49e2
fix: update anchor element creation to use button's ownerDocument
miaobuao Sep 8, 2026
ad93a96
chore: avoid duplicate lint
miaobuao Sep 8, 2026
0760767
feat: searchable settings, preference-aware deletion, dep refresh
miaobuao Sep 8, 2026
e977e23
feat: add plugin info display in troubleshooting settings
miaobuao Sep 8, 2026
20b2fe9
perf: compress production assets and align runtime targets
miaobuao Sep 9, 2026
33f0325
fix: update lint:deps script to include --prod flag for better depend…
miaobuao Sep 9, 2026
3b96fe4
chore: upgrade pnpm to version 12.3.4 and enforce frozen lockfile dur…
miaobuao Sep 9, 2026
5673eb8
fix: update stop button visibility assertion in sync progress modal t…
miaobuao Sep 9, 2026
e5b177d
fix: recover IndexedDB service failures
miaobuao Sep 10, 2026
b6e1d78
fix: update release workflow to improve asset attestation and formatting
miaobuao Sep 10, 2026
4b16169
feat: grouped settings
miaobuao Sep 10, 2026
d1140b4
feat: group per-turn assistant process in chatbox timeline
miaobuao Sep 11, 2026
ff3fe24
chore: rm useless field
miaobuao Sep 11, 2026
4914be6
fix: preserve queued inputs across tool boundaries
miaobuao Sep 11, 2026
c91eac5
feat: add skill management features and settings UI
miaobuao Sep 11, 2026
3d730d1
feat: add webview runtime diagnostics
miaobuao Sep 14, 2026
50c3e78
fix: hide AI conflict action without conflicts
miaobuao Sep 14, 2026
e16f9ea
fix: reuse matching AI draft sessions
miaobuao Sep 14, 2026
9124e32
feat: add durable inter-agent communication
miaobuao Sep 15, 2026
c04e9ac
feat: add Nutstore LLM Gateway modal for usage overview
miaobuao Sep 23, 2026
c4253ed
refactor: remove beta confirmation modal
miaobuao Sep 23, 2026
bd43663
feat: animate settings tab transitions
miaobuao Sep 23, 2026
e6de770
feat: show context menu on session list
miaobuao Sep 23, 2026
a762726
fix: make WebDAV traversal resilient to transient 404s
miaobuao Sep 24, 2026
c464d94
feat: set default active tab to usage in Nutstore LLM Gateway modal
miaobuao Sep 24, 2026
8d64d8d
feat: add icon to Nutstore AI Provider
miaobuao Sep 24, 2026
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
6 changes: 3 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,9 @@ jobs:
scope: '@nutstore'

- name: Install pnpm
uses: pnpm/action-setup@v2
uses: pnpm/action-setup@v4
with:
version: latest-9
version: 12.3.4

- name: Install dependencies
env:
Expand All @@ -49,7 +49,7 @@ jobs:
NUTSTORE_PAT: ${{ secrets.GITHUB_TOKEN }}
NODE_ENV: production
NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: pnpm run build
run: pnpm run build:plugin

- name: Run unit tests
run: pnpm run test:unit
Expand Down
19 changes: 16 additions & 3 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ jobs:
permissions:
contents: write
packages: read
id-token: write
attestations: write

steps:
- uses: actions/checkout@v3
with:
Expand All @@ -25,14 +28,14 @@ jobs:
scope: '@nutstore'

- name: Install pnpm
uses: pnpm/action-setup@v2
uses: pnpm/action-setup@v4
with:
version: latest-9
version: 12.3.4

- name: Install dependencies
env:
NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: pnpm install
run: pnpm install --frozen-lockfile

- name: Update models API catalog
run: pnpm run update:models-api
Expand All @@ -54,6 +57,16 @@ jobs:
zip ${{ github.event.repository.name }}-${tag}.zip main.js manifest.json styles.css
tar -czf ${{ github.event.repository.name }}-${tag}.tar.gz main.js manifest.json styles.css

- name: Attest release assets
uses: actions/attest@v4
with:
subject-path: |
main.js
manifest.json
styles.css
${{ github.event.repository.name }}-${{ github.ref_name }}.zip
${{ github.event.repository.name }}-${{ github.ref_name }}.tar.gz

- name: Create release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
Expand Down
16 changes: 13 additions & 3 deletions .swcrc
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,20 @@
"topLevelAwait": false,
"importMeta": false
},
"target": "es5",
"loose": false,
"externalHelpers": false,
"keepClassNames": false
"keepClassNames": false,
"minify": {
"compress": true,
"mangle": true
}
},
"minify": true
"minify": true,
"env": {
"targets": {
"chrome": "69",
"electron": "30",
"ios": "12"
}
}
}
8 changes: 3 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -103,13 +103,11 @@ Agent 支持:
#### 配置 AI

1. 打开 Nutstore Sync 设置中的 **AI** 标签页。
2. 添加服务商、API Key 和模型,或在账号可用时授权实验性的 Nutstore AI。
2. 添加服务商、API Key 和模型,或授权 Nutstore AI。
3. 选择默认模型。
4. 点击功能区的机器人图标,或从命令面板运行 **Open chatbox**。
5. 按需配置 Explorer 或 Memory 子 Agent、添加 MCP 服务或管理 Skills。

模型能力取决于你选择的服务商和具体模型。Nutstore AI 仍是实验性功能,并非所有账号都可用。

#### 操作权限

Agent 默认会在修改文件或插件设置前请求确认。你可以仅允许一次,也可以在当前会话中自动允许同类操作。设置中的 **完全访问权限(YOLO 模式)** 会跳过逐项确认,请只在你理解任务影响时开启。
Expand Down Expand Up @@ -208,12 +206,12 @@ The Agent supports:
#### Configure AI

1. Open the **AI** tab in Nutstore Sync settings.
2. Add a provider, API key, and model, or authorize the experimental Nutstore AI service if it is available for your account.
2. Add a provider, API key, and model, or authorize Nutstore AI.
3. Select a default model.
4. Click the robot ribbon icon, or run **Open chatbox** from the command palette.
5. Optionally configure Explorer or Memory subagents, add MCP servers, or manage Skills.

Capabilities vary by provider and model. Nutstore AI is experimental and is not available to every account.
Capabilities vary by provider and model.

#### Permissions

Expand Down
5 changes: 2 additions & 3 deletions esbuild.config.mjs
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
import dotenv from 'dotenv'
import esbuild from 'esbuild'
import { readFileSync } from 'node:fs'
import { existsSync, readFileSync } from 'node:fs'
import process from 'node:process'
import { createBuildPlugins } from './scripts/esbuild/plugins/index.mjs'

const pkgJson = JSON.parse(readFileSync('./package.json', 'utf-8'))
dotenv.config()
if (existsSync('.env')) process.loadEnvFile('.env')

const prod = process.argv[2] === 'production'
process.env.NODE_ENV = prod ? 'production' : 'development'
Expand Down
127 changes: 21 additions & 106 deletions eslint.config.mts
Original file line number Diff line number Diff line change
Expand Up @@ -69,25 +69,21 @@ const markdownPlugin = markdown as unknown as NonNullable<

export default defineConfig([
{
ignores: ['node_modules/**', 'dist/**', 'main.js', 'coverage/**'],
ignores: [
'node_modules/**',
'dist/**',
'main.js',
'styles.css',
'coverage/**',
],
},

...obsidianRecommended,

// Type-aware linting uses the repository's single root TypeScript project so
// its ambient declarations are loaded together with every linted source file.
{
files: typedFiles,
languageOptions: {
parserOptions: {
project: './tsconfig.json',
tsconfigRootDir: configDir,
},
},
files: codeFiles,
rules: {
// This rule mis-models detached elements created from an owner Document
// and suggests Window helpers that are absent from Obsidian's Window type.
'obsidianmd/prefer-create-el': 'off',
'eslint-comments/no-restricted-disable': 'off',
},
},

Expand All @@ -110,26 +106,25 @@ export default defineConfig([
},
},

// Solid owns TSX-specific semantics.
{
files: ['**/*.tsx'],
...solidConfig,
},

// eslint-plugin-unused-imports owns the complete unused-declaration domain
// for TypeScript files so imports are not reported twice.
// Use one TypeScript project so all source files share ambient declarations.
{
files: typedFiles,
languageOptions: {
parserOptions: {
project: './tsconfig.json',
tsconfigRootDir: configDir,
},
},
plugins: {
'unused-imports': unusedImports,
},
rules: {
'no-undef': 'off',

// unused-imports handles both imports and variables without duplicate reports.
'@typescript-eslint/no-unused-vars': 'off',
'@typescript-eslint/no-unsafe-assignment': 'off',
'@typescript-eslint/no-unsafe-argument': 'off',
'@typescript-eslint/no-misused-promises': 'off',

'unused-imports/no-unused-imports': 'error',
'unused-imports/no-unused-vars': [
Expand All @@ -155,10 +150,12 @@ export default defineConfig([
},
},

// Core ESLint cannot see assignments performed by Solid JSX ref bindings.
{
...solidConfig,
files: ['**/*.tsx'],
rules: {
...solidConfig.rules,
// Core ESLint cannot see assignments performed by Solid JSX ref bindings.
'no-unassigned-vars': 'off',
},
},
Expand All @@ -172,8 +169,6 @@ export default defineConfig([
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/await-thenable': 'off',
'@typescript-eslint/no-unnecessary-type-assertion': 'off',
'@typescript-eslint/no-unsafe-argument': 'off',
'@typescript-eslint/no-unsafe-assignment': 'off',
'@typescript-eslint/no-unsafe-call': 'off',
'@typescript-eslint/no-unsafe-member-access': 'off',
'@typescript-eslint/no-unsafe-return': 'off',
Expand All @@ -186,86 +181,6 @@ export default defineConfig([
},
},

{
files: [
'src/ai/chat/messages/export-session.ts',
'src/ai/transport/provider-fetch.ts',
],
rules: {
// These adapters need the Fetch response/stream contract; requestUrl does
// not expose an equivalent interface.
'no-restricted-globals': 'off',
},
},

{
files: [
'src/components/McpServerEditorModal.ts',
'src/components/ProviderEditorModal.ts',
],
rules: {
// URL placeholders are machine-oriented examples, not prose UI labels.
'obsidianmd/ui/sentence-case': 'off',
},
},

{
files: ['src/ai/chat/messages/ui-message.ts'],
rules: {
// Reads the deprecated field solely to migrate persisted legacy sessions.
'@typescript-eslint/no-deprecated': 'off',
},
},

{
files: ['src/polyfill.ts'],
rules: {
// This bootstrap must attach process to the host global in Node tests and
// browser windows; the window-only recommendation cannot express that.
'obsidianmd/no-global-this': 'off',
},
},

{
files: ['src/ai/tools/bash/fs.ts', 'src/utils/local-vault-io.ts'],
rules: {
// These reusable low-level adapters intentionally depend only on Vault;
// callers that own an App use FileManager.trashFile directly.
'obsidianmd/prefer-file-manager-trash-file': 'off',
},
},

{
files: ['src/settings/**/*.ts'],
rules: {
// The declarative settings API requires Obsidian 1.13, while this plugin
// intentionally supports the declared 1.7.2 minimum.
'obsidianmd/settings-tab/prefer-setting-definitions': 'off',
'obsidianmd/settings-tab/prefer-update-over-display': 'off',
},
},

// package.json is already parsed and owned by eslint-plugin-obsidianmd's
// recommended config. Only override its dependency policy here instead of
// registering another @eslint/json plugin instance for the same file.
{
files: ['package.json'],
rules: {
'depend/ban-dependencies': [
'error',
{
presets: ['native', 'microutilities', 'preferred'],
allowed: [
'builtin-modules',
'dotenv',
'eslint-plugin-import',
'lodash-es',
],
},
],
},
},

// Strict JSON. package.json is excluded because obsidianmd already owns it;
// tsconfig files use JSONC semantics below.
{
Expand Down Expand Up @@ -338,7 +253,7 @@ export default defineConfig([
// outside the generic CSS validator's model.
'css/no-invalid-at-rules': 'off',
'css/no-invalid-properties': 'off',
'css/no-important': 'off',
'css/no-important': 'error',
'css/use-baseline': 'off',
},
},
Expand Down
Loading
Loading