Compare commits

..

167 Commits

Author SHA1 Message Date
john 82b74d71ad fix: relax REL release gate checks for normal Portal publishes
Memind CI / Test, build, and release guards (push) Failing after 1m35s
Ignore local .runtime build output in REL-01, accept missing Gitea CI when
origin/main matches HEAD, and compare two clean runtime rebuilds for REL-03.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-27 22:26:01 +08:00
john 90ee4c38d5 fix: honor stored Rybbit analytics secret fallback
Memind CI / Test, build, and release guards (push) Successful in 1m37s
2026-07-27 22:14:06 +08:00
john c7718c683b fix: inject Rybbit tracking on m.tkmind.cn publication pages
Memind CI / Test, build, and release guards (push) Successful in 1m36s
Publication routes and share shells were missing the Rybbit tracker, and
bootstrap now reuses the stored MindSpace analytics secret when Rybbit env
secret is absent.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-27 22:10:07 +08:00
john 48c61a3279 fix: harden long conversation continuity
Memind CI / Test, build, and release guards (push) Successful in 1m28s
2026-07-27 21:39:34 +08:00
john 5ae166fc44 fix: exclude page actions from long images 2026-07-27 21:21:54 +08:00
john d1be5d9e2a fix: preserve replies after session recovery 2026-07-27 19:59:09 +08:00
john 17c59fde71 fix: isolate visual tool failures from agent runs 2026-07-27 19:20:23 +08:00
john 7002007128 feat: add public page view action 2026-07-27 18:35:29 +08:00
john 77be18d340 Merge branch 'codex/active-development-20260727'
Memind CI / Test, build, and release guards (push) Successful in 1m48s
2026-07-27 18:07:48 +08:00
john 6878827224 mindspace: decouple page list sync latency 2026-07-27 18:07:16 +08:00
john 40dcdaf49f mindspace: guard split-service contract drift 2026-07-27 17:48:34 +08:00
john 70264a4c4c mindspace: version runtime contracts and audit packages 2026-07-27 17:43:38 +08:00
john e94052ff24 mindspace: close authority boundaries 2026-07-27 15:34:35 +08:00
john dfab78c75a feat(workflow): add risk-based release gates 2026-07-27 10:38:24 +08:00
john c88623855f fix(dev): stop stale frontend when portal exits 2026-07-27 10:28:12 +08:00
john 6b479c16f9 test: make thumbnail refresh assertion portable
Memind CI / Test, build, and release guards (push) Successful in 1m50s
2026-07-27 09:43:43 +08:00
john 291178d2c3 chore: stop tracking generated runtime artifacts
Memind CI / Test, build, and release guards (push) Failing after 9m20s
2026-07-27 09:08:55 +08:00
john 56ff170a60 fix(chat): recover session list from snapshots 2026-07-27 09:08:55 +08:00
john 32da0c0583 fix(api): retry transient session reads safely 2026-07-27 09:08:54 +08:00
john 0708d56d61 docs: record obsolete branch disposition 2026-07-27 09:08:54 +08:00
john 5ca6ed9094 fix(release): allow stable fallback for release-only artifact promotions
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-27 08:43:00 +08:00
john cb38225704 fix(release): correct ahead/behind parsing for REL-02
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-27 08:40:15 +08:00
john 6e25008df2 fix(release): allow REL-02 when main is ahead with successful CI evidence
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-27 08:38:09 +08:00
john a6a9bb4eab feat(release): add incremental gate and auto CI status for 103 publish
When the runtime artifact is unchanged, carry forward prior gate results and
re-run only REL scenarios; resolve REL-02 from Gitea commit status and allow
stable promotion when canary matches the same artifact bundle.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-27 08:32:12 +08:00
tkmind 9e2aa4f71d Merge pull request 'fix(release): harden stable promotion after canary acceptance' (#35) from codex/fix-stable-promotion-release into main
Memind CI / Test, build, and release guards (push) Successful in 2m5s
2026-07-27 00:04:28 +00:00
john 41bf775c4c fix(release): harden stable promotion after canary acceptance
Memind CI / Test, build, and release guards (pull_request) Successful in 13m26s
Verify matching 103 canary evidence before 8081 promotion, fix agent-run
drain JSON parsing, tolerate macOS full-backup tar races, and extend goosed
remount health waits for non-interactive SSH releases.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-27 07:09:27 +08:00
tkmind 67bf2c2bbb Merge pull request 'fix: align DeepSeek canary tool rounds with gate' (#34)
Memind CI / Test, build, and release guards (push) Successful in 2h57m1s
Merge production canary DeepSeek tool-round compatibility lifecycle and regression coverage.
2026-07-26 16:25:24 +00:00
john fb6865638a fix: align DeepSeek canary tool rounds with gate
Memind CI / Test, build, and release guards (pull_request) Successful in 1m32s
2026-07-26 23:49:32 +08:00
john 046704816f fix: use container MCP path in portal canary
Memind CI / Test, build, and release guards (push) Successful in 1m41s
2026-07-26 22:34:58 +08:00
john 02f2dc6b17 fix: preserve canary release stdin across edge checks
Memind CI / Test, build, and release guards (push) Successful in 1m35s
2026-07-26 21:24:23 +08:00
john 473ad80882 fix: route portal canary through isolated edge tunnel
Memind CI / Test, build, and release guards (push) Has been cancelled
2026-07-26 20:30:56 +08:00
john 286069449b feat: add guarded portal canary release
Memind CI / Test, build, and release guards (push) Failing after 2m14s
2026-07-26 19:51:44 +08:00
john 058d646b32 chore: ignore generated release gate reports
Memind CI / Test, build, and release guards (push) Successful in 3m58s
2026-07-26 19:01:41 +08:00
john 441703de32 fix: stabilize page data release gate scenarios
Memind CI / Test, build, and release guards (push) Successful in 1m58s
2026-07-26 17:41:45 +08:00
john bb6b70a8c4 test: make page data delivery scenarios explicit
Memind CI / Test, build, and release guards (push) Successful in 1m52s
2026-07-26 16:17:36 +08:00
john e885310f39 fix: isolate packaged gate writable roots
Memind CI / Test, build, and release guards (push) Successful in 4m1s
2026-07-26 15:31:31 +08:00
john f1f9a1cf8f fix: ignore generated gate artifacts in cleanliness check
Memind CI / Test, build, and release guards (push) Successful in 1m59s
2026-07-26 15:20:14 +08:00
john ea07f6f250 fix: isolate artifact rebuild from release suites
Memind CI / Test, build, and release guards (push) Has been cancelled
2026-07-26 15:19:30 +08:00
john b1577a16e9 fix: harden release gate and page delivery
Memind CI / Test, build, and release guards (push) Failing after 12m3s
2026-07-26 14:32:01 +08:00
john d3141a3e91 feat(excel-analyst): restore enhanced report HTML template for excel_report
Memind CI / Test, build, and release guards (push) Successful in 4m34s
Move report generation into excel-report-html.mjs so excel_report matches the hand-enhanced layout with KPI cards, charts, and insight cards, while keeping fact-model validation in the analysis engine.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-26 09:58:49 +08:00
john 8ccf2db05c feat(page-data): add validation suggestions, repair path, and thinking fixes
Memind CI / Test, build, and release guards (push) Failing after 3m18s
Map Page Data failure codes to Chinese remediation hints, trigger one-shot
goosed repair for remediable cases, and recover poisoned thinking sessions.
Route local DeepSeek through the no-think proxy via host.docker.internal so
tool rounds no longer hit reasoning_content 400; document gate and case-study
scenarios for event registration repair.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-25 23:01:55 +08:00
john 6b6f9ed01c fix: unblock local news page generation 2026-07-25 21:55:00 +08:00
john 793e64bfbc fix: preserve page skill user input 2026-07-25 20:26:20 +08:00
john 721db19a92 feat(orchestrator): enforce Page Data validation gate 2026-07-25 14:27:07 +08:00
john 417aa9c78b feat(orchestrator): observe Page Data validation 2026-07-25 14:16:57 +08:00
john e02495a6c0 merge: integrate recent product analytics and Aider development 2026-07-25 09:51:10 +08:00
john da818bbbbc merge: record adapted Aider development branch 2026-07-25 09:50:45 +08:00
john d2cfd54d43 merge: record adapted product analytics branch 2026-07-25 09:50:42 +08:00
john 104fb4e370 feat: complete Aider Page Data review workflow 2026-07-25 09:48:12 +08:00
john 0122d89db3 feat: complete Aider Page Data review workflow 2026-07-25 09:47:25 +08:00
john be9c25f1d0 feat: add fail-closed Aider development skill 2026-07-25 09:46:55 +08:00
john 1c82b34ad9 feat: add attributable page analytics 2026-07-25 09:46:10 +08:00
john d479e89fc7 feat: track Memind product analytics 2026-07-25 09:44:26 +08:00
tkmind 258e4a8a07 Merge pull request 'Fix Phase 5 documentation whitespace CI failure' (#32) from codex/fix-phase5-doc-whitespace into main
Memind CI / Test, build, and release guards (push) Successful in 2m42s
2026-07-25 01:31:01 +00:00
john 4c1890f344 fix(ci): remove trailing whitespace from phase 5 docs
Memind CI / Test, build, and release guards (pull_request) Successful in 2m22s
2026-07-25 09:27:40 +08:00
tkmind 299bee82ba Merge pull request 'fix: update DeepSeek direct models to v4' (#33) from codex/fix-deepseek-v4-models into main
Memind CI / Test, build, and release guards (push) Successful in 2m57s
2026-07-25 01:23:05 +00:00
john 69dabd5186 fix: update DeepSeek direct models to v4
Memind CI / Test, build, and release guards (pull_request) Successful in 1m51s
2026-07-25 09:20:00 +08:00
tkmind 62fd5188ab merge: Phase 5 pluggable LangGraph Orchestrator runtime
Memind CI / Test, build, and release guards (push) Failing after 1m35s
Merge PR #30 into main after review approval and successful CI #69.
2026-07-25 01:04:07 +00:00
tkmind 5d08d56f91 merge: harden zero-impact Orchestrator Shadow rollout
Memind CI / Test, build, and release guards (pull_request) Successful in 2m5s
Merge PR #31 into codex/langgraph-phase5-merge-fix after CI #68 passed.
2026-07-25 00:57:34 +00:00
john 6df82818c5 feat(orchestrator): harden zero-impact shadow rollout
Gate and bound Portal shadow observations while preserving Native execution. Add fail-closed service boundaries, terminal retention controls, Canary readiness telemetry, ops visibility, and isolated regression coverage.
2026-07-25 07:28:37 +08:00
john 08a48e4849 ci: skip redundant sharp arm64 install
Memind CI / Test, build, and release guards (pull_request) Successful in 1m48s
2026-07-25 05:56:03 +08:00
john db593c44fd fix: restore orchestrator shadow smoke command
Memind CI / Test, build, and release guards (pull_request) Has been cancelled
2026-07-25 05:23:46 +08:00
john 36eca57506 merge: include latest orchestrator worker alignment 2026-07-25 00:10:19 +08:00
john 764981c086 merge: integrate langgraph execution runtime
# Conflicts:
#	agent-run-gateway.test.mjs
#	capabilities.mjs
#	package.json
#	server.mjs
2026-07-25 00:09:15 +08:00
john cf36a9c84a fix: align orchestrator worker with local goosed 2026-07-25 00:04:50 +08:00
john e3d7b9ee76 docs: finalize orchestrator phase 5 operations 2026-07-24 23:55:40 +08:00
john f6f2cd0933 feat: harden orchestrator execution runtime 2026-07-24 23:53:32 +08:00
john 396bb78200 feat: expose executor job observability 2026-07-24 23:31:29 +08:00
john bbb43f97a3 feat: persist blocked executor jobs 2026-07-24 23:07:46 +08:00
john d21c4849a9 feat: add executor gateway contracts 2026-07-24 22:50:37 +08:00
john 19706eb3a0 feat: add workflow dry-run observability 2026-07-24 22:44:26 +08:00
john c9ad841543 feat: add dry-run workflow execution boundary 2026-07-24 22:30:41 +08:00
john 646178944d test: align wechat extension mocks 2026-07-24 22:19:24 +08:00
john 85e888b340 feat: add orchestrator canary readiness gate 2026-07-24 22:09:19 +08:00
john ff9c68e57f docs: document orchestrator env export 2026-07-24 21:57:43 +08:00
john 3e57f85d3a feat: add orchestrator shadow observability 2026-07-24 21:44:21 +08:00
john 24336d0178 feat: add shadow LangGraph orchestrator runtime 2026-07-24 21:25:40 +08:00
john 46ea22b342 feat: add pluggable workflow orchestrator controls 2026-07-24 20:59:01 +08:00
john c5f84f54b9 feat: add fail-closed Aider development skill 2026-07-24 19:48:04 +08:00
john d87bfde501 merge: server architecture modularization 2026-07-24 19:18:14 +08:00
john 785731d98d refactor: modularize portal server and harden session recovery 2026-07-24 19:10:44 +08:00
john 1d291fd528 fix: restore page links after delayed materialization 2026-07-24 17:58:52 +08:00
john 550969bed2 fix: preserve delivered page links when auto images fail 2026-07-24 17:57:39 +08:00
john 412e5f149b fix: allow page clarification turns without delivery error 2026-07-24 17:37:05 +08:00
john 03f03cf7c5 merge: feature/page-data-dev-aider into main
Bring in Page Data Aider dev loop, adm code-run policy UI, and customer order demo.
Keep system disclosure policy and agent code-run admin wiring side by side.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-24 14:42:25 +08:00
john 54637beffb fix preview sandbox and local analytics proxy 2026-07-24 14:21:06 +08:00
john 3fd1db8c2f fix: resolve deep search runtime symlink
Memind CI / Test, build, and release guards (pull_request) Successful in 3m48s
Memind CI / Test, build, and release guards (push) Successful in 4m2s
2026-07-24 10:39:45 +08:00
tkmind 6573c6bee0 merge: fix Deep Search LaunchAgent startup
Memind CI / Test, build, and release guards (push) Successful in 3m28s
CI passed; merge the verified first-install LaunchAgent and rollback fix.
2026-07-24 02:31:16 +00:00
john 22a45f34f5 fix: start deep search launchagent reliably
Memind CI / Test, build, and release guards (pull_request) Successful in 4m7s
2026-07-24 10:26:16 +08:00
tkmind 25c09f1e8f merge: production-ready Deep Search service
Memind CI / Test, build, and release guards (push) Successful in 3m7s
CI passed; merge the verified MindSearch and standalone Deep Search production runtime.
2026-07-24 02:18:16 +00:00
john 53ed38c250 feat: prepare deep search production runtime
Memind CI / Test, build, and release guards (pull_request) Successful in 4m4s
2026-07-24 09:53:06 +08:00
john 46041c3456 fix: allow deep search llm gateway auth 2026-07-24 09:40:58 +08:00
john 784a10a592 feat: configure deep search llm models 2026-07-24 09:40:58 +08:00
john be1e4c18c0 feat: implement local deep search engine 2026-07-24 09:40:58 +08:00
john 4e36b98c9e feat: add pluggable search service registry 2026-07-24 09:40:58 +08:00
tkmind 48e9f68211 Merge pull request 'feat: add system disclosure policy gate' (#26) from codex/system-disclosure-policy into main
Memind CI / Test, build, and release guards (push) Successful in 3m57s
Reviewed-on: #26
2026-07-23 15:05:58 +00:00
john 205b5fd8be feat: add system disclosure policy gate
Memind CI / Test, build, and release guards (pull_request) Successful in 3m14s
2026-07-23 22:53:15 +08:00
john dab6140f99 feat: Page Data dev loop, adm Code Run UI, and customer order demo
Add verify→Aider→OpenHands dev loop, memindadm config/history UI, and john4
customer-order Page Data demo with scenario + verification scripts.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-23 22:11:18 +08:00
john 239c41f935 feat: add memindadm runtime policy for agent code runs (Phase 1.5)
Persist code-run gates in admin DB and expose them via /auth/status so H5 can honor runtime policy without VITE rebuilds.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-23 21:33:27 +08:00
john 13f5c740a1 feat: add page_data_dev code-run path and adm policy design docs
Introduce Page Data dev repair intent routing, page_data_dev taskType
autodetect, and help-code02 memindadm runtime policy specification.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-23 21:31:09 +08:00
john 898f6fff44 docs: add Page Data Aider dev supplement scheme (help-code01)
Document the Goose + verify + Aider L2 workflow for Page Data simple
system bug fixing during development, without replacing the main path.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-23 21:16:13 +08:00
john ba6cc10f08 merge: semantic WeChat session actions
Memind CI / Test, build, and release guards (push) Successful in 2m39s
2026-07-23 17:44:04 +08:00
john 7e20ec14f1 feat: add semantic WeChat session actions 2026-07-23 17:18:25 +08:00
john 890264ba10 feat: combine dedicated and web search providers 2026-07-23 12:38:20 +08:00
john d9eb11f5f5 feat: refresh MeMind welcome copy 2026-07-23 11:48:56 +08:00
john 6ee8542da2 fix: stop stuck loading after session run conflict 2026-07-23 11:48:56 +08:00
john baa383548c Merge fix: harden agent and WeChat run completion
Memind CI / Test, build, and release guards (push) Has been cancelled
2026-07-23 10:24:40 +08:00
john a69e2766ed fix: harden agent and WeChat run completion 2026-07-23 10:24:21 +08:00
tkmind d81e798b28 Merge pull request #25: fix WeChat session isolation and page links
Memind CI / Test, build, and release guards (push) Successful in 3m44s
修复微信历史图片会话污染、换新会话失效及普通聊天误追加历史页面链接。
2026-07-22 06:16:26 +00:00
john db225b784e fix(wechat): isolate stale images and page links
Memind CI / Test, build, and release guards (pull_request) Successful in 2m36s
2026-07-22 14:08:18 +08:00
tkmind aea3c1e83e Merge pull request #24: fix WeChat episodic recall
Memind CI / Test, build, and release guards (push) Successful in 3m9s
2026-07-22 05:42:38 +00:00
john 5242cbf08b fix: inject episodic memory into WeChat agent
Memind CI / Test, build, and release guards (pull_request) Successful in 3m24s
2026-07-22 13:41:40 +08:00
tkmind 881f70f4bf Merge pull request 'feat: 补充历史会话记忆召回' (#23) from codex/episodic-memory-recall into main
Memind CI / Test, build, and release guards (push) Successful in 3m53s
CI passed; merge episodic history recall with rollout gates.
2026-07-22 04:59:42 +00:00
john 93d7bc0cd5 feat: add episodic history recall
Memind CI / Test, build, and release guards (pull_request) Successful in 4m37s
2026-07-22 12:36:20 +08:00
tkmind 092ed16d82 Merge pull request 'fix: 修复微信服务号新缩略图交付失败' (#22) from codex/wechat-thumbnail-delivery-fix into main
Memind CI / Test, build, and release guards (push) Successful in 4m7s
Reviewed-on: #22
2026-07-22 04:21:16 +00:00
john cb62b36cd5 fix: recover WeChat page thumbnail delivery
Memind CI / Test, build, and release guards (pull_request) Successful in 5m1s
2026-07-22 11:51:48 +08:00
john 57d2c14fca fix(memory): honor empty extraction results
Memind CI / Test, build, and release guards (push) Successful in 2m55s
2026-07-22 11:43:45 +08:00
john d52aab8ab0 fix(memory): add bounded hybrid recall
Memind CI / Test, build, and release guards (push) Successful in 3m52s
2026-07-22 11:15:00 +08:00
john c10788dfe1 fix(memory): extract from original user messages
Memind CI / Test, build, and release guards (push) Successful in 2m59s
2026-07-22 10:56:18 +08:00
tkmind 1f9e147dea merge: retry missing WeChat page thumbnails
Memind CI / Test, build, and release guards (push) Successful in 2m59s
Retry a service-account page once in a fresh session when the first run omits its required current-run thumbnail; notify only after the retry also fails.
2026-07-22 01:43:27 +00:00
john 7b3acb6813 fix(wechat): retry missing page thumbnails in fresh sessions
Memind CI / Test, build, and release guards (pull_request) Successful in 4m1s
2026-07-22 09:38:13 +08:00
tkmind aafda0cf64 merge: trust configured imgproxy generated images
Memind CI / Test, build, and release guards (push) Successful in 3m40s
Service-account generated images may be served from the configured imgproxy origin. Preserve explicit origin trust and reject unknown hosts.
2026-07-22 01:10:46 +00:00
john c6ae7cd21c fix(wechat): trust configured imgproxy generated images
Memind CI / Test, build, and release guards (pull_request) Successful in 2m56s
2026-07-22 09:05:18 +08:00
tkmind 1765cac65a merge: honor explicit WeChat page generation negation
Memind CI / Test, build, and release guards (push) Successful in 2m49s
Merge real-WeChat acceptance fix after successful CI.
2026-07-21 15:44:24 +00:00
john efbbe69e2c fix(wechat): honor explicit page generation negation
Memind CI / Test, build, and release guards (pull_request) Successful in 2m56s
2026-07-21 23:40:29 +08:00
john c2e2209344 fix(memory): sync new memories into pgvector
Memind CI / Test, build, and release guards (push) Successful in 2m31s
2026-07-21 23:30:18 +08:00
tkmind 6f4a3b53d0 merge: add WeChat image generation delivery policy
Memind CI / Test, build, and release guards (push) Successful in 2m39s
Merge service-account image generation policy after successful CI validation.
2026-07-21 15:27:00 +00:00
john 28581310da feat(wechat): add image generation delivery policy
Memind CI / Test, build, and release guards (pull_request) Successful in 2m45s
2026-07-21 23:22:06 +08:00
john bfb1f6fea9 fix(memory): initialize candidates and enforce lifecycle rollout
Memind CI / Test, build, and release guards (push) Successful in 3m29s
2026-07-21 22:55:19 +08:00
tkmind 0dd9331e5b merge: verify MindSpace service replacement
Memind CI / Test, build, and release guards (push) Successful in 2m15s
CI run 1065 passed. Fixes the 8082 listener race and validates the replacement launchd job.
2026-07-21 10:59:04 +00:00
john 4e6db07123 fix: verify MindSpace service replacement
Memind CI / Test, build, and release guards (pull_request) Successful in 2m26s
2026-07-21 18:55:23 +08:00
tkmind fe4b8c0da9 merge: preserve MindSpace runtime data during release
Memind CI / Test, build, and release guards (push) Successful in 2m30s
CI run 1063 passed. Required release safety fix for the image_make production canary.
2026-07-21 10:41:21 +00:00
john fa777fa195 fix: preserve MindSpace runtime data during release
Memind CI / Test, build, and release guards (pull_request) Successful in 2m31s
2026-07-21 18:37:49 +08:00
john a4522854d8 feat: add attributable page analytics 2026-07-20 20:49:44 +08:00
john 175095cbf3 feat: track Memind product analytics 2026-07-20 20:19:52 +08:00
tkmind b63c906c23 merge: complete reviewed image generation delivery
Memind CI / Test, build, and release guards (push) Successful in 2m57s
Merge validated 0717-dev image generation delivery changes. No 103 runtime artifact or production deployment.
2026-07-20 12:09:06 +00:00
john 4b15610aa8 feat(image): complete reviewed generation delivery
Memind CI / Test, build, and release guards (pull_request) Successful in 2m47s
2026-07-20 20:04:53 +08:00
john fc3d27aae0 fix(mindspace): do not block home on job summary 2026-07-20 20:04:53 +08:00
john b6f2b40942 fix(page-data): isolate invalid workspace bindings 2026-07-20 20:04:53 +08:00
john 105a72c1f1 feat: add guarded image generation controls 2026-07-20 20:04:53 +08:00
john 72ed4dde83 fix: complete image_make asset delivery 2026-07-20 20:04:53 +08:00
john 9cf12e3786 feat: expose image generation to page agents 2026-07-20 20:04:53 +08:00
john 5b88f8ece5 feat: integrate image_make with MindSpace assets 2026-07-20 20:04:53 +08:00
john 91026882cb fix(mindspace): do not block home on job summary 2026-07-20 11:44:57 +08:00
john 1df2489831 fix(page-data): isolate invalid workspace bindings 2026-07-20 11:39:17 +08:00
john 8438eec08c feat: add guarded image generation controls 2026-07-20 07:37:43 +08:00
john a0043e95c1 fix: complete image_make asset delivery 2026-07-19 21:28:05 +08:00
john 32e697b698 feat: expose image generation to page agents 2026-07-19 21:28:05 +08:00
john 4959535b5e feat: integrate image_make with MindSpace assets 2026-07-19 21:28:05 +08:00
john 2f4366e882 merge: enable WeChat media for all users
Memind CI / Test, build, and release guards (push) Successful in 2m18s
2026-07-18 21:21:13 +08:00
john 2ce1527edd feat: enable WeChat media for all users 2026-07-18 21:20:56 +08:00
john 1161292482 merge: fix WeChat multi-image gray flow
Memind CI / Test, build, and release guards (push) Successful in 2m28s
2026-07-18 19:53:21 +08:00
john 711a7d2061 fix: aggregate WeChat multi-image batches 2026-07-18 19:53:09 +08:00
john 341cf5ae89 merge: fix WeChat media gray pipeline
Memind CI / Test, build, and release guards (push) Successful in 1m55s
2026-07-18 19:10:13 +08:00
john ae3e1ba3fa fix: recover stale WeChat active requests 2026-07-18 19:05:33 +08:00
john 8eaf4d23f3 fix: route WeChat media through shared vision pipeline 2026-07-18 18:15:22 +08:00
john 8ccaf3b39d merge: add WeChat media analysis gray rollout
Memind CI / Test, build, and release guards (push) Successful in 2m35s
2026-07-18 17:50:06 +08:00
john 94f347398d feat: gate WeChat media analysis by user 2026-07-18 17:46:20 +08:00
john fd3904fdee feat: add WeChat media analysis adapters 2026-07-18 17:41:32 +08:00
tkmind 055d53c58b Merge pull request 'fix(chat): translate session replay cursors' (#14)
Memind CI / Test, build, and release guards (push) Successful in 4m33s
Preserve Portal/Goose SSE cursor boundaries and recover Finish after reconnect.
2026-07-17 08:55:36 +00:00
john cce56a4c6a fix(chat): translate session replay cursors
Memind CI / Test, build, and release guards (pull_request) Successful in 2m55s
2026-07-17 16:49:31 +08:00
tkmind c9591bc4cf Merge pull request 'fix(analytics): identify Memind users before pageviews' (#13) from codex/fix-umami-users-identify into main
Memind CI / Test, build, and release guards (push) Successful in 4m25s
2026-07-17 06:17:00 +00:00
john ed9e23fc07 fix(analytics): identify Memind users before pageviews
Memind CI / Test, build, and release guards (pull_request) Successful in 3m11s
2026-07-17 14:10:36 +08:00
tkmind 25620be0b1 Merge pull request 'fix: sync npm lockfile for Excel runtime' (#12) from codex/fix-excel-package-lock into main
Memind CI / Test, build, and release guards (push) Successful in 3m39s
Keep package-lock.json aligned with the Excel runtime dependency so npm ci and release CI remain reproducible.
2026-07-17 04:16:20 +00:00
john e8a51506d0 fix: sync npm lockfile for Excel runtime
Memind CI / Test, build, and release guards (pull_request) Successful in 3m37s
2026-07-17 12:11:32 +08:00
tkmind 2f590464b4 Merge pull request 'fix: remount goosed after portal runtime swap' (#11) from codex/fix-goosed-remount into main
Memind CI / Test, build, and release guards (push) Failing after 1m23s
Ensure goosed containers remount the new Portal/MindSpace live directory after each atomic runtime swap.
2026-07-17 04:07:21 +00:00
john 0c1c0c3b48 feat: add pluggable Excel analyst report guard
Memind CI / Test, build, and release guards (push) Has been cancelled
2026-07-17 12:05:51 +08:00
697 changed files with 98607 additions and 66418 deletions
+91
View File
@@ -18,7 +18,18 @@ H5_PUBLIC_BASE_URL=http://127.0.0.1:5173
# MEMIND_ANALYTICS_URL=http://127.0.0.1:3100
# MEMIND_ANALYTICS_WEBSITE_ID=<local Umami Website ID>
# MEMIND_ANALYTICS_ID_SECRET=<local-only pseudonymization secret>
# MEMIND_ANALYTICS_IDENTITY_MODE=pseudonymous # use raw only in an approved first-party analytics environment
# MEMIND_ANALYTICS_DOMAINS=127.0.0.1,localhost
# Memind 产品壳层使用独立 Website,避免与用户生成页面的浏览口径混在一起
# MEMIND_PRODUCT_ANALYTICS_ENABLED=true
# MEMIND_PRODUCT_ANALYTICS_WEBSITE_ID=<local Umami product Website ID>
# Local Rybbit analytics (same-origin /rybbit proxy to rybbit.tkmind.cn).
# Create a Rybbit Site for localhost / 127.0.0.1, then set its numeric site_id.
# MEMIND_RYBBIT_ENABLED=true
# MEMIND_RYBBIT_URL=https://rybbit.tkmind.cn
# MEMIND_RYBBIT_SITE_ID=<numeric site id>
# MEMIND_RYBBIT_ID_SECRET=<local-only pseudonymization secret>
# 生产 H5 public base 当前临时切到 https://mm.tkmind.cn。
# 后续公网 H5 不再依赖 105 转发链路;m.tkmind.cn 仅作为 legacy/rollback 记录处理。
@@ -32,9 +43,12 @@ H5_PUBLIC_BASE_URL=http://127.0.0.1:5173
# Code-tool agent run 灰度开关(默认关闭)。
# 后端必须先开启 MEMIND_AGENT_CODE_RUNS_ENABLEDH5 构建开关才会生效。
# 开启后,页面编辑子聊天会传 tool_mode=code;普通聊天仍需同时开启 AUTODETECT 才会按文本自动识别代码任务。
# Phase 1.5memindadm 运行时策略优先于 VITE_;设为 env 可强制只读 env(紧急 override)。
# MEMIND_CODE_RUN_POLICY_SOURCE=env
# MEMIND_AGENT_CODE_RUNS_ENABLED=0
# VITE_AGENT_CODE_RUNS_ENABLED=0
# VITE_AGENT_CODE_RUNS_AUTODETECT=0
# VITE_AGENT_PAGE_DATA_DEV_AUTODETECT=0
# Tool Gateway Queue v0/agent/runs 后台任务队列,默认保守限流)。
# MEMIND_AGENT_RUN_QUEUE_CONCURRENCY=1
@@ -46,8 +60,36 @@ H5_PUBLIC_BASE_URL=http://127.0.0.1:5173
# MEMIND_AGENT_RUN_WORKER_BATCH_SIZE=1
# MEMIND_AGENT_RUN_HEARTBEAT_MS=30000
# MEMIND_AGENT_RUN_HEARTBEAT_STALE_MS=90000
# MEMIND_AGENT_RUN_RECOVERY_INTERVAL_MS=30000
# MEMIND_RUNTIME_BUILD_ID=<release-or-build-id>
# MEMIND_AGENT_RUN_WORKER_ID=<optional-instance-id>
# MEMIND_AGENT_RUN_WORKER_EXPECT_RUNNING=0
# LangGraph Orchestrator Shadow(默认完全不接入 Agent Run 请求路径)。
# 仅在独立 Orchestrator 已健康、service token 已配置后,先显式打开观察 wiring,
# 再通过 memindadm 选择 shadow。关闭 wiring 时不查询编排配置、不排队、不传用户数据。
# MEMIND_ORCHESTRATOR_SHADOW_OBSERVATION_ENABLED=0
# MEMIND_ORCHESTRATOR_URL=http://127.0.0.1:8093
# MEMIND_ORCHESTRATOR_SERVICE_TOKEN=<local-or-deployment-service-token>
# MEMIND_ORCHESTRATOR_SHADOW_MAX_CONCURRENCY=2
# MEMIND_ORCHESTRATOR_SHADOW_MAX_QUEUE=100
# 非 loopback URL 必须精确列入;逗号分隔,只接受 origin。
# MEMIND_ORCHESTRATOR_ALLOWED_ORIGINS=https://orchestrator.internal
# 真实执行交接是另一道独立闸门,默认保持关闭。
# MEMIND_ORCHESTRATOR_EXECUTION_HANDOFF_ENABLED=0
# MEMIND_ORCHESTRATOR_KILL_SWITCH=0
# Page Data 审查强制闸门(fail-closed)。默认关闭=仅观察/写建议,不改变 Native 成功语义。
# 生效前提:memindadm mode=shadow 且 MEMIND_ORCHESTRATOR_SHADOW_OBSERVATION_ENABLED=1。
# 本地/开发:保持 0。灰度强制审查再设 1。生产启用需 Ops 明确批准。
# 失败 UX:H5 会看到 codes 对应的中文纠正建议(page-data-validation-suggestions.mjs)。
# MEMIND_ORCHESTRATOR_PAGE_DATA_VALIDATION_GATE_ENABLED=0
# 可修复 codes 失败时,把纠正建议再发一轮给 goosed(每 run 最多 1 次;默认开启)。
# MEMIND_PAGE_DATA_SUGGESTION_REPAIR_ENABLED=1
# Orchestrator 终态数据保留清理默认关闭;在独立服务环境配置,建议真实 Canary 前明确周期。
# MEMIND_ORCHESTRATOR_RETENTION_DAYS=0
# MEMIND_ORCHESTRATOR_RETENTION_SWEEP_INTERVAL_MS=86400000
# MEMIND_ORCHESTRATOR_RETENTION_SWEEP_LIMIT=100
# Runtime SLO 日报(默认每日 23:55 写 reports/runtime-slo)。
# MEMIND_RUNTIME_REPORT_DIR=/Users/john/Project/Memind/reports/runtime-slo
# MEMIND_RUNTIME_SLO_HOUR=23
@@ -148,6 +190,16 @@ H5_ADMIN_PASSWORD=change-me-admin
# H5_LOCAL_LLM_API_KEY=ollama
# H5_LOCAL_LLM_NAME=Local Ollama 7B
H5_ACCESS_PASSWORD=change-me
# Portal API 访问策略第一阶段仅支持 off / shadow;shadow 只记录差异,不改变放行结果。
# MEMIND_PORTAL_ACCESS_POLICY_MODE=shadow
# 同一访问策略差异在窗口内只记录一次,后续日志携带累计与抑制次数。
# MEMIND_PORTAL_ACCESS_SHADOW_LOG_INTERVAL_MS=60000
# Phase C 灰度执行必须同时开启总开关并精确列出策略组;默认全部关闭,不支持 all。
# 可选组:legacy-page-data,page-data-public,plaza-optional-user
# MEMIND_PORTAL_ACCESS_POLICY_ENFORCEMENT_ENABLED=0
# MEMIND_PORTAL_ACCESS_POLICY_ENFORCE_GROUPS=
# 紧急熔断优先级最高;设为 1 后所有策略组立即回到旧鉴权路径(重启 Portal 生效)。
# MEMIND_PORTAL_ACCESS_POLICY_KILL_SWITCH=0
# 计费(Phase 2,金额单位均为人民币分)
# 默认按 Token 单价扣费;生产推荐开启成本模式(见 docs/h5-metering-gateway.md
@@ -252,6 +304,41 @@ VITE_TKMIND_WORKING_DIR=/Users/john/PycharmProjects/tkmind
# MINDSPACE_AGENT_JOBS_ENABLED=true
# MINDSPACE_INTERNAL_AGENT_SECRET=local-dev-secret
# MINDSPACE_FREE_PUBLIC_PAGE_LIMIT=10
# image_make 独立生图服务。只有 URL、Token 与 memind_adm 资产能力开关同时配置后才会调用。
# IMAGE_MAKE_BASE_URL=http://127.0.0.1:8080
# IMAGE_MAKE_TOKEN=dev-token
# IMAGE_MAKE_REQUEST_TIMEOUT_MS=15000
# IMAGE_MAKE_GENERATION_TIMEOUT_MS=600000
# IMAGE_MAKE_POLL_INTERVAL_MS=1000
# IMAGE_MAKE_MAX_RESULT_BYTES=20971520
# Optional local/provider-specific raster size overrides. Defaults remain defined by image_make presets.
# IMAGE_MAKE_HERO_WIDTH=768
# IMAGE_MAKE_HERO_HEIGHT=432
# IMAGE_MAKE_SEMANTIC_REVIEW_ENABLED=1
# IMAGE_MAKE_SEMANTIC_REVIEW_MIN_SCORE=70
# IMAGE_MAKE_SEMANTIC_REVIEW_MAX_ATTEMPTS=3
# H5_WECHAT_MP_FRESH_PAGE_THUMBNAILS=1
# H5_WECHAT_MP_FRESH_THUMBNAIL_REPAIR=0
# Sandbox MCP 调用 Portal 内部生图入口;容器内通常使用 host.docker.internal。
# MINDSPACE_AGENT_API_BASE_URL=http://127.0.0.1:8081/api
# ---------------------------------------------------------------------------
# MindSearch / standalone Deep Search
# ---------------------------------------------------------------------------
# Production SearXNG on 103 is bound to the host at 127.0.0.1:20080.
# Goosed MCP endpoints are automatically rewritten to host.docker.internal.
# TKMIND_SEARCH_SEARXNG_URL=http://127.0.0.1:20080/search
# TKMIND_SEARCH_MCP_HOST_GATEWAY=host.docker.internal
#
# Deep Search runs as an independently released LaunchAgent on 127.0.0.1:20100.
# Its production environment is stored separately at:
# /Users/john/Project/deep-search-runtime/shared/.env
# TKMIND_DEEP_SEARCH_SECRET=
# TKMIND_SEARCH_GITHUB_GATEWAY_URL=http://127.0.0.1:20100
# TKMIND_SEARCH_GITHUB_GATEWAY_SECRET=${TKMIND_DEEP_SEARCH_SECRET}
#
# GITHUB_TOKEN must only be set in the standalone Deep Search environment.
# Do not pass it to goosed MCP extension envs or commit it to Git.
# ---------------------------------------------------------------------------
# Memind runtime profile(本地 vs 生产 必须区分)
@@ -266,6 +353,10 @@ VITE_TKMIND_WORKING_DIR=/Users/john/PycharmProjects/tkmind
# 【本地开发 — 复制到 .env 的默认值】
MEMIND_RUNTIME_PROFILE=local
# Portal 代码目录与持久化数据目录分离(例如从 git worktree 启动)时显式设置。
# MindSpace/<userId>、users/ 与默认 data/mindspace 都以此目录为根;
# 前端 dist/public 等代码静态资源仍从当前 runtime 目录读取。
# MEMIND_PORTAL_H5_ROOT=/Users/john/Project/Memind
# MINDSPACE_STORAGE_ROOT 留空即可,自动使用 <repo>/data/mindspace
# 【本机 split-service 联调 — 需要独立 MindSpace LaunchAgent 已启动】
+10 -3
View File
@@ -42,9 +42,13 @@ jobs:
npm ci --include=optional
SHARP_ARM64_VERSION="$(node -p "require('./package-lock.json').packages['node_modules/@img/sharp-linux-arm64'].version")"
LIBVIPS_ARM64_VERSION="$(node -p "require('./package-lock.json').packages['node_modules/@img/sharp-libvips-linux-arm64'].version")"
npm install --no-save --package-lock=false \
"@img/sharp-linux-arm64@${SHARP_ARM64_VERSION}" \
"@img/sharp-libvips-linux-arm64@${LIBVIPS_ARM64_VERSION}"
if [[ ! -d node_modules/@img/sharp-linux-arm64 || ! -d node_modules/@img/sharp-libvips-linux-arm64 ]]; then
npm install --no-save --package-lock=false \
"@img/sharp-linux-arm64@${SHARP_ARM64_VERSION}" \
"@img/sharp-libvips-linux-arm64@${LIBVIPS_ARM64_VERSION}"
else
echo "Locked Sharp ARM64 optional packages are already installed"
fi
node -e "import('sharp').then((sharp) => sharp.default({ create: { width: 1, height: 1, channels: 4, background: '#000' } }).png().toBuffer())"
- name: Check patch formatting
@@ -53,6 +57,9 @@ jobs:
- name: Run full test suite
run: npm test
- name: Verify release gate and canary routing
run: npm run test:release-gate:unit
- name: Build production frontend
run: npm run build
+2
View File
@@ -3,6 +3,7 @@ ops/node_modules/
dist/
ops/dist/
.runtime/
.deep-search/
.env
.env.local
@@ -12,6 +13,7 @@ scripts/g2-aliyun-cert.env
*.log
*.pid
.local/
.release-gate/
MindSpace/
data/
-63
View File
@@ -1,63 +0,0 @@
Portal runtime artifact
This directory is meant to run on production without the source tree.
Required persisted items to inherit on the host:
.env
MindSpace/
data/
users/
.tailscale/
public/plaza-covers/
logs/
Bundled alongside server.mjs (required for sandbox-fs MCP):
mindspace-sandbox-mcp.mjs (esbuild bundle; includes schedule-service deps)
Post-deploy validation (scripts/check-mindspace-public-links.mjs):
Scans MindSpace/*/public/*.html for missing relative href/src/cover targets.
Runtime install mode: bundle-node-modules
Bundle target: node24
Platform agent skills (synced into user workspaces):
skills/
Key runtime differences must stay in .env, not in the artifact:
DATABASE_URL / MYSQL_*
H5_PUBLIC_BASE_URL
TKMIND_API_TARGETS / TKMIND_API_TARGET / TKMIND_API_TARGET_1
H5_USERS_ROOT / MINDSPACE_STORAGE_ROOT / MEMIND_SHARED_PUBLISH_ROOT
Deployment and operations transport:
H5 public domain: mm.tkmind.cn
Current public path: mm.tkmind.cn -> local nginx -> Portal :8081
Legacy rollback-only path: m.tkmind.cn -> 105 nginx -> reverse SSH tunnel -> Portal :8081
Future H5 traffic must not depend on 105 forwarding unless explicitly rolling back.
Streaming runtime operations:
node scripts/check-stream-runtime.mjs
node scripts/runtime-worker-drain.mjs status
node scripts/runtime-worker-drain.mjs reconcile
node scripts/runtime-worker-drain.mjs reconcile --apply
node scripts/runtime-worker-metrics.mjs status
node scripts/runtime-worker-metrics.mjs sample
bash scripts/install-runtime-metrics-agent.sh
node scripts/runtime-worker-heartbeat.mjs once
node scripts/runtime-worker-heartbeat.mjs serve
bash scripts/install-runtime-heartbeat-agent.sh
node scripts/runtime-slo-report.mjs
node scripts/runtime-slo-report.mjs --write-report
node scripts/runtime-slo-report.mjs --write-report --prune --retention-days 30
bash scripts/install-runtime-slo-report-agent.sh
bash scripts/install-runtime-slo-soak-agent.sh
node scripts/runtime-worker-drain.mjs drain goosed-3
node scripts/runtime-worker-drain.mjs undrain goosed-3
node scripts/check-tool-runtime.mjs
node scripts/check-agent-code-run-entry.mjs
curl -sk https://mm.tkmind.cn/api/runtime/status # includes toolRuntime.queue
node scripts/agent-run-worker.mjs --status
node scripts/agent-run-worker.mjs --once
bash scripts/install-agent-run-worker-agent.sh # installs disabled by default
node scripts/check-agent-run-worker.mjs # read-only LaunchAgent/queue check
node scripts/agent-run-guard.mjs # dry-run auto-pause guard check
node scripts/agent-run-guard.mjs --apply # stop worker and disable code-run gate when thresholds trip
bash scripts/install-agent-run-guard-agent.sh # installs guard LaunchAgent
-151
View File
@@ -1,151 +0,0 @@
import fs from 'node:fs';
import path from 'node:path';
const SKIP_REFERENCE = /^(?:https?:|mailto:|javascript:|data:|tel:|#|\/\/)/i;
const DOWNLOAD_EXTENSIONS = /\.(?:docx|doc|pdf|xlsx|xls|pptx|ppt|zip|rar|7z|csv)$/i;
export function isFilesystemPublicReference(raw) {
const value = String(raw ?? '').trim();
if (!value) return false;
if (SKIP_REFERENCE.test(value)) return false;
// /api/... and /MindSpace/... are server routes, not on-disk siblings of public HTML.
if (value.startsWith('/')) return false;
return true;
}
/** @deprecated use isFilesystemPublicReference */
export function isRelativePublicReference(raw) {
return isFilesystemPublicReference(raw);
}
export function isDownloadLikeReference(raw, source = '') {
if (!isFilesystemPublicReference(raw)) return false;
const ref = normalizeReferencePath(raw);
if (DOWNLOAD_EXTENSIONS.test(ref)) return true;
return /\bdownload\b/i.test(String(source ?? ''));
}
export function normalizeReferencePath(raw) {
const trimmed = String(raw ?? '')
.trim()
.split('#')[0]
.split('?')[0]
.trim();
if (!trimmed) return '';
try {
return decodeURIComponent(trimmed);
} catch {
return trimmed;
}
}
export function resolveReferencePath(htmlDir, raw) {
const ref = normalizeReferencePath(raw);
if (!ref) return null;
return path.resolve(htmlDir, ref);
}
function parseMindspaceCoverPaths(contentAttr) {
const paths = [];
if (!contentAttr) return paths;
let parsed = null;
try {
parsed = JSON.parse(contentAttr);
} catch {
for (const key of ['cover', 'image']) {
const match = contentAttr.match(new RegExp(`"${key}"\\s*:\\s*"([^"]+)"`));
if (match?.[1]) paths.push(match[1]);
}
return paths;
}
for (const key of ['cover', 'image']) {
if (parsed?.[key]) paths.push(String(parsed[key]));
}
return paths;
}
export function collectPublicHtmlReferences(html, htmlDir, { downloadsOnly = false } = {}) {
const refs = [];
const seen = new Set();
const add = (raw, source) => {
if (downloadsOnly && !isDownloadLikeReference(raw, source)) return;
if (!downloadsOnly && !isFilesystemPublicReference(raw)) return;
const ref = normalizeReferencePath(raw);
if (!ref) return;
const key = `${source}\0${ref}`;
if (seen.has(key)) return;
seen.add(key);
refs.push({
ref,
source,
resolvedPath: resolveReferencePath(htmlDir, ref),
});
};
for (const match of String(html ?? '').matchAll(/\b(?:href|src)\s*=\s*["']([^"']+)["']/gi)) {
add(match[1], match[0]);
}
if (!downloadsOnly) {
for (const match of String(html ?? '').matchAll(
/<meta\b[^>]*\bname\s*=\s*["']mindspace-cover["'][^>]*>/gi,
)) {
const tag = match[0];
const contentMatch =
tag.match(/\bcontent\s*=\s*"([^"]*)"/i) ?? tag.match(/\bcontent\s*=\s*'([^']*)'/i);
for (const coverPath of parseMindspaceCoverPaths(contentMatch?.[1])) {
add(coverPath, 'mindspace-cover');
}
}
}
return refs;
}
export function findMissingPublicHtmlReferences(htmlPath, html = null, options = {}) {
const resolvedHtmlPath = path.resolve(htmlPath);
const content = html ?? fs.readFileSync(resolvedHtmlPath, 'utf8');
const htmlDir = path.dirname(resolvedHtmlPath);
const missing = [];
const seen = new Set();
for (const item of collectPublicHtmlReferences(content, htmlDir, options)) {
const key = item.ref;
if (seen.has(key)) continue;
seen.add(key);
if (!item.resolvedPath || !fs.existsSync(item.resolvedPath)) {
missing.push({ htmlPath: resolvedHtmlPath, ...item });
}
}
return missing;
}
export function listPublicHtmlFiles(publishRoot, { userId = null } = {}) {
const root = path.resolve(publishRoot);
if (!fs.existsSync(root)) return [];
const userDirs = userId
? [path.join(root, userId)]
: fs.readdirSync(root, { withFileTypes: true }).filter((d) => d.isDirectory()).map((d) => path.join(root, d.name));
const files = [];
for (const userDir of userDirs) {
const publicDir = path.join(userDir, 'public');
if (!fs.existsSync(publicDir) || !fs.statSync(publicDir).isDirectory()) continue;
for (const name of fs.readdirSync(publicDir)) {
if (!name.toLowerCase().endsWith('.html')) continue;
files.push(path.join(publicDir, name));
}
}
return files.sort();
}
export function scanPublicHtmlLinks(publishRoot, options = {}) {
const issues = [];
for (const htmlPath of listPublicHtmlFiles(publishRoot, options)) {
issues.push(...findMissingPublicHtmlReferences(htmlPath, null, options));
}
return issues;
}
File diff suppressed because it is too large Load Diff
-22
View File
@@ -1,22 +0,0 @@
{
"name": "tkmind-h5-portal-runtime",
"private": true,
"type": "module",
"engines": {
"node": ">=22"
},
"dependencies": {
"@node-rs/argon2": "^2.0.2",
"@resvg/resvg-js": "^2.6.2",
"debug": "^4.4.3",
"express": "^4.21.2",
"http-proxy-middleware": "^3.0.3",
"jsonrepair": "^3.14.0",
"mysql2": "^3.22.5",
"playwright": "^1.61.1",
"qrcode": "^1.5.4",
"redis": "^4.7.1",
"sharp": "^0.35.2",
"undici": "^6.26.0"
}
}
@@ -1 +0,0 @@
nXjhx0ErC6MhQ0SZ
Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

@@ -1,50 +0,0 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>微信分享预览 · 连云港三天两夜攻略 🌊</title>
<style>
* { box-sizing: border-box; }
body { margin: 0; min-height: 100vh; padding: 24px; background: #ececec; font-family: ui-sans-serif, -apple-system, BlinkMacSystemFont, sans-serif; color: #111; }
.wrap { max-width: 420px; margin: 0 auto; }
h1 { margin: 0 0 8px; font-size: 18px; }
.hint, .note { margin: 0 0 16px; color: #666; font-size: 13px; line-height: 1.6; }
.card { display: grid; grid-template-columns: 1fr 72px; gap: 12px; padding: 12px; border-radius: 8px; background: #fff; box-shadow: 0 1px 0 rgba(0,0,0,.06); }
.card-main { min-width: 0; }
.card-title { margin: 0; font-size: 16px; font-weight: 600; line-height: 1.35; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.card-desc { margin: 6px 0 0; color: #888; font-size: 13px; line-height: 1.45; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.card-foot { display: flex; align-items: center; gap: 6px; margin-top: 10px; color: #999; font-size: 12px; }
.card-foot img { width: 16px; height: 16px; border-radius: 999px; object-fit: cover; }
.card-thumb { width: 72px; height: 72px; border-radius: 4px; object-fit: cover; background: #f3f3f3; }
.card-thumb-empty { display: grid; place-items: center; color: #bbb; font-size: 12px; }
.meta { margin-top: 18px; padding: 14px; border-radius: 10px; background: rgba(255,255,255,.72); font-size: 12px; line-height: 1.7; word-break: break-all; }
code { background: rgba(0,0,0,.06); padding: 1px 4px; border-radius: 4px; }
</style>
</head>
<body>
<div class="wrap">
<h1>微信链接卡片预览</h1>
<p class="hint">本地模拟的是「粘贴链接后看到的卡片」,不是 JS-SDK 内部分享弹层。源链接:<code>https://m.tkmind.cn/MindSpace/john/public/lianyungang-guide.html</code></p>
<p class="note">修复后:标题 + 描述 + 缩略图 + 底部「TKMind 智趣」小图标应同时出现。</p>
<article class="card" aria-label="微信分享卡片预览">
<div class="card-main">
<h2 class="card-title">连云港三天两夜攻略 🌊</h2>
<p class="card-desc">三天两夜·沙滩酒店·必吃美食</p>
<div class="card-foot">
<img src="http://127.0.0.1:8081/brand/tkmind-icon.png" alt="" onerror="this.style.display='none'">
<span>TKMind 智趣</span>
</div>
</div>
<img class="card-thumb" src="https://images.unsplash.com/photo-1507525428034-b723cf961d3e?auto=format&amp;fit=crop&amp;w=200&amp;q=80" alt="">
</article>
<div class="meta">
<div><strong>og:title</strong> 连云港三天两夜攻略 🌊</div>
<div><strong>og:description</strong> 三天两夜·沙滩酒店·必吃美食</div>
<div><strong>og:site_name</strong> TKMind 智趣</div>
<div><strong>og:image</strong> https://images.unsplash.com/photo-1507525428034-b723cf961d3e?auto=format&amp;fit=crop&amp;w=200&amp;q=80</div>
<div><strong>icon</strong> /brand/tkmind-icon.png</div>
</div>
</div>
</body>
</html>
@@ -1,41 +0,0 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>微信分享预览工具</title>
<style>
* { box-sizing: border-box; }
body { margin: 0; min-height: 100vh; padding: 24px; background: #f3f3f3; font-family: ui-sans-serif, -apple-system, BlinkMacSystemFont, sans-serif; color: #111; }
.panel { max-width: 560px; margin: 0 auto; padding: 20px; border-radius: 16px; background: #fff; box-shadow: 0 8px 30px rgba(0,0,0,.06); }
h1 { margin: 0 0 8px; font-size: 22px; }
p { margin: 0 0 16px; color: #666; line-height: 1.6; font-size: 14px; }
label { display: block; margin-bottom: 8px; font-size: 13px; font-weight: 600; }
input { width: 100%; padding: 12px 14px; border: 1px solid #ddd; border-radius: 10px; font: inherit; }
button { margin-top: 14px; width: 100%; padding: 12px 14px; border: 0; border-radius: 10px; background: #2f6f57; color: #fff; font: inherit; font-weight: 700; cursor: pointer; }
code { background: rgba(0,0,0,.06); padding: 1px 4px; border-radius: 4px; }
</style>
</head>
<body>
<div class="panel">
<h1>微信分享预览</h1>
<p>输入已发布页面路径,本地模拟微信「粘贴链接后」看到的卡片。开发环境走 Portal API:<code>/dev/wechat-share-preview</code></p>
<form id="preview-form">
<label for="url">页面 URL 或路径</label>
<input id="url" name="url" placeholder="/MindSpace/john/public/demo.html" required>
<button type="submit">生成预览</button>
</form>
</div>
<script>
document.getElementById('preview-form').addEventListener('submit', (event) => {
event.preventDefault();
const value = document.getElementById('url').value.trim();
if (!value) return;
const target = value.startsWith('http')
? `/dev/wechat-share-preview?url=${encodeURIComponent(value)}`
: `/dev/wechat-share-preview?url=${encodeURIComponent(value.startsWith('/') ? value : `/${value}`)}`;
window.location.href = target;
});
</script>
</body>
</html>
-159
View File
@@ -1,159 +0,0 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="John 的专属欢迎页面 - TKMind 为您呈现">
<meta name="mindspace-cover" content='{"tag":"报告","emoji":"👋","accent":"#f093fb","accent2":"#24243e","subtitle":"Hello John","cover":"https://images.unsplash.com/photo-1579547945413-497e1b99dac0?w=1200&q=80"}'>
<title>Hello, John!</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
background: linear-gradient(135deg, #0f0c29, #302b63, #24243e);
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
overflow: hidden;
}
/* 动态粒子背景 */
.bg-particles {
position: fixed;
inset: 0;
z-index: 0;
overflow: hidden;
}
.bg-particles span {
position: absolute;
width: 6px;
height: 6px;
background: rgba(255, 255, 255, 0.15);
border-radius: 50%;
animation: float 20s infinite;
}
.bg-particles span:nth-child(1) { top: 10%; left: 10%; animation-duration: 18s; animation-delay: 0s; }
.bg-particles span:nth-child(2) { top: 30%; left: 80%; width: 10px; height: 10px; animation-duration: 22s; animation-delay: 2s; }
.bg-particles span:nth-child(3) { top: 70%; left: 20%; animation-duration: 16s; animation-delay: 4s; }
.bg-particles span:nth-child(4) { top: 85%; left: 85%; width: 8px; height: 8px; animation-duration: 24s; animation-delay: 1s; }
.bg-particles span:nth-child(5) { top: 50%; left: 50%; width: 4px; height: 4px; animation-duration: 20s; animation-delay: 3s; }
.bg-particles span:nth-child(6) { top: 15%; left: 60%; animation-duration: 19s; animation-delay: 5s; }
.bg-particles span:nth-child(7) { top: 60%; left: 5%; width: 7px; height: 7px; animation-duration: 21s; animation-delay: 0.5s; }
.bg-particles span:nth-child(8) { top: 40%; left: 70%; width: 5px; height: 5px; animation-duration: 17s; animation-delay: 2.5s; }
@keyframes float {
0% { transform: translateY(0) rotate(0deg); opacity: 0; }
10% { opacity: 1; }
90% { opacity: 1; }
100% { transform: translateY(-100vh) rotate(720deg); opacity: 0; }
}
.card {
position: relative;
z-index: 1;
text-align: center;
padding: 60px 80px;
background: rgba(255, 255, 255, 0.05);
border-radius: 24px;
backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px);
border: 1px solid rgba(255, 255, 255, 0.1);
box-shadow:
0 25px 50px rgba(0, 0, 0, 0.3),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
animation: fadeIn 1.2s ease-out;
}
h1 {
font-size: 72px;
font-weight: 700;
background: linear-gradient(135deg, #f093fb, #f5576c, #4facfe);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
margin-bottom: 16px;
animation: pulse 3s ease-in-out infinite;
letter-spacing: 4px;
}
p {
font-size: 24px;
color: rgba(255, 255, 255, 0.7);
letter-spacing: 2px;
}
.emoji {
font-size: 48px;
display: block;
margin-bottom: 24px;
animation: wave 2s ease-in-out infinite;
}
.footer {
margin-top: 36px;
font-size: 13px;
color: rgba(255, 255, 255, 0.3);
letter-spacing: 1px;
}
@keyframes fadeIn {
from {
opacity: 0;
transform: translateY(30px) scale(0.95);
}
to {
opacity: 1;
transform: translateY(0) scale(1);
}
}
@keyframes pulse {
0%, 100% { transform: scale(1); }
50% { transform: scale(1.03); }
}
@keyframes wave {
0%, 100% { transform: rotate(0deg); }
25% { transform: rotate(15deg); }
75% { transform: rotate(-15deg); }
}
@media (max-width: 600px) {
.card {
padding: 40px 32px;
margin: 20px;
border-radius: 16px;
}
h1 {
font-size: 48px;
}
p {
font-size: 18px;
}
.emoji {
font-size: 36px;
}
}
</style>
</head>
<body>
<div class="bg-particles">
<span></span><span></span><span></span><span></span>
<span></span><span></span><span></span><span></span>
</div>
<div class="card">
<span class="emoji">👋</span>
<h1>Hello!</h1>
<p>Welcome, John</p>
<div class="footer">powered by TKMind</div>
</div>
</body>
</html>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 407 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 569 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 328 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 212 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 407 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 292 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 292 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 555 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 292 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 407 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 555 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 569 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 292 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 328 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 407 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 672 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 723 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 672 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 458 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 160 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 160 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 723 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 723 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 672 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 458 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 672 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 723 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 309 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 338 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 338 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 294 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 294 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 190 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 309 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 338 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 309 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 294 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 309 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 338 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 190 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 294 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 210 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 334 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 376 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 334 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 334 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 310 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 157 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 310 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 310 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 157 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 376 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 310 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 334 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 310 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 210 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 310 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 342 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 342 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 353 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 613 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 342 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 353 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 353 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 306 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 274 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 353 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 342 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 342 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 342 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 274 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 613 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 227 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 227 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 227 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 274 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 166 KiB

Some files were not shown because too many files have changed in this diff Show More