dsh-form-fill-agent 0.2.19 → 0.2.20
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/README.md +4 -4
- package/lib/http.js +2 -2
- package/lib/mapping-recommendations.js +3 -1
- package/lib/ui.html +13 -11
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
AI填表智能体:支持自动填表、表格填充、表格补全、Excel填表与 Excel回填;使用企查查 MCP 填写 XLSX 空白字段,预览确认后导出新副本。
|
|
6
6
|
|
|
7
7
|
```sh
|
|
8
|
-
dsh plugin --profile web add dsh-form-fill-agent@0.2.
|
|
8
|
+
dsh plugin --profile web add dsh-form-fill-agent@0.2.20
|
|
9
9
|
```
|
|
10
10
|
|
|
11
11
|
请先满足下文的 DSH、连接器及侧边栏依赖要求;安装后完整停止并重启对应 Profile。
|
|
@@ -55,7 +55,7 @@ dsh plugin --profile web add dsh-form-fill-agent@latest
|
|
|
55
55
|
- 结果筛选显示当前/总数及已选格数,下载始终包含全部确认内容。
|
|
56
56
|
- 简单 XLSX 安全解析、工作表与表头识别、企业名称或信用代码锚点识别。
|
|
57
57
|
- 确定性字段语义映射、只填空白、单元格级预览与来源追溯。
|
|
58
|
-
-
|
|
58
|
+
- 137 字段目录:工商、企业简介、联系方式、上市、开票、进出口、自身及关联风险、实际控制人。唯一完整实控人记录可填写,多名/分页/异常留空待核验。事实和确定性摘要区分来源,不生成风险结论。
|
|
59
59
|
- 五步工作台、指令回填、任务历史、可恢复单元格选择、取消/失败重试与重启恢复。
|
|
60
60
|
- 可选择工作表、表头行并修正字段映射;修改后需重新预览。
|
|
61
61
|
- 查询主体不一致时展示返回候选,人工选择或补充已核验的完整主体后重新查询,原表名称不覆盖。
|
|
@@ -64,7 +64,7 @@ dsh plugin --profile web add dsh-form-fill-agent@latest
|
|
|
64
64
|
|
|
65
65
|
## 使用边界与数据保存
|
|
66
66
|
|
|
67
|
-
补充要求为模型可读文本;字段或工作表范围请通过向导/工作台修改,不能仅改文字后假定执行范围已同步。任务 schema 5 可读取 schema 1–5;回退旧版本请使用升级前目录副本或独立任务目录。主包为 0.2.
|
|
67
|
+
补充要求为模型可读文本;字段或工作表范围请通过向导/工作台修改,不能仅改文字后假定执行范围已同步。任务 schema 5 可读取 schema 1–5;回退旧版本请使用升级前目录副本或独立任务目录。主包为 0.2.20,共享内核为 0.2.10,Provider 为 0.2.2,共享字段契约为 0.1.0。
|
|
68
68
|
|
|
69
69
|
支持企业完整登记名称或 18 位信用代码;简称、主体不一致或多候选不会自动猜选。仅有信用代码的表格也可作为查询锚点。连接候选检索工具时可检索简称,仍需人工确认;缺少工具时降级人工输入。字段映射采用确定性规则及人工确认,不让模型编造事实。支持普通内部公式、固定区域下拉、基础条件格式和普通表格对象;复杂 Excel 结构和 Word 暂不支持,保真边界见下方安全说明。
|
|
70
70
|
|
|
@@ -72,7 +72,7 @@ dsh plugin --profile web add dsh-form-fill-agent@latest
|
|
|
72
72
|
|
|
73
73
|
显式设置 DSH_HOME 时,任务保存至其 form-fill-tasks 目录,默认 24 小时过期;未设置时使用内存。任务保存输入表格和归一化预览,不持久化原始 MCP 响应,可主动删除任务。模型及 MCP 凭据由宿主管理。
|
|
74
74
|
|
|
75
|
-
0.2.
|
|
75
|
+
0.2.20 保存任务 schema 5,兼容读取旧 schema 1–4;回退旧版本须使用升级前任务目录副本或新目录,防止丢失已确认的字段/主体设置。
|
|
76
76
|
|
|
77
77
|
## 文档与反馈
|
|
78
78
|
|
package/lib/http.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { randomUUID, createHash } from 'node:crypto';
|
|
2
2
|
import { readFile } from 'node:fs/promises';
|
|
3
3
|
import { applyChangeSet, parseWorkbook } from 'form-fill-core';
|
|
4
|
-
import { FIELD_CATALOG, QCC_FIELD_CATALOG, ACTUAL_CONTROLLER_GROUP, isCompleteAnchor } from 'qcc-form-fill-provider';
|
|
4
|
+
import { FIELD_CATALOG, QCC_FIELD_CATALOG, ACTUAL_CONTROLLER_GROUP, SNAPSHOT_GROUPS, isCompleteAnchor } from 'qcc-form-fill-provider';
|
|
5
5
|
import { previewBytes } from './workflow.js';
|
|
6
6
|
import { createTaskStore } from './task-store.js';
|
|
7
7
|
import { allCandidates, selectCandidates } from './task-model.js';
|
|
@@ -27,7 +27,7 @@ export function createFormFillHandler({ basePath = '', getPort, now = Date.now,
|
|
|
27
27
|
candidates: allCandidates(task).changes,
|
|
28
28
|
selectedIds: task.preview.changeSet.changes.map(c=>c.id),
|
|
29
29
|
catalog: FIELD_CATALOG.map(field=>({...field,searchAliases:mappingSearchAliases(field.key)})),
|
|
30
|
-
catalogGroups: [...QCC_FIELD_CATALOG,ACTUAL_CONTROLLER_GROUP].map(g=>({id:g.id,label:g.label,fields:g.fields.flatMap(item=>FIELD_CATALOG.filter(f=>f.key===item.id||f.aliases?.includes(item.id)).map(f=>f.key))})),
|
|
30
|
+
catalogGroups: [...QCC_FIELD_CATALOG,ACTUAL_CONTROLLER_GROUP,...SNAPSHOT_GROUPS].map(g=>({id:g.id,label:g.label,fields:g.fields.flatMap(item=>FIELD_CATALOG.filter(f=>f.key===item.id||f.aliases?.includes(item.id)).map(f=>f.key))})),
|
|
31
31
|
structure: parseWorkbook(task.bytes).sheets.filter(s => !s.hidden).map(s => ({
|
|
32
32
|
name: s.name,
|
|
33
33
|
rows: s.rows.filter(r => !r.hidden).slice(0,30).map(r => ({ number: r.number, cells: Object.values(s.cells).filter(c => c.row === r.number && !c.hidden && c.value.trim()).map(c => ({ column: c.column, label: c.value, recommendations: mappingRecommendations(c.value,FIELD_CATALOG) })) })),
|
|
@@ -17,6 +17,8 @@ const aliases = {
|
|
|
17
17
|
actual_controller_voting_ratio:['实际控制人表决权比例'],
|
|
18
18
|
};
|
|
19
19
|
const ambiguous = {
|
|
20
|
+
受益人:['beneficial_owner_first_name'],受益所有人:['beneficial_owner_first_name'],UBO:['beneficial_owner_first_name'],
|
|
21
|
+
主营业务收入:['financial_total_revenue'],
|
|
20
22
|
地址:['registered_address','mailing_address','invoice_address'],
|
|
21
23
|
address:['registered_address','mailing_address'],企业地址:['registered_address','mailing_address'],公司地址:['registered_address','mailing_address'],
|
|
22
24
|
开业时间:['established_date'],开业日期:['established_date'],
|
|
@@ -27,7 +29,7 @@ export function mappingSearchAliases(key){
|
|
|
27
29
|
return [...(aliases[key]||[]),...Object.entries(ambiguous).filter(([,keys])=>keys.includes(key)).map(([label])=>label)];
|
|
28
30
|
}
|
|
29
31
|
export function mappingRecommendations(header,catalog){
|
|
30
|
-
const label=normalize(String(header??'').normalize('NFKC').replace(/\s*\(?\s*YYYY[-/]MM[-/]DD\s*\)?\s*$/i,''));
|
|
32
|
+
const label=normalize(String(header??'').normalize('NFKC').replace(/\s*\(重复列\s*\d+\)\s*$/,'').replace(/\s*\(?\s*YYYY[-/]MM[-/]DD\s*\)?\s*$/i,''));
|
|
31
33
|
if(!label)return [];
|
|
32
34
|
const available=new Set(catalog.map(f=>f.key));
|
|
33
35
|
const hinted=Object.entries(ambiguous).find(([name])=>normalize(name)===label)?.[1];
|
package/lib/ui.html
CHANGED
|
@@ -121,17 +121,17 @@ function renderWizard(){
|
|
|
121
121
|
if($('scope-ack').dataset.signature!==signature){$('scope-ack').checked=false;$('scope-ack').dataset.signature=signature}
|
|
122
122
|
$('scope-review').textContent=(review.omitted.length?'本次不填写 '+review.omitted.length+' 列:'+review.omitted.slice(0,3).join('、')+(review.omitted.length>3?'等,详见明细':'')+'。':'所有已映射的非主体字段均已纳入。')+(review.missing.length?'有 '+review.missing.length+' 行缺少可用主体标识;请检查企业名称列,不能使用整列为空的信用代码定位主体。':'');
|
|
123
123
|
$('wizard-positions').textContent=(current?.analysis.opportunities||[]).filter(p=>wizardFields.has(p.field)).slice(0,200).map(p=>p.sheet+'!'+p.cell+':'+p.label).join('\n')+'\n最多展示前 200 个位置;完整计划保存在任务中。\n保留列:'+review.omitted.join('、');
|
|
124
|
-
$('wizard-message').textContent=review.blocked?review.problem:
|
|
125
|
-
$('scope-ack-label').hidden
|
|
124
|
+
$('wizard-message').textContent=review.blocked?review.problem:'';
|
|
125
|
+
$('scope-ack-label').hidden=true;
|
|
126
126
|
$('wizard-next').textContent=wizardStep===1?'应用映射并继续':'下一步';
|
|
127
127
|
$('wizard-prev').disabled=wizardStep===0||busy;$('wizard-next').hidden=wizardStep===3;$('wizard-next').disabled=!current||busy;
|
|
128
|
-
$('draft').hidden=wizardStep!==3;$('copy-command').hidden=wizardStep!==3;$('draft').disabled=!current||!wizardFields.size||busy||review.blocked
|
|
128
|
+
$('draft').hidden=wizardStep!==3;$('copy-command').hidden=wizardStep!==3;$('draft').disabled=!current||!wizardFields.size||busy||review.blocked;$('copy-command').disabled=$('draft').disabled;
|
|
129
129
|
}
|
|
130
130
|
function openWizard(retry=false){retryIntent=retry===true;initWizard();renderWizard();if(!$('wizard').open)$('wizard').showModal();renderWizard();if(parent!==window){document.body.classList.add('ff-modal-host');parent.postMessage({type:'ff-wizard-state',open:true},location.origin)}}
|
|
131
131
|
function closeWizard(focusComposer=false){saveWizard();$('draft-conflict').close();$('wizard').close();mappingHome.after(sharedMapping);sharedMapping.hidden=step!=='rules';document.body.classList.remove('ff-modal-host');if(parent!==window)parent.postMessage({type:'ff-wizard-state',open:false,focusComposer},location.origin);if(!focusComposer)$('wizard-open').focus()}
|
|
132
132
|
async function applyScope(){
|
|
133
133
|
if(!current||!wizardFields.size)throw Error('请至少选择一个已映射的填写字段');
|
|
134
|
-
const review=scopeReview();if(review.blocked)throw Error('没有可用主体标识,请先到字段设置映射企业名称列。');
|
|
134
|
+
const review=scopeReview();if(review.blocked)throw Error('没有可用主体标识,请先到字段设置映射企业名称列。');
|
|
135
135
|
const original=current.selectedFields||[...new Set(current.analysis.tables.flatMap(t=>t.mappings.filter(m=>m.field&&!isInput(t,m)).map(m=>m.field)))];
|
|
136
136
|
if(retryIntent&&JSON.stringify([...original].sort())!==JSON.stringify([...wizardFields].sort()))throw Error('重试时请保留原字段范围;如需更改,请重新生成完整核验指令。');
|
|
137
137
|
if(JSON.stringify([...original].sort())!==JSON.stringify([...wizardFields].sort()))render(await api('/scope',{id:current.id,selectedFields:[...wizardFields]}));
|
|
@@ -149,14 +149,14 @@ function directScope(){
|
|
|
149
149
|
if($('direct-ack').dataset.signature!==signature){$('direct-ack').checked=false;$('direct-ack').dataset.signature=signature}
|
|
150
150
|
$('direct-scope').textContent=review.problem||'将填写 '+wizardFields.size+' 个已确认字段。'+(review.omitted.length?'另有 '+review.omitted.length+' 列未纳入,可展开查看。':'');
|
|
151
151
|
$('scope-omissions').hidden=!review.omitted.length;$('scope-omissions-list').textContent=review.omitted.slice(0,3).join('、')+(review.omitted.length>3?'等,详见明细':'');
|
|
152
|
-
$('direct-ack-label').hidden
|
|
152
|
+
$('direct-ack-label').hidden=true;
|
|
153
153
|
return review;
|
|
154
154
|
}
|
|
155
155
|
async function directDraft(){
|
|
156
156
|
if(busy||!current)return;
|
|
157
157
|
const review=directScope();
|
|
158
158
|
if(review.blocked){$('status').textContent=review.problem;navigate('rules');$('anchor-alert').textContent=review.problem;$('anchor-alert').scrollIntoView({block:'center'});return}
|
|
159
|
-
|
|
159
|
+
|
|
160
160
|
$('scope-ack').checked=$('direct-ack').checked;
|
|
161
161
|
if(parent===window){$('direct-command').hidden=false;$('direct-command').value=command();$('direct-command').focus();$('direct-command').select();$('status').textContent='指令已生成,请复制到 DSH 对话框发送。';return}
|
|
162
162
|
$('status').textContent='正在回填到对话框…';await sendDraft();
|
|
@@ -208,9 +208,11 @@ function renderSettings(data){
|
|
|
208
208
|
const status=document.createElement('p');status.className='ff-mapping-status';status.setAttribute('aria-live','polite');
|
|
209
209
|
const count=document.createElement('small');count.className='muted';
|
|
210
210
|
const suggestions=document.createElement('div');suggestions.className='ff-mapping-suggestions';
|
|
211
|
+
const selectionNote=document.createElement('p');selectionNote.className='muted';label.append(selectionNote);
|
|
211
212
|
const updateStatus=()=>{const f=data.catalog.find(f=>f.key===chosen);role.hidden=!(f?.anchor||f?.anchorFallback);select.dataset.manual=String(manual);select.dataset.primary=String(!role.hidden);status.dataset.state=chosen?(manual?'confirmed':'automatic'):manual?'skipped':suggestions.childElementCount?'pending':'unmatched';status.textContent=chosen?(manual?'已确认':'自动通过')+':'+(f?.label||chosen):manual?'已跳过:保留原值,不填写':suggestions.childElementCount?'待人工确认:请选择推荐字段':'未匹配:保留原值,不填写;可搜索字段';};
|
|
212
213
|
label.updateMappingStatus=updateStatus;
|
|
213
|
-
|
|
214
|
+
const originalUpdate=label.updateMappingStatus;label.updateMappingStatus=()=>{originalUpdate();selectionNote.textContent=(data.catalog.find(f=>f.key===(chosen||cell.recommendations?.[0]))?.selectionNote||'')+((chosen||cell.recommendations?.[0])==='financial_total_revenue'&&cell.label.includes('主营业务收入')?';主营业务收入与营业总收入口径不同,采用前请确认。':'')};
|
|
215
|
+
role.onchange=()=>{manual=true;label.updateMappingStatus();highlightMappingConflicts()};
|
|
214
216
|
const options=()=>{
|
|
215
217
|
const group=data.catalogGroups?.find(g=>g.id===dimension.value);
|
|
216
218
|
const found=(data.catalog||[]).filter(f=>matches(f,search.value)&&(!dimension.value||(dimension.value==='other'?!data.catalogGroups?.some(g=>g.fields.includes(f.key)):group?.fields.includes(f.key))));
|
|
@@ -220,9 +222,9 @@ function renderSettings(data){
|
|
|
220
222
|
const buckets=new Map();
|
|
221
223
|
for(const field of list){const option=document.createElement('option');option.value=field.key;option.textContent=field.label;const group=field.key?data.catalogGroups?.find(g=>g.fields.includes(field.key)):null;if(group){if(!buckets.has(group.id)){const optgroup=document.createElement('optgroup');optgroup.label=group.label;select.append(optgroup);buckets.set(group.id,optgroup)}buckets.get(group.id).append(option)}else select.append(option)}
|
|
222
224
|
trigger.textContent=chosen?(data.catalog.find(f=>f.key===chosen)?.label||chosen):'选择填写字段';
|
|
223
|
-
select.value=chosen;count.textContent=found.length?'匹配 '+found.length+' 个字段':'没有匹配字段,请更换关键词或维度';
|
|
225
|
+
select.value=chosen;count.textContent=found.length?'匹配 '+found.length+' 个字段':'没有匹配字段,请更换关键词或维度';label.updateMappingStatus();
|
|
224
226
|
};
|
|
225
|
-
const choose=()=>{chosen=select.value;manual=true;suggestions.replaceChildren();trigger.textContent=chosen?(data.catalog.find(f=>f.key===chosen)?.label||chosen):'不填写';
|
|
227
|
+
const choose=()=>{chosen=select.value;manual=true;suggestions.replaceChildren();trigger.textContent=chosen?(data.catalog.find(f=>f.key===chosen)?.label||chosen):'不填写';label.updateMappingStatus();$('mapping-next').hidden=true};
|
|
226
228
|
const finish=()=>{choose();highlightMappingConflicts();picker.open=false;trigger.focus()};
|
|
227
229
|
select.onchange=choose;
|
|
228
230
|
select.ondblclick=finish;
|
|
@@ -282,7 +284,7 @@ initWizard();filterResults();syncActions();if($('wizard').open)renderWizard();
|
|
|
282
284
|
const missing=data.analysis.incomplete.filter(i=>i.reason==='missing-anchor');
|
|
283
285
|
$('anchor-alert').textContent=missing.length?'有 '+missing.length+' 行缺少可用主体标识。请把实际包含名称的列映射为“企业名称”,或提供非空信用代码;当前不会查询这些行。':'';
|
|
284
286
|
}
|
|
285
|
-
async function restore(silent=false){if(busy||!current&& !location.hash)return;const id=new URLSearchParams(location.hash.slice(1)).get('task');if(!id)return;try{const data=await api('/task/'+encodeURIComponent(id));if(!silent||data.id!==current?.id||data.revision!==current?.revision){render(data);if(!silent){const target=pendingNavigation||(data.confirmed?'download':'preview');pendingNavigation=undefined;if(target==='history')$('history-tab').click();else navigate(target)}}}catch(e){if(!silent)$('status').textContent=e.message}}
|
|
287
|
+
async function restore(silent=false){if(busy||!current&& !location.hash)return;const id=new URLSearchParams(location.hash.slice(1)).get('task');if(!id)return;try{const data=await api('/task/'+encodeURIComponent(id));if(!silent||data.id!==current?.id||data.revision!==current?.revision){const wasRunning=current?.state==='enriching';render(data);if(silent&&data.state==='enriching'){navigate('identity');$('status').textContent=$('execution-progress').textContent}else if(silent&&wasRunning){navigate('preview');$('status').textContent='查询已结束,请检查填写预览。'}if(!silent){const target=pendingNavigation||(data.confirmed?'download':'preview');pendingNavigation=undefined;if(target==='history')$('history-tab').click();else navigate(target)}}}catch(e){if(!silent)$('status').textContent=e.message}}
|
|
286
288
|
async function preview(buffer,name,demo=false){controls(true);try{const bytes=new Uint8Array(buffer);if(bytes.length>8388608)throw Error('文件超过 8 MiB');let binary='';for(let i=0;i<bytes.length;i+=32768)binary+=String.fromCharCode(...bytes.subarray(i,i+32768));$('grid').open=true;render(await api('/preview',{base64:btoa(binary),filename:name,sessionId,analyzeOnly:!demo}));navigate(demo?'preview':'rules');$('status').textContent='预览已准备好,请检查后确认。'}catch(e){$('status').textContent=e.message;$('wizard-message').textContent=e.message}finally{controls(false)}}
|
|
287
289
|
document.querySelectorAll('[data-step]').forEach(b=>b.onclick=()=>navigate(b.dataset.step));
|
|
288
290
|
$('file').onchange=async()=>{const input=$('file'),f=input.files[0];if(!f||busy)return;input.disabled=true;controls(true);$('status').textContent='正在自动解析表格…';try{await preview(await f.arrayBuffer(),f.name)}catch(e){$('status').textContent=e.message}finally{input.disabled=false;input.value='';controls(false)}};
|
|
@@ -312,7 +314,7 @@ $('draft-cancel').onclick=()=>$('draft-conflict').close();
|
|
|
312
314
|
for(const mode of ['append','replace'])$('draft-'+mode).onclick=()=>{$('draft-conflict').close();sendDraft(mode)};
|
|
313
315
|
$('mapping-search').oninput=()=>{const query=$('mapping-search').value.trim().toLowerCase();$('mapping').querySelectorAll('.ff-mapping-row').forEach(row=>row.hidden=!row.dataset.sourceLabel.toLowerCase().includes(query))};
|
|
314
316
|
$('result-search').oninput=filterResults;$('changes').onchange=filterResults;
|
|
315
|
-
window.addEventListener('message',e=>{if(e.origin!==location.origin||e.source!==parent)return;if(e.data?.type==='ff-theme'&&['light','dark'].includes(e.data.theme))document.body.dataset.ffTheme=e.data.theme;if(e.data?.type==='ff-draft-conflict'){expectedDraft=e.data.draft;if(!$('draft-conflict').open)$('draft-conflict').showModal()}if(e.data?.type==='ff-draft-result'){$('status').textContent=e.data.ok?'已回填,请在对话框修改或发送。':'回填失败,任务已保留。';if(e.data.ok)closeWizard(true)}if(e.data?.type==='ff-navigate'){if(!current&&location.hash)pendingNavigation=e.data.step;if(e.data.step==='history')$('history-tab').click();else navigate(e.data.step)}});
|
|
317
|
+
window.addEventListener('message',e=>{if(e.origin!==location.origin||e.source!==parent)return;if(e.data?.type==='ff-theme'&&['light','dark'].includes(e.data.theme))document.body.dataset.ffTheme=e.data.theme;if(e.data?.type==='ff-draft-conflict'){expectedDraft=e.data.draft;if(!$('draft-conflict').open)$('draft-conflict').showModal()}if(e.data?.type==='ff-draft-result'){$('status').textContent=e.data.ok?'已回填,请在对话框修改或发送。':'回填失败,任务已保留。';if(e.data.ok){closeWizard(true);navigate('identity');$('status').textContent='指令已回填,发送后将在此显示查询进度。'}}if(e.data?.type==='ff-navigate'){if(!current&&location.hash)pendingNavigation=e.data.step;if(e.data.step==='history')$('history-tab').click();else navigate(e.data.step)}});
|
|
316
318
|
api('/health').then(s=>{$('connection').textContent=s.qccAvailable?'已发现企查查工商工具,可在对话中执行。':'尚未发现企查查工商工具;请先连接 MCP。合成模板仍可体验。'}).catch(()=>{});
|
|
317
319
|
$('preview-continue').onclick=async()=>{if(busy||!current)return;controls(true);try{const ids=[...$('changes').querySelectorAll('input:checked')].map(x=>x.value);if(!current.confirmed&&JSON.stringify([...ids].sort())!==JSON.stringify([...(current.selectedIds||[])].sort()))render(await api('/select',{id:current.id,selectedIds:ids}));navigate('download');$('confirm').scrollIntoView({block:'center'});$('confirm').focus();$('status').textContent=current.confirmed?'副本已生成,请点击下载。':'请确认填写结果,点击蓝色按钮生成新副本。'}catch(e){$('status').textContent=e.message}finally{controls(false)}};
|
|
318
320
|
$('mapping-continue').onclick=()=>{if(busy||!current)return;navigate('identity');$('wizard-open').focus()};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-form-fill-agent",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.20",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "AI form filling and spreadsheet autofill for XLSX in DeepSeek Harness, using authorized Qichacha MCP facts with cell previews, user confirmation and export to a new copy.",
|
|
6
6
|
"repository": {
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
35
|
"form-fill-core": "0.2.10",
|
|
36
|
-
"qcc-form-fill-provider": "0.2.
|
|
36
|
+
"qcc-form-fill-provider": "0.2.2"
|
|
37
37
|
},
|
|
38
38
|
"dsh": {
|
|
39
39
|
"client": {
|