Commit Graph
2849 Commits
Author SHA1 Message Date
LuoQianhong 6c4e70262e fix(extension): 完成 #588 跨浏览器与登录态实站验收 (#611)
* fix(extension): correct cross-browser clipping and record live acceptance

* fix(extension): use string prefix check for Jike image URLs
2026-10-18 12:09:07 +08:00
tianma-if dca7757caa fix(ios): preserve shared clip body during editor initialization (#601) 2026-10-18 12:02:32 +08:00
Dariusz Korytoandtianma-if df22f55d1c feat(docker): report image build metadata in System information (#602)
Docker instances reported most deployment fields as unknown. Report how
and when the container image was built, separately from how the
instance was deployed:

- Dockerfile: optional EDGE_EVER_BUILD_CREATED_AT, EDGE_EVER_BUILD_TRIGGER
  and EDGE_EVER_BUILD_METHOD build args, empty by default.
- /api/health (self-hosted-bun only): optional buildCreatedAt and
  buildProvenance. deploymentVersionCreatedAt and deployment keep their
  meaning and stay runtime-supplied; Cloudflare responses are unchanged.
- docker-image.yml: official images record the build time and their
  provenance. Draft-release builds dispatched with release_tag are
  github_release, main pushes main_push, other dispatches manual.
  The container test checks the health response for a metadata build
  with runtime overrides and for a default self-build; the post-publish
  audit checks the published image.
- Add an explicit `docker` deployment method. It is never inferred from
  the runtime, and the registry source still comes only from
  EDGE_EVER_CONTAINER_IMAGE.
- Web/desktop show "Image built at" and "Image build source" for Docker;
  Android shows "Image built at". Older clients ignore the new fields.
- Document the build args and runtime variables in both Docker guides.

Co-authored-by: tianma-if <yingwaizhiying@gmail.com>
2026-10-18 11:43:41 +08:00
Dariusz Korytoandtianma-if 5ac19b542b feat(web): show a QR code for note and notebook share links (#610)
Opening a shared note on a phone meant copying the link to another
device. Add a collapsible "QR code" section to the note and notebook
share dialogs that renders the public link as a scannable code.

- Rendered with qrcode.react 4.2.0 (SVG, no dependencies), loaded with
  the share dialogs only.
- Dark modules on a white panel in every theme so phone cameras can
  read it; labelled for screen readers, no native title tooltip.
- Hidden for password-protected links, so the code never replaces the
  password the recipient still has to receive separately.
- Copy in all four catalogs.

Co-authored-by: tianma-if <yingwaizhiying@gmail.com>
2026-10-18 11:39:00 +08:00
Dariusz Korytoandtianma-if d0f441dafa fix(web): localize untitled notes and diagrams on public share pages (#605)
* fix(web): show the localized label for untitled notes everywhere

Untitled notes are stored with the zh-CN default title, and several views
only replaced an empty title, so they showed 无标题笔记 in every locale.
The visible cases were the public share page (heading and browser tab),
the public notebook site, AI companion cards and mentions, the note link
picker, link text inserted for a note, and the title of a duplicated
note.

Add getMemoDisplayTitle() next to DEFAULT_MEMO_TITLE and use it in those
views, matching what MemoCard already does with isDefaultMemoTitle.

* fix(web): localize diagrams and content label on the public share page

The public share page passed zh-CN to read-only diagrams for every
language other than English, so Japanese and Polish visitors saw Chinese
diagram labels. Resolve the locale with resolveSupportedLocale(), which
the diagram renderer already supports for all four languages.

Also translate the note content aria-label, which was hard-coded in
English.

---------

Co-authored-by: tianma-if <yingwaizhiying@gmail.com>
2026-10-18 11:26:50 +08:00
Dariusz Korytoandtianma-if 82dac9b5cb fix: keep share and form links out of search indexes and caches (#608)
Public share and form pages only added a robots meta tag from JavaScript,
so the HTML for /share/* and /form/* was served without any indexing or
caching directive, and the form page had none at all. Error responses
from /api/public/* also lacked X-Robots-Tag.

Send one policy everywhere a token-bearing link is served:

  X-Robots-Tag: noindex, nofollow, noarchive, nosnippet, noimageindex
  Cache-Control: private, no-store
  Referrer-Policy: no-referrer

- /api/public/*: shared middleware in the application, so it applies on
  Cloudflare and Docker, including 404/403 responses. Routes that already
  set Cache-Control keep it.
- /share/* and /form/* HTML: _headers rules for Cloudflare static assets
  and the self-hosted static server.
- Referrer-Policy keeps the share token out of Referer headers sent to
  linked sites.

robots.txt is deliberately not used to block these paths: a disallowed
URL can still be indexed from external links, because crawlers never see
the noindex header.

Co-authored-by: tianma-if <yingwaizhiying@gmail.com>
2026-10-18 11:23:42 +08:00
Dariusz Koryto d269c2f3b6 fix(site): sync manual deployment step 5 with root READMEs (#604)
The README rewrite in d635c45f changed the "Build & Verify" step but left
the product site's manual deployment copy unchanged, so the
"product site deployment prompts mirror the root READMEs" regression test
fails on main and on every open PR.
2026-10-18 11:20:36 +08:00
tianma-if e2b2f40e79 docs: refine feature matrix tagline to all-in-one workspace across all READMEs 2026-10-18 00:16:15 +08:00
tianma-if 052f3e5aba docs: remove past-tense qualifier from Evernote sync description 2026-10-18 00:06:19 +08:00
tianma-if 3c2fc29b3e docs: use pushpin icon for Cloudflare deployment notes across all READMEs 2026-10-17 23:59:53 +08:00
tianma-if fb2024d420 docs: remove redundant emojis inside Cloudflare notes across all READMEs 2026-10-17 23:57:25 +08:00
tianma-if 7f53889070 docs: separate Cloudflare deployment notes into dedicated details disclosure 2026-10-17 23:49:38 +08:00
tianma-if 1202f62934 docs: collapse monorepo project structure under details across all READMEs 2026-10-17 23:45:01 +08:00
tianma-if 7fb40ccf24 docs: restructure README information architecture across all languages 2026-10-17 23:41:48 +08:00
tianma-if 3779f2ad3a docs: balance hero composition across README and website 2026-10-17 23:05:07 +08:00
tianma-if f66c745fa7 docs(site): update hero image to v5 2026-10-17 22:47:25 +08:00
tianma-if 5f38573182 docs: add product hero across all README languages 2026-10-17 22:41:08 +08:00
tianma-if 61419abfd8 fix: only show extension review hint when waiting 2026-10-17 19:09:33 +08:00
tianma-if 55db1af4a6 docs: restructure features section into capabilities matrix across all READMEs 2026-10-17 19:03:13 +08:00
tianma-if 339b52cfef docs: streamline browser clipper description and expand supported platforms 2026-10-17 18:04:39 +08:00
tianma-if d635c45f36 docs: reorganize readme sections and fold manual cloudflare deployment 2026-10-17 17:41:10 +08:00
tianma-if 88079662bd Revert "docs: refresh multi-language readmes with hero showcase and structured comparison"
This reverts commit b63d0a68ba.
2026-10-17 16:11:28 +08:00
tianma-if 1b56903333 fix(poster): resolve element overlaps and standardize card sections on template switch 2026-10-17 12:15:26 +08:00
tianma-if b63d0a68ba docs: refresh multi-language readmes with hero showcase and structured comparison 2026-10-17 12:15:14 +08:00
tianma-if 4edadb101f feat(poster): refine built-in template font pairings with catalog display fonts 2026-10-17 11:40:44 +08:00
tianma-if 67f627cc3c feat(fonts): share all 23 poster fonts across typography pickers 2026-10-17 11:10:22 +08:00
tianma-if 7b2fce158d docs: clarify release contributor credits and simplify guidance 2026-10-17 10:44:57 +08:00
tianma-if 054a93f4ae fix(web): split image font coverage tables from the editor bundle 2026-10-17 01:30:04 +08:00
tianma-if 8820de1273 chore: release v1.121.0 [skip ci] 2026-10-17 01:23:52 +08:00
tianma-if 9df386dee7 test: align font preference assertions with unified catalog 2026-10-17 01:22:14 +08:00
Dariusz Koryto ccc5ed3f29 refactor: remove unused code and enforce no-unused-vars (#598)
* refactor: remove unused imports, variables and parameters

Remove the 110 bindings reported by no-unused-vars:

- 78 unused imports. Nine whole value-import statements disappear:
  shadcn/ui input, tooltip, button and switch, MobileWebClipCapture,
  AccountSecurityModal and @/lib/api in plugin-host. None of these
  modules has top-level side effects beyond displayName assignments,
  and @/lib/api is still imported by 60 other web modules. The other
  removals are type-only imports or bindings from modules that stay
  imported, so module evaluation is unchanged.
- Dead helpers: appendResourceMarkdown, handleTogglePin (mobile),
  CheckCircleCheck, moveTargetTitle, moveTargetSelectRef,
  handleMoveTargetSelectKeyDown (memo list), copiedLabel (share
  dialog), and an unused palette and flowchart in the diagram editor.
- Component props that are passed but never read are dropped from the
  destructuring only. Their prop types and call sites are unchanged,
  so no caller changes behaviour.
- Tests: iterate Object.values() where keys were unused, and drop
  unused fixture bindings and callback parameters.

* ci: enforce no-unused-vars in oxlint

Turn the rule on with the conventional escapes: names starting with an
underscore and rest siblings used to omit a property
(`({ id, ...item }) => item`) are allowed.
2026-10-17 01:11:05 +08:00
tianma-if 43dd421b31 docs: credit Firefly Card in all README acknowledgements 2026-10-17 01:08:12 +08:00
tianma-if 2605774ecd docs(site): modernize three-pane and brand messaging across locales 2026-10-17 01:05:49 +08:00
tianma-if 8726df7542 feat(fonts): show loading status and retry failed font loads 2026-10-17 01:03:25 +08:00
tianma-if 9dc05c2480 feat(fonts): unify catalog for body and poster editors 2026-10-16 22:59:19 +08:00
tianma-if 12853c0624 fix(poster): move font selector to top of inspector 2026-10-16 22:49:42 +08:00
tianma-if a2a0f37377 Merge remote-tracking branch 'origin/main' 2026-10-16 22:41:16 +08:00
tianma-if 20a3851958 feat(share): add cached fonts and font picker previews 2026-10-16 22:40:12 +08:00
tianma-if 1d72367a9b fix(web): make save status tooltips keyboard accessible 2026-10-16 22:10:30 +08:00
Dariusz Koryto 50e4a1a7f2 fix(i18n): localize the suspicious overwrite save rejection (#593)
The API rejects a save that changes the title while most of the note
content disappears with an English message, and clients showed it
verbatim in every locale.

- shared: add editor.saveState.errorReason.suspiciousOverwrite in all
  four catalogs and getMemoSaveErrorReasonKey(), matching the error code
  or the server message; the API reuses the exported code and message.
- desktop sync details: translate the item by lastErrorCode.
- Android: map the stored message to its zh-CN source text so the
  localized components translate it.
- web editor: show the reason in the save status tooltip and label
  instead of the bare "Could not save".
2026-10-16 22:09:26 +08:00
Dariusz Korytoandtianma-if ee5e9621d5 fix(mobile): keep automatic sync alive when settling a pass fails (#597)
The automatic sync runner reset runningRef inside a finally block, after
awaiting refreshSyncQueueItems(). If reading the queue threw there,
runningRef stayed true and every later call returned early as if a pass
were still running, so automatic sync stopped until the app restarted.
A failing getMobileSyncRetryDelay() also surfaced as an unhandled
rejection from the void-ed run.

Move the settle step into settleMobileSyncPass(), where refreshing the
visible queue and reading the retry delay each handle their own errors
and the runner is always marked idle. Ordering is unchanged: refresh,
mark idle, run a pass requested meanwhile, otherwise schedule the retry.
This also removes the return inside finally reported by
no-unsafe-finally.

Co-authored-by: tianma-if <yingwaizhiying@gmail.com>
2026-10-16 22:07:23 +08:00
tianma-if 29ff4d14e0 Merge remote-tracking branch 'origin/main' 2026-10-16 21:58:11 +08:00
tianma-if 776fc3b566 feat(share): refine image themes and persist settings across clients 2026-10-16 21:57:49 +08:00
Dariusz Koryto bec688b91a ci: add oxlint correctness check and resolve its findings (#592)
* refactor: resolve oxlint correctness findings without behavior changes

- Snapshot iterations that mutate their collection with Array.from()
  instead of a spread (live childNodes, self-removing disposers, a Set
  extended inside its own loop).
- Drop empty spread fallbacks, redundant regex escapes, Boolean() casts
  inside negations, a rethrow-only try/catch and statement ternaries.
- Use startsWith/endsWith for anchored literal checks in the extension.
- List U+FE0F explicitly in the mobile attachment emoji class; the
  matched set is unchanged.
- Fix the WeChat copy fixture, where \oint in a template literal lost its
  backslash and the block formula never exercised \oint.
- Document the intentional control-character regexes (filename
  sanitizing and input validation), the throwing provider stream test,
  Astro's generated type reference and the mobile auto-sync finally
  block with narrow inline exceptions.

* ci: run oxlint correctness rules on pull requests

Pin oxlint 1.88.0 and enable only its correctness category across apps/
and packages/, excluding build output, vendored code and the iOS app.
Findings are errors and the script passes --deny-warnings, so CI fails
on any finding. no-unused-vars stays off until unused code is removed
in a dedicated pass.
2026-10-16 21:57:36 +08:00
Dariusz Koryto c2ff5ca1b6 fix(diagram): keep the shape menu from blocking the editor (#595)
The shape-library trigger opened its menu on every pointerenter. When the
editor replaced the note list under a pointer that did not move, or when
the pointer only passed over the toolbar, the menu opened by itself and
stayed open. For mind maps and flowcharts that menu was modal, so the
back-to-list button could not be pressed until the menu was closed. On
touch screens pointerenter fires right before the pointerdown that
toggles the menu, so a tap could open it and close it again.

- Open the menu on hover only for mouse pointers.
- Make the mind-map and flowchart insert menu non-modal, as the
  architecture library already is.
2026-10-16 21:53:10 +08:00
Dariusz Koryto d96b8f6e69 feat(diagram): start new diagrams with labels in the interface language (#594)
New mind maps, flowcharts and architecture diagrams always started with
Chinese labels, whatever language the interface used.

- createDefaultDiagramDocument takes optional starter labels. Without
  them it returns the existing Chinese starter unchanged, so the other
  callers (tests, desktop sidecar checks) keep their output.
- The web client passes translated labels from new diagram.seed keys in
  en-US, zh-CN, ja and pl.
- fitDefaultDiagramLabels sizes the nodes and lays the starter out again
  only when a translated label needs more room than the default label it
  replaces, so the Chinese starter keeps its tuned geometry. The helper is
  loaded with the lazily loaded diagram editor, which keeps dagre out of
  the workspace chunk; if that import fails the note is still created
  with the starter geometry.
2026-10-16 21:53:03 +08:00
Thorsten Ruf 640f973997 fix(web): open internal note links in the target notebook (#581)
* fix(web): open linked notes in their target notebook

* fix(web): release pending note selection on manual scope changes
2026-10-16 21:52:57 +08:00
tianma-if 70d486e4d7 fix(desktop): exclude development files from production packages 2026-10-16 21:44:29 +08:00
tianma-if 2c1b713ffa docs: modernize product positioning and decouple evernote coupling across locales 2026-10-16 13:09:13 +08:00
yulei666andClaude Opus 5.5 e85916de78 fix(desktop): connect to WorkBuddy 5.8+ lite-wb CLI over stdio ACP (#586)
WorkBuddy 5.8+ ships only dist/codebuddy-lite-wb.mjs. Its loader picks that
bundle only with CODEBUDDY_FORCE_LITE_WB_BUNDLE=1, otherwise --acp requires the
removed dist/codebuddy and exits. A bare --acp in the lite-wb bundle also runs a
one-shot print session; stdio ACP is served only together with --serve.

When the lite-wb layout is detected, set the bundle variable and launch with
--acp --serve --acp-transport stdio. --serve also starts WorkBuddy's local
gateway, so pin it to loopback with --host 127.0.0.1 and SERVER__HOST, which
overrides an inherited SERVER__HOST; the port stays WorkBuddy's random default.
Older layouts keep the previous launch, and the login flow adds only --port
when the command already serves.

Fixes #584

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 13:00:35 +08:00