dsh-worktodo 0.1.0 → 0.1.3

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.
package/lib/client.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/client/index.js"],
4
- "sourcesContent": ["import React from 'react';\n\n/**\n * worktodo \u6D4F\u89C8\u5668\u534A\u4FA7\uFF1ADSH \u4FA7\u680F\u5165\u53E3 + \u4E2D\u680F\u300C\u5DE5\u4F5C\u5F85\u529E\u300D\u9762\u677F\u3002\n *\n * \u6570\u636E\u6765\u6E90\u53EA\u6709\u4E00\u5904\uFF1A\u540C\u6E90\u7684 /worktodo/* \u8DEF\u7531\uFF08\u5BBF\u4E3B\u534A\u4FA7 lib/index.js \u6CE8\u518C\uFF09\u3002\n * \u6240\u6709\u8DEF\u7531\u90FD\u8FD4\u56DE HTTP 200\uFF0C\u6210\u529F\u4E0E\u5426\u770B body \u91CC\u7684 `ok` \u5B57\u6BB5\u2014\u2014\u6240\u4EE5\u5224\u5B9A\u6761\u4EF6\u5199\u5728\n * `!body.ok` \u4E0A\uFF0C\u800C\u4E0D\u662F `response.ok`\uFF1A\u53EA\u770B HTTP \u72B6\u6001\u7801\u4F1A\u628A\u300C\u6807\u9898\u4E3A\u7A7A\u300D\u8FD9\u7C7B\n * \u4E1A\u52A1\u5931\u8D25\u5F53\u6210\u7F51\u7EDC\u6545\u969C\uFF0C\u7528\u6237\u5C31\u770B\u4E0D\u5230\u771F\u6B63\u7684\u539F\u56E0\u4E86\u3002\n *\n * \u4E3A\u4EC0\u4E48\u4F1A\u8BDD\u5F85\u529E\u8981\u5355\u72EC\u62C6\u4E00\u4E2A\u5B50\u7EC4\u4EF6\uFF1A\n * \u5B98\u65B9\u4F1A\u8BDD todos \u6765\u81EA `props.useProjection('todos')`\uFF0C\u800C useProjection \u662F hook\u2014\u2014\n * \u9762\u677F\u6CE8\u518C\u5728 root scope\uFF0C\u67D0\u4E9B\u7EC4\u5408\u4E0B props \u91CC\u6839\u672C\u6CA1\u6709\u5B83\u3002hook \u7684\u8C03\u7528\u6B21\u6570\u5728\u7EC4\u4EF6\u5B9E\u4F8B\n * \u751F\u547D\u5468\u671F\u5185\u5FC5\u987B\u6052\u5B9A\uFF0C\u6240\u4EE5\u300C\u6709\u6CA1\u6709 useProjection\u300D\u8FD9\u4E2A\u6761\u4EF6\u53EA\u80FD\u51B3\u5B9A**\u6574\u5757\u8981\u4E0D\u8981\u6302\u8F7D**\uFF0C\n * \u4E0D\u80FD\u5199\u5728\u540C\u4E00\u4E2A\u7EC4\u4EF6\u5185\u90E8\u3002\u89C1 SessionAdopt\u3002\n *\n * \u6837\u5F0F\uFF1A\u53EA\u7528 DSH \u81EA\u5DF1\u7684 --dsw-* \u4E3B\u9898\u53D8\u91CF\uFF08\u4E0D\u5199\u4EFB\u4F55\u989C\u8272\u5B57\u9762\u91CF\uFF09\uFF0C\n * \u6240\u4EE5\u6DF1\u6D45\u4E3B\u9898\u3001\u4EE5\u53CA\u4EE5\u540E\u6362\u4E3B\u9898\u76AE\u80A4\u65F6\u90FD\u5929\u7136\u8DDF\u7740\u8D70\u3002\u7C7B\u540D\u7EDF\u4E00 wt- \u524D\u7F00\uFF0C\n * \u6837\u5F0F\u8868\u8DDF\u7740\u9762\u677F\u4E00\u8D77\u6E32\u67D3\uFF08\u6302\u5728\u9762\u677F\u81EA\u5DF1\u90A3\u68F5 DOM \u91CC\u7684 style \u8282\u70B9\uFF0C\u4E0D\u78B0\u9762\u677F\u4E4B\u5916\u7684\u9875\u9762\uFF09\u3002\n */\n\nconst PKG_NAME = typeof __DSH_PLUGIN_NAME__ === 'string' ? __DSH_PLUGIN_NAME__ : 'dsh-worktodo';\n/**\n * \u5BBF\u4E3B\u534A\u4FA7\u7684 name / \u8DEF\u7531\u524D\u7F00\u662F\u5199\u6B7B\u7684 'worktodo'\uFF08lib/index.js\uFF09\uFF0C\u800C\u4FA7\u680F slot id \u53C8\u5FC5\u987B\u4E0E\n * main \u9762\u677F\u7684 key \u540C\u540D\uFF0C\u5426\u5219\u70B9\u4E86\u4FA7\u680F\u6253\u4E0D\u5F00\u9762\u677F\u3002\u6240\u4EE5\u77ED\u540D\u4EE5\u5305\u540D\u6D3E\u751F\u4E3A\u4E3B\uFF0C\n * \u4F46\u4E00\u65E6\u6D3E\u751F\u503C\u4E0D\u662F\u5BBF\u4E3B\u8BA4\u7684\u90A3\u4E2A\u540D\u5B57\u5C31\u9000\u56DE 'worktodo'\u2014\u2014\u5305\u540D\u5E26\u540E\u7F00\u65F6\u5B81\u53EF\u9762\u677F\u80FD\u5F00\u3002\n */\nconst DERIVED_NAME = PKG_NAME.replace(/^dsh-/, '');\nconst SHORT_NAME = DERIVED_NAME === 'worktodo' ? DERIVED_NAME : 'worktodo';\nconst SLOT_ID = SHORT_NAME;\nconst ROUTE_BASE = `/${SHORT_NAME}`;\nconst LOCALE_NS = SHORT_NAME;\nconst ROUTE_LIST = `${ROUTE_BASE}/list`;\n\n/* ------------------------------------------------------------------ *\n * \u6587\u6848\uFF1Azh / en \u4E24\u4EFD key \u5FC5\u987B\u4E00\u4E00\u5BF9\u5E94\uFF08\u5BBF\u4E3B\u6309 key \u53D6\u8BCD\uFF0C\u7F3A key \u4F1A\u663E\u793A key \u672C\u8EAB\uFF09\n * ------------------------------------------------------------------ */\nconst zh = {\n 'nav': '\u5F85\u529E',\n 'title': '\u5DE5\u4F5C\u5F85\u529E',\n 'statOpen': '\u672A\u5B8C\u6210',\n 'statOverdue': '\u903E\u671F',\n 'statToday': '\u4ECA\u5929',\n 'statDoing': '\u8FDB\u884C\u4E2D',\n 'statDoneToday': '\u4ECA\u65E5\u5B8C\u6210',\n 'refresh': '\u5237\u65B0',\n 'loading': '\u8BFB\u53D6\u5F85\u529E\u2026',\n 'failed': '\u8BFB\u53D6\u5931\u8D25',\n 'retry': '\u91CD\u8BD5',\n 'dismiss': '\u5173\u95ED',\n 'storeAt': '\u5B58\u50A8\u4F4D\u7F6E',\n 'storeDomain': '\u5B98\u65B9 storage',\n 'storeFile': 'JSON \u6587\u4EF6',\n 'addPlaceholder': '\u52A0\u4E00\u4EF6\u8981\u505A\u7684\u4E8B\uFF0C\u56DE\u8F66\u4FDD\u5B58',\n 'add': '\u6DFB\u52A0',\n 'dueLabel': '\u622A\u6B62',\n 'priorityLabel': '\u4F18\u5148\u7EA7',\n 'prioHigh': '\u9AD8',\n 'prioNormal': '\u666E\u901A',\n 'prioLow': '\u4F4E',\n 'groupOverdue': '\u903E\u671F',\n 'groupToday': '\u4ECA\u5929',\n 'groupWeek': '\u672C\u5468',\n 'groupLater': '\u4EE5\u540E',\n 'groupCompleted': '\u5DF2\u5B8C\u6210',\n 'expand': '\u5C55\u5F00',\n 'collapse': '\u6536\u8D77',\n 'empty': '\u8FD8\u6CA1\u6709\u5F85\u529E',\n 'emptyHint': '\u5728\u4E0A\u9762\u8F93\u5165\u6846\u52A0\u7B2C\u4E00\u4EF6\u4E8B',\n 'overdueTag': '\u903E\u671F',\n 'sourceAgent': 'AI',\n 'sourceSession': '\u4F1A\u8BDD',\n 'markDone': '\u6807\u4E3A\u5B8C\u6210',\n 'unmarkDone': '\u53D6\u6D88\u5B8C\u6210',\n 'editHint': '\u70B9\u51FB\u6807\u9898\u53EF\u7F16\u8F91',\n 'deleteBtn': '\u5220\u9664',\n 'confirmDelete': '\u786E\u8BA4\u5220\u9664\uFF1F',\n 'save': '\u4FDD\u5B58',\n 'cancel': '\u53D6\u6D88',\n 'projectLabel': '\u9879\u76EE',\n 'projectPlaceholder': '\u9879\u76EE\u540D\uFF08\u53EF\u9009\uFF09',\n 'titlePlaceholder': '\u5F85\u529E\u6807\u9898',\n 'notesLabel': '\u5907\u6CE8',\n 'notesPlaceholder': '\u5907\u6CE8\uFF08\u53EF\u9009\uFF09',\n 'notesAdd': '\u52A0\u5907\u6CE8',\n 'notesHide': '\u6536\u8D77\u5907\u6CE8',\n 'adoptPre': '\u628A\u672C\u4F1A\u8BDD\u7684',\n 'adoptPost': '\u6761\u5F85\u529E\u63D0\u5347\u4E3A\u5DE5\u4F5C\u5F85\u529E',\n 'adoptHint': '\u8FD9\u662F\u6A21\u578B\u5728\u672C\u4F1A\u8BDD\u91CC\u5217\u7684\u5F85\u529E\u3002\u63D0\u5347\u540E\u5F52\u4F60\u6240\u6709\uFF1A\u8DE8\u4F1A\u8BDD\u4FDD\u7559\uFF0C\u8FD8\u80FD\u52A0\u4F18\u5148\u7EA7\u548C\u622A\u6B62\u65E5\u671F\u3002',\n 'adoptPending': '\u5F85\u5B8C\u6210',\n 'adoptDone': '\u5DF2\u63D0\u5347',\n 'adoptSkipped': '\u8DF3\u8FC7',\n 'titleEmpty': '\u8BF7\u5148\u5199\u70B9\u4EC0\u4E48',\n 'untitled': '\uFF08\u65E0\u6807\u9898\uFF09',\n};\n\nconst en = {\n 'nav': 'To-dos',\n 'title': 'Work to-dos',\n 'statOpen': 'Open',\n 'statOverdue': 'Overdue',\n 'statToday': 'Today',\n 'statDoing': 'In progress',\n 'statDoneToday': 'Done today',\n 'refresh': 'Refresh',\n 'loading': 'Loading to-dos\u2026',\n 'failed': 'Failed to load',\n 'retry': 'Retry',\n 'dismiss': 'Dismiss',\n 'storeAt': 'Stored at',\n 'storeDomain': 'official storage',\n 'storeFile': 'JSON file',\n 'addPlaceholder': 'Add something to do \u2014 Enter saves',\n 'add': 'Add',\n 'dueLabel': 'Due',\n 'priorityLabel': 'Priority',\n 'prioHigh': 'High',\n 'prioNormal': 'Normal',\n 'prioLow': 'Low',\n 'groupOverdue': 'Overdue',\n 'groupToday': 'Today',\n 'groupWeek': 'This week',\n 'groupLater': 'Later',\n 'groupCompleted': 'Completed',\n 'expand': 'Expand',\n 'collapse': 'Collapse',\n 'empty': 'No to-dos yet',\n 'emptyHint': 'Add your first one in the box above',\n 'overdueTag': 'overdue',\n 'sourceAgent': 'AI',\n 'sourceSession': 'Session',\n 'markDone': 'Mark as done',\n 'unmarkDone': 'Mark as not done',\n 'editHint': 'Click the title to edit',\n 'deleteBtn': 'Delete',\n 'confirmDelete': 'Delete?',\n 'save': 'Save',\n 'cancel': 'Cancel',\n 'projectLabel': 'Project',\n 'projectPlaceholder': 'project (optional)',\n 'titlePlaceholder': 'To-do title',\n 'notesLabel': 'Notes',\n 'notesPlaceholder': 'Notes (optional)',\n 'notesAdd': 'Add notes',\n 'notesHide': 'Hide notes',\n 'adoptPre': \"Promote this session's \",\n 'adoptPost': ' to-dos into your work list',\n 'adoptHint': 'These are the to-dos the model listed in this session. Promoting makes them yours: they survive across sessions and take priorities and due dates.',\n 'adoptPending': 'open',\n 'adoptDone': 'Promoted',\n 'adoptSkipped': 'skipped',\n 'titleEmpty': 'Type something first',\n 'untitled': '(untitled)',\n};\n\n/* ------------------------------------------------------------------ *\n * \u989C\u8272\uFF1A\u53EA\u53D6 DSH \u4E3B\u9898\u53D8\u91CF\u3002\n * \u4E0D\u5199\u4EFB\u4F55\u989C\u8272\u5B57\u9762\u91CF\u515C\u5E95\u2014\u2014\u515C\u5E95\u503C\u7B49\u4E8E\u5199\u6B7B\u67D0\u4E00\u79CD\u4E3B\u9898\u4E0B\u7684\u989C\u8272\uFF0C\u53E6\u4E00\u5957\u4E3B\u9898\u5C31\u82B1\u4E86\u3002\n * \u9700\u8981\u300C\u6DE1\u6DE1\u7684\u5E95\u8272\u300D\u65F6\u7528 color-mix \u628A\u8BED\u4E49\u8272\u6DF7\u8FDB transparent\uFF0C\u4ECD\u7136\u662F\u53D8\u91CF\u9A71\u52A8\u3002\n * ------------------------------------------------------------------ */\nconst C = {\n label: 'var(--dsw-alias-label-primary)',\n label2: 'var(--dsw-alias-label-secondary)',\n label3: 'var(--dsw-alias-label-tertiary)',\n border: 'var(--dsw-alias-border-l2)',\n border1: 'var(--dsw-alias-border-l1)',\n layer1: 'var(--dsw-alias-bg-layer-1)',\n hover: 'var(--dsw-alias-interactive-bg-hover)',\n brand: 'var(--dsw-alias-brand-primary)',\n warn: 'var(--dsw-alias-state-warn-primary)',\n error: 'var(--dsw-alias-state-error-primary)',\n ok: 'var(--dsw-alias-state-success-primary)',\n};\n/** \u8BED\u4E49\u8272\u7684\u6DE1\u5E95/\u6DE1\u8FB9\uFF1Apct \u662F\u6DF7\u5165\u6BD4\u4F8B */\nconst tint = (color, pct) => `color-mix(in srgb, ${color} ${pct}%, transparent)`;\n\n/** \u9762\u677F\u81EA\u5E26\u6837\u5F0F\u8868\uFF1A\u51E0\u4F55\u5B57\u9762\u91CF\uFF08\u95F4\u8DDD/\u5B57\u53F7/\u5706\u89D2\uFF09\u5199\u6B7B\uFF0C\u989C\u8272\u5168\u90E8\u8D70\u53D8\u91CF\u3002 */\nconst STYLE_TEXT = `\n@keyframes wt-spin { to { transform: rotate(360deg); } }\n.wt-root {\n height: 100%; overflow: auto; padding: 16px 18px 40px; box-sizing: border-box;\n color: ${C.label}; font-family: var(--dsw-font-family, system-ui, sans-serif); font-size: 13px;\n}\n.wt-input {\n min-width: 0; font-family: inherit; font-size: 12px; line-height: 1.5; padding: 4px 8px;\n border-radius: 8px; border: 1px solid ${C.border}; background: transparent; color: ${C.label};\n color-scheme: light dark;\n}\n.wt-input::placeholder { color: ${C.label3}; }\n.wt-input:focus {\n outline: none; border-color: ${C.brand};\n box-shadow: 0 0 0 2px ${tint(C.brand, 22)};\n}\n.wt-btn {\n display: inline-flex; align-items: center; gap: 4px; font-family: inherit; font-size: 12px;\n line-height: 1.6; padding: 3px 10px; border-radius: 8px; cursor: pointer; user-select: none;\n border: 1px solid ${C.border}; background: transparent; color: ${C.label2}; white-space: nowrap;\n}\n.wt-btn:hover { background: ${C.hover}; color: ${C.label}; }\n.wt-btn:disabled { opacity: .55; cursor: default; }\n.wt-btn:disabled:hover { background: transparent; color: ${C.label2}; }\n.wt-btn-primary {\n border-color: ${tint(C.brand, 50)}; color: ${C.brand}; background: ${tint(C.brand, 10)};\n}\n.wt-btn-primary:hover { background: ${tint(C.brand, 18)}; color: ${C.brand}; }\n.wt-btn-primary:disabled:hover { background: ${tint(C.brand, 10)}; color: ${C.brand}; }\n.wt-btn-danger { color: ${C.error}; border-color: ${tint(C.error, 45)}; }\n.wt-btn-danger:hover { background: var(--dsw-alias-interactive-bg-hover-danger); color: ${C.error}; }\n.wt-icon-btn {\n display: inline-flex; align-items: center; justify-content: center; flex: none;\n width: 22px; height: 22px; padding: 0; border: none; border-radius: 6px;\n background: transparent; color: ${C.label3}; cursor: pointer;\n}\n.wt-icon-btn:hover { background: ${C.hover}; color: ${C.label}; }\n.wt-icon-btn-danger:hover { background: var(--dsw-alias-interactive-bg-hover-danger); color: ${C.error}; }\n.wt-check {\n display: inline-flex; align-items: center; justify-content: center; flex: none;\n width: 17px; height: 17px; margin-top: 1px; padding: 0; border-radius: 5px;\n border: 1px solid ${C.border}; background: transparent; color: transparent; cursor: pointer;\n}\n.wt-check:hover { border-color: ${C.brand}; }\n.wt-check-done {\n border-color: ${tint(C.ok, 55)}; background: ${tint(C.ok, 14)}; color: ${C.ok};\n}\n.wt-row { display: flex; align-items: flex-start; gap: 8px; padding: 5px 8px; border-radius: 10px; }\n.wt-row:hover { background: ${C.hover}; }\n.wt-row-edit {\n flex-direction: column; align-items: stretch; gap: 6px;\n border: 1px solid ${C.border1}; background: ${C.layer1};\n}\n.wt-group-head {\n display: flex; align-items: center; gap: 7px; padding: 3px 8px; border-radius: 8px;\n cursor: pointer; user-select: none; color: ${C.label2};\n}\n.wt-group-head:hover { background: ${C.hover}; }\n.wt-chip {\n display: inline-flex; align-items: baseline; gap: 4px; font-size: 11px; line-height: 1.7;\n padding: 0 8px; border-radius: 999px; border: 1px solid ${C.border1}; color: ${C.label3};\n white-space: nowrap;\n}\n.wt-tag {\n display: inline-flex; align-items: center; gap: 3px; font-size: 10.5px; line-height: 1.6;\n padding: 0 6px; border-radius: 999px; border: 1px solid ${C.border1}; color: ${C.label3};\n white-space: nowrap;\n}\n.wt-link { cursor: pointer; user-select: none; color: var(--dsw-alias-link); font-size: 11px; }\n.wt-link:hover { text-decoration: underline; }\n.wt-title { cursor: pointer; word-break: break-word; }\n.wt-title:hover { text-decoration: underline; text-decoration-style: dotted; text-underline-offset: 3px; }\n.wt-spin {\n display: inline-block; width: 12px; height: 12px; border-radius: 50%;\n border: 2px solid ${C.border}; border-top-color: ${C.brand}; animation: wt-spin .8s linear infinite;\n}\n`;\n\n/* ------------------------------------------------------------------ *\n * \u56FE\u6807\uFF1A\u7EAF React.createElement('svg', ...) \u81EA\u7ED8\uFF0C\u989C\u8272\u4E00\u5F8B currentColor\uFF0C\n * \u8FD9\u6837\u540C\u4E00\u4E2A\u56FE\u6807\u5728\u52FE\u9009\u6846\u91CC\u662F\u7EFF\u8272\u3001\u5728\u6309\u94AE\u91CC\u662F\u6B21\u7EA7\u6587\u5B57\u8272\uFF0C\u4E0D\u9700\u8981\u7B2C\u4E8C\u5957\u753B\u6CD5\u3002\n * ------------------------------------------------------------------ */\nfunction WorkTodoIcon({ size = 16, active }) {\n return React.createElement('svg', {\n width: size, height: size, viewBox: '0 0 16 16', fill: 'none',\n stroke: 'currentColor', strokeWidth: 1.3, strokeLinecap: 'round', strokeLinejoin: 'round',\n style: { opacity: active ? 1 : 0.82 },\n }, [\n React.createElement('rect', { key: 'a', x: '2.7', y: '3.1', width: '10.6', height: '10.4', rx: '2' }),\n React.createElement('path', { key: 'b', d: 'M5.6 1.7h4.8v2.7H5.6z' }),\n React.createElement('path', { key: 'c', d: 'M5.7 9.3l1.7 1.7 3.1-3.5' }),\n ]);\n}\n\nfunction IconCheck({ size = 11 }) {\n return React.createElement('svg', {\n width: size, height: size, viewBox: '0 0 12 12', fill: 'none',\n stroke: 'currentColor', strokeWidth: 2, strokeLinecap: 'round', strokeLinejoin: 'round',\n }, React.createElement('path', { d: 'M2 6.3 4.6 8.9 10 3.1' }));\n}\n\nfunction IconChevron({ open, size = 10 }) {\n return React.createElement('svg', {\n width: size, height: size, viewBox: '0 0 14 14', fill: 'none',\n stroke: 'currentColor', strokeWidth: 1.8, strokeLinecap: 'round', strokeLinejoin: 'round',\n // \u6536\u8D77\u65F6\u628A\u300C\u5411\u4E0B\u300D\u7684\u7BAD\u5934\u8F6C\u6210\u300C\u5411\u53F3\u300D\uFF1A\u6BD4\u753B\u4E24\u4E2A\u56FE\u6807\u4FBF\u5B9C\uFF0C\u4E5F\u4E0D\u4F1A\u56E0\u4E3A\u5C3A\u5BF8\u4E0D\u540C\u800C\u8DF3\u4E00\u4E0B\n style: { flex: 'none', transform: open ? 'none' : 'rotate(-90deg)', transition: 'transform .15s ease' },\n }, React.createElement('path', { d: 'm3.4 5.2 3.6 3.6 3.6-3.6' }));\n}\n\nfunction IconTrash({ size = 13 }) {\n return React.createElement('svg', {\n width: size, height: size, viewBox: '0 0 16 16', fill: 'none',\n stroke: 'currentColor', strokeWidth: 1.3, strokeLinecap: 'round', strokeLinejoin: 'round',\n }, [\n React.createElement('path', { key: 'a', d: 'M2.8 4.4h10.4' }),\n React.createElement('path', { key: 'b', d: 'M6.4 4.4V2.9h3.2v1.5' }),\n React.createElement('path', { key: 'c', d: 'M4.5 4.4l.7 8.4h5.6l.7-8.4' }),\n React.createElement('path', { key: 'd', d: 'M6.9 6.8v3.9M9.1 6.8v3.9' }),\n ]);\n}\n\nfunction IconClose({ size = 11 }) {\n return React.createElement('svg', {\n width: size, height: size, viewBox: '0 0 12 12', fill: 'none',\n stroke: 'currentColor', strokeWidth: 1.6, strokeLinecap: 'round',\n }, [\n React.createElement('path', { key: 'a', d: 'M3 3l6 6' }),\n React.createElement('path', { key: 'b', d: 'M9 3l-6 6' }),\n ]);\n}\n\nfunction IconRefresh({ size = 12 }) {\n return React.createElement('svg', {\n width: size, height: size, viewBox: '0 0 16 16', fill: 'none',\n stroke: 'currentColor', strokeWidth: 1.4, strokeLinecap: 'round', strokeLinejoin: 'round',\n }, [\n React.createElement('path', { key: 'a', d: 'M2.6 8a5.4 5.4 0 0 1 9.1-3.9' }),\n React.createElement('path', { key: 'b', d: 'M13.4 8a5.4 5.4 0 0 1-9.1 3.9' }),\n React.createElement('path', { key: 'c', d: 'M12.3 1.9v2.6H9.7' }),\n React.createElement('path', { key: 'd', d: 'M3.7 14.1v-2.6h2.6' }),\n ]);\n}\n\n/* ------------------------------------------------------------------ *\n * \u5C0F\u5DE5\u5177\n * ------------------------------------------------------------------ */\n/** \u672C\u5730\u300C\u4ECA\u5929\u300D\u3002\u53EA\u5728\u8BE5\u5B57\u6BB5\u7F3A\u5931\u65F6\u515C\u5E95\uFF08\u5BBF\u4E3B\u7684 today \u662F\u6743\u5A01\u503C\uFF0C\u4E14\u4E0E\u672C\u673A\u65F6\u533A\u4E00\u81F4\uFF09\u3002 */\nfunction localToday() {\n const d = new Date();\n const pad = (n) => String(n).padStart(2, '0');\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;\n}\n\nconst asArray = (value) => (Array.isArray(value) ? value : []);\n\n/**\n * \u9762\u677F\u4E0A\u7684\u5199\u64CD\u4F5C\u7EDF\u4E00\u8D70\u8FD9\u91CC\u3002\n * \u7EA6\u5B9A\uFF1A\u5BBF\u4E3B\u6240\u6709\u8DEF\u7531\u90FD\u56DE 200\uFF0C\u6210\u8D25\u770B `ok`\uFF1B\u5931\u8D25\u65F6\u628A\u5BBF\u4E3B\u7684 error \u539F\u6587\u629B\u51FA\u53BB\uFF0C\n * \u7531\u9762\u677F\u9876\u90E8\u7684\u9519\u8BEF\u6761\u539F\u6837\u663E\u793A\u2014\u2014\u7EDD\u4E0D\u541E\u6389\u539F\u56E0\uFF08\u7528\u6237\u8981\u770B\u5230\u300C\u6807\u9898\u8FC7\u957F\u300D\u8FD9\u79CD\u5177\u4F53\u8BDD\uFF09\u3002\n * @param {string} path \u76F8\u5BF9\u8DEF\u7531\u524D\u7F00\u7684\u8DEF\u5F84\uFF0C\u5982 '/create'\n * @param {object} body\n * @returns {Promise<object>} \u6210\u529F\u65F6\u8FD4\u56DE data\n */\nasync function postJson(path, body) {\n const response = await fetch(`${ROUTE_BASE}${path}`, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n cache: 'no-store',\n credentials: 'same-origin',\n body: JSON.stringify(body ?? {}),\n });\n if (!response.ok) throw new Error(`HTTP ${response.status}`);\n const parsed = await response.json().catch(() => null);\n if (!parsed) throw new Error('\u54CD\u5E94\u4E0D\u662F JSON');\n if (!parsed.ok) throw new Error(parsed.error ?? parsed.reason ?? '\u672A\u77E5\u9519\u8BEF');\n return parsed.data ?? {};\n}\n\n/* ------------------------------------------------------------------ *\n * \u6570\u636E\u83B7\u53D6\n * ------------------------------------------------------------------ */\n/**\n * \u6A21\u5757\u7EA7\u7F13\u5B58\uFF1A\u9762\u677F\u88AB\u5207\u8D70\u518D\u5207\u56DE\u6765\u65F6 React \u4F1A\u91CD\u65B0\u6302\u8F7D\uFF0C\u6709\u4E0A\u6B21\u7ED3\u679C\u5C31\u5148\u6E32\u67D3\u3001\u540E\u53F0\u518D\u5237\u65B0\n * \uFF08stale-while-revalidate\uFF09\u3002\u4FA7\u680F\u6765\u56DE\u70B9\u7684\u65F6\u5019\u4E0D\u8BE5\u6BCF\u6B21\u90FD\u8F6C\u5708\u3002\n */\nlet lastList = null;\n\nfunction useList() {\n const [state, setState] = React.useState(() => (lastList\n ? { status: 'ready', data: lastList, error: null }\n : { status: 'loading', data: null, error: null }));\n const [tick, setTick] = React.useState(0);\n\n React.useEffect(() => {\n let alive = true;\n /**\n * filter=all \u800C\u4E0D\u662F open\uFF1A\u9762\u677F\u662F\u300C\u6309\u5206\u7EC4\u5C55\u793A\u300D\u7684\uFF0C\u5BBF\u4E3B\u7684\u5206\u7EC4\u662F\u5728**\u7B5B\u9009\u540E\u7684\u5B50\u96C6**\u4E0A\u7B97\u7684\uFF0C\n * \u7528 open \u65F6 groups.completed \u6052\u4E3A\u7A7A\uFF0C\u300C\u5DF2\u5B8C\u6210\u300D\u90A3\u4E00\u7EC4\u5C31\u6C38\u8FDC\u51FA\u4E0D\u6765\uFF08\u4E5F\u5C31\u6CA1\u6CD5\u6298\u53E0/\u5C55\u5F00\uFF09\u3002\n * \u7EDF\u8BA1 stats \u4E0D\u53D7 filter \u5F71\u54CD\uFF08\u5BBF\u4E3B\u6309\u5168\u91CF\u7B97\uFF09\uFF0C\u6240\u4EE5\u9876\u90E8\u6570\u5B57\u4ECD\u7136\u662F\u5168\u5C40\u53E3\u5F84\u3002\n */\n fetch(`${ROUTE_LIST}?filter=all`, { cache: 'no-store', credentials: 'same-origin' })\n .then(async (response) => {\n if (!response.ok) throw new Error(`HTTP ${response.status}`);\n const body = await response.json().catch(() => null);\n if (!body?.ok) throw new Error(body?.error ?? body?.reason ?? '\u672A\u77E5\u9519\u8BEF');\n lastList = body.data;\n if (alive) setState({ status: 'ready', data: body.data, error: null });\n })\n .catch((error) => {\n // \u5DF2\u7ECF\u6709\u6570\u636E\u65F6\u53EA\u6807\u8BB0\u9519\u8BEF\uFF0C\u4E0D\u6E05\u7A7A\u9762\u677F\uFF1A\u4E00\u6B21\u6296\u52A8\u4E0D\u8BE5\u8BA9\u4EBA\u770B\u4E0D\u5230\u81EA\u5DF1\u7684\u5F85\u529E\n if (alive) {\n setState((prev) => ({\n ...prev,\n status: prev.data ? 'ready' : 'failed',\n error: String(error?.message ?? error),\n }));\n }\n });\n return () => { alive = false; };\n }, [tick]);\n\n const refresh = React.useCallback(() => setTick((n) => n + 1), []);\n return { ...state, refresh };\n}\n\n/* ------------------------------------------------------------------ *\n * \u5FEB\u901F\u6DFB\u52A0\n * ------------------------------------------------------------------ */\nfunction QuickAdd({ t, onAdd, busy }) {\n const [title, setTitle] = React.useState('');\n const [due, setDue] = React.useState('');\n const [priority, setPriority] = React.useState('normal');\n\n const submit = () => {\n if (busy) return;\n // \u622A\u6B62\u65E5\u671F\u4E0E\u4F18\u5148\u7EA7\u662F\u300C\u8FD9\u4E00\u6279\u300D\u7684\u9009\u62E9\uFF0C\u52A0\u5B8C\u4FDD\u7559\uFF1A\u540C\u4E00\u5929\u8FDE\u7740\u52A0\u51E0\u4EF6\u4E8B\u65F6\u4E0D\u7528\u53CD\u590D\u586B\n Promise.resolve(onAdd({ title, due, priority })).then((ok) => {\n if (ok !== false) setTitle('');\n }).catch(() => { /* onAdd \u5185\u90E8\u5DF2\u7ECF\u541E\u6389\u9519\u8BEF\u5E76\u663E\u793A\u5728\u9519\u8BEF\u6761\u4E0A */ });\n };\n\n return React.createElement('div', {\n style: { display: 'flex', alignItems: 'center', gap: 6, flexWrap: 'wrap', marginBottom: 10 },\n }, [\n React.createElement('input', {\n key: 'ti',\n className: 'wt-input',\n style: { flex: '1 1 200px', fontSize: 12.5, padding: '5px 9px' },\n value: title,\n placeholder: t('addPlaceholder'),\n 'aria-label': t('addPlaceholder'),\n onChange: (event) => setTitle(event.target.value),\n onKeyDown: (event) => { if (event.key === 'Enter') submit(); },\n }),\n React.createElement('label', {\n key: 'due',\n title: t('dueLabel'),\n style: { display: 'inline-flex', alignItems: 'center', gap: 4, fontSize: 11, color: C.label3 },\n }, [\n t('dueLabel'),\n React.createElement('input', {\n key: 'i',\n className: 'wt-input',\n type: 'date',\n value: due,\n 'aria-label': t('dueLabel'),\n onChange: (event) => setDue(event.target.value),\n }),\n ]),\n React.createElement('label', {\n key: 'prio',\n title: t('priorityLabel'),\n style: { display: 'inline-flex', alignItems: 'center', gap: 4, fontSize: 11, color: C.label3 },\n }, [\n t('priorityLabel'),\n React.createElement('select', {\n key: 's',\n className: 'wt-input',\n value: priority,\n 'aria-label': t('priorityLabel'),\n onChange: (event) => setPriority(event.target.value),\n }, [\n React.createElement('option', { key: 'high', value: 'high' }, t('prioHigh')),\n React.createElement('option', { key: 'normal', value: 'normal' }, t('prioNormal')),\n React.createElement('option', { key: 'low', value: 'low' }, t('prioLow')),\n ]),\n ]),\n React.createElement('button', {\n key: 'add',\n type: 'button',\n className: 'wt-btn wt-btn-primary',\n disabled: Boolean(busy),\n onClick: submit,\n }, t('add')),\n ]);\n}\n\n/* ------------------------------------------------------------------ *\n * \u5355\u884C\uFF1A\u67E5\u770B / \u884C\u5185\u7F16\u8F91 / \u4E8C\u6B21\u786E\u8BA4\u5220\u9664\n * \u72B6\u6001\u90FD\u7559\u5728\u8FD9\u4E00\u884C\u5185\u90E8\uFF0C\u6240\u4EE5\u5728\u522B\u7684\u884C\u4E0A\u6572\u5B57\u3001\u6216\u8005\u5217\u8868\u5237\u65B0\uFF0C\u90FD\u4E0D\u4F1A\u628A\u6B63\u5728\u7F16\u8F91\u7684\u5185\u5BB9\u51B2\u6389\u3002\n * ------------------------------------------------------------------ */\nfunction TodoRow({ todo, today, t, onToggle, onRemove, onSave }) {\n const [editing, setEditing] = React.useState(false);\n const [draft, setDraft] = React.useState(null);\n const [notesOpen, setNotesOpen] = React.useState(false);\n const [confirming, setConfirming] = React.useState(false);\n\n // \u4E8C\u6B21\u786E\u8BA4\u8981\u80FD\u81EA\u5DF1\u5931\u6548\uFF1A\u70B9\u4E86\u5220\u9664\u53C8\u6539\u4E3B\u610F\u7684\u4EBA\uFF0C\u4E0D\u8BE5\u5728\u51E0\u5206\u949F\u540E\u8BEF\u89E6\u4E00\u6B21\u5C31\u771F\u5220\u6389\n React.useEffect(() => {\n if (!confirming) return undefined;\n const id = setTimeout(() => setConfirming(false), 5000);\n return () => clearTimeout(id);\n }, [confirming]);\n\n const row = todo ?? {};\n const done = row.status === 'completed';\n const due = typeof row.due === 'string' ? row.due : '';\n const overdue = !done && Boolean(due) && Boolean(today) && due < today;\n\n const beginEdit = () => {\n setDraft({\n title: typeof row.title === 'string' ? row.title : '',\n due,\n priority: row.priority === 'high' || row.priority === 'low' ? row.priority : 'normal',\n project: typeof row.project === 'string' ? row.project : '',\n notes: typeof row.notes === 'string' ? row.notes : '',\n });\n setNotesOpen(Boolean(row.notes));\n setEditing(true);\n };\n\n const stopEdit = () => { setEditing(false); setDraft(null); };\n\n /**\n * \u4FDD\u5B58\u65F6\u53EA\u53D1\u6539\u52A8\u8FC7\u7684\u5B57\u6BB5\uFF1A\u5BBF\u4E3B\u5BF9\u7A7A patch \u4F1A\u56DE empty-patch \u9519\u8BEF\uFF0C\n * \u800C\u300C\u6253\u5F00\u53C8\u539F\u6837\u5173\u6389\u300D\u663E\u7136\u4E0D\u8BE5\u62A5\u9519\uFF0C\u6240\u4EE5\u8FD9\u91CC\u5148\u81EA\u5DF1\u6BD4\u5BF9\u4E00\u904D\u3002\n */\n const submit = () => {\n if (!draft) return;\n const patch = {};\n const title = String(draft.title ?? '').trim();\n if (title !== (row.title ?? '')) patch.title = title;\n const nextDue = draft.due || '';\n if (nextDue !== due) patch.due = nextDue; // \u7A7A\u4E32 = \u6E05\u7A7A\u622A\u6B62\u65E5\u671F\n const priority = draft.priority || 'normal';\n if (priority !== (row.priority ?? 'normal')) patch.priority = priority;\n const project = String(draft.project ?? '').trim();\n if (project !== (row.project ?? '')) patch.project = project; // \u7A7A\u4E32 = \u53BB\u6389\u9879\u76EE\n const notes = String(draft.notes ?? '').trim();\n if (notes !== (row.notes ?? '')) patch.notes = notes;\n stopEdit();\n if (!Object.keys(patch).length) return;\n Promise.resolve(onSave(row.id, patch)).catch(() => { /* \u5DF2\u5728\u9519\u8BEF\u6761\u4E0A\u663E\u793A */ });\n };\n\n const inputStyle = { fontSize: 12, padding: '3px 7px' };\n\n if (editing && draft) {\n const field = (key, label, control) => React.createElement('label', {\n key,\n style: { display: 'inline-flex', alignItems: 'center', gap: 4, fontSize: 11, color: C.label3 },\n }, [label, control]);\n\n return React.createElement('div', { className: 'wt-row wt-row-edit' }, [\n React.createElement('div', { key: 'top', style: { display: 'flex', gap: 6, alignItems: 'center' } }, [\n React.createElement('input', {\n key: 'ti',\n className: 'wt-input',\n style: { ...inputStyle, flex: 1, minWidth: 0 },\n value: draft.title,\n autoFocus: true,\n placeholder: t('titlePlaceholder'),\n 'aria-label': t('titlePlaceholder'),\n onChange: (event) => setDraft((prev) => ({ ...prev, title: event.target.value })),\n onKeyDown: (event) => {\n if (event.key === 'Enter') submit();\n if (event.key === 'Escape') stopEdit();\n },\n }),\n React.createElement('button', {\n key: 'save', type: 'button', className: 'wt-btn wt-btn-primary', onClick: submit,\n }, t('save')),\n React.createElement('button', {\n key: 'cancel', type: 'button', className: 'wt-btn', onClick: stopEdit,\n }, t('cancel')),\n ]),\n React.createElement('div', {\n key: 'fields',\n style: { display: 'flex', gap: 10, flexWrap: 'wrap', alignItems: 'center' },\n }, [\n field('due', t('dueLabel'), React.createElement('input', {\n className: 'wt-input', style: inputStyle, type: 'date', value: draft.due,\n 'aria-label': t('dueLabel'),\n onChange: (event) => setDraft((prev) => ({ ...prev, due: event.target.value })),\n })),\n field('prio', t('priorityLabel'), React.createElement('select', {\n className: 'wt-input', style: inputStyle, value: draft.priority,\n 'aria-label': t('priorityLabel'),\n onChange: (event) => setDraft((prev) => ({ ...prev, priority: event.target.value })),\n }, [\n React.createElement('option', { key: 'high', value: 'high' }, t('prioHigh')),\n React.createElement('option', { key: 'normal', value: 'normal' }, t('prioNormal')),\n React.createElement('option', { key: 'low', value: 'low' }, t('prioLow')),\n ])),\n field('project', t('projectLabel'), React.createElement('input', {\n className: 'wt-input', style: { ...inputStyle, width: 130 }, value: draft.project,\n placeholder: t('projectPlaceholder'),\n 'aria-label': t('projectPlaceholder'),\n onChange: (event) => setDraft((prev) => ({ ...prev, project: event.target.value })),\n })),\n ]),\n React.createElement('div', { key: 'notes' }, [\n notesOpen\n ? React.createElement('div', { key: 'box', style: { display: 'flex', flexDirection: 'column', gap: 4 } }, [\n React.createElement('textarea', {\n key: 'ta',\n className: 'wt-input',\n style: { width: '100%', boxSizing: 'border-box', resize: 'vertical', minHeight: 54 },\n rows: 3,\n value: draft.notes,\n placeholder: t('notesPlaceholder'),\n 'aria-label': t('notesLabel'),\n onChange: (event) => setDraft((prev) => ({ ...prev, notes: event.target.value })),\n // textarea \u91CC\u56DE\u8F66\u8981\u6362\u884C\uFF0C\u6240\u4EE5\u4FDD\u5B58\u7528 Ctrl/Cmd+Enter\n onKeyDown: (event) => {\n if (event.key === 'Enter' && (event.metaKey || event.ctrlKey)) submit();\n if (event.key === 'Escape') stopEdit();\n },\n }),\n React.createElement('span', {\n key: 'hide', className: 'wt-link', onClick: () => setNotesOpen(false),\n }, t('notesHide')),\n ])\n : React.createElement('span', {\n key: 'add', className: 'wt-link', onClick: () => setNotesOpen(true),\n }, t('notesAdd')),\n ]),\n ]);\n }\n\n const meta = [];\n if (row.priority === 'high') {\n meta.push(React.createElement('span', {\n key: 'p',\n className: 'wt-tag',\n style: { color: C.warn, borderColor: tint(C.warn, 50), background: tint(C.warn, 12), fontWeight: 600 },\n }, t('prioHigh')));\n } else if (row.priority === 'low') {\n meta.push(React.createElement('span', { key: 'p', className: 'wt-tag' }, t('prioLow')));\n }\n if (due) {\n meta.push(React.createElement('span', {\n key: 'd',\n style: { color: overdue ? C.warn : C.label3, fontSize: 11 },\n }, overdue ? `${t('overdueTag')} ${due}` : due));\n }\n if (row.project) {\n meta.push(React.createElement('span', { key: 'j', className: 'wt-tag' }, `#${row.project}`));\n }\n // \u6765\u6E90\u6807\u8BB0\uFF1A\u8BA9\u7528\u6237\u4E00\u773C\u770B\u51FA\u8FD9\u6761\u662F\u6A21\u578B\u52A0\u7684\u3001\u8FD8\u662F\u4ECE\u4F1A\u8BDD\u63D0\u5347\u6765\u7684\uFF08\u4EBA\u81EA\u5DF1\u52A0\u7684\u4E0D\u7528\u6807\uFF09\n if (row.source === 'agent' || row.source === 'session') {\n meta.push(React.createElement('span', {\n key: 's',\n className: 'wt-tag',\n title: row.source === 'agent' ? t('sourceAgent') : t('sourceSession'),\n }, row.source === 'agent' ? t('sourceAgent') : t('sourceSession')));\n }\n\n return React.createElement('div', { className: 'wt-row' }, [\n React.createElement('button', {\n key: 'check',\n type: 'button',\n className: `wt-check${done ? ' wt-check-done' : ''}`,\n 'aria-label': done ? t('unmarkDone') : t('markDone'),\n title: done ? t('unmarkDone') : t('markDone'),\n onClick: () => { Promise.resolve(onToggle(row.id)).catch(() => { /* \u5DF2\u5728\u9519\u8BEF\u6761\u4E0A\u663E\u793A */ }); },\n }, done ? React.createElement(IconCheck, { key: 'i' }) : null),\n React.createElement('div', { key: 'main', style: { flex: 1, minWidth: 0 } }, [\n React.createElement('div', {\n key: 'title',\n className: 'wt-title',\n title: t('editHint'),\n onClick: beginEdit,\n style: {\n color: done ? C.label3 : C.label,\n textDecoration: done ? 'line-through' : 'none',\n fontWeight: row.priority === 'high' && !done ? 650 : 400,\n },\n }, typeof row.title === 'string' && row.title ? row.title : t('untitled')),\n meta.length\n ? React.createElement('div', {\n key: 'meta',\n style: { display: 'flex', alignItems: 'center', gap: 6, flexWrap: 'wrap', marginTop: 2 },\n }, meta)\n : null,\n ]),\n React.createElement('button', {\n key: 'del',\n type: 'button',\n className: confirming ? 'wt-btn wt-btn-danger' : 'wt-icon-btn wt-icon-btn-danger',\n title: confirming ? t('confirmDelete') : t('deleteBtn'),\n 'aria-label': t('deleteBtn'),\n onClick: () => {\n if (!confirming) { setConfirming(true); return; }\n setConfirming(false);\n Promise.resolve(onRemove(row.id)).catch(() => { /* \u5DF2\u5728\u9519\u8BEF\u6761\u4E0A\u663E\u793A */ });\n },\n }, confirming ? t('confirmDelete') : React.createElement(IconTrash, { key: 'i' })),\n ]);\n}\n\n/* ------------------------------------------------------------------ *\n * \u5206\u7EC4\uFF1A\u7A7A\u7EC4\u6574\u5757\u4E0D\u6E32\u67D3\uFF0C\u907F\u514D\u4E94\u4E2A\u7A7A\u6807\u9898\u5806\u5728\u9762\u677F\u4E0A\n * ------------------------------------------------------------------ */\nfunction Group({ label, items, closed, t, today, onToggleOpen, onToggleTodo, onRemove, onSave }) {\n const list = asArray(items);\n if (!list.length) return null;\n return React.createElement('div', { style: { marginTop: 6 } }, [\n React.createElement('div', {\n key: 'head',\n className: 'wt-group-head',\n onClick: onToggleOpen,\n title: closed ? t('expand') : t('collapse'),\n role: 'button',\n 'aria-expanded': !closed,\n }, [\n React.createElement(IconChevron, { key: 'c', open: !closed }),\n React.createElement('span', { key: 'l', style: { fontWeight: 600, fontSize: 12 } }, label),\n React.createElement('span', { key: 'n', style: { fontSize: 11, color: C.label3 } }, String(list.length)),\n React.createElement('span', { key: 'sp', style: { flex: 1 } }),\n React.createElement('span', { key: 'h', style: { fontSize: 11, color: C.label3 } }, closed ? t('expand') : t('collapse')),\n ]),\n closed ? null : React.createElement('div', { key: 'body' }, list.map((todo, index) => React.createElement(TodoRow, {\n key: (todo && todo.id) || `row-${index}`,\n todo,\n today,\n t,\n onToggle: onToggleTodo,\n onRemove,\n onSave,\n }))),\n ]);\n}\n\n/* ------------------------------------------------------------------ *\n * \u4F1A\u8BDD\u5F85\u529E\uFF1A\u63D0\u5347\u4E3A\u5DE5\u4F5C\u5F85\u529E\n *\n * \u5B98\u65B9\u4F1A\u8BDD todos \u53EA\u80FD\u901A\u8FC7 useProjection hook \u62FF\u5230\uFF0C\u800C hook \u4E0D\u80FD\u5728\u7EC4\u4EF6\u91CC\u300C\u6709\u6761\u4EF6\u5730\u8C03\u7528\u300D\u3002\n * \u6240\u4EE5\u8FD9\u91CC\u62C6\u6210\u72EC\u7ACB\u5B50\u7EC4\u4EF6\uFF1A\u7236\u7EC4\u4EF6\u53EA\u5728 props.useProjection \u786E\u5B9E\u662F\u51FD\u6570\u65F6\u624D\u6302\u8F7D\u5B83\uFF0C\n * \u4E00\u65E6\u6302\u8F7D\uFF0C\u8FD9\u4E00\u4EFD\u5B9E\u4F8B\u91CC hook \u7684\u8C03\u7528\u6B21\u6570\u5C31\u662F\u6052\u5B9A\u7684 \u2014\u2014 \u4E0D\u8FDD\u53CD hooks \u89C4\u5219\u3002\n * \u6295\u5F71\u4E3A\u7A7A\uFF08\u8FD9\u4E2A\u4F1A\u8BDD\u6CA1\u5217\u8FC7\u5F85\u529E\uFF09\u65F6\u6574\u5757\u8FD4\u56DE null\uFF0C\u9762\u677F\u4E0A\u4E0D\u4F1A\u591A\u51FA\u4E00\u884C\u6CA1\u7528\u7684\u6309\u94AE\u3002\n * ------------------------------------------------------------------ */\nfunction SessionAdopt({ useProjection, t, onAdopt, busy }) {\n let projected;\n try {\n projected = useProjection('todos');\n } catch {\n // \u6295\u5F71\u5C1A\u672A\u5C31\u7EEA / \u5BBF\u4E3B\u7248\u672C\u6CA1\u6709\u8FD9\u4E2A\u6295\u5F71\uFF1A\u5F53\u4F5C\u6CA1\u6709\u4F1A\u8BDD\u5F85\u529E\n projected = null;\n }\n // \u6295\u5F71\u53EF\u80FD\u662F\u88F8\u6570\u7EC4\uFF0C\u4E5F\u53EF\u80FD\u662F { todos: [...] } \u5305\u4E00\u5C42\u2014\u2014\u4E24\u79CD\u5F62\u72B6\u90FD\u8BA4\n const raw = Array.isArray(projected) ? projected : asArray(projected?.todos);\n const items = raw.map((item) => ({\n content: typeof item?.content === 'string' ? item.content\n : (typeof item?.title === 'string' ? item.title : ''),\n status: typeof item?.status === 'string' ? item.status : 'pending',\n })).filter((item) => item.content.trim());\n if (!items.length) return null;\n const openCount = items.filter((item) => item.status !== 'completed').length;\n\n return React.createElement('div', {\n style: { display: 'flex', alignItems: 'center', gap: 8, flexWrap: 'wrap', marginBottom: 10 },\n }, [\n React.createElement('button', {\n key: 'b',\n type: 'button',\n className: 'wt-btn wt-btn-primary',\n disabled: Boolean(busy),\n title: t('adoptHint'),\n onClick: () => { Promise.resolve(onAdopt(items)).catch(() => { /* \u5DF2\u5728\u9519\u8BEF\u6761\u4E0A\u663E\u793A */ }); },\n }, `${t('adoptPre')}${items.length}${t('adoptPost')}`),\n React.createElement('span', {\n key: 'h',\n title: t('adoptHint'),\n style: { fontSize: 11, color: C.label3 },\n }, `${t('adoptPending')} ${openCount}`),\n ]);\n}\n\n/* ------------------------------------------------------------------ *\n * \u9762\u677F\u4E3B\u4F53\n * ------------------------------------------------------------------ */\nconst GROUPS = [\n { key: 'overdue', label: 'groupOverdue' },\n { key: 'today', label: 'groupToday' },\n { key: 'week', label: 'groupWeek' },\n { key: 'later', label: 'groupLater' },\n { key: 'completed', label: 'groupCompleted' },\n];\n\nfunction WorkTodoPanel(props) {\n // t \u7531 locale \u670D\u52A1\u901A\u8FC7 slot props \u6CE8\u5165\uFF1B\u62FF\u4E0D\u5230\u65F6\u9000\u56DE\u4E2D\u6587\uFF0C\u81F3\u5C11\u4E0D\u663E\u793A\u88F8 key\n const t = typeof props?.t === 'function' ? props.t : (key) => zh[key] ?? key;\n const { status, data, error, refresh } = useList();\n\n // \u5199\u64CD\u4F5C\u7684\u9519\u8BEF\u6761\uFF1BreadError \u662F\u62C9\u53D6\u9519\u8BEF\uFF08\u7528\u6237\u5173\u6389\u4E4B\u540E\uFF0C\u53EA\u6709\u6362\u6210\u65B0\u9519\u8BEF\u624D\u518D\u5F39\uFF09\n const [barError, setBarError] = React.useState(null);\n const [dismissedReadError, setDismissedReadError] = React.useState(null);\n const readError = error && error !== dismissedReadError ? error : null;\n const shownError = barError ?? readError;\n\n const [notice, setNotice] = React.useState(null);\n const [pending, setPending] = React.useState(0);\n // \u300C\u5DF2\u5B8C\u6210\u300D\u9ED8\u8BA4\u6298\u53E0\uFF08\u505A\u5B8C\u7684\u4E8B\u4E0D\u7528\u5360\u6EE1\u5C4F\u5E55\uFF09\uFF0C\u5176\u4F59\u9ED8\u8BA4\u5C55\u5F00\n const [closed, setClosed] = React.useState({ completed: true });\n\n /**\n * \u6240\u6709\u5199\u64CD\u4F5C\u7684\u7EDF\u4E00\u5916\u58F3\uFF1A\u6210\u529F\u6E05\u6389\u9519\u8BEF\u6761\uFF0C\u5931\u8D25\u628A\u5BBF\u4E3B\u7684 error \u539F\u6587\u653E\u4E0A\u53BB\uFF0C\n * \u65E0\u8BBA\u6210\u8D25\u6700\u540E\u90FD\u91CD\u65B0\u62C9\u4E00\u6B21\u5217\u8868\uFF08\u907F\u514D\u672C\u5730\u72B6\u6001\u548C\u78C1\u76D8\u4E0A\u7684\u771F\u76F8\u5BF9\u4E0D\u4E0A\uFF09\u3002\n * @returns {Promise<{ok: boolean, data: object}>} data \u662F\u5BBF\u4E3B\u8FD4\u56DE\u7684 data\uFF08\u5931\u8D25\u65F6\u4E3A\u7A7A\u5BF9\u8C61\uFF09\n */\n const runWrite = React.useCallback(async (job) => {\n setPending((n) => n + 1);\n try {\n const data = await job();\n setBarError(null);\n return { ok: true, data: data ?? {} };\n } catch (writeError) {\n setBarError(String(writeError?.message ?? writeError));\n return { ok: false, data: {} };\n } finally {\n setPending((n) => Math.max(0, n - 1));\n refresh();\n }\n }, [refresh]);\n\n const handleAdd = React.useCallback((input) => {\n const title = String(input?.title ?? '').trim();\n // \u7A7A\u6807\u9898\u5148\u5728\u672C\u5730\u62E6\u4E0B\uFF1A\u8FD9\u6761\u6587\u6848\u8981\u8D70 t()\uFF0C\u800C\u5BBF\u4E3B\u7684\u62A5\u9519\u662F\u4E2D\u6587\u7684\uFF0C\u4E24\u4E2A\u90FD\u663E\u793A\u4F1A\u66F4\u4E71\n if (!title) {\n setBarError(t('titleEmpty'));\n return Promise.resolve(false);\n }\n return runWrite(() => postJson('/create', {\n title,\n due: input?.due ? String(input.due) : null,\n priority: input?.priority ?? 'normal',\n })).then((result) => result.ok);\n }, [runWrite, t]);\n\n const handleToggle = React.useCallback((ref) => runWrite(() => postJson('/status', { ref, toggle: true })), [runWrite]);\n const handleRemove = React.useCallback((ref) => runWrite(() => postJson('/remove', { ref })), [runWrite]);\n const handleSave = React.useCallback((ref, patch) => runWrite(() => postJson('/update', { ref, ...patch })), [runWrite]);\n\n const handleAdopt = React.useCallback((sessionTodos) => runWrite(() => postJson('/adopt', { todos: sessionTodos }))\n .then((result) => {\n // runWrite \u5DF2\u7ECF\u5237\u65B0\u8FC7\u5217\u8868\uFF0C\u8FD9\u91CC\u8865\u4E00\u53E5\u300C\u63D0\u5347\u4E86\u51E0\u6761\u3001\u8DF3\u8FC7\u51E0\u6761\u300D\u7684\u56DE\u6267\uFF0C\u5426\u5219\u70B9\u5B8C\u50CF\u6CA1\u53CD\u5E94\n if (result.ok) {\n const created = Array.isArray(result.data?.created) ? result.data.created.length : 0;\n const skipped = Number.isFinite(Number(result.data?.skipped)) ? Number(result.data.skipped) : 0;\n setNotice(`${t('adoptDone')} ${created} \u00B7 ${t('adoptSkipped')} ${skipped}`);\n }\n return result.ok;\n }), [runWrite, t]);\n\n // hooks \u89C4\u5219\uFF1A\u8FD9\u91CC\u53EA\u662F\u53D6\u7528\uFF0C\u4E0D\u8C03\u7528\u3002\u771F\u6B63\u7684\u8C03\u7528\u5728 SessionAdopt \u91CC\uFF08\u6309\u6761\u4EF6\u6302\u8F7D\u6574\u4E2A\u5B50\u7EC4\u4EF6\uFF09\n const useProjection = typeof props?.useProjection === 'function' ? props.useProjection : undefined;\n\n const rootStyle = {\n height: '100%', overflow: 'auto', padding: '16px 18px 40px', boxSizing: 'border-box',\n color: C.label, fontFamily: 'var(--dsw-font-family, system-ui, sans-serif)', fontSize: 13,\n };\n\n if (status === 'loading' && !data) {\n return React.createElement('div', {\n className: 'wt-root',\n style: { ...rootStyle, display: 'flex', alignItems: 'center', gap: 8, color: C.label3, padding: 28 },\n }, [\n React.createElement('style', { key: 'css' }, STYLE_TEXT),\n React.createElement('span', { key: 'sp', className: 'wt-spin' }),\n React.createElement('span', { key: 't' }, t('loading')),\n ]);\n }\n\n if (status === 'failed' && !data) {\n return React.createElement('div', {\n className: 'wt-root',\n style: { ...rootStyle, padding: 28, color: C.error },\n }, [\n React.createElement('style', { key: 'css' }, STYLE_TEXT),\n React.createElement('div', { key: 'm' }, `${t('failed')}\uFF1A${error ?? ''}`),\n React.createElement('button', {\n key: 'r', type: 'button', className: 'wt-btn', style: { marginTop: 10 }, onClick: refresh,\n }, t('retry')),\n ]);\n }\n\n const groups = data?.groups ?? {};\n const stats = data?.stats ?? {};\n const today = typeof data?.today === 'string' && data.today ? data.today : localToday();\n const store = data?.store ?? null;\n const num = (value) => (Number.isFinite(Number(value)) ? Number(value) : 0);\n const overdueCount = num(stats.overdue);\n const totalVisible = GROUPS.reduce((sum, group) => sum + asArray(groups[group.key]).length, 0);\n\n const chips = [\n { key: 'open', label: t('statOpen'), value: num(stats.open) },\n { key: 'overdue', label: t('statOverdue'), value: overdueCount, alert: overdueCount > 0 },\n { key: 'today', label: t('statToday'), value: num(stats.today) },\n { key: 'doing', label: t('statDoing'), value: num(stats.doing) },\n { key: 'done', label: t('statDoneToday'), value: num(stats.completedToday) },\n ];\n\n return React.createElement('div', { className: 'wt-root', style: rootStyle }, [\n React.createElement('style', { key: 'css' }, STYLE_TEXT),\n\n /* \u9876\u90E8\uFF1A\u6807\u9898 + \u7EDF\u8BA1 + \u5237\u65B0 */\n React.createElement('div', {\n key: 'head',\n style: { display: 'flex', alignItems: 'center', gap: 8, flexWrap: 'wrap', marginBottom: 10 },\n }, [\n React.createElement('div', { key: 'ti', style: { fontWeight: 700, fontSize: 15 } }, t('title')),\n ...chips.map((chip) => React.createElement('span', {\n key: chip.key,\n className: 'wt-chip',\n style: chip.alert\n ? { color: C.warn, borderColor: tint(C.warn, 50), background: tint(C.warn, 12) }\n : undefined,\n }, [\n React.createElement('span', { key: 'l', style: { color: C.label3 } }, chip.label),\n React.createElement('b', { key: 'v', style: { fontWeight: 650 } }, String(chip.value)),\n ])),\n React.createElement('span', { key: 'sp', style: { flex: 1 } }),\n React.createElement('button', {\n key: 'rf',\n type: 'button',\n className: 'wt-btn',\n disabled: status === 'loading' || pending > 0,\n title: t('refresh'),\n onClick: refresh,\n }, [\n React.createElement(IconRefresh, { key: 'i' }),\n t('refresh'),\n ]),\n ]),\n\n /* \u9519\u8BEF\u6761\uFF1A\u5BBF\u4E3B\u7684 error \u539F\u6587\u7167\u8D34\uFF0C\u7EDD\u4E0D\u541E\u6389 */\n shownError\n ? React.createElement('div', {\n key: 'err',\n style: {\n display: 'flex', alignItems: 'flex-start', gap: 8, marginBottom: 10, padding: '6px 9px',\n borderRadius: 8, border: `1px solid ${tint(C.error, 45)}`, background: tint(C.error, 12),\n color: C.error, fontSize: 12, lineHeight: 1.6,\n },\n }, [\n React.createElement('span', {\n key: 'm',\n style: { flex: 1, minWidth: 0, wordBreak: 'break-word' },\n }, `${t('failed')}\uFF1A${shownError}`),\n React.createElement('button', {\n key: 'x',\n type: 'button',\n className: 'wt-icon-btn',\n style: { width: 18, height: 18, color: C.error },\n title: t('dismiss'),\n 'aria-label': t('dismiss'),\n onClick: () => { setBarError(null); setDismissedReadError(error ?? null); },\n }, React.createElement(IconClose, { key: 'i' })),\n ])\n : null,\n\n /* \u63D0\u5347\u7ED3\u679C\u63D0\u793A\uFF1A\u70B9\u5B8C\u6309\u94AE\u8981\u6709\u4E2A\u56DE\u6267 */\n notice\n ? React.createElement('div', {\n key: 'notice',\n style: {\n display: 'flex', alignItems: 'center', gap: 8, marginBottom: 10, padding: '5px 9px',\n borderRadius: 8, border: `1px solid ${tint(C.ok, 40)}`, background: tint(C.ok, 10),\n color: C.label2, fontSize: 11.5,\n },\n }, [\n React.createElement('span', { key: 'm', style: { flex: 1 } }, notice),\n React.createElement('span', {\n key: 'x', className: 'wt-link', onClick: () => setNotice(null),\n }, t('dismiss')),\n ])\n : null,\n\n /* \u4F1A\u8BDD\u5F85\u529E\uFF1A\u53EA\u5728\u62FF\u5F97\u5230 useProjection \u65F6\u6302\u8F7D\uFF08\u89C1 SessionAdopt \u7684\u8BF4\u660E\uFF09 */\n useProjection\n ? React.createElement(SessionAdopt, {\n key: 'adopt',\n useProjection,\n t,\n busy: pending > 0,\n onAdopt: handleAdopt,\n })\n : null,\n\n React.createElement(QuickAdd, { key: 'quick', t, busy: pending > 0, onAdd: handleAdd }),\n\n /* \u5206\u7EC4\u5217\u8868 */\n totalVisible\n ? React.createElement('div', { key: 'groups' }, GROUPS.map((group) => React.createElement(Group, {\n key: group.key,\n label: t(group.label),\n items: groups[group.key],\n closed: Boolean(closed[group.key]),\n t,\n today,\n onToggleOpen: () => setClosed((prev) => ({ ...prev, [group.key]: !prev[group.key] })),\n onToggleTodo: handleToggle,\n onRemove: handleRemove,\n onSave: handleSave,\n })))\n : React.createElement('div', {\n key: 'empty',\n style: { padding: '22px 12px', textAlign: 'center', color: C.label3 },\n }, [\n React.createElement('div', { key: 'a', style: { fontSize: 13, color: C.label2 } }, t('empty')),\n React.createElement('div', { key: 'b', style: { fontSize: 11.5, marginTop: 4 } }, t('emptyHint')),\n ]),\n\n /* \u5E95\u90E8\uFF1A\u6570\u636E\u5230\u5E95\u5B58\u5728\u54EA\uFF08\u6392\u67E5\u300C\u6211\u7684\u5F85\u529E\u4E0D\u89C1\u4E86\u300D\u65F6\u7B2C\u4E00\u773C\u8981\u770B\u7684\u4E1C\u897F\uFF09 */\n React.createElement('div', {\n key: 'foot',\n style: { marginTop: 14, paddingTop: 8, borderTop: `1px solid ${C.border1}`, fontSize: 10.5, color: C.label3, lineHeight: 1.7 },\n }, store && store.location\n ? React.createElement('div', {\n key: 'store',\n title: `${t('storeAt')}\uFF1A${store.location}`,\n style: { wordBreak: 'break-all' },\n }, `${t('storeAt')} \u00B7 ${store.kind === 'domain' ? t('storeDomain') : t('storeFile')} \u00B7 ${store.location}`)\n : null),\n ]);\n}\n\n/* ------------------------------------------------------------------ *\n * \u63D2\u4EF6\u4F53\n * ------------------------------------------------------------------ */\nexport const inject = ['slots', 'locale'];\n\nexport function apply(ctx) {\n ctx.effect(() => ctx.locale.register(LOCALE_NS, { zh, en }), `${LOCALE_NS}: dictionaries`);\n\n // \u4FA7\u680F\u5165\u53E3\uFF08id \u5FC5\u987B\u4E0E main \u9762\u677F\u7684 key \u540C\u540D\uFF0Csidebar \u7528\u5B83\u53BB\u9009\u4E2D\u9762\u677F\uFF09\n ctx.slots.inject('sidebar.panellist', () => ctx.slots.register({\n name: 'sidebar.panellist',\n id: SLOT_ID,\n order: 88,\n label: () => '\u5F85\u529E',\n locale: LOCALE_NS,\n }, (props) => React.createElement(WorkTodoIcon, { size: props?.size ?? 16, active: props?.active })));\n\n // \u4E2D\u680F\u72EC\u7ACB\u9762\u677F\n ctx.slots.inject('main', () => ctx.slots.register({\n name: 'main',\n key: SLOT_ID,\n locale: LOCALE_NS,\n }, WorkTodoPanel));\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import React from 'react';\n\n/**\n * worktodo \u6D4F\u89C8\u5668\u534A\u4FA7\uFF1ADSH \u4FA7\u680F\u5165\u53E3 + \u4E2D\u680F\u300C\u5DE5\u4F5C\u5F85\u529E\u300D\u9762\u677F\u3002\n *\n * \u6570\u636E\u6765\u6E90\u53EA\u6709\u4E00\u5904\uFF1A\u540C\u6E90\u7684 /worktodo/* \u8DEF\u7531\uFF08\u5BBF\u4E3B\u534A\u4FA7 lib/index.js \u6CE8\u518C\uFF09\u3002\n * \u6240\u6709\u8DEF\u7531\u90FD\u8FD4\u56DE HTTP 200\uFF0C\u6210\u529F\u4E0E\u5426\u770B body \u91CC\u7684 `ok` \u5B57\u6BB5\u2014\u2014\u6240\u4EE5\u5224\u5B9A\u6761\u4EF6\u5199\u5728\n * `!body.ok` \u4E0A\uFF0C\u800C\u4E0D\u662F `response.ok`\uFF1A\u53EA\u770B HTTP \u72B6\u6001\u7801\u4F1A\u628A\u300C\u6807\u9898\u4E3A\u7A7A\u300D\u8FD9\u7C7B\n * \u4E1A\u52A1\u5931\u8D25\u5F53\u6210\u7F51\u7EDC\u6545\u969C\uFF0C\u7528\u6237\u5C31\u770B\u4E0D\u5230\u771F\u6B63\u7684\u539F\u56E0\u4E86\u3002\n *\n * \u4E3A\u4EC0\u4E48\u4F1A\u8BDD\u5F85\u529E\u8981\u5355\u72EC\u62C6\u4E00\u4E2A\u5B50\u7EC4\u4EF6\uFF1A\n * \u5B98\u65B9\u4F1A\u8BDD todos \u6765\u81EA `props.useProjection('todos')`\uFF0C\u800C useProjection \u662F hook\u2014\u2014\n * \u9762\u677F\u6CE8\u518C\u5728 root scope\uFF0C\u67D0\u4E9B\u7EC4\u5408\u4E0B props \u91CC\u6839\u672C\u6CA1\u6709\u5B83\u3002hook \u7684\u8C03\u7528\u6B21\u6570\u5728\u7EC4\u4EF6\u5B9E\u4F8B\n * \u751F\u547D\u5468\u671F\u5185\u5FC5\u987B\u6052\u5B9A\uFF0C\u6240\u4EE5\u300C\u6709\u6CA1\u6709 useProjection\u300D\u8FD9\u4E2A\u6761\u4EF6\u53EA\u80FD\u51B3\u5B9A**\u6574\u5757\u8981\u4E0D\u8981\u6302\u8F7D**\uFF0C\n * \u4E0D\u80FD\u5199\u5728\u540C\u4E00\u4E2A\u7EC4\u4EF6\u5185\u90E8\u3002\u89C1 SessionAdopt\u3002\n *\n * \u6837\u5F0F\uFF1A\u53EA\u7528 DSH \u81EA\u5DF1\u7684 --dsw-* \u4E3B\u9898\u53D8\u91CF\uFF08\u4E0D\u5199\u4EFB\u4F55\u989C\u8272\u5B57\u9762\u91CF\uFF09\uFF0C\n * \u6240\u4EE5\u6DF1\u6D45\u4E3B\u9898\u3001\u4EE5\u53CA\u4EE5\u540E\u6362\u4E3B\u9898\u76AE\u80A4\u65F6\u90FD\u5929\u7136\u8DDF\u7740\u8D70\u3002\u7C7B\u540D\u7EDF\u4E00 wt- \u524D\u7F00\uFF0C\n * \u6837\u5F0F\u8868\u8DDF\u7740\u9762\u677F\u4E00\u8D77\u6E32\u67D3\uFF08\u6302\u5728\u9762\u677F\u81EA\u5DF1\u90A3\u68F5 DOM \u91CC\u7684 style \u8282\u70B9\uFF0C\u4E0D\u78B0\u9762\u677F\u4E4B\u5916\u7684\u9875\u9762\uFF09\u3002\n */\n\nconst PKG_NAME = typeof __DSH_PLUGIN_NAME__ === 'string' ? __DSH_PLUGIN_NAME__ : 'dsh-worktodo';\n/**\n * \u5BBF\u4E3B\u534A\u4FA7\u7684 name / \u8DEF\u7531\u524D\u7F00\u662F\u5199\u6B7B\u7684 'worktodo'\uFF08lib/index.js\uFF09\uFF0C\u800C\u4FA7\u680F slot id \u53C8\u5FC5\u987B\u4E0E\n * main \u9762\u677F\u7684 key \u540C\u540D\uFF0C\u5426\u5219\u70B9\u4E86\u4FA7\u680F\u6253\u4E0D\u5F00\u9762\u677F\u3002\u6240\u4EE5\u77ED\u540D\u4EE5\u5305\u540D\u6D3E\u751F\u4E3A\u4E3B\uFF0C\n * \u4F46\u4E00\u65E6\u6D3E\u751F\u503C\u4E0D\u662F\u5BBF\u4E3B\u8BA4\u7684\u90A3\u4E2A\u540D\u5B57\u5C31\u9000\u56DE 'worktodo'\u2014\u2014\u5305\u540D\u5E26\u540E\u7F00\u65F6\u5B81\u53EF\u9762\u677F\u80FD\u5F00\u3002\n */\nconst DERIVED_NAME = PKG_NAME.replace(/^dsh-/, '');\nconst SHORT_NAME = DERIVED_NAME === 'worktodo' ? DERIVED_NAME : 'worktodo';\nconst SLOT_ID = SHORT_NAME;\nconst ROUTE_BASE = `/${SHORT_NAME}`;\nconst LOCALE_NS = SHORT_NAME;\nconst ROUTE_LIST = `${ROUTE_BASE}/list`;\n\n/* ------------------------------------------------------------------ *\n * \u6587\u6848\uFF1Azh / en \u4E24\u4EFD key \u5FC5\u987B\u4E00\u4E00\u5BF9\u5E94\uFF08\u5BBF\u4E3B\u6309 key \u53D6\u8BCD\uFF0C\u7F3A key \u4F1A\u663E\u793A key \u672C\u8EAB\uFF09\n * ------------------------------------------------------------------ */\nconst zh = {\n 'nav': '\u5F85\u529E',\n 'title': '\u5DE5\u4F5C\u5F85\u529E',\n 'statOpen': '\u672A\u5B8C\u6210',\n 'statOverdue': '\u903E\u671F',\n 'statToday': '\u4ECA\u5929',\n 'statDoing': '\u8FDB\u884C\u4E2D',\n 'statDoneToday': '\u4ECA\u65E5\u5B8C\u6210',\n 'refresh': '\u5237\u65B0',\n 'loading': '\u8BFB\u53D6\u5F85\u529E\u2026',\n 'failed': '\u8BFB\u53D6\u5931\u8D25',\n 'retry': '\u91CD\u8BD5',\n 'dismiss': '\u5173\u95ED',\n 'storeAt': '\u5B58\u50A8\u4F4D\u7F6E',\n 'storeDomain': '\u5B98\u65B9 storage',\n 'storeFile': 'JSON \u6587\u4EF6',\n 'addPlaceholder': '\u52A0\u4E00\u4EF6\u8981\u505A\u7684\u4E8B\uFF0C\u56DE\u8F66\u4FDD\u5B58',\n 'add': '\u6DFB\u52A0',\n 'dueLabel': '\u622A\u6B62',\n 'priorityLabel': '\u4F18\u5148\u7EA7',\n 'prioHigh': '\u9AD8',\n 'prioNormal': '\u666E\u901A',\n 'prioLow': '\u4F4E',\n 'groupOverdue': '\u903E\u671F',\n 'groupToday': '\u4ECA\u5929',\n 'groupWeek': '\u672C\u5468',\n 'groupLater': '\u4EE5\u540E',\n 'groupCompleted': '\u5DF2\u5B8C\u6210',\n 'viewDue': '\u6309\u622A\u6B62',\n 'viewProject': '\u6309\u9879\u76EE',\n 'noProject': '\u672A\u5F52\u7C7B',\n 'sortLabel': '\u6392\u5E8F',\n 'sortManual': '\u624B\u52A8',\n 'sortPriority': '\u4F18\u5148\u7EA7',\n 'sortCreated': '\u521B\u5EFA\u65F6\u95F4',\n 'dragHint': '\u62D6\u52A8\u8C03\u6574\u987A\u5E8F\uFF08\u4F1A\u81EA\u52A8\u5207\u5230\u624B\u52A8\u6392\u5E8F\uFF09',\n 'expand': '\u5C55\u5F00',\n 'collapse': '\u6536\u8D77',\n 'empty': '\u8FD8\u6CA1\u6709\u5F85\u529E',\n 'emptyHint': '\u5728\u4E0A\u9762\u8F93\u5165\u6846\u52A0\u7B2C\u4E00\u4EF6\u4E8B',\n 'overdueTag': '\u903E\u671F',\n 'sourceAgent': 'AI',\n 'sourceSession': '\u4F1A\u8BDD',\n 'markDone': '\u6807\u4E3A\u5B8C\u6210',\n 'unmarkDone': '\u53D6\u6D88\u5B8C\u6210',\n 'editHint': '\u70B9\u51FB\u6807\u9898\u53EF\u7F16\u8F91',\n 'deleteBtn': '\u5220\u9664',\n 'confirmDelete': '\u786E\u8BA4\u5220\u9664\uFF1F',\n 'save': '\u4FDD\u5B58',\n 'cancel': '\u53D6\u6D88',\n 'projectLabel': '\u9879\u76EE',\n 'projectPlaceholder': '\u9879\u76EE\u540D\uFF08\u53EF\u9009\uFF09',\n 'titlePlaceholder': '\u5F85\u529E\u6807\u9898',\n 'notesLabel': '\u5907\u6CE8',\n 'notesPlaceholder': '\u5907\u6CE8\uFF08\u53EF\u9009\uFF09',\n 'notesAdd': '\u52A0\u5907\u6CE8',\n 'notesHide': '\u6536\u8D77\u5907\u6CE8',\n 'adoptPre': '\u628A\u672C\u4F1A\u8BDD\u7684',\n 'adoptPost': '\u6761\u5F85\u529E\u63D0\u5347\u4E3A\u5DE5\u4F5C\u5F85\u529E',\n 'adoptHint': '\u8FD9\u662F\u6A21\u578B\u5728\u672C\u4F1A\u8BDD\u91CC\u5217\u7684\u5F85\u529E\u3002\u63D0\u5347\u540E\u5F52\u4F60\u6240\u6709\uFF1A\u8DE8\u4F1A\u8BDD\u4FDD\u7559\uFF0C\u8FD8\u80FD\u52A0\u4F18\u5148\u7EA7\u548C\u622A\u6B62\u65E5\u671F\u3002',\n 'adoptPending': '\u5F85\u5B8C\u6210',\n 'adoptDone': '\u5DF2\u63D0\u5347',\n 'adoptSkipped': '\u8DF3\u8FC7',\n 'titleEmpty': '\u8BF7\u5148\u5199\u70B9\u4EC0\u4E48',\n 'untitled': '\uFF08\u65E0\u6807\u9898\uFF09',\n};\n\nconst en = {\n 'nav': 'To-dos',\n 'title': 'Work to-dos',\n 'statOpen': 'Open',\n 'statOverdue': 'Overdue',\n 'statToday': 'Today',\n 'statDoing': 'In progress',\n 'statDoneToday': 'Done today',\n 'refresh': 'Refresh',\n 'loading': 'Loading to-dos\u2026',\n 'failed': 'Failed to load',\n 'retry': 'Retry',\n 'dismiss': 'Dismiss',\n 'storeAt': 'Stored at',\n 'storeDomain': 'official storage',\n 'storeFile': 'JSON file',\n 'addPlaceholder': 'Add something to do \u2014 Enter saves',\n 'add': 'Add',\n 'dueLabel': 'Due',\n 'priorityLabel': 'Priority',\n 'prioHigh': 'High',\n 'prioNormal': 'Normal',\n 'prioLow': 'Low',\n 'groupOverdue': 'Overdue',\n 'groupToday': 'Today',\n 'groupWeek': 'This week',\n 'groupLater': 'Later',\n 'groupCompleted': 'Completed',\n 'viewDue': 'By due',\n 'viewProject': 'By project',\n 'noProject': 'Uncategorized',\n 'sortLabel': 'Sort',\n 'sortManual': 'Manual',\n 'sortPriority': 'Priority',\n 'sortCreated': 'Created',\n 'dragHint': 'Drag to reorder (switches to manual sort)',\n 'expand': 'Expand',\n 'collapse': 'Collapse',\n 'empty': 'No to-dos yet',\n 'emptyHint': 'Add your first one in the box above',\n 'overdueTag': 'overdue',\n 'sourceAgent': 'AI',\n 'sourceSession': 'Session',\n 'markDone': 'Mark as done',\n 'unmarkDone': 'Mark as not done',\n 'editHint': 'Click the title to edit',\n 'deleteBtn': 'Delete',\n 'confirmDelete': 'Delete?',\n 'save': 'Save',\n 'cancel': 'Cancel',\n 'projectLabel': 'Project',\n 'projectPlaceholder': 'project (optional)',\n 'titlePlaceholder': 'To-do title',\n 'notesLabel': 'Notes',\n 'notesPlaceholder': 'Notes (optional)',\n 'notesAdd': 'Add notes',\n 'notesHide': 'Hide notes',\n 'adoptPre': \"Promote this session's \",\n 'adoptPost': ' to-dos into your work list',\n 'adoptHint': 'These are the to-dos the model listed in this session. Promoting makes them yours: they survive across sessions and take priorities and due dates.',\n 'adoptPending': 'open',\n 'adoptDone': 'Promoted',\n 'adoptSkipped': 'skipped',\n 'titleEmpty': 'Type something first',\n 'untitled': '(untitled)',\n};\n\n/* ------------------------------------------------------------------ *\n * \u989C\u8272\uFF1A\u53EA\u53D6 DSH \u4E3B\u9898\u53D8\u91CF\u3002\n * \u4E0D\u5199\u4EFB\u4F55\u989C\u8272\u5B57\u9762\u91CF\u515C\u5E95\u2014\u2014\u515C\u5E95\u503C\u7B49\u4E8E\u5199\u6B7B\u67D0\u4E00\u79CD\u4E3B\u9898\u4E0B\u7684\u989C\u8272\uFF0C\u53E6\u4E00\u5957\u4E3B\u9898\u5C31\u82B1\u4E86\u3002\n * \u9700\u8981\u300C\u6DE1\u6DE1\u7684\u5E95\u8272\u300D\u65F6\u7528 color-mix \u628A\u8BED\u4E49\u8272\u6DF7\u8FDB transparent\uFF0C\u4ECD\u7136\u662F\u53D8\u91CF\u9A71\u52A8\u3002\n * ------------------------------------------------------------------ */\nconst C = {\n label: 'var(--dsw-alias-label-primary)',\n label2: 'var(--dsw-alias-label-secondary)',\n label3: 'var(--dsw-alias-label-tertiary)',\n border: 'var(--dsw-alias-border-l2)',\n border1: 'var(--dsw-alias-border-l1)',\n layer1: 'var(--dsw-alias-bg-layer-1)',\n hover: 'var(--dsw-alias-interactive-bg-hover)',\n brand: 'var(--dsw-alias-brand-primary)',\n warn: 'var(--dsw-alias-state-warn-primary)',\n error: 'var(--dsw-alias-state-error-primary)',\n ok: 'var(--dsw-alias-state-success-primary)',\n};\n/** \u8BED\u4E49\u8272\u7684\u6DE1\u5E95/\u6DE1\u8FB9\uFF1Apct \u662F\u6DF7\u5165\u6BD4\u4F8B */\nconst tint = (color, pct) => `color-mix(in srgb, ${color} ${pct}%, transparent)`;\n\n/** \u9762\u677F\u81EA\u5E26\u6837\u5F0F\u8868\uFF1A\u51E0\u4F55\u5B57\u9762\u91CF\uFF08\u95F4\u8DDD/\u5B57\u53F7/\u5706\u89D2\uFF09\u5199\u6B7B\uFF0C\u989C\u8272\u5168\u90E8\u8D70\u53D8\u91CF\u3002 */\nconst STYLE_TEXT = `\n@keyframes wt-spin { to { transform: rotate(360deg); } }\n.wt-root {\n height: 100%; overflow: auto; padding: 16px 18px 40px; box-sizing: border-box;\n color: ${C.label}; font-family: var(--dsw-font-family, system-ui, sans-serif); font-size: 13px;\n}\n.wt-input {\n min-width: 0; font-family: inherit; font-size: 12px; line-height: 1.5; padding: 4px 8px;\n border-radius: 8px; border: 1px solid ${C.border}; background: transparent; color: ${C.label};\n color-scheme: light dark;\n}\n.wt-input::placeholder { color: ${C.label3}; }\n.wt-input:focus {\n outline: none; border-color: ${C.brand};\n box-shadow: 0 0 0 2px ${tint(C.brand, 22)};\n}\n.wt-btn {\n display: inline-flex; align-items: center; gap: 4px; font-family: inherit; font-size: 12px;\n line-height: 1.6; padding: 3px 10px; border-radius: 8px; cursor: pointer; user-select: none;\n border: 1px solid ${C.border}; background: transparent; color: ${C.label2}; white-space: nowrap;\n}\n.wt-btn:hover { background: ${C.hover}; color: ${C.label}; }\n.wt-btn:disabled { opacity: .55; cursor: default; }\n.wt-btn:disabled:hover { background: transparent; color: ${C.label2}; }\n.wt-btn-primary {\n border-color: ${tint(C.brand, 50)}; color: ${C.brand}; background: ${tint(C.brand, 10)};\n}\n.wt-btn-primary:hover { background: ${tint(C.brand, 18)}; color: ${C.brand}; }\n.wt-btn-primary:disabled:hover { background: ${tint(C.brand, 10)}; color: ${C.brand}; }\n.wt-btn-danger { color: ${C.error}; border-color: ${tint(C.error, 45)}; }\n.wt-btn-danger:hover { background: var(--dsw-alias-interactive-bg-hover-danger); color: ${C.error}; }\n.wt-icon-btn {\n display: inline-flex; align-items: center; justify-content: center; flex: none;\n width: 22px; height: 22px; padding: 0; border: none; border-radius: 6px;\n background: transparent; color: ${C.label3}; cursor: pointer;\n}\n.wt-icon-btn:hover { background: ${C.hover}; color: ${C.label}; }\n.wt-icon-btn-danger:hover { background: var(--dsw-alias-interactive-bg-hover-danger); color: ${C.error}; }\n.wt-check {\n display: inline-flex; align-items: center; justify-content: center; flex: none;\n width: 17px; height: 17px; margin-top: 1px; padding: 0; border-radius: 5px;\n border: 1px solid ${C.border}; background: transparent; color: transparent; cursor: pointer;\n}\n.wt-check:hover { border-color: ${C.brand}; }\n.wt-check-done {\n border-color: ${tint(C.ok, 55)}; background: ${tint(C.ok, 14)}; color: ${C.ok};\n}\n.wt-row { display: flex; align-items: flex-start; gap: 8px; padding: 5px 8px; border-radius: 10px; }\n.wt-row:hover { background: ${C.hover}; }\n.wt-row-edit {\n flex-direction: column; align-items: stretch; gap: 6px;\n border: 1px solid ${C.border1}; background: ${C.layer1};\n}\n.wt-seg {\n display: inline-flex; align-items: center; border-radius: 8px; overflow: hidden;\n border: 1px solid ${C.border}; background: ${C.bg2};\n}\n.wt-seg-btn {\n appearance: none; border: 0; background: transparent; color: ${C.label2};\n font: inherit; font-size: 11.5px; line-height: 1; padding: 5px 9px; cursor: pointer;\n}\n.wt-seg-btn.is-on { background: ${C.hover}; color: ${C.label}; font-weight: 600; }\n.wt-seg-btn:hover { color: ${C.label}; }\n.wt-row[draggable=\"true\"] { cursor: grab; }\n.wt-row[draggable=\"true\"]:active { cursor: grabbing; }\n.wt-group-head {\n display: flex; align-items: center; gap: 7px; padding: 3px 8px; border-radius: 8px;\n cursor: pointer; user-select: none; color: ${C.label2};\n}\n.wt-group-head:hover { background: ${C.hover}; }\n.wt-chip {\n display: inline-flex; align-items: baseline; gap: 4px; font-size: 11px; line-height: 1.7;\n padding: 0 8px; border-radius: 999px; border: 1px solid ${C.border1}; color: ${C.label3};\n white-space: nowrap;\n}\n.wt-tag {\n display: inline-flex; align-items: center; gap: 3px; font-size: 10.5px; line-height: 1.6;\n padding: 0 6px; border-radius: 999px; border: 1px solid ${C.border1}; color: ${C.label3};\n white-space: nowrap;\n}\n.wt-link { cursor: pointer; user-select: none; color: var(--dsw-alias-link); font-size: 11px; }\n.wt-link:hover { text-decoration: underline; }\n.wt-title { cursor: pointer; word-break: break-word; }\n.wt-title:hover { text-decoration: underline; text-decoration-style: dotted; text-underline-offset: 3px; }\n.wt-spin {\n display: inline-block; width: 12px; height: 12px; border-radius: 50%;\n border: 2px solid ${C.border}; border-top-color: ${C.brand}; animation: wt-spin .8s linear infinite;\n}\n`;\n\n/* ------------------------------------------------------------------ *\n * \u56FE\u6807\uFF1A\u7EAF React.createElement('svg', ...) \u81EA\u7ED8\uFF0C\u989C\u8272\u4E00\u5F8B currentColor\uFF0C\n * \u8FD9\u6837\u540C\u4E00\u4E2A\u56FE\u6807\u5728\u52FE\u9009\u6846\u91CC\u662F\u7EFF\u8272\u3001\u5728\u6309\u94AE\u91CC\u662F\u6B21\u7EA7\u6587\u5B57\u8272\uFF0C\u4E0D\u9700\u8981\u7B2C\u4E8C\u5957\u753B\u6CD5\u3002\n * ------------------------------------------------------------------ */\nfunction WorkTodoIcon({ size = 16, active }) {\n return React.createElement('svg', {\n width: size, height: size, viewBox: '0 0 16 16', fill: 'none',\n stroke: 'currentColor', strokeWidth: 1.3, strokeLinecap: 'round', strokeLinejoin: 'round',\n style: { opacity: active ? 1 : 0.82 },\n }, [\n React.createElement('rect', { key: 'a', x: '2.7', y: '3.1', width: '10.6', height: '10.4', rx: '2' }),\n React.createElement('path', { key: 'b', d: 'M5.6 1.7h4.8v2.7H5.6z' }),\n React.createElement('path', { key: 'c', d: 'M5.7 9.3l1.7 1.7 3.1-3.5' }),\n ]);\n}\n\nfunction IconCheck({ size = 11 }) {\n return React.createElement('svg', {\n width: size, height: size, viewBox: '0 0 12 12', fill: 'none',\n stroke: 'currentColor', strokeWidth: 2, strokeLinecap: 'round', strokeLinejoin: 'round',\n }, React.createElement('path', { d: 'M2 6.3 4.6 8.9 10 3.1' }));\n}\n\nfunction IconChevron({ open, size = 10 }) {\n return React.createElement('svg', {\n width: size, height: size, viewBox: '0 0 14 14', fill: 'none',\n stroke: 'currentColor', strokeWidth: 1.8, strokeLinecap: 'round', strokeLinejoin: 'round',\n // \u6536\u8D77\u65F6\u628A\u300C\u5411\u4E0B\u300D\u7684\u7BAD\u5934\u8F6C\u6210\u300C\u5411\u53F3\u300D\uFF1A\u6BD4\u753B\u4E24\u4E2A\u56FE\u6807\u4FBF\u5B9C\uFF0C\u4E5F\u4E0D\u4F1A\u56E0\u4E3A\u5C3A\u5BF8\u4E0D\u540C\u800C\u8DF3\u4E00\u4E0B\n style: { flex: 'none', transform: open ? 'none' : 'rotate(-90deg)', transition: 'transform .15s ease' },\n }, React.createElement('path', { d: 'm3.4 5.2 3.6 3.6 3.6-3.6' }));\n}\n\nfunction IconTrash({ size = 13 }) {\n return React.createElement('svg', {\n width: size, height: size, viewBox: '0 0 16 16', fill: 'none',\n stroke: 'currentColor', strokeWidth: 1.3, strokeLinecap: 'round', strokeLinejoin: 'round',\n }, [\n React.createElement('path', { key: 'a', d: 'M2.8 4.4h10.4' }),\n React.createElement('path', { key: 'b', d: 'M6.4 4.4V2.9h3.2v1.5' }),\n React.createElement('path', { key: 'c', d: 'M4.5 4.4l.7 8.4h5.6l.7-8.4' }),\n React.createElement('path', { key: 'd', d: 'M6.9 6.8v3.9M9.1 6.8v3.9' }),\n ]);\n}\n\nfunction IconClose({ size = 11 }) {\n return React.createElement('svg', {\n width: size, height: size, viewBox: '0 0 12 12', fill: 'none',\n stroke: 'currentColor', strokeWidth: 1.6, strokeLinecap: 'round',\n }, [\n React.createElement('path', { key: 'a', d: 'M3 3l6 6' }),\n React.createElement('path', { key: 'b', d: 'M9 3l-6 6' }),\n ]);\n}\n\nfunction IconRefresh({ size = 12 }) {\n return React.createElement('svg', {\n width: size, height: size, viewBox: '0 0 16 16', fill: 'none',\n stroke: 'currentColor', strokeWidth: 1.4, strokeLinecap: 'round', strokeLinejoin: 'round',\n }, [\n React.createElement('path', { key: 'a', d: 'M2.6 8a5.4 5.4 0 0 1 9.1-3.9' }),\n React.createElement('path', { key: 'b', d: 'M13.4 8a5.4 5.4 0 0 1-9.1 3.9' }),\n React.createElement('path', { key: 'c', d: 'M12.3 1.9v2.6H9.7' }),\n React.createElement('path', { key: 'd', d: 'M3.7 14.1v-2.6h2.6' }),\n ]);\n}\n\n/* ------------------------------------------------------------------ *\n * \u5C0F\u5DE5\u5177\n * ------------------------------------------------------------------ */\n/** \u672C\u5730\u300C\u4ECA\u5929\u300D\u3002\u53EA\u5728\u8BE5\u5B57\u6BB5\u7F3A\u5931\u65F6\u515C\u5E95\uFF08\u5BBF\u4E3B\u7684 today \u662F\u6743\u5A01\u503C\uFF0C\u4E14\u4E0E\u672C\u673A\u65F6\u533A\u4E00\u81F4\uFF09\u3002 */\nfunction localToday() {\n const d = new Date();\n const pad = (n) => String(n).padStart(2, '0');\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;\n}\n\nconst asArray = (value) => (Array.isArray(value) ? value : []);\n\n/**\n * \u9762\u677F\u4E0A\u7684\u5199\u64CD\u4F5C\u7EDF\u4E00\u8D70\u8FD9\u91CC\u3002\n * \u7EA6\u5B9A\uFF1A\u5BBF\u4E3B\u6240\u6709\u8DEF\u7531\u90FD\u56DE 200\uFF0C\u6210\u8D25\u770B `ok`\uFF1B\u5931\u8D25\u65F6\u628A\u5BBF\u4E3B\u7684 error \u539F\u6587\u629B\u51FA\u53BB\uFF0C\n * \u7531\u9762\u677F\u9876\u90E8\u7684\u9519\u8BEF\u6761\u539F\u6837\u663E\u793A\u2014\u2014\u7EDD\u4E0D\u541E\u6389\u539F\u56E0\uFF08\u7528\u6237\u8981\u770B\u5230\u300C\u6807\u9898\u8FC7\u957F\u300D\u8FD9\u79CD\u5177\u4F53\u8BDD\uFF09\u3002\n * @param {string} path \u76F8\u5BF9\u8DEF\u7531\u524D\u7F00\u7684\u8DEF\u5F84\uFF0C\u5982 '/create'\n * @param {object} body\n * @returns {Promise<object>} \u6210\u529F\u65F6\u8FD4\u56DE data\n */\nasync function postJson(path, body) {\n const response = await fetch(`${ROUTE_BASE}${path}`, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n cache: 'no-store',\n credentials: 'same-origin',\n body: JSON.stringify(body ?? {}),\n });\n if (!response.ok) throw new Error(`HTTP ${response.status}`);\n const parsed = await response.json().catch(() => null);\n if (!parsed) throw new Error('\u54CD\u5E94\u4E0D\u662F JSON');\n if (!parsed.ok) throw new Error(parsed.error ?? parsed.reason ?? '\u672A\u77E5\u9519\u8BEF');\n return parsed.data ?? {};\n}\n\n/* ------------------------------------------------------------------ *\n * \u6570\u636E\u83B7\u53D6\n * ------------------------------------------------------------------ */\n/**\n * \u6A21\u5757\u7EA7\u7F13\u5B58\uFF1A\u9762\u677F\u88AB\u5207\u8D70\u518D\u5207\u56DE\u6765\u65F6 React \u4F1A\u91CD\u65B0\u6302\u8F7D\uFF0C\u6709\u4E0A\u6B21\u7ED3\u679C\u5C31\u5148\u6E32\u67D3\u3001\u540E\u53F0\u518D\u5237\u65B0\n * \uFF08stale-while-revalidate\uFF09\u3002\u4FA7\u680F\u6765\u56DE\u70B9\u7684\u65F6\u5019\u4E0D\u8BE5\u6BCF\u6B21\u90FD\u8F6C\u5708\u3002\n */\nlet lastList = null;\n// \u6392\u5E8F\u6A21\u5F0F\u8DE8\u300C\u5207\u8D70\u518D\u5207\u56DE\u300D\u4FDD\u6301\uFF1Bmanual = \u5C0A\u91CD\u62D6\u52A8\u987A\u5E8F\nlet lastSort = 'manual';\n\nfunction useList(sort) {\n const [state, setState] = React.useState(() => (lastList\n ? { status: 'ready', data: lastList, error: null }\n : { status: 'loading', data: null, error: null }));\n const [tick, setTick] = React.useState(0);\n\n React.useEffect(() => {\n let alive = true;\n /**\n * filter=all \u800C\u4E0D\u662F open\uFF1A\u9762\u677F\u662F\u300C\u6309\u5206\u7EC4\u5C55\u793A\u300D\u7684\uFF0C\u5BBF\u4E3B\u7684\u5206\u7EC4\u662F\u5728**\u7B5B\u9009\u540E\u7684\u5B50\u96C6**\u4E0A\u7B97\u7684\uFF0C\n * \u7528 open \u65F6 groups.completed \u6052\u4E3A\u7A7A\uFF0C\u300C\u5DF2\u5B8C\u6210\u300D\u90A3\u4E00\u7EC4\u5C31\u6C38\u8FDC\u51FA\u4E0D\u6765\uFF08\u4E5F\u5C31\u6CA1\u6CD5\u6298\u53E0/\u5C55\u5F00\uFF09\u3002\n * \u7EDF\u8BA1 stats \u4E0D\u53D7 filter \u5F71\u54CD\uFF08\u5BBF\u4E3B\u6309\u5168\u91CF\u7B97\uFF09\uFF0C\u6240\u4EE5\u9876\u90E8\u6570\u5B57\u4ECD\u7136\u662F\u5168\u5C40\u53E3\u5F84\u3002\n */\n fetch(`${ROUTE_LIST}?filter=all&sort=${encodeURIComponent(sort || 'manual')}`, { cache: 'no-store', credentials: 'same-origin' })\n .then(async (response) => {\n if (!response.ok) throw new Error(`HTTP ${response.status}`);\n const body = await response.json().catch(() => null);\n if (!body?.ok) throw new Error(body?.error ?? body?.reason ?? '\u672A\u77E5\u9519\u8BEF');\n lastList = body.data;\n if (alive) setState({ status: 'ready', data: body.data, error: null });\n })\n .catch((error) => {\n // \u5DF2\u7ECF\u6709\u6570\u636E\u65F6\u53EA\u6807\u8BB0\u9519\u8BEF\uFF0C\u4E0D\u6E05\u7A7A\u9762\u677F\uFF1A\u4E00\u6B21\u6296\u52A8\u4E0D\u8BE5\u8BA9\u4EBA\u770B\u4E0D\u5230\u81EA\u5DF1\u7684\u5F85\u529E\n if (alive) {\n setState((prev) => ({\n ...prev,\n status: prev.data ? 'ready' : 'failed',\n error: String(error?.message ?? error),\n }));\n }\n });\n return () => { alive = false; };\n }, [tick, sort]);\n\n const refresh = React.useCallback(() => setTick((n) => n + 1), []);\n return { ...state, refresh };\n}\n\n/* ------------------------------------------------------------------ *\n * \u5FEB\u901F\u6DFB\u52A0\n * ------------------------------------------------------------------ */\nfunction QuickAdd({ t, onAdd, busy }) {\n const [title, setTitle] = React.useState('');\n const [due, setDue] = React.useState('');\n const [priority, setPriority] = React.useState('normal');\n\n const submit = () => {\n if (busy) return;\n // \u622A\u6B62\u65E5\u671F\u4E0E\u4F18\u5148\u7EA7\u662F\u300C\u8FD9\u4E00\u6279\u300D\u7684\u9009\u62E9\uFF0C\u52A0\u5B8C\u4FDD\u7559\uFF1A\u540C\u4E00\u5929\u8FDE\u7740\u52A0\u51E0\u4EF6\u4E8B\u65F6\u4E0D\u7528\u53CD\u590D\u586B\n Promise.resolve(onAdd({ title, due, priority })).then((ok) => {\n if (ok !== false) setTitle('');\n }).catch(() => { /* onAdd \u5185\u90E8\u5DF2\u7ECF\u541E\u6389\u9519\u8BEF\u5E76\u663E\u793A\u5728\u9519\u8BEF\u6761\u4E0A */ });\n };\n\n return React.createElement('div', {\n style: { display: 'flex', alignItems: 'center', gap: 6, flexWrap: 'wrap', marginBottom: 10 },\n }, [\n React.createElement('input', {\n key: 'ti',\n className: 'wt-input',\n style: { flex: '1 1 200px', fontSize: 12.5, padding: '5px 9px' },\n value: title,\n placeholder: t('addPlaceholder'),\n 'aria-label': t('addPlaceholder'),\n onChange: (event) => setTitle(event.target.value),\n onKeyDown: (event) => { if (event.key === 'Enter') submit(); },\n }),\n React.createElement('label', {\n key: 'due',\n title: t('dueLabel'),\n style: { display: 'inline-flex', alignItems: 'center', gap: 4, fontSize: 11, color: C.label3 },\n }, [\n t('dueLabel'),\n React.createElement('input', {\n key: 'i',\n className: 'wt-input',\n type: 'date',\n value: due,\n 'aria-label': t('dueLabel'),\n onChange: (event) => setDue(event.target.value),\n }),\n ]),\n React.createElement('label', {\n key: 'prio',\n title: t('priorityLabel'),\n style: { display: 'inline-flex', alignItems: 'center', gap: 4, fontSize: 11, color: C.label3 },\n }, [\n t('priorityLabel'),\n React.createElement('select', {\n key: 's',\n className: 'wt-input',\n value: priority,\n 'aria-label': t('priorityLabel'),\n onChange: (event) => setPriority(event.target.value),\n }, [\n React.createElement('option', { key: 'high', value: 'high' }, t('prioHigh')),\n React.createElement('option', { key: 'normal', value: 'normal' }, t('prioNormal')),\n React.createElement('option', { key: 'low', value: 'low' }, t('prioLow')),\n ]),\n ]),\n React.createElement('button', {\n key: 'add',\n type: 'button',\n className: 'wt-btn wt-btn-primary',\n disabled: Boolean(busy),\n onClick: submit,\n }, t('add')),\n ]);\n}\n\n/* ------------------------------------------------------------------ *\n * \u5355\u884C\uFF1A\u67E5\u770B / \u884C\u5185\u7F16\u8F91 / \u4E8C\u6B21\u786E\u8BA4\u5220\u9664\n * \u72B6\u6001\u90FD\u7559\u5728\u8FD9\u4E00\u884C\u5185\u90E8\uFF0C\u6240\u4EE5\u5728\u522B\u7684\u884C\u4E0A\u6572\u5B57\u3001\u6216\u8005\u5217\u8868\u5237\u65B0\uFF0C\u90FD\u4E0D\u4F1A\u628A\u6B63\u5728\u7F16\u8F91\u7684\u5185\u5BB9\u51B2\u6389\u3002\n * ------------------------------------------------------------------ */\nfunction TodoRow({ todo, today, t, onToggle, onRemove, onSave, drag }) {\n const [editing, setEditing] = React.useState(false);\n const [draft, setDraft] = React.useState(null);\n const [notesOpen, setNotesOpen] = React.useState(false);\n const [confirming, setConfirming] = React.useState(false);\n\n // \u4E8C\u6B21\u786E\u8BA4\u8981\u80FD\u81EA\u5DF1\u5931\u6548\uFF1A\u70B9\u4E86\u5220\u9664\u53C8\u6539\u4E3B\u610F\u7684\u4EBA\uFF0C\u4E0D\u8BE5\u5728\u51E0\u5206\u949F\u540E\u8BEF\u89E6\u4E00\u6B21\u5C31\u771F\u5220\u6389\n React.useEffect(() => {\n if (!confirming) return undefined;\n const id = setTimeout(() => setConfirming(false), 5000);\n return () => clearTimeout(id);\n }, [confirming]);\n\n const row = todo ?? {};\n const done = row.status === 'completed';\n const due = typeof row.due === 'string' ? row.due : '';\n const overdue = !done && Boolean(due) && Boolean(today) && due < today;\n\n const beginEdit = () => {\n setDraft({\n title: typeof row.title === 'string' ? row.title : '',\n due,\n priority: row.priority === 'high' || row.priority === 'low' ? row.priority : 'normal',\n project: typeof row.project === 'string' ? row.project : '',\n notes: typeof row.notes === 'string' ? row.notes : '',\n });\n setNotesOpen(Boolean(row.notes));\n setEditing(true);\n };\n\n const stopEdit = () => { setEditing(false); setDraft(null); };\n\n /**\n * \u4FDD\u5B58\u65F6\u53EA\u53D1\u6539\u52A8\u8FC7\u7684\u5B57\u6BB5\uFF1A\u5BBF\u4E3B\u5BF9\u7A7A patch \u4F1A\u56DE empty-patch \u9519\u8BEF\uFF0C\n * \u800C\u300C\u6253\u5F00\u53C8\u539F\u6837\u5173\u6389\u300D\u663E\u7136\u4E0D\u8BE5\u62A5\u9519\uFF0C\u6240\u4EE5\u8FD9\u91CC\u5148\u81EA\u5DF1\u6BD4\u5BF9\u4E00\u904D\u3002\n */\n const submit = () => {\n if (!draft) return;\n const patch = {};\n const title = String(draft.title ?? '').trim();\n if (title !== (row.title ?? '')) patch.title = title;\n const nextDue = draft.due || '';\n if (nextDue !== due) patch.due = nextDue; // \u7A7A\u4E32 = \u6E05\u7A7A\u622A\u6B62\u65E5\u671F\n const priority = draft.priority || 'normal';\n if (priority !== (row.priority ?? 'normal')) patch.priority = priority;\n const project = String(draft.project ?? '').trim();\n if (project !== (row.project ?? '')) patch.project = project; // \u7A7A\u4E32 = \u53BB\u6389\u9879\u76EE\n const notes = String(draft.notes ?? '').trim();\n if (notes !== (row.notes ?? '')) patch.notes = notes;\n stopEdit();\n if (!Object.keys(patch).length) return;\n Promise.resolve(onSave(row.id, patch)).catch(() => { /* \u5DF2\u5728\u9519\u8BEF\u6761\u4E0A\u663E\u793A */ });\n };\n\n const inputStyle = { fontSize: 12, padding: '3px 7px' };\n\n if (editing && draft) {\n const field = (key, label, control) => React.createElement('label', {\n key,\n style: { display: 'inline-flex', alignItems: 'center', gap: 4, fontSize: 11, color: C.label3 },\n }, [label, control]);\n\n return React.createElement('div', { className: 'wt-row wt-row-edit' }, [\n React.createElement('div', { key: 'top', style: { display: 'flex', gap: 6, alignItems: 'center' } }, [\n React.createElement('input', {\n key: 'ti',\n className: 'wt-input',\n style: { ...inputStyle, flex: 1, minWidth: 0 },\n value: draft.title,\n autoFocus: true,\n placeholder: t('titlePlaceholder'),\n 'aria-label': t('titlePlaceholder'),\n onChange: (event) => setDraft((prev) => ({ ...prev, title: event.target.value })),\n onKeyDown: (event) => {\n if (event.key === 'Enter') submit();\n if (event.key === 'Escape') stopEdit();\n },\n }),\n React.createElement('button', {\n key: 'save', type: 'button', className: 'wt-btn wt-btn-primary', onClick: submit,\n }, t('save')),\n React.createElement('button', {\n key: 'cancel', type: 'button', className: 'wt-btn', onClick: stopEdit,\n }, t('cancel')),\n ]),\n React.createElement('div', {\n key: 'fields',\n style: { display: 'flex', gap: 10, flexWrap: 'wrap', alignItems: 'center' },\n }, [\n field('due', t('dueLabel'), React.createElement('input', {\n className: 'wt-input', style: inputStyle, type: 'date', value: draft.due,\n 'aria-label': t('dueLabel'),\n onChange: (event) => setDraft((prev) => ({ ...prev, due: event.target.value })),\n })),\n field('prio', t('priorityLabel'), React.createElement('select', {\n className: 'wt-input', style: inputStyle, value: draft.priority,\n 'aria-label': t('priorityLabel'),\n onChange: (event) => setDraft((prev) => ({ ...prev, priority: event.target.value })),\n }, [\n React.createElement('option', { key: 'high', value: 'high' }, t('prioHigh')),\n React.createElement('option', { key: 'normal', value: 'normal' }, t('prioNormal')),\n React.createElement('option', { key: 'low', value: 'low' }, t('prioLow')),\n ])),\n field('project', t('projectLabel'), React.createElement('input', {\n className: 'wt-input', style: { ...inputStyle, width: 130 }, value: draft.project,\n placeholder: t('projectPlaceholder'),\n 'aria-label': t('projectPlaceholder'),\n onChange: (event) => setDraft((prev) => ({ ...prev, project: event.target.value })),\n })),\n ]),\n React.createElement('div', { key: 'notes' }, [\n notesOpen\n ? React.createElement('div', { key: 'box', style: { display: 'flex', flexDirection: 'column', gap: 4 } }, [\n React.createElement('textarea', {\n key: 'ta',\n className: 'wt-input',\n style: { width: '100%', boxSizing: 'border-box', resize: 'vertical', minHeight: 54 },\n rows: 3,\n value: draft.notes,\n placeholder: t('notesPlaceholder'),\n 'aria-label': t('notesLabel'),\n onChange: (event) => setDraft((prev) => ({ ...prev, notes: event.target.value })),\n // textarea \u91CC\u56DE\u8F66\u8981\u6362\u884C\uFF0C\u6240\u4EE5\u4FDD\u5B58\u7528 Ctrl/Cmd+Enter\n onKeyDown: (event) => {\n if (event.key === 'Enter' && (event.metaKey || event.ctrlKey)) submit();\n if (event.key === 'Escape') stopEdit();\n },\n }),\n React.createElement('span', {\n key: 'hide', className: 'wt-link', onClick: () => setNotesOpen(false),\n }, t('notesHide')),\n ])\n : React.createElement('span', {\n key: 'add', className: 'wt-link', onClick: () => setNotesOpen(true),\n }, t('notesAdd')),\n ]),\n ]);\n }\n\n const meta = [];\n if (row.priority === 'high') {\n meta.push(React.createElement('span', {\n key: 'p',\n className: 'wt-tag',\n style: { color: C.warn, borderColor: tint(C.warn, 50), background: tint(C.warn, 12), fontWeight: 600 },\n }, t('prioHigh')));\n } else if (row.priority === 'low') {\n meta.push(React.createElement('span', { key: 'p', className: 'wt-tag' }, t('prioLow')));\n }\n if (due) {\n meta.push(React.createElement('span', {\n key: 'd',\n style: { color: overdue ? C.warn : C.label3, fontSize: 11 },\n }, overdue ? `${t('overdueTag')} ${due}` : due));\n }\n if (row.project) {\n meta.push(React.createElement('span', { key: 'j', className: 'wt-tag' }, `#${row.project}`));\n }\n // \u6765\u6E90\u6807\u8BB0\uFF1A\u8BA9\u7528\u6237\u4E00\u773C\u770B\u51FA\u8FD9\u6761\u662F\u6A21\u578B\u52A0\u7684\u3001\u8FD8\u662F\u4ECE\u4F1A\u8BDD\u63D0\u5347\u6765\u7684\uFF08\u4EBA\u81EA\u5DF1\u52A0\u7684\u4E0D\u7528\u6807\uFF09\n if (row.source === 'agent' || row.source === 'session') {\n meta.push(React.createElement('span', {\n key: 's',\n className: 'wt-tag',\n title: row.source === 'agent' ? t('sourceAgent') : t('sourceSession'),\n }, row.source === 'agent' ? t('sourceAgent') : t('sourceSession')));\n }\n\n // \u62D6\u52A8\u5C5E\u6027\uFF1A\u53EA\u6709\u7236\u7EA7\u7ED9\u4E86 drag \u624D\u53EF\u62D6\uFF08\u672A\u542F\u7528\u65F6\u884C\u4E3A\u4E0E\u4EE5\u524D\u5B8C\u5168\u4E00\u81F4\uFF09\n const dragAttrs = drag\n ? {\n draggable: true,\n onDragStart: (event) => {\n try {\n event.dataTransfer?.setData('text/plain', row.id ?? '');\n if (event.dataTransfer) event.dataTransfer.effectAllowed = 'move';\n } catch { /* \u5C11\u6570\u73AF\u5883\u4E0D\u5141\u8BB8\u5199 dataTransfer\uFF0C\u5FFD\u7565\u5373\u53EF */ }\n drag.onStart?.(row.id);\n },\n onDragOver: (event) => { event.preventDefault(); drag.onOver?.(row.id); },\n onDrop: (event) => { event.preventDefault(); drag.onDrop?.(row.id); },\n onDragEnd: () => drag.onEnd?.(),\n title: drag.hint,\n style: drag.dragging ? { opacity: 0.45 } : undefined,\n }\n : {};\n return React.createElement('div', { className: 'wt-row', ...dragAttrs }, [\n React.createElement('button', {\n key: 'check',\n type: 'button',\n className: `wt-check${done ? ' wt-check-done' : ''}`,\n 'aria-label': done ? t('unmarkDone') : t('markDone'),\n title: done ? t('unmarkDone') : t('markDone'),\n onClick: () => { Promise.resolve(onToggle(row.id)).catch(() => { /* \u5DF2\u5728\u9519\u8BEF\u6761\u4E0A\u663E\u793A */ }); },\n }, done ? React.createElement(IconCheck, { key: 'i' }) : null),\n React.createElement('div', { key: 'main', style: { flex: 1, minWidth: 0 } }, [\n React.createElement('div', {\n key: 'title',\n className: 'wt-title',\n title: t('editHint'),\n onClick: beginEdit,\n style: {\n color: done ? C.label3 : C.label,\n textDecoration: done ? 'line-through' : 'none',\n fontWeight: row.priority === 'high' && !done ? 650 : 400,\n },\n }, typeof row.title === 'string' && row.title ? row.title : t('untitled')),\n meta.length\n ? React.createElement('div', {\n key: 'meta',\n style: { display: 'flex', alignItems: 'center', gap: 6, flexWrap: 'wrap', marginTop: 2 },\n }, meta)\n : null,\n ]),\n React.createElement('button', {\n key: 'del',\n type: 'button',\n className: confirming ? 'wt-btn wt-btn-danger' : 'wt-icon-btn wt-icon-btn-danger',\n title: confirming ? t('confirmDelete') : t('deleteBtn'),\n 'aria-label': t('deleteBtn'),\n onClick: () => {\n if (!confirming) { setConfirming(true); return; }\n setConfirming(false);\n Promise.resolve(onRemove(row.id)).catch(() => { /* \u5DF2\u5728\u9519\u8BEF\u6761\u4E0A\u663E\u793A */ });\n },\n }, confirming ? t('confirmDelete') : React.createElement(IconTrash, { key: 'i' })),\n ]);\n}\n\n/* ------------------------------------------------------------------ *\n * \u5206\u7EC4\uFF1A\u7A7A\u7EC4\u6574\u5757\u4E0D\u6E32\u67D3\uFF0C\u907F\u514D\u4E94\u4E2A\u7A7A\u6807\u9898\u5806\u5728\u9762\u677F\u4E0A\n * ------------------------------------------------------------------ */\nfunction Group({ label, items, meta, closed, t, today, onToggleOpen, onToggleTodo, onRemove, onSave, drag }) {\n const list = asArray(items);\n if (!list.length) return null;\n return React.createElement('div', { style: { marginTop: 6 } }, [\n React.createElement('div', {\n key: 'head',\n className: 'wt-group-head',\n onClick: onToggleOpen,\n title: closed ? t('expand') : t('collapse'),\n role: 'button',\n 'aria-expanded': !closed,\n }, [\n React.createElement(IconChevron, { key: 'c', open: !closed }),\n React.createElement('span', { key: 'l', style: { fontWeight: 600, fontSize: 12 } }, label),\n React.createElement('span', { key: 'n', style: { fontSize: 11, color: C.label3 } }, meta || String(list.length)),\n React.createElement('span', { key: 'sp', style: { flex: 1 } }),\n React.createElement('span', { key: 'h', style: { fontSize: 11, color: C.label3 } }, closed ? t('expand') : t('collapse')),\n ]),\n closed ? null : React.createElement('div', { key: 'body' }, list.map((todo, index) => React.createElement(TodoRow, {\n key: (todo && todo.id) || `row-${index}`,\n todo,\n today,\n t,\n onToggle: onToggleTodo,\n onRemove,\n onSave,\n drag: drag ? {\n dragging: drag.dragId === todo?.id,\n hint: drag.hint,\n onStart: drag.onStart,\n onOver: drag.onOver,\n onDrop: drag.onDrop,\n onEnd: drag.onEnd,\n } : undefined,\n }))),\n ]);\n}\n\n/* ------------------------------------------------------------------ *\n * \u4F1A\u8BDD\u5F85\u529E\uFF1A\u63D0\u5347\u4E3A\u5DE5\u4F5C\u5F85\u529E\n *\n * \u5B98\u65B9\u4F1A\u8BDD todos \u53EA\u80FD\u901A\u8FC7 useProjection hook \u62FF\u5230\uFF0C\u800C hook \u4E0D\u80FD\u5728\u7EC4\u4EF6\u91CC\u300C\u6709\u6761\u4EF6\u5730\u8C03\u7528\u300D\u3002\n * \u6240\u4EE5\u8FD9\u91CC\u62C6\u6210\u72EC\u7ACB\u5B50\u7EC4\u4EF6\uFF1A\u7236\u7EC4\u4EF6\u53EA\u5728 props.useProjection \u786E\u5B9E\u662F\u51FD\u6570\u65F6\u624D\u6302\u8F7D\u5B83\uFF0C\n * \u4E00\u65E6\u6302\u8F7D\uFF0C\u8FD9\u4E00\u4EFD\u5B9E\u4F8B\u91CC hook \u7684\u8C03\u7528\u6B21\u6570\u5C31\u662F\u6052\u5B9A\u7684 \u2014\u2014 \u4E0D\u8FDD\u53CD hooks \u89C4\u5219\u3002\n * \u6295\u5F71\u4E3A\u7A7A\uFF08\u8FD9\u4E2A\u4F1A\u8BDD\u6CA1\u5217\u8FC7\u5F85\u529E\uFF09\u65F6\u6574\u5757\u8FD4\u56DE null\uFF0C\u9762\u677F\u4E0A\u4E0D\u4F1A\u591A\u51FA\u4E00\u884C\u6CA1\u7528\u7684\u6309\u94AE\u3002\n * ------------------------------------------------------------------ */\nfunction SessionAdopt({ useProjection, t, onAdopt, busy }) {\n let projected;\n try {\n projected = useProjection('todos');\n } catch {\n // \u6295\u5F71\u5C1A\u672A\u5C31\u7EEA / \u5BBF\u4E3B\u7248\u672C\u6CA1\u6709\u8FD9\u4E2A\u6295\u5F71\uFF1A\u5F53\u4F5C\u6CA1\u6709\u4F1A\u8BDD\u5F85\u529E\n projected = null;\n }\n // \u6295\u5F71\u53EF\u80FD\u662F\u88F8\u6570\u7EC4\uFF0C\u4E5F\u53EF\u80FD\u662F { todos: [...] } \u5305\u4E00\u5C42\u2014\u2014\u4E24\u79CD\u5F62\u72B6\u90FD\u8BA4\n const raw = Array.isArray(projected) ? projected : asArray(projected?.todos);\n const items = raw.map((item) => ({\n content: typeof item?.content === 'string' ? item.content\n : (typeof item?.title === 'string' ? item.title : ''),\n status: typeof item?.status === 'string' ? item.status : 'pending',\n })).filter((item) => item.content.trim());\n if (!items.length) return null;\n const openCount = items.filter((item) => item.status !== 'completed').length;\n\n return React.createElement('div', {\n style: { display: 'flex', alignItems: 'center', gap: 8, flexWrap: 'wrap', marginBottom: 10 },\n }, [\n React.createElement('button', {\n key: 'b',\n type: 'button',\n className: 'wt-btn wt-btn-primary',\n disabled: Boolean(busy),\n title: t('adoptHint'),\n onClick: () => { Promise.resolve(onAdopt(items)).catch(() => { /* \u5DF2\u5728\u9519\u8BEF\u6761\u4E0A\u663E\u793A */ }); },\n }, `${t('adoptPre')}${items.length}${t('adoptPost')}`),\n React.createElement('span', {\n key: 'h',\n title: t('adoptHint'),\n style: { fontSize: 11, color: C.label3 },\n }, `${t('adoptPending')} ${openCount}`),\n ]);\n}\n\n/* ------------------------------------------------------------------ *\n * \u9762\u677F\u4E3B\u4F53\n * ------------------------------------------------------------------ */\nconst GROUPS = [\n { key: 'overdue', label: 'groupOverdue' },\n { key: 'today', label: 'groupToday' },\n { key: 'week', label: 'groupWeek' },\n { key: 'later', label: 'groupLater' },\n { key: 'completed', label: 'groupCompleted' },\n];\n\nfunction WorkTodoPanel(props) {\n // t \u7531 locale \u670D\u52A1\u901A\u8FC7 slot props \u6CE8\u5165\uFF1B\u62FF\u4E0D\u5230\u65F6\u9000\u56DE\u4E2D\u6587\uFF0C\u81F3\u5C11\u4E0D\u663E\u793A\u88F8 key\n const t = typeof props?.t === 'function' ? props.t : (key) => zh[key] ?? key;\n // \u6392\u5E8F\uFF1Amanual\uFF08\u9ED8\u8BA4\uFF0C\u5C0A\u91CD\u62D6\u52A8\uFF09/ priority / created\uFF1B\u5FC5\u987B\u5728 useList(sort) \u4E4B\u524D\u58F0\u660E\n const [sort, setSortState] = React.useState(lastSort);\n const setSort = React.useCallback((next) => { lastSort = next; setSortState(next); }, []);\n const [dragId, setDragId] = React.useState(null);\n const { status, data, error, refresh } = useList(sort);\n\n // \u5199\u64CD\u4F5C\u7684\u9519\u8BEF\u6761\uFF1BreadError \u662F\u62C9\u53D6\u9519\u8BEF\uFF08\u7528\u6237\u5173\u6389\u4E4B\u540E\uFF0C\u53EA\u6709\u6362\u6210\u65B0\u9519\u8BEF\u624D\u518D\u5F39\uFF09\n const [barError, setBarError] = React.useState(null);\n const [dismissedReadError, setDismissedReadError] = React.useState(null);\n const readError = error && error !== dismissedReadError ? error : null;\n const shownError = barError ?? readError;\n\n const [notice, setNotice] = React.useState(null);\n const [pending, setPending] = React.useState(0);\n // \u300C\u5DF2\u5B8C\u6210\u300D\u9ED8\u8BA4\u6298\u53E0\uFF08\u505A\u5B8C\u7684\u4E8B\u4E0D\u7528\u5360\u6EE1\u5C4F\u5E55\uFF09\uFF0C\u5176\u4F59\u9ED8\u8BA4\u5C55\u5F00\n const [closed, setClosed] = React.useState({ completed: true });\n // \u89C6\u56FE\uFF1A\u6309\u622A\u6B62\uFF08\u9ED8\u8BA4\uFF09\u6216\u6309\u9879\u76EE\n const [view, setView] = React.useState('due');\n\n /**\n * \u6240\u6709\u5199\u64CD\u4F5C\u7684\u7EDF\u4E00\u5916\u58F3\uFF1A\u6210\u529F\u6E05\u6389\u9519\u8BEF\u6761\uFF0C\u5931\u8D25\u628A\u5BBF\u4E3B\u7684 error \u539F\u6587\u653E\u4E0A\u53BB\uFF0C\n * \u65E0\u8BBA\u6210\u8D25\u6700\u540E\u90FD\u91CD\u65B0\u62C9\u4E00\u6B21\u5217\u8868\uFF08\u907F\u514D\u672C\u5730\u72B6\u6001\u548C\u78C1\u76D8\u4E0A\u7684\u771F\u76F8\u5BF9\u4E0D\u4E0A\uFF09\u3002\n * @returns {Promise<{ok: boolean, data: object}>} data \u662F\u5BBF\u4E3B\u8FD4\u56DE\u7684 data\uFF08\u5931\u8D25\u65F6\u4E3A\u7A7A\u5BF9\u8C61\uFF09\n */\n const runWrite = React.useCallback(async (job) => {\n setPending((n) => n + 1);\n try {\n const data = await job();\n setBarError(null);\n return { ok: true, data: data ?? {} };\n } catch (writeError) {\n setBarError(String(writeError?.message ?? writeError));\n return { ok: false, data: {} };\n } finally {\n setPending((n) => Math.max(0, n - 1));\n refresh();\n }\n }, [refresh]);\n\n const handleAdd = React.useCallback((input) => {\n const title = String(input?.title ?? '').trim();\n // \u7A7A\u6807\u9898\u5148\u5728\u672C\u5730\u62E6\u4E0B\uFF1A\u8FD9\u6761\u6587\u6848\u8981\u8D70 t()\uFF0C\u800C\u5BBF\u4E3B\u7684\u62A5\u9519\u662F\u4E2D\u6587\u7684\uFF0C\u4E24\u4E2A\u90FD\u663E\u793A\u4F1A\u66F4\u4E71\n if (!title) {\n setBarError(t('titleEmpty'));\n return Promise.resolve(false);\n }\n return runWrite(() => postJson('/create', {\n title,\n due: input?.due ? String(input.due) : null,\n priority: input?.priority ?? 'normal',\n })).then((result) => result.ok);\n }, [runWrite, t]);\n\n const handleToggle = React.useCallback((ref) => runWrite(() => postJson('/status', { ref, toggle: true })), [runWrite]);\n const handleRemove = React.useCallback((ref) => runWrite(() => postJson('/remove', { ref })), [runWrite]);\n const handleSave = React.useCallback((ref, patch) => runWrite(() => postJson('/update', { ref, ...patch })), [runWrite]);\n\n /** \u628A dragId \u632A\u5230\u76EE\u6807\u4E4B\u524D\uFF0C\u5F97\u5230\u65B0\u7684\u5B8C\u6574\u987A\u5E8F\u5E76\u843D\u76D8\uFF08manual \u6A21\u5F0F\u751F\u6548\uFF09 */\n\n const handleDropOn = React.useCallback((targetId) => {\n\n const dragging = dragId;\n\n setDragId(null);\n\n if (!dragging || !targetId || dragging === targetId) return Promise.resolve(false);\n\n const ids = asArray(data?.todos).map((todo) => todo?.id).filter(Boolean);\n\n const from = ids.indexOf(dragging);\n\n if (from === -1) return Promise.resolve(false);\n\n ids.splice(from, 1);\n\n const to = ids.indexOf(targetId);\n\n ids.splice(to === -1 ? ids.length : to, 0, dragging);\n\n return runWrite(() => postJson('/reorder', { ids })).then((result) => result.ok);\n\n }, [dragId, data, runWrite]);\n\n \n\n const dragHandlers = React.useMemo(() => ({\n\n dragId,\n\n hint: t('dragHint'),\n\n onStart: (id) => {\n\n setDragId(id);\n\n // \u62D6\u4E86\u5C31\u8BF4\u660E\u60F3\u81EA\u5DF1\u5B9A\u987A\u5E8F\uFF1A\u81EA\u52A8\u5207\u5230\u624B\u52A8\uFF0C\u5426\u5219\u677E\u624B\u540E\u770B\u8D77\u6765\u300C\u6CA1\u751F\u6548\u300D\n\n if (sort !== 'manual') setSort('manual');\n\n },\n\n onOver: () => {},\n\n onDrop: (id) => handleDropOn(id),\n\n onEnd: () => setDragId(null),\n\n }), [dragId, sort, t, setSort, handleDropOn]);\n\n \n\n const handleAdopt = React.useCallback((sessionTodos) => runWrite(() => postJson('/adopt', { todos: sessionTodos }))\n .then((result) => {\n // runWrite \u5DF2\u7ECF\u5237\u65B0\u8FC7\u5217\u8868\uFF0C\u8FD9\u91CC\u8865\u4E00\u53E5\u300C\u63D0\u5347\u4E86\u51E0\u6761\u3001\u8DF3\u8FC7\u51E0\u6761\u300D\u7684\u56DE\u6267\uFF0C\u5426\u5219\u70B9\u5B8C\u50CF\u6CA1\u53CD\u5E94\n if (result.ok) {\n const created = Array.isArray(result.data?.created) ? result.data.created.length : 0;\n const skipped = Number.isFinite(Number(result.data?.skipped)) ? Number(result.data.skipped) : 0;\n setNotice(`${t('adoptDone')} ${created} \u00B7 ${t('adoptSkipped')} ${skipped}`);\n }\n return result.ok;\n }), [runWrite, t]);\n\n // hooks \u89C4\u5219\uFF1A\u8FD9\u91CC\u53EA\u662F\u53D6\u7528\uFF0C\u4E0D\u8C03\u7528\u3002\u771F\u6B63\u7684\u8C03\u7528\u5728 SessionAdopt \u91CC\uFF08\u6309\u6761\u4EF6\u6302\u8F7D\u6574\u4E2A\u5B50\u7EC4\u4EF6\uFF09\n const useProjection = typeof props?.useProjection === 'function' ? props.useProjection : undefined;\n\n const rootStyle = {\n height: '100%', overflow: 'auto', padding: '16px 18px 40px', boxSizing: 'border-box',\n color: C.label, fontFamily: 'var(--dsw-font-family, system-ui, sans-serif)', fontSize: 13,\n };\n\n if (status === 'loading' && !data) {\n return React.createElement('div', {\n className: 'wt-root',\n style: { ...rootStyle, display: 'flex', alignItems: 'center', gap: 8, color: C.label3, padding: 28 },\n }, [\n React.createElement('style', { key: 'css' }, STYLE_TEXT),\n React.createElement('span', { key: 'sp', className: 'wt-spin' }),\n React.createElement('span', { key: 't' }, t('loading')),\n ]);\n }\n\n if (status === 'failed' && !data) {\n return React.createElement('div', {\n className: 'wt-root',\n style: { ...rootStyle, padding: 28, color: C.error },\n }, [\n React.createElement('style', { key: 'css' }, STYLE_TEXT),\n React.createElement('div', { key: 'm' }, `${t('failed')}\uFF1A${error ?? ''}`),\n React.createElement('button', {\n key: 'r', type: 'button', className: 'wt-btn', style: { marginTop: 10 }, onClick: refresh,\n }, t('retry')),\n ]);\n }\n\n const groups = data?.groups ?? {};\n const stats = data?.stats ?? {};\n const today = typeof data?.today === 'string' && data.today ? data.today : localToday();\n const store = data?.store ?? null;\n const num = (value) => (Number.isFinite(Number(value)) ? Number(value) : 0);\n const overdueCount = num(stats.overdue);\n // \u89C6\u56FE\u5206\u6876\uFF1A\u6309\u622A\u6B62\uFF08\u539F\u6709 GROUPS\uFF09\u6216\u6309\u9879\u76EE\uFF08\u5BBF\u4E3B\u7ED9\u7684 projectGroups\uFF0C\u9644 \u672A\u5B8C\u6210/\u603B\u6570/\u903E\u671F\uFF09\n const projectGroups = asArray(data?.projectGroups);\n const viewGroups = view === 'project'\n ? projectGroups.map((bucket) => ({\n key: `p:${bucket?.key ?? ''}`,\n label: bucket?.project ? String(bucket.project) : t('noProject'),\n meta: `${num(bucket?.open)}/${num(bucket?.total)}${num(bucket?.overdue) ? ` \u00B7 ${t('statOverdue')} ${num(bucket.overdue)}` : ''}`,\n items: bucket?.todos,\n }))\n : GROUPS.map((group) => ({ key: group.key, label: t(group.label), items: groups[group.key] }));\n const totalVisible = viewGroups.reduce((sum, group) => sum + asArray(group.items).length, 0);\n\n const chips = [\n { key: 'open', label: t('statOpen'), value: num(stats.open) },\n { key: 'overdue', label: t('statOverdue'), value: overdueCount, alert: overdueCount > 0 },\n { key: 'today', label: t('statToday'), value: num(stats.today) },\n { key: 'doing', label: t('statDoing'), value: num(stats.doing) },\n { key: 'done', label: t('statDoneToday'), value: num(stats.completedToday) },\n ];\n\n return React.createElement('div', { className: 'wt-root', style: rootStyle }, [\n React.createElement('style', { key: 'css' }, STYLE_TEXT),\n\n /* \u9876\u90E8\uFF1A\u6807\u9898 + \u7EDF\u8BA1 + \u5237\u65B0 */\n React.createElement('div', {\n key: 'head',\n style: { display: 'flex', alignItems: 'center', gap: 8, flexWrap: 'wrap', marginBottom: 10 },\n }, [\n React.createElement('div', { key: 'ti', style: { fontWeight: 700, fontSize: 15 } }, t('title')),\n ...chips.map((chip) => React.createElement('span', {\n key: chip.key,\n className: 'wt-chip',\n style: chip.alert\n ? { color: C.warn, borderColor: tint(C.warn, 50), background: tint(C.warn, 12) }\n : undefined,\n }, [\n React.createElement('span', { key: 'l', style: { color: C.label3 } }, chip.label),\n React.createElement('b', { key: 'v', style: { fontWeight: 650 } }, String(chip.value)),\n ])),\n React.createElement('span', { key: 'sort', className: 'wt-seg', title: t('sortLabel') }, [\n ...['manual', 'priority', 'created'].map((mode) => React.createElement('button', {\n key: mode,\n type: 'button',\n className: `wt-seg-btn${sort === mode ? ' is-on' : ''}`,\n title: mode === 'manual' ? t('dragHint') : `${t('sortLabel')}\uFF1A${t(`sort${mode === 'manual' ? 'Manual' : mode === 'priority' ? 'Priority' : 'Created'}`)}`,\n onClick: () => setSort(mode),\n }, t(`sort${mode === 'manual' ? 'Manual' : mode === 'priority' ? 'Priority' : 'Created'}`))),\n ]),\n React.createElement('span', { key: 'view', className: 'wt-seg' }, [\n React.createElement('button', {\n key: 'due',\n type: 'button',\n className: `wt-seg-btn${view === 'due' ? ' is-on' : ''}`,\n title: t('viewDue'),\n onClick: () => setView('due'),\n }, t('viewDue')),\n React.createElement('button', {\n key: 'proj',\n type: 'button',\n className: `wt-seg-btn${view === 'project' ? ' is-on' : ''}`,\n title: t('viewProject'),\n onClick: () => setView('project'),\n }, t('viewProject')),\n ]),\n React.createElement('span', { key: 'sp', style: { flex: 1 } }),\n React.createElement('button', {\n key: 'rf',\n type: 'button',\n className: 'wt-btn',\n disabled: status === 'loading' || pending > 0,\n title: t('refresh'),\n onClick: refresh,\n }, [\n React.createElement(IconRefresh, { key: 'i' }),\n t('refresh'),\n ]),\n ]),\n\n /* \u9519\u8BEF\u6761\uFF1A\u5BBF\u4E3B\u7684 error \u539F\u6587\u7167\u8D34\uFF0C\u7EDD\u4E0D\u541E\u6389 */\n shownError\n ? React.createElement('div', {\n key: 'err',\n style: {\n display: 'flex', alignItems: 'flex-start', gap: 8, marginBottom: 10, padding: '6px 9px',\n borderRadius: 8, border: `1px solid ${tint(C.error, 45)}`, background: tint(C.error, 12),\n color: C.error, fontSize: 12, lineHeight: 1.6,\n },\n }, [\n React.createElement('span', {\n key: 'm',\n style: { flex: 1, minWidth: 0, wordBreak: 'break-word' },\n }, `${t('failed')}\uFF1A${shownError}`),\n React.createElement('button', {\n key: 'x',\n type: 'button',\n className: 'wt-icon-btn',\n style: { width: 18, height: 18, color: C.error },\n title: t('dismiss'),\n 'aria-label': t('dismiss'),\n onClick: () => { setBarError(null); setDismissedReadError(error ?? null); },\n }, React.createElement(IconClose, { key: 'i' })),\n ])\n : null,\n\n /* \u63D0\u5347\u7ED3\u679C\u63D0\u793A\uFF1A\u70B9\u5B8C\u6309\u94AE\u8981\u6709\u4E2A\u56DE\u6267 */\n notice\n ? React.createElement('div', {\n key: 'notice',\n style: {\n display: 'flex', alignItems: 'center', gap: 8, marginBottom: 10, padding: '5px 9px',\n borderRadius: 8, border: `1px solid ${tint(C.ok, 40)}`, background: tint(C.ok, 10),\n color: C.label2, fontSize: 11.5,\n },\n }, [\n React.createElement('span', { key: 'm', style: { flex: 1 } }, notice),\n React.createElement('span', {\n key: 'x', className: 'wt-link', onClick: () => setNotice(null),\n }, t('dismiss')),\n ])\n : null,\n\n /* \u4F1A\u8BDD\u5F85\u529E\uFF1A\u53EA\u5728\u62FF\u5F97\u5230 useProjection \u65F6\u6302\u8F7D\uFF08\u89C1 SessionAdopt \u7684\u8BF4\u660E\uFF09 */\n useProjection\n ? React.createElement(SessionAdopt, {\n key: 'adopt',\n useProjection,\n t,\n busy: pending > 0,\n onAdopt: handleAdopt,\n })\n : null,\n\n React.createElement(QuickAdd, { key: 'quick', t, busy: pending > 0, onAdd: handleAdd }),\n\n /* \u5206\u7EC4\u5217\u8868 */\n totalVisible\n ? React.createElement('div', { key: 'groups' }, viewGroups.map((group) => React.createElement(Group, {\n key: group.key,\n label: group.label,\n meta: group.meta,\n items: group.items,\n closed: Boolean(closed[group.key]),\n t,\n today,\n onToggleOpen: () => setClosed((prev) => ({ ...prev, [group.key]: !prev[group.key] })),\n onToggleTodo: handleToggle,\n onRemove: handleRemove,\n onSave: handleSave,\n drag: dragHandlers,\n })))\n : React.createElement('div', {\n key: 'empty',\n style: { padding: '22px 12px', textAlign: 'center', color: C.label3 },\n }, [\n React.createElement('div', { key: 'a', style: { fontSize: 13, color: C.label2 } }, t('empty')),\n React.createElement('div', { key: 'b', style: { fontSize: 11.5, marginTop: 4 } }, t('emptyHint')),\n ]),\n\n /* \u5E95\u90E8\uFF1A\u6570\u636E\u5230\u5E95\u5B58\u5728\u54EA\uFF08\u6392\u67E5\u300C\u6211\u7684\u5F85\u529E\u4E0D\u89C1\u4E86\u300D\u65F6\u7B2C\u4E00\u773C\u8981\u770B\u7684\u4E1C\u897F\uFF09 */\n React.createElement('div', {\n key: 'foot',\n style: { marginTop: 14, paddingTop: 8, borderTop: `1px solid ${C.border1}`, fontSize: 10.5, color: C.label3, lineHeight: 1.7 },\n }, store && store.location\n ? React.createElement('div', {\n key: 'store',\n title: `${t('storeAt')}\uFF1A${store.location}`,\n style: { wordBreak: 'break-all' },\n }, `${t('storeAt')} \u00B7 ${store.kind === 'domain' ? t('storeDomain') : t('storeFile')} \u00B7 ${store.location}`)\n : null),\n ]);\n}\n\n/* ------------------------------------------------------------------ *\n * \u63D2\u4EF6\u4F53\n * ------------------------------------------------------------------ */\nexport const inject = ['slots', 'locale'];\n\nexport function apply(ctx) {\n ctx.effect(() => ctx.locale.register(LOCALE_NS, { zh, en }), `${LOCALE_NS}: dictionaries`);\n\n // \u4FA7\u680F\u5165\u53E3\uFF08id \u5FC5\u987B\u4E0E main \u9762\u677F\u7684 key \u540C\u540D\uFF0Csidebar \u7528\u5B83\u53BB\u9009\u4E2D\u9762\u677F\uFF09\n ctx.slots.inject('sidebar.panellist', () => ctx.slots.register({\n name: 'sidebar.panellist',\n id: SLOT_ID,\n order: 88,\n label: () => '\u5F85\u529E',\n locale: LOCALE_NS,\n }, (props) => React.createElement(WorkTodoIcon, { size: props?.size ?? 16, active: props?.active })));\n\n // \u4E2D\u680F\u72EC\u7ACB\u9762\u677F\n ctx.slots.inject('main', () => ctx.slots.register({\n name: 'main',\n key: SLOT_ID,\n locale: LOCALE_NS,\n }, WorkTodoPanel));\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["React", "data"]
7
7
  }
package/lib/index.js CHANGED
@@ -16,6 +16,7 @@
16
16
  * 浏览器半侧(侧栏入口 + 面板)在 lib/client.js,按 package.json 的 dsh.client 组成 bundle。
17
17
  */
18
18
  import { readFileSync } from 'node:fs';
19
+
19
20
  import { createWorkTodoService } from '../src/service.mjs';
20
21
  import { openWorkTodoStore } from '../src/store.mjs';
21
22
 
@@ -113,6 +114,25 @@ function readJsonBody(request) {
113
114
  * @param {object} ctx cordis 上下文
114
115
  * @param {object} [config] 组合配置(cordis.patch.yml 的 config)
115
116
  */
117
+ /**
118
+ * 给模型的用法指引(AI 推荐接口)。
119
+ *
120
+ * 为什么要有它:工具描述只讲「这个工具做什么」,而模型真正需要的是「什么时候该用哪个」——
121
+ * 尤其是本插件与官方 todo_write 的分工(会话内的步骤拆解 vs 人拥有的跨会话工作)。
122
+ * 通过 Host 的 systemPrompt.section() 贡献一段提示,是官方 practices 文档给的推荐做法。
123
+ * order 取 3050:官方 SECTION_ORDERS 里内置工具段是 1000–3000、MCP_SERVERS 是 3100,
124
+ * 插在两者之间读起来就是「插件工具的使用说明」。
125
+ */
126
+ const GUIDANCE_TEXT = [
127
+ '工作待办(worktodo_*):属于用户、跨会话持久的工作清单;侧栏面板与这些工具读写同一份数据。',
128
+ '- 该用:用户说出要办的事、承诺或截止日期(「下周要交」「等对方回复」「记一下」),或你在工作中发现超出本会话、仍需人跟进的待办 → worktodo_add。',
129
+ '- 不该用:当前这次任务的步骤拆解与你自己的执行顺序 → 那是会话内的 todo_write(整表替换、只属于本会话)。两者互补:todo_write 说「这一步怎么走」,工作待办说「这件事还欠着」。',
130
+ '- 动手前先看:worktodo_list({ filter: "today" }) 或 "overdue";按项目看:worktodo_list({ project: "<项目>" })。用户问「今天要做什么」时先查再答,不要凭记忆。',
131
+ '- 加之前先查重:worktodo_list({ query: "<关键词>" }),同一条不要登记两次。',
132
+ '- 做完了 / 状态变了:worktodo_done(ref 可给 id 或标题);改标题、截止、优先级、项目用 worktodo_update。',
133
+ '- 约定:标题写成一句简短的祈使句;project 用仓库名或产品名;priority 只在「真的卡住别人」时给 high;链接、背景与验收标准放 notes。',
134
+ ].join('\n');
135
+
116
136
  export async function apply(ctx, config = {}) {
117
137
  const logger = typeof ctx.logger === 'function' ? ctx.logger(name) : ctx.logger;
118
138
 
@@ -159,6 +179,26 @@ export async function apply(ctx, config = {}) {
159
179
  }, 'worktodo: agent tools');
160
180
  });
161
181
 
182
+ // ---- 给模型的用法指引(可选服务;缺 systemPrompt 时静默跳过)----
183
+ ctx.inject(['systemPrompt'], (spCtx) => {
184
+ spCtx.effect(() => {
185
+ if (typeof spCtx.systemPrompt?.section !== 'function') return () => {};
186
+ let disposeSection = () => {};
187
+ try {
188
+ disposeSection = spCtx.systemPrompt.section({
189
+ name: 'worktodo:guidance',
190
+ order: 3050,
191
+ text: GUIDANCE_TEXT,
192
+ }) ?? (() => {});
193
+ logger?.info?.('已注册给模型的用法指引(systemPrompt.section)');
194
+ } catch (error) {
195
+ // 段落注册失败不影响工具与面板;只记一行,方便排查
196
+ logger?.warn?.(`用法指引注册失败:${error?.message ?? error}`);
197
+ }
198
+ return () => { try { disposeSection?.(); } catch { /* 卸载清理失败不打断 */ } };
199
+ }, 'worktodo: system prompt guidance');
200
+ });
201
+
162
202
  // ---- HTTP 路由(可选服务)----
163
203
  ctx.inject(['webServer'], (webCtx) => {
164
204
  /**
@@ -215,10 +255,20 @@ export async function apply(ctx, config = {}) {
215
255
  filter: url.searchParams.get('filter') ?? 'open',
216
256
  project: url.searchParams.get('project') ?? undefined,
217
257
  query: url.searchParams.get('query') ?? undefined,
258
+ sort: url.searchParams.get('sort') ?? undefined,
218
259
  });
219
260
  reply(response, result);
220
261
  }),
221
262
  }),
263
+ // 写:手动排序(拖动)。body: { ids: [待办 id,按新顺序排列] }
264
+ webCtx.webServer.register({
265
+ kind: 'exact',
266
+ path: `${ROUTE_BASE}/reorder`,
267
+ handler: method('POST', async (request, response) => {
268
+ const body = await readJsonBody(request);
269
+ reply(response, await service.reorder(body));
270
+ }),
271
+ }),
222
272
  // 写:新增
223
273
  webCtx.webServer.register({
224
274
  kind: 'exact',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-worktodo",
3
- "version": "0.1.0",
3
+ "version": "0.1.3",
4
4
  "description": "DSH 工作待办面板(社区插件,非官方):归你所有、跨会话持久的工作待办——优先级 / 截止日期 / 项目 / 逾期与本周视图,agent 通过 worktodo_* 工具读写同一份列表。官方 todo_write 属于单个会话且只能整表替换,这份列表属于人。Human-owned cross-session work todo list for DeepSeek Harness: priorities, due dates, projects, overdue/week views and worktodo_* tools the agent shares with you.",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",
@@ -75,31 +75,22 @@
75
75
  ]
76
76
  }
77
77
  },
78
- "dependencies": {},
78
+ "dependencies": {
79
+ "@deepseek-ai/dsh-home-paths": "^0.2.0-rc.2",
80
+ "@deepseek-ai/dsh-storage-domain": "^0.2.0-rc.2",
81
+ "@deepseek-ai/dsh-tools": "^0.2.0-rc.2"
82
+ },
79
83
  "peerDependencies": {
80
- "@deepseek-ai/cordis": "^4.0.2",
81
- "@deepseek-ai/dsh-home-paths": ">=0.1.0-rc.1 <0.3.0-0",
82
- "@deepseek-ai/dsh-storage-domain": ">=0.1.0-rc.1 <0.3.0-0",
83
- "@deepseek-ai/dsh-tools": ">=0.1.0-rc.1 <0.3.0-0"
84
+ "@deepseek-ai/cordis": "^4.0.2"
84
85
  },
85
86
  "peerDependenciesMeta": {
86
87
  "@deepseek-ai/cordis": {
87
88
  "optional": true
88
- },
89
- "@deepseek-ai/dsh-tools": {
90
- "optional": true
91
- },
92
- "@deepseek-ai/dsh-storage-domain": {
93
- "optional": true
94
- },
95
- "@deepseek-ai/dsh-home-paths": {
96
- "optional": true
97
89
  }
98
90
  },
99
91
  "devDependencies": {
100
92
  "@deepseek-ai/cordis": "4.0.4",
101
93
  "@deepseek-ai/dsh-agent": "0.2.0-rc.2",
102
- "@deepseek-ai/dsh-home-paths": "0.2.0-rc.2",
103
94
  "@deepseek-ai/dsh-invariants": "0.2.0-rc.2",
104
95
  "@deepseek-ai/dsh-llm": "0.2.0-rc.2",
105
96
  "@deepseek-ai/dsh-ptc-runtime": "0.2.0-rc.2",
@@ -108,20 +99,19 @@
108
99
  "@deepseek-ai/dsh-scope": "0.2.0-rc.2",
109
100
  "@deepseek-ai/dsh-session": "0.2.0-rc.2",
110
101
  "@deepseek-ai/dsh-storage": "0.2.0-rc.2",
111
- "@deepseek-ai/dsh-storage-domain": "0.2.0-rc.2",
112
102
  "@deepseek-ai/dsh-system-prompt": "0.2.0-rc.2",
113
- "@deepseek-ai/dsh-tools": "0.2.0-rc.2",
114
103
  "@deepseek-ai/dsh-user-approval": "0.2.0-rc.2",
115
104
  "@deepseek-ai/dsh-util-values": "0.2.0-rc.2",
116
105
  "esbuild": "^0.28.2"
117
106
  },
118
- "publishConfig": {
119
- "registry": "https://registry.npmjs.org/"
120
- },
121
- "license": "MIT",
122
107
  "scripts": {
123
108
  "build": "node tools/build-client.mjs",
124
109
  "watch": "node tools/build-client.mjs --watch",
125
- "test": "node tools/verify-all.mjs"
126
- }
127
- }
110
+ "test": "node tools/verify-all.mjs",
111
+ "prepublishOnly": "node tools/build-client.mjs && node tools/verify-all.mjs"
112
+ },
113
+ "publishConfig": {
114
+ "registry": "https://registry.npmjs.org/"
115
+ },
116
+ "license": "MIT"
117
+ }