cc-viewer 1.8.9 → 1.8.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/README.md +13 -0
  2. package/dist/assets/App-vpm6omRY.js +2 -0
  3. package/dist/assets/{MdxEditorPanel-BznPWiig.js → MdxEditorPanel-CpknU7SR.js} +1 -1
  4. package/dist/assets/{Mobile-ph7aKFZy.js → Mobile-BHIBdqHs.js} +1 -1
  5. package/dist/assets/{ProxyStatsModal-B7iew2Tv.js → ProxyStatsModal-DdV7wN2V.js} +1 -1
  6. package/dist/assets/{_baseUniq-D2aO8mv4.js → _baseUniq-C2FCldN4.js} +1 -1
  7. package/dist/assets/{arc-DOjcnBTh.js → arc-CSzd_bdT.js} +1 -1
  8. package/dist/assets/{architectureDiagram-Q4EWVU46-Drea2H7X.js → architectureDiagram-Q4EWVU46-CjEbBe2R.js} +1 -1
  9. package/dist/assets/{blockDiagram-DXYQGD6D-Bc9eijBD.js → blockDiagram-DXYQGD6D-BYzl2ukW.js} +1 -1
  10. package/dist/assets/{c4Diagram-AHTNJAMY-D-umzFnM.js → c4Diagram-AHTNJAMY-0x0_8O_X.js} +1 -1
  11. package/dist/assets/{channel-DUff3FBt.js → channel-xMmQtLq9.js} +1 -1
  12. package/dist/assets/{chunk-4BX2VUAB-CFnsROfz.js → chunk-4BX2VUAB-DnFoMzQG.js} +1 -1
  13. package/dist/assets/{chunk-4TB4RGXK-C95jMPjB.js → chunk-4TB4RGXK-Dc5reuwv.js} +1 -1
  14. package/dist/assets/{chunk-55IACEB6-CeWf2Y2b.js → chunk-55IACEB6-DTKTLKcJ.js} +1 -1
  15. package/dist/assets/{chunk-EDXVE4YY-ClUoTJxv.js → chunk-EDXVE4YY-BNqgeN9r.js} +1 -1
  16. package/dist/assets/{chunk-FMBD7UC4-Dk62kqb8.js → chunk-FMBD7UC4-DzJVZ11t.js} +1 -1
  17. package/dist/assets/{chunk-OYMX7WX6-CZuykSsu.js → chunk-OYMX7WX6-CjYwzMor.js} +1 -1
  18. package/dist/assets/{chunk-QZHKN3VN-DYtx68Um.js → chunk-QZHKN3VN-C0KVKecr.js} +1 -1
  19. package/dist/assets/{chunk-YZCP3GAM-rLSq0tSC.js → chunk-YZCP3GAM-3VhNeNVm.js} +1 -1
  20. package/dist/assets/classDiagram-6PBFFD2Q-DdUtH789.js +1 -0
  21. package/dist/assets/classDiagram-v2-HSJHXN6E-DdUtH789.js +1 -0
  22. package/dist/assets/clone-C6d2XDvR.js +1 -0
  23. package/dist/assets/{cose-bilkent-S5V4N54A-B5H6ewon.js → cose-bilkent-S5V4N54A-DGE02sJS.js} +1 -1
  24. package/dist/assets/{dagre-KV5264BT-BO2R2WP7.js → dagre-KV5264BT-CY4eCcwS.js} +1 -1
  25. package/dist/assets/{diagram-5BDNPKRD-Y3GNif-g.js → diagram-5BDNPKRD-DHq2THYn.js} +1 -1
  26. package/dist/assets/{diagram-G4DWMVQ6-Du3_TylQ.js → diagram-G4DWMVQ6-DD_76oJg.js} +1 -1
  27. package/dist/assets/{diagram-MMDJMWI5-DB_Ynyjc.js → diagram-MMDJMWI5-BvQxk1jl.js} +1 -1
  28. package/dist/assets/{diagram-TYMM5635-_Rfjm82W.js → diagram-TYMM5635-B_tMXPJl.js} +1 -1
  29. package/dist/assets/{erDiagram-SMLLAGMA-D5XhBiiV.js → erDiagram-SMLLAGMA-DpuGbN9e.js} +1 -1
  30. package/dist/assets/{flowDiagram-DWJPFMVM-CxWJ7sAQ.js → flowDiagram-DWJPFMVM-BW0xGFBf.js} +1 -1
  31. package/dist/assets/{ganttDiagram-T4ZO3ILL-D-a8fh00.js → ganttDiagram-T4ZO3ILL-BSzTiT93.js} +1 -1
  32. package/dist/assets/{gitGraphDiagram-UUTBAWPF-q5WMk0Ce.js → gitGraphDiagram-UUTBAWPF-1tsgBlcn.js} +1 -1
  33. package/dist/assets/{graph-Bi8xMAuo.js → graph-CwiXMdRR.js} +1 -1
  34. package/dist/assets/{index-BRtbpMRz.js → index-9e6BGquk.js} +1 -1
  35. package/dist/assets/{index-BWPHHS6P.js → index-BmpXfVQ8.js} +1 -1
  36. package/dist/assets/{index-O2Mx9uLd.js → index-CZWNaOo8.js} +1 -1
  37. package/dist/assets/{index-BBEH6Ppx.js → index-Cixs7aRD.js} +1 -1
  38. package/dist/assets/{index-C3wsDB-y.js → index-Ct6Fi103.js} +1 -1
  39. package/dist/assets/index-D1yGak8I.css +1 -0
  40. package/dist/assets/{index-3Z3ucdlB.js → index-DIAMN9QO.js} +1 -1
  41. package/dist/assets/{index-BB66PLo6.js → index-DhjwHRxk.js} +1 -1
  42. package/dist/assets/{index-BbF89uTe.js → index-tnWldUm3.js} +2 -2
  43. package/dist/assets/{infoDiagram-42DDH7IO-CE2mUuLF.js → infoDiagram-42DDH7IO-Dk1ESZFk.js} +1 -1
  44. package/dist/assets/{ishikawaDiagram-UXIWVN3A-C5sNQIVL.js → ishikawaDiagram-UXIWVN3A-DcPyNwkI.js} +1 -1
  45. package/dist/assets/{journeyDiagram-VCZTEJTY-g7HXOeyX.js → journeyDiagram-VCZTEJTY-CZWieu1U.js} +1 -1
  46. package/dist/assets/{jszip.min-x3xOZxY_.js → jszip.min-Bq1JxqcN.js} +1 -1
  47. package/dist/assets/{kanban-definition-6JOO6SKY-D3Mus6hc.js → kanban-definition-6JOO6SKY-S1sSSTKx.js} +1 -1
  48. package/dist/assets/{layout-05qDuweB.js → layout-BQFiWq71.js} +1 -1
  49. package/dist/assets/{linear-DQEG_N-F.js → linear-BNV4po81.js} +1 -1
  50. package/dist/assets/{mermaid.core-DcaXqkk5.js → mermaid.core-DvwEdatr.js} +2 -2
  51. package/dist/assets/{min-DSpvw5zG.js → min-DFik8k4L.js} +1 -1
  52. package/dist/assets/{mindmap-definition-QFDTVHPH-DomUIop7.js → mindmap-definition-QFDTVHPH-CebeX76u.js} +1 -1
  53. package/dist/assets/{pieDiagram-DEJITSTG-COTLcC5G.js → pieDiagram-DEJITSTG-DMB5JbMP.js} +1 -1
  54. package/dist/assets/{quadrantDiagram-34T5L4WZ-DMg8C3Up.js → quadrantDiagram-34T5L4WZ-BAYzoLVo.js} +1 -1
  55. package/dist/assets/{requirementDiagram-MS252O5E-DF9beYd7.js → requirementDiagram-MS252O5E-CUQoAuOc.js} +1 -1
  56. package/dist/assets/{sankeyDiagram-XADWPNL6-MvERK2UP.js → sankeyDiagram-XADWPNL6-Dt0AQuLW.js} +1 -1
  57. package/dist/assets/seqResourceLoaders-C-QHRkUq.js +2 -0
  58. package/dist/assets/{sequenceDiagram-FGHM5R23-B8k_nyzc.js → sequenceDiagram-FGHM5R23-HyZFUlMU.js} +1 -1
  59. package/dist/assets/{stateDiagram-FHFEXIEX-D-9fTYas.js → stateDiagram-FHFEXIEX-B8x24fuD.js} +1 -1
  60. package/dist/assets/stateDiagram-v2-QKLJ7IA2-2qtHlnwO.js +1 -0
  61. package/dist/assets/{timeline-definition-GMOUNBTQ-CbK1g9CO.js → timeline-definition-GMOUNBTQ-TnbjDVtB.js} +1 -1
  62. package/dist/assets/{vendor-antd-FhK5cQx7.js → vendor-antd-BTBRwbax.js} +1 -1
  63. package/dist/assets/{vendor-codemirror-DL3yyKRQ.js → vendor-codemirror-CPWlhuQ1.js} +1 -1
  64. package/dist/assets/{vendor-mdxeditor-DgyrvHzS.js → vendor-mdxeditor-Cy5Xg_90.js} +2 -2
  65. package/dist/assets/{vendor-qrcode-BAwwP1Nd.js → vendor-qrcode-E9ld0lSz.js} +1 -1
  66. package/dist/assets/{vendor-virtuoso-B_7lc2Ot.js → vendor-virtuoso-Bq6QMhgG.js} +1 -1
  67. package/dist/assets/{vennDiagram-DHZGUBPP-DYjGtMA5.js → vennDiagram-DHZGUBPP-BqgIjkBO.js} +1 -1
  68. package/dist/assets/{wardley-RL74JXVD-Djh5alV9.js → wardley-RL74JXVD-BFcIn2-Q.js} +1 -1
  69. package/dist/assets/{wardleyDiagram-NUSXRM2D-al50Jlxp.js → wardleyDiagram-NUSXRM2D-CYDWQLb6.js} +1 -1
  70. package/dist/assets/{xychartDiagram-5P7HB3ND-Bl969-3U.js → xychartDiagram-5P7HB3ND-zfusE3BC.js} +1 -1
  71. package/dist/index.html +6 -6
  72. package/package.json +1 -1
  73. package/server/lib/auth.js +20 -4
  74. package/server/lib/is-admin.js +27 -0
  75. package/server/lib/skills-api.js +48 -26
  76. package/server/routes/auth.js +11 -9
  77. package/server/routes/dingtalk.js +23 -8
  78. package/server/routes/files-fs.js +76 -1
  79. package/server/routes/im.js +36 -20
  80. package/server/routes/preferences.js +27 -15
  81. package/server/routes/project-prefs.js +6 -5
  82. package/server/routes/skills.js +50 -29
  83. package/server/routes/voice-pack.js +7 -6
  84. package/server/server.js +12 -2
  85. package/dist/assets/App-DuJsCzTH.js +0 -2
  86. package/dist/assets/classDiagram-6PBFFD2Q-DT8RQXlO.js +0 -1
  87. package/dist/assets/classDiagram-v2-HSJHXN6E-DT8RQXlO.js +0 -1
  88. package/dist/assets/clone-_dhVVwEt.js +0 -1
  89. package/dist/assets/index-D3GEPgde.css +0 -1
  90. package/dist/assets/seqResourceLoaders-76uKbVqf.js +0 -2
  91. package/dist/assets/stateDiagram-v2-QKLJ7IA2-CO0tv8rD.js +0 -1
package/README.md CHANGED
@@ -193,6 +193,19 @@ By default, remote (LAN) access requires the `?token=` query that ccv prints at
193
193
  * **Global default + per-project override:** by default one password covers every project. From the QR popover the admin can switch between **This project** and **Global** — set a project-specific password that overrides the global default for that project only, or remove the override to inherit the global setting again. (A disabled project override means "no protection for this project", which is different from removing it.)
194
194
  * The on/off state and password(s) are persisted alongside your other settings in cc-viewer's `preferences.json` — a global `auth` key plus an optional `authByProject` map (the password is base64-obfuscated, not stored as raw plaintext; file mode `0600`). The login cookie is tied to the per-launch token, so restarting ccv requires remote devices to log in again.
195
195
 
196
+ ### Container / cloud deployment (remote admin)
197
+
198
+ cc-viewer works in a single container or on a cloud host where you reach the UI from a remote browser. The main process binds `0.0.0.0` by default, so once you map the port you can open it from anywhere.
199
+
200
+ * **An authenticated remote client is an admin.** Once a remote browser gets in — via the `?token=` URL printed at startup, or via password login (`ccv --usePassword`) — it can use **all** management features: configuring and starting the DingTalk/IM integrations, managing skills, voice packs, project preferences, and the auth/password settings. You no longer need to be on `127.0.0.1` to save IM credentials or start the worker.
201
+ * **Empty-password mode is NOT admin.** If you enable password login with an empty password (explicitly "no protection"), remote clients get *read* access but are **not** admins — destructive/admin actions (deleting skills, changing the password, adjusting retry/proxy config that multiplies your paid upstream spend) still require a real credential or a loopback connection. An empty password never opens the write surface to the whole network.
202
+ * **Plaintext secrets stay on the host.** The IM/DingTalk status endpoint tells a remote admin the process/connection state (so the UI can show "connected"), but plaintext app secrets are only ever returned to a loopback (`127.0.0.1`) client.
203
+ * **Internal machine bridges stay loopback-locked.** The hook/notify channels the local `claude` process uses (turn-end, session-start, task-event, stream chunks) still require a loopback peer plus the per-boot internal token — remote admins cannot reach them.
204
+ * **IM workers stay on `127.0.0.1`.** Each DingTalk/IM worker binds loopback inside the container; the main process probes it over `127.0.0.1`. In a single container this needs no extra setup.
205
+ * **Security recommendations for a public/cloud deployment:** enable password login (or keep the random `?token=` URL secret), and put the instance behind a reverse proxy that terminates HTTPS. Persist the log/settings directory by mounting a volume at the path pointed to by `CCV_LOG_DIR` (default `~/.claude/cc-viewer`) so your preferences, auth password, and IM credentials survive container restarts.
206
+ * **Reverse-proxy note:** access control is based on the socket peer address (`X-Forwarded-For` is deliberately not trusted, to prevent spoofing). This does not affect remote admins — they authenticate by token/password, not by IP. It only means "same-container" detection relies on a real loopback connection.
207
+
208
+
196
209
  ### Model-specific system prompts
197
210
 
198
211
  The **Edit System Prompt** modal (hamburger menu → Edit System Prompt) is tabbed: