{"_id":"@dva89/flare-chat-ui","name":"@dva89/flare-chat-ui","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"@dva89/flare-chat-ui","private":false,"version":"0.1.0","type":"module","scripts":{"dev":"npm run dev:playground","dev:mock":"VITE_FLARE_CHAT_DEV_DEFAULT_BACKEND=mock npm run dev:playground","dev:real":"VITE_FLARE_CHAT_DEV_DEFAULT_BACKEND=real npm run dev:playground","dev:playground":"vite --config playground/vite.config.js","build":"npm run build:playground","build:playground":"vite build --config playground/vite.config.js","preview:playground":"vite preview --config playground/vite.config.js --port 3001","test":"node --test tests/**/*.test.js"},"main":"./src/index.js","module":"./src/index.js","exports":{".":"./src/index.js","./index.js":"./src/index.js","./chat-gui/index.js":"./src/chat-gui/index.js","./chat-gui/ChatWorkspace.jsx":"./src/chat-gui/ChatWorkspace.jsx","./chat-gui/components/ChatComposer.jsx":"./src/chat-gui/components/ChatComposer.jsx","./chat-gui/components/ChatTimeline.jsx":"./src/chat-gui/components/ChatTimeline.jsx","./chat-gui/components/SessionListPane.jsx":"./src/chat-gui/components/SessionListPane.jsx"},"dependencies":{"flare-canvas-ui":"npm:@dva89/flare-canvas-ui@0.1.0","flare-chat-core":"npm:@dva89/flare-chat-core@0.1.0","flare-generative-ui":"npm:@dva89/flare-generative-ui@0.1.0"},"peerDependencies":{"@ant-design/icons":"^6.0.0","antd":"^6.0.0","react":"^18.0.0"},"devDependencies":{"@ant-design/icons":"^6.0.0","@vitejs/plugin-react":"^5.1.1","antd":"^6.2.2","react":"^18.3.1","react-dom":"^18.3.1","vite":"^7.2.4"},"_id":"@dva89/flare-chat-ui@0.1.0","gitHead":"6cf76a9231a595a6725fa417d3c629218850d428","description":"Chat GUI 能力包。","_nodeVersion":"20.20.2","_npmVersion":"10.8.2","dist":{"integrity":"sha512-CpHjhMbTQBy+Bw7owLXzbXGuptgGkN/l2gEHeqdwJWk8sRpU5/TD0veOeFz0hQM8xyEEYh+jKqkVaYzDCRL/Kw==","shasum":"95c97085aceb802421367ed4dac08fe138a54863","tarball":"https://registry.npmjs.org/@dva89/flare-chat-ui/-/flare-chat-ui-0.1.0.tgz","fileCount":17,"unpackedSize":138675,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIF6r7XxMqO2h/GN39EE4Rftb4ED6R/gi3yL2fHc/q7KZAiEA8VjWzfRYCKlnjrxjwp13oh0cBqmaimkrR797tmmiHUI="}]},"_npmUser":{"name":"dantevonarmia","email":"dantevonarmia@gmail.com"},"directories":{},"maintainers":[{"name":"dantevonarmia","email":"dantevonarmia@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/flare-chat-ui_0.1.0_1775328731272_0.7186310784824246"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-04T18:52:11.160Z","0.1.0":"2026-04-04T18:52:11.432Z","modified":"2026-04-04T18:52:11.684Z"},"maintainers":[{"name":"dantevonarmia","email":"dantevonarmia@gmail.com"}],"description":"Chat GUI 能力包。","readme":"# flare-chat-ui\n\nChat GUI 能力包。\n\n依赖：\n\n1. `flare-chat-core`\n2. `flare-generative-ui`\n3. `flare-canvas-ui`\n\n职责：\n\n1. 会话列表。\n2. 消息时间线。\n3. 输入区与发送交互。\n4. ChatWorkspace 宿主编排。\n\n不包含：\n\n1. kernel 调用实现。\n2. 业务领域写死逻辑。\n\n## development mode（本地调试）\n\n用于纯组件调试，不依赖真实业务后端：\n\n1. `cd packages/flare-chat-ui`\n2. `npm install`\n3. `npm run dev`\n\n默认地址：`http://127.0.0.1:3000`\n\n约定：\n\n1. `playground` 默认使用本地 mock runtime（会话/消息/流式事件均为模拟）。\n2. 不接入真实采购业务逻辑。\n3. 端口与标题通过环境变量配置，不在代码里写死业务地址。\n\n可选环境变量：\n\n1. `FLARE_CHAT_UI_DEV_HOST`、`FLARE_CHAT_UI_DEV_PORT`\n2. `VITE_FLARE_CHAT_FUNCTION_TYPE`\n3. `VITE_FLARE_CHAT_DEFAULT_SESSION_TITLE`\n4. `VITE_FLARE_CHAT_PROJECT_NAME`\n5. `VITE_FLARE_CHAT_PROJECT_TITLE`\n6. `VITE_FLARE_CHAT_SOURCE_API_ENABLED`（`true` 时启用真实文件 API）\n7. `VITE_FLARE_CHAT_SOURCE_API_BASE_URL`（如 `http://127.0.0.1:8001`）\n8. `VITE_FLARE_CHAT_SOURCE_API_TOKEN`（Bearer token）\n\n## shell slots（配置化插槽）\n\n`ChatWorkspace` 支持把壳层入口配置化，便于后续只改配置：\n\n1. `projectSlot`\n2. `sidebarOperations`\n3. `modeQuickEntries`\n4. `uiLabels`\n5. `identityContext`\n6. `onProjectSourcesChange`\n7. `sourceAPI`\n\n最小示例：\n\n```jsx\n<ChatWorkspace\n  functionType=\"chat_component_debug\"\n  messageAPI={messageAPI}\n  projectSlot={{\n    key: 'project-learning-gpt',\n    project_id: 'proj_001',\n    subtitle: 'Project',\n    name: '项目',\n    sessionListParams: { project_id: 'proj_001' },\n    sessionCreateParams: { project_id: 'proj_001' },\n  }}\n  identityContext={{\n    user_id: 'user_001',\n    project_id: 'proj_001',\n  }}\n  onProjectSourcesChange={({ project_id, user_id, sources }) => {\n    // 宿主可在这里持久化项目资料与会话引用关系\n  }}\n  sourceAPI={{\n    uploadSourceFile: (payload) => apiClient.uploadSourceFile(payload),\n    listProjectSources: (projectId) => apiClient.listProjectSources(projectId),\n    deleteProjectSource: (projectId, sourceId) => apiClient.deleteProjectSource(projectId, sourceId),\n  }}\n  sessionAPI={sessionAPI}\n  sidebarOperations={[\n    { key: 'new_thread', label: 'New thread' },\n    { key: 'automations', label: 'Automations' },\n    { key: 'skills', label: 'Skills' },\n  ]}\n  modeQuickEntries={[\n    { key: 'requirement_canvas', label: '需求梳理', functionType: 'requirement_canvas' },\n    { key: 'intelligent_sourcing', label: '智能寻源', functionType: 'intelligent_sourcing' },\n  ]}\n  uiLabels={{\n    mode_quick_entry_title: '推荐模式',\n    current_mode_label: '当前模式',\n  }}\n/>\n```\n\n`sourceAPI` 约定：\n\n1. `uploadSourceFile({ file, project_id, session_id? }) => Promise<SourceRecord>`\n2. `listProjectSources(projectId) => Promise<{ project_id, sources }>`\n3. `deleteProjectSource(projectId, sourceId) => Promise<{ deleted: boolean }>`\n\n未传 `sourceAPI` 时，资料区仍使用本地状态模式（仅前端内存）。\n","readmeFilename":"README.md","_rev":"1-62f9d345aa1c1ea7e7224c8ebd84ffc0"}