// CoCreate.jsx — 墨吞 · 牵线(共创)
// 找人帮助分两条路,是墨吞常用的问题结构:
// ① 现成的(过去):有人已经写过 → 引用并在文末嵌入来源(带 ID / 出处)
// ② 实时的(现在):信息还没有、或需要现场(如到某地拍照)→ 约人;
// 墨吞依据你写的内容做 faiss 检索,并判断是否该请专业人士介入。
// 墨吞在这里只做"建立联系"。(演示流程,确定性匹配,未接真实 faiss)
const { useState: useStateCC } = React;
function CoPersonCard({ row, mode, joined, onInvite }) {
const { p, score, whenPlace, pro } = row;
const live = (mode === 'live');
return (
{/* 墨吞 · 判断这一页缺什么,并结构成两条路 */}
{!embedded && (
墨
墨吞 · 牵线 — 这一页,要不要请人补一块?
我读了这一页,判断你可能缺:{judge.missing}。这通常有两条路 —
向量检索
)}
{/* 两条路 · 模式切换(嵌入书写视图时由页签锁定,隐藏切换)*/}
{!lockMode && (
)}
{/* 当前路的墨吞提示 */}
{mode === 'past'
? {judge.pastLine}
: {judge.liveLine}
{judge.proRole && 建议请「{judge.proRole}」介入。}
}
{/* 可被邀约 · 用户可随时关闭 */}
{mode === 'live' && (
)}
{/* 邀约卡 · 真正发出的一张卡片 */}
{compose && (
{compose.p.name[0]}
致 {compose.p.name} {compose.p.prof}
一张来自《{pageTitle}》的邀约
)}
{/* 选择要找什么 */}
{dims.map(d => (
))}
{/* 自由检索 */}
setQuery(e.target.value)}
onKeyDown={e => { if (e.key === 'Enter') search(query); }}
placeholder={mode === 'live' ? '想请谁来现场?例如:现在在杭州、能拍西湖的人' : '想引用谁写过的?例如:写过侘寂 / 爵士的人'} />
{busy && (
向量检索中 · 在 {corpus.toLocaleString()} 页他人的笔记里匹配语境…
)}
{!busy && results && (
results.length ? (
{mode === 'live'
? `墨吞找到 ${results.length} 位现在能帮上忙的人 · 按相关度排序`
: `墨吞找到 ${results.length} 则可引用的现成内容 · 按相关度排序`}
{results.map(row => (
))}
) : (
这一向度暂时没匹配到。换个职业、地点或主题试试?
)
)}
{/* ① 已引用:文末出处 */}
{cited.length > 0 && (
已引用进这一页 · {cited.length}
自动写入文末出处,署对方 ID 与来源
{cited.map(({ p, n }) => (
[{n}]
{p.name}
{p.prof}
“{p.snippet}”
文末出处 [{n}] · {p.id} · 来源《{p.note}》
))}
引用的文字会带着 [序号] 落进正文,文末自动生成出处清单。
)}
{/* ② 已约人:实时邀约 · 等待 → 接受(素材回到这一页 + 文末出处)*/}
{invited.length > 0 && (
邀约 · {invited.length}
对方接受后,素材带 ID 回到这一页
{invited.map(({ p, pro, msg, status, material, n }) => (
{p.name[0]}
{p.name}
{p.prof}
{pro && 专业}
“{msg}”
{status === 'waiting' && (
已送达 · 等待回应…
)}
{status === 'accepted' && (
{p.name} 接受了邀约
{material && material.kind === 'photo'
?
{material.label}
:
“{material && material.label}”
}
文末出处 [{n}] · {p.id} · 已署名
)}
))}
回来的照片 / 资料带上 TA 的 ID 与时间戳,作为这一页的共创素材,并写入文末出处。
)}
);
}
Object.assign(window, { CoCreate, CoPersonCard });