aitable-workflow-cli 0.1.15 → 0.1.16-beta.1786022310508
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/package.json +3 -3
- package/templates/support-qa/lib/__tests__/declarative-matcher.test.ts +240 -0
- package/templates/support-qa/lib/__tests__/dingtalk-group-membership.test.ts +127 -0
- package/templates/support-qa/lib/__tests__/memory-events.test.ts +90 -0
- package/templates/support-qa/lib/action-dispatch.ts +1 -1
- package/templates/support-qa/lib/declarative-matcher.ts +398 -0
- package/templates/support-qa/lib/dingtalk-group-membership.ts +151 -0
- package/templates/support-qa/lib/guards.ts +18 -0
- package/templates/support-qa/lib/memory-events.ts +60 -41
- package/templates/support-qa/lib/preflight.ts +294 -0
- package/templates/support-qa/package.json +2 -4
- package/templates/support-qa/profiles/aitable/profile/fastpath/known-answers.yml +1 -1
- package/templates/support-qa/profiles/aitable/profile/troubleshoot/classifiers.yml +1 -1
- package/templates/support-qa/workflows/config-sync/recipes/config_sync.recipe.ts +10 -8
- package/templates/support-qa/workflows/daily-review/recipes/daily_review.recipe.ts +1 -1
- package/templates/support-qa/workflows/group-qa/recipes/answer.recipe.ts +2 -7
- package/templates/support-qa/workflows/group-qa/recipes/conversation_handler.recipe.ts +3 -3
- package/templates/support-qa/workflows/group-qa/recipes/fastpath.recipe.ts +5 -11
- package/templates/support-qa/workflows/group-qa/recipes/on-action.recipe.ts +4 -2
- package/templates/support-qa/workflows/group-qa/recipes/reply-to-group.recipe.ts +13 -7
- package/templates/support-qa/workflows/group-qa/recipes/troubleshoot.recipe.ts +12 -18
- package/templates/support-qa/workspaces/support/AGENTS.md +1 -1
- package/templates/aitable-handoff/.env.example +0 -17
- package/templates/aitable-handoff/aitable-workflow.config.yml +0 -64
- package/templates/aitable-handoff/coding-agents.config.json +0 -17
- package/templates/aitable-handoff/npmrc +0 -1
- package/templates/aitable-handoff/package.json +0 -16
- package/templates/aitable-handoff/roles/config-syncer.role.yml +0 -4
- package/templates/aitable-handoff/roles/daily-review.role.yml +0 -4
- package/templates/aitable-handoff/roles/faq-support.role.yml +0 -9
- package/templates/aitable-handoff/roles/faq-troubleshooter.role.yml +0 -17
- package/templates/aitable-handoff/roles/kb-editor.role.yml +0 -19
- package/templates/aitable-handoff/wiki/faq-support/01-/345/277/253/351/200/237/345/205/245/351/227/250/6/350/212/202/350/257/276/345/270/246/344/275/240/345/277/253/351/200/237/344/270/212/346/211/213AI/350/241/250/346/240/274.md +0 -43
- package/templates/aitable-handoff/wiki/faq-support/01-/345/277/253/351/200/237/345/205/245/351/227/250/AI/350/241/250/346/240/274/350/241/214/346/225/260/350/257/264/346/230/216.md +0 -85
- package/templates/aitable-handoff/wiki/faq-support/01-/345/277/253/351/200/237/345/205/245/351/227/250//344/275/277/347/224/250/345/277/253/346/215/267/351/224/256.md +0 -34
- package/templates/aitable-handoff/wiki/faq-support/01-/345/277/253/351/200/237/345/205/245/351/227/250//345/260/206Excel/346/226/207/344/273/266/345/257/274/345/205/245AI/350/241/250/346/240/274.md +0 -48
- package/templates/aitable-handoff/wiki/faq-support/01-/345/277/253/351/200/237/345/205/245/351/227/250//345/270/270/350/247/201/351/227/256/351/242/230.md +0 -88
- package/templates/aitable-handoff/wiki/faq-support/01-/345/277/253/351/200/237/345/205/245/351/227/250//346/250/241/346/235/277/344/270/255/345/277/203.md +0 -59
- package/templates/aitable-handoff/wiki/faq-support/01-/345/277/253/351/200/237/345/205/245/351/227/250//351/222/211/351/222/211AI/350/241/250/346/240/274/345/270/270/350/247/201/344/270/212/351/231/220.md +0 -181
- package/templates/aitable-handoff/wiki/faq-support/01-/345/277/253/351/200/237/345/205/245/351/227/250//351/222/211/351/222/211AI/350/241/250/346/240/274/345/277/253/351/200/237/344/270/212/346/211/213.md +0 -177
- package/templates/aitable-handoff/wiki/faq-support/02-/345/237/272/347/241/200/346/223/215/344/275/234/AI/350/241/250/346/240/274/347/232/204/345/257/274/345/207/272.md +0 -27
- package/templates/aitable-handoff/wiki/faq-support/02-/345/237/272/347/241/200/346/223/215/344/275/234//344/275/277/347/224/250/345/210/206/347/273/204.md +0 -67
- package/templates/aitable-handoff/wiki/faq-support/02-/345/237/272/347/241/200/346/223/215/344/275/234//344/275/277/347/224/250/345/241/253/350/211/262.md +0 -99
- package/templates/aitable-handoff/wiki/faq-support/02-/345/237/272/347/241/200/346/223/215/344/275/234//344/275/277/347/224/250/346/216/222/345/272/217.md +0 -66
- package/templates/aitable-handoff/wiki/faq-support/02-/345/237/272/347/241/200/346/223/215/344/275/234//344/275/277/347/224/250/347/255/233/351/200/211/345/222/214/347/255/233/351/200/211/346/235/241/344/273/266/347/273/204.md +0 -104
- package/templates/aitable-handoff/wiki/faq-support/02-/345/237/272/347/241/200/346/223/215/344/275/234//346/237/245/347/234/213/345/216/206/345/217/262/350/256/260/345/275/225.md +0 -79
- package/templates/aitable-handoff/wiki/faq-support/02-/345/237/272/347/241/200/346/223/215/344/275/234//347/224/250AI/350/241/250/346/240/274/344/270/200/350/241/250/344/270/200/345/212/251/347/220/206/345/217/221/346/266/210/346/201/257.md +0 -94
- package/templates/aitable-handoff/wiki/faq-support/02-/345/237/272/347/241/200/346/223/215/344/275/234//350/207/252/345/256/232/344/271/211/350/256/260/345/275/225/345/220/215/347/247/260.md +0 -35
- package/templates/aitable-handoff/wiki/faq-support/02-/345/237/272/347/241/200/346/223/215/344/275/234//350/207/252/345/256/232/344/271/211/350/256/260/345/275/225/350/257/246/346/203/205/351/241/265/345/222/214/345/241/253/345/206/231/351/241/265.md +0 -141
- package/templates/aitable-handoff/wiki/faq-support/02-/345/237/272/347/241/200/346/223/215/344/275/234//350/260/203/346/225/264/345/210/227/345/256/275.md +0 -42
- package/templates/aitable-handoff/wiki/faq-support/02-/345/237/272/347/241/200/346/223/215/344/275/234//350/260/203/346/225/264/350/241/214/351/253/230.md +0 -40
- package/templates/aitable-handoff/wiki/faq-support/03-/344/275/277/347/224/250/345/255/227/346/256/265//344/270/272/350/241/250/346/240/274/346/267/273/345/212/240/345/255/227/346/256/265.md +0 -188
- package/templates/aitable-handoff/wiki/faq-support/03-/344/275/277/347/224/250/345/255/227/346/256/265//345/215/225/351/200/211/345/244/232/351/200/211/345/255/227/346/256/265/345/220/214/346/255/245/345/205/266/344/273/226/350/241/250/351/200/211/351/241/271.md +0 -142
- package/templates/aitable-handoff/wiki/faq-support/03-/344/275/277/347/224/250/345/255/227/346/256/265//345/255/227/346/256/265/347/256/241/347/220/206.md +0 -44
- package/templates/aitable-handoff/wiki/faq-support/03-/344/275/277/347/224/250/345/255/227/346/256/265//345/255/227/346/256/265/347/261/273/345/236/213/345/210/227/350/241/250.md +0 -95
- package/templates/aitable-handoff/wiki/faq-support/03-/344/275/277/347/224/250/345/255/227/346/256/265//345/255/227/346/256/265/347/274/226/347/273/204.md +0 -138
- package/templates/aitable-handoff/wiki/faq-support/04-/344/275/277/347/224/250/350/241/250/345/215/225//350/241/250/345/215/225/345/221/250/346/234/237/345/210/206/350/241/250.md +0 -42
- package/templates/aitable-handoff/wiki/faq-support/04-/344/275/277/347/224/250/350/241/250/345/215/225//350/241/250/345/215/225/345/237/272/347/241/200/346/223/215/344/275/234.md +0 -344
- package/templates/aitable-handoff/wiki/faq-support/04-/344/275/277/347/224/250/350/241/250/345/215/225//350/241/250/345/215/225/346/230/216/347/273/206/350/241/250-/344/270/200/346/254/241/345/241/253/345/206/231/345/244/232/346/235/241/346/217/220/344/272/244.md +0 -174
- package/templates/aitable-handoff/wiki/faq-support/04-/344/275/277/347/224/250/350/241/250/345/215/225//350/241/250/345/215/225/351/242/204/345/241/253/351/273/230/350/256/244/345/200/274.md +0 -97
- package/templates/aitable-handoff/wiki/faq-support/05-/345/205/254/345/274/217/345/207/275/346/225/260//344/275/277/347/224/250AI/347/224/237/346/210/220/345/205/254/345/274/217.md +0 -26
- package/templates/aitable-handoff/wiki/faq-support/05-/345/205/254/345/274/217/345/207/275/346/225/260//344/275/277/347/224/250/345/205/254/345/274/217/345/207/275/346/225/260/345/270/270/350/247/201/351/227/256/351/242/230.md +0 -179
- package/templates/aitable-handoff/wiki/faq-support/05-/345/205/254/345/274/217/345/207/275/346/225/260//344/275/277/347/224/250/345/205/254/345/274/217/345/255/227/346/256/265.md +0 -81
- package/templates/aitable-handoff/wiki/faq-support/05-/345/205/254/345/274/217/345/207/275/346/225/260//344/275/277/347/224/250/345/207/275/346/225/260.md +0 -21
- package/templates/aitable-handoff/wiki/faq-support/05-/345/205/254/345/274/217/345/207/275/346/225/260//345/205/254/345/274/217/345/207/275/346/225/260/345/244/247/345/205/250.md +0 -433
- package/templates/aitable-handoff/wiki/faq-support/05-/345/205/254/345/274/217/345/207/275/346/225/260//345/205/254/345/274/217/346/224/257/346/214/201/346/230/276/347/244/272/346/240/274/345/274/217.md +0 -126
- package/templates/aitable-handoff/wiki/faq-support/05-/345/205/254/345/274/217/345/207/275/346/225/260//345/205/254/345/274/217/351/224/231/350/257/257/344/273/243/347/240/201/345/210/227/350/241/250.md +0 -30
- package/templates/aitable-handoff/wiki/faq-support/05-/345/205/254/345/274/217/345/207/275/346/225/260//345/207/275/346/225/260/345/256/236/350/267/265.md +0 -13
- package/templates/aitable-handoff/wiki/faq-support/06-/346/225/260/346/215/256/350/277/236/346/216/245/344/270/255/345/277/203//346/225/260/346/215/256/350/277/236/346/216/245/344/270/255/345/277/203.md +0 -169
- package/templates/aitable-handoff/wiki/faq-support/06-/346/225/260/346/215/256/350/277/236/346/216/245/344/270/255/345/277/203//347/273/204/347/273/207/345/206/205/345/205/261/344/272/253/346/225/260/346/215/256/346/272/220.md +0 -106
- package/templates/aitable-handoff/wiki/faq-support/06-/346/225/260/346/215/256/350/277/236/346/216/245/344/270/255/345/277/203//350/267/250AI/350/241/250/346/240/274/346/225/260/346/215/256/345/220/214/346/255/245.md +0 -176
- package/templates/aitable-handoff/wiki/faq-support/06-/346/225/260/346/215/256/350/277/236/346/216/245/344/270/255/345/277/203//351/222/211/351/222/211AI/345/220/254/350/256/260/346/225/260/346/215/256/345/220/214/346/255/245.md +0 -100
- package/templates/aitable-handoff/wiki/faq-support/06-/346/225/260/346/215/256/350/277/236/346/216/245/344/270/255/345/277/203//351/222/211/351/222/211OA/345/256/241/346/211/271/346/225/260/346/215/256/345/220/214/346/255/245.md +0 -194
- package/templates/aitable-handoff/wiki/faq-support/06-/346/225/260/346/215/256/350/277/236/346/216/245/344/270/255/345/277/203//351/222/211/351/222/211/345/276/205/345/212/236/346/225/260/346/215/256/345/220/214/346/255/245.md +0 -87
- package/templates/aitable-handoff/wiki/faq-support/06-/346/225/260/346/215/256/350/277/236/346/216/245/344/270/255/345/277/203//351/222/211/351/222/211/346/227/245/347/250/213/346/225/260/346/215/256/345/220/214/346/255/245.md +0 -92
- package/templates/aitable-handoff/wiki/faq-support/06-/346/225/260/346/215/256/350/277/236/346/216/245/344/270/255/345/277/203//351/222/211/351/222/211/350/200/203/345/213/244/346/211/223/345/215/241/346/225/260/346/215/256/345/220/214/346/255/245.md +0 -129
- package/templates/aitable-handoff/wiki/faq-support/06-/346/225/260/346/215/256/350/277/236/346/216/245/344/270/255/345/277/203//351/222/211/351/222/211/350/241/250/346/240/274/346/225/260/346/215/256/345/220/214/346/255/245.md +0 -229
- package/templates/aitable-handoff/wiki/faq-support/06-/346/225/260/346/215/256/350/277/236/346/216/245/344/270/255/345/277/203//351/222/211/351/222/211/351/200/232/350/256/257/345/275/225/346/225/260/346/215/256/345/220/214/346/255/245.md +0 -120
- package/templates/aitable-handoff/wiki/faq-support/07-/344/275/277/347/224/250/350/247/206/345/233/276//344/275/277/347/224/250AI/350/241/250/346/240/274/350/247/206/345/233/276.md +0 -219
- package/templates/aitable-handoff/wiki/faq-support/07-/344/275/277/347/224/250/350/247/206/345/233/276//345/210/206/344/272/253/350/247/206/345/233/276.md +0 -71
- package/templates/aitable-handoff/wiki/faq-support/07-/344/275/277/347/224/250/350/247/206/345/233/276//346/225/260/346/215/256/350/241/250/345/222/214/350/247/206/345/233/276/347/232/204/345/205/263/347/263/273.md +0 -48
- package/templates/aitable-handoff/wiki/faq-support/07-/344/275/277/347/224/250/350/247/206/345/233/276//346/227/245/345/216/206/350/247/206/345/233/276.md +0 -89
- package/templates/aitable-handoff/wiki/faq-support/07-/344/275/277/347/224/250/350/247/206/345/233/276//346/237/245/350/257/242/351/241/265/351/235/242.md +0 -116
- package/templates/aitable-handoff/wiki/faq-support/07-/344/275/277/347/224/250/350/247/206/345/233/276//347/224/230/347/211/271/345/233/276.md +0 -135
- package/templates/aitable-handoff/wiki/faq-support/07-/344/275/277/347/224/250/350/247/206/345/233/276//347/224/273/345/206/214/350/247/206/345/233/276.md +0 -28
- package/templates/aitable-handoff/wiki/faq-support/07-/344/275/277/347/224/250/350/247/206/345/233/276//347/234/213/346/235/277/350/247/206/345/233/276.md +0 -35
- package/templates/aitable-handoff/wiki/faq-support/07-/344/275/277/347/224/250/350/247/206/345/233/276//350/241/250/346/240/274/350/247/206/345/233/276.md +0 -116
- package/templates/aitable-handoff/wiki/faq-support/07-/344/275/277/347/224/250/350/247/206/345/233/276//351/200/217/350/247/206/350/241/250/350/247/206/345/233/276.md +0 -123
- package/templates/aitable-handoff/wiki/faq-support/08-/344/275/277/347/224/250/344/273/252/350/241/250/347/233/230/TOP_N/345/210/206/346/236/220.md +0 -78
- package/templates/aitable-handoff/wiki/faq-support/08-/344/275/277/347/224/250/344/273/252/350/241/250/347/233/230//344/273/252/350/241/250/347/233/230/344/270/255/346/267/273/345/212/240/345/244/232/344/270/252/346/225/260/346/215/256/346/272/220.md +0 -129
- package/templates/aitable-handoff/wiki/faq-support/08-/344/275/277/347/224/250/344/273/252/350/241/250/347/233/230//344/273/252/350/241/250/347/233/230/345/215/225/345/233/276/350/241/250/345/222/214AI/350/247/243/350/257/273/345/206/205/345/256/271/345/210/206/344/272/253.md +0 -104
- package/templates/aitable-handoff/wiki/faq-support/08-/344/275/277/347/224/250/344/273/252/350/241/250/347/233/230//344/273/252/350/241/250/347/233/230/345/270/270/350/247/201/351/227/256/351/242/230.md +0 -31
- package/templates/aitable-handoff/wiki/faq-support/08-/344/275/277/347/224/250/344/273/252/350/241/250/347/233/230//344/273/252/350/241/250/347/233/230/346/231/272/350/203/275/346/200/273/347/273/223/345/210/206/346/236/220.md +0 -57
- package/templates/aitable-handoff/wiki/faq-support/08-/344/275/277/347/224/250/344/273/252/350/241/250/347/233/230//344/273/252/350/241/250/347/233/230/347/273/204/344/273/266.md +0 -47
- package/templates/aitable-handoff/wiki/faq-support/08-/344/275/277/347/224/250/344/273/252/350/241/250/347/233/230//344/275/277/347/224/250AI/350/241/250/346/240/274/344/273/252/350/241/250/347/233/230.md +0 -226
- package/templates/aitable-handoff/wiki/faq-support/08-/344/275/277/347/224/250/344/273/252/350/241/250/347/233/230//344/275/277/347/224/250/350/207/252/345/212/250/345/214/226/346/265/201/347/250/213/345/217/221/351/200/201/344/273/252/350/241/250/347/233/230.md +0 -49
- package/templates/aitable-handoff/wiki/faq-support/08-/344/275/277/347/224/250/344/273/252/350/241/250/347/233/230//345/210/206/344/272/253/344/273/252/350/241/250/347/233/230.md +0 -74
- package/templates/aitable-handoff/wiki/faq-support/08-/344/275/277/347/224/250/344/273/252/350/241/250/347/233/230//345/234/250/344/273/252/350/241/250/347/233/230/344/270/255/347/255/233/351/200/211/346/225/260/346/215/256.md +0 -65
- package/templates/aitable-handoff/wiki/faq-support/08-/344/275/277/347/224/250/344/273/252/350/241/250/347/233/230//350/207/252/345/256/232/344/271/211/344/273/252/350/241/250/347/233/230/344/270/255/345/277/203.md +0 -93
- package/templates/aitable-handoff/wiki/faq-support/08-/344/275/277/347/224/250/344/273/252/350/241/250/347/233/230//350/267/237/351/232/217/350/256/277/351/227/256/350/200/205/346/235/203/351/231/220/347/273/237/350/256/241.md +0 -48
- package/templates/aitable-handoff/wiki/faq-support/09-/345/272/224/347/224/250/346/250/241/345/274/217//345/205/250/346/226/260/345/272/224/347/224/250/346/250/241/345/274/217.md +0 -155
- package/templates/aitable-handoff/wiki/faq-support/09-/345/272/224/347/224/250/346/250/241/345/274/217//345/210/227/350/241/250/347/273/204/344/273/266.md +0 -228
- package/templates/aitable-handoff/wiki/faq-support/09-/345/272/224/347/224/250/346/250/241/345/274/217//345/233/276/347/211/207.md +0 -93
- package/templates/aitable-handoff/wiki/faq-support/09-/345/272/224/347/224/250/346/250/241/345/274/217//346/214/211/351/222/256.md +0 -86
- package/templates/aitable-handoff/wiki/faq-support/09-/345/272/224/347/224/250/346/250/241/345/274/217//346/240/207/347/255/276/351/241/265.md +0 -97
- package/templates/aitable-handoff/wiki/faq-support/09-/345/272/224/347/224/250/346/250/241/345/274/217//350/247/206/345/233/276/347/273/204/344/273/266.md +0 -125
- package/templates/aitable-handoff/wiki/faq-support/09-/345/272/224/347/224/250/346/250/241/345/274/217//350/277/207/346/273/244/345/231/250.md +0 -110
- package/templates/aitable-handoff/wiki/faq-support/09-/345/272/224/347/224/250/346/250/241/345/274/217//351/200/217/350/247/206/350/241/250/347/273/204/344/273/266.md +0 -142
- package/templates/aitable-handoff/wiki/faq-support/10-/350/207/252/345/212/250/345/214/226/345/267/245/344/275/234/346/265/201/Webhook/345/217/202/346/225/260/347/232/204/350/257/246/347/273/206/350/257/264/346/230/216.md +0 -76
- package/templates/aitable-handoff/wiki/faq-support/10-/350/207/252/345/212/250/345/214/226/345/267/245/344/275/234/346/265/201//344/270/200/350/241/250/344/270/200/345/217/267Agent/346/224/257/346/214/201/347/276/244/346/224/266/351/233/206.md +0 -150
- package/templates/aitable-handoff/wiki/faq-support/10-/350/207/252/345/212/250/345/214/226/345/267/245/344/275/234/346/265/201//344/275/277/347/224/250webhook/350/247/246/345/217/221/350/207/252/345/212/250/345/214/226.md +0 -163
- package/templates/aitable-handoff/wiki/faq-support/10-/350/207/252/345/212/250/345/214/226/345/267/245/344/275/234/346/265/201//344/275/277/347/224/250/344/270/215/345/220/214/350/272/253/344/273/275/345/217/221/351/200/201/351/222/211/351/222/211/346/266/210/346/201/257.md +0 -60
- package/templates/aitable-handoff/wiki/faq-support/10-/350/207/252/345/212/250/345/214/226/345/267/245/344/275/234/346/265/201//344/275/277/347/224/250/350/207/252/345/212/250/345/214/226/345/267/245/344/275/234/346/265/201.md +0 -219
- package/templates/aitable-handoff/wiki/faq-support/10-/350/207/252/345/212/250/345/214/226/345/267/245/344/275/234/346/265/201//344/275/277/347/224/250/350/207/252/345/212/250/345/214/226/345/276/252/347/216/257/350/212/202/347/202/271.md +0 -63
- package/templates/aitable-handoff/wiki/faq-support/10-/350/207/252/345/212/250/345/214/226/345/267/245/344/275/234/346/265/201//345/234/250/346/265/201/347/250/213/344/270/255/344/275/277/347/224/250AI/351/227/256/347/255/224.md +0 -69
- package/templates/aitable-handoff/wiki/faq-support/10-/350/207/252/345/212/250/345/214/226/345/267/245/344/275/234/346/265/201//345/234/250/346/266/210/346/201/257/345/215/241/347/211/207/344/270/212/346/267/273/345/212/240/346/214/211/351/222/256.md +0 -93
- package/templates/aitable-handoff/wiki/faq-support/10-/350/207/252/345/212/250/345/214/226/345/267/245/344/275/234/346/265/201//346/265/201/347/250/213/345/217/230/351/207/217/350/247/243/351/207/212/344/270/216/345/270/270/350/247/201/346/212/245/351/224/231.md +0 -158
- package/templates/aitable-handoff/wiki/faq-support/10-/350/207/252/345/212/250/345/214/226/345/267/245/344/275/234/346/265/201//346/265/201/347/250/213/350/247/246/345/217/221/346/235/241/344/273/266/344/270/216/346/211/247/350/241/214/345/212/250/344/275/234/344/270/200/350/247/210.md +0 -310
- package/templates/aitable-handoff/wiki/faq-support/10-/350/207/252/345/212/250/345/214/226/345/267/245/344/275/234/346/265/201//347/224/250AI/350/241/250/346/240/274/344/270/200/350/241/250/344/270/200/345/212/251/347/220/206/345/217/221/346/266/210/346/201/257-/350/207/252/345/212/250/345/214/226.md +0 -129
- package/templates/aitable-handoff/wiki/faq-support/10-/350/207/252/345/212/250/345/214/226/345/267/245/344/275/234/346/265/201//347/224/250/346/237/245/346/211/276/350/256/260/345/275/225/345/217/221/351/200/201/347/273/204/345/220/210/345/255/227/346/256/265/351/200/232/347/237/245.md +0 -66
- package/templates/aitable-handoff/wiki/faq-support/10-/350/207/252/345/212/250/345/214/226/345/267/245/344/275/234/346/265/201//350/207/252/345/212/250/345/214/226/345/210/233/345/273/272/351/222/211/351/222/211/345/276/205/345/212/236/346/210/226/346/227/245/347/250/213.md +0 -84
- package/templates/aitable-handoff/wiki/faq-support/10-/350/207/252/345/212/250/345/214/226/345/267/245/344/275/234/346/265/201//350/207/252/345/212/250/345/214/226/345/217/221/350/265/267AI/347/224/265/350/257/235/345/244/226/345/221/274.md +0 -322
- package/templates/aitable-handoff/wiki/faq-support/10-/350/207/252/345/212/250/345/214/226/345/267/245/344/275/234/346/265/201//350/207/252/345/212/250/345/214/226/345/217/221/350/265/267OA/345/256/241/346/211/271.md +0 -93
- package/templates/aitable-handoff/wiki/faq-support/10-/350/207/252/345/212/250/345/214/226/345/267/245/344/275/234/346/265/201//350/207/252/345/212/250/345/214/226/345/217/221/351/200/201HTTP/350/257/267/346/261/202.md +0 -168
- package/templates/aitable-handoff/wiki/faq-support/10-/350/207/252/345/212/250/345/214/226/345/267/245/344/275/234/346/265/201//350/207/252/345/212/250/345/214/226/345/270/270/350/247/201/351/227/256/351/242/230.md +0 -83
- package/templates/aitable-handoff/wiki/faq-support/10-/350/207/252/345/212/250/345/214/226/345/267/245/344/275/234/346/265/201//350/207/252/345/212/250/345/214/226/346/211/271/351/207/217/345/217/221/351/202/256/344/273/266.md +0 -79
- package/templates/aitable-handoff/wiki/faq-support/10-/350/207/252/345/212/250/345/214/226/345/267/245/344/275/234/346/265/201//350/207/252/345/212/250/345/214/226/346/224/257/346/214/201/346/217/222/345/205/245/345/223/252/344/272/233/345/217/230/351/207/217/345/206/205/345/256/271.md +0 -80
- package/templates/aitable-handoff/wiki/faq-support/10-/350/207/252/345/212/250/345/214/226/345/267/245/344/275/234/346/265/201//350/207/252/345/212/250/345/214/226/346/233/264/345/244/232/346/211/247/350/241/214/345/212/250/344/275/234/344/275/277/347/224/250/346/214/207/345/215/227.md +0 -21
- package/templates/aitable-handoff/wiki/faq-support/10-/350/207/252/345/212/250/345/214/226/345/267/245/344/275/234/346/265/201//350/260/203/347/224/250/344/270/211/346/226/271/345/267/245/344/275/234/346/265/201/345/272/224/347/224/250.md +0 -161
- package/templates/aitable-handoff/wiki/faq-support/11-AI/350/241/250/346/240/274/345/212/251/347/220/206/AI/350/241/250/346/240/274/344/270/207/350/203/275/350/264/264/344/274/230/345/205/210/344/275/277/347/224/250/347/224/263/350/257/267.md +0 -67
- package/templates/aitable-handoff/wiki/faq-support/11-AI/350/241/250/346/240/274/345/212/251/347/220/206/AI/350/241/250/346/240/274/344/270/207/350/203/275/350/264/264/344/275/277/347/224/250/350/257/264/346/230/216.md +0 -63
- package/templates/aitable-handoff/wiki/faq-support/11-AI/350/241/250/346/240/274/345/212/251/347/220/206/AI/350/241/250/346/240/274/345/212/251/347/220/206.md +0 -107
- package/templates/aitable-handoff/wiki/faq-support/12-/351/253/230/347/272/247/346/235/203/351/231/220//344/275/277/347/224/250AI/350/241/250/346/240/274/351/253/230/347/272/247/346/235/203/351/231/220.md +0 -194
- package/templates/aitable-handoff/wiki/faq-support/12-/351/253/230/347/272/247/346/235/203/351/231/220//350/241/214/345/210/227/346/235/203/351/231/220/350/256/276/347/275/256/345/217/212/351/253/230/347/272/247/346/235/203/351/231/220/345/257/271/350/241/250/345/215/225/345/205/254/345/274/217/347/232/204/345/275/261/345/223/215.md +0 -32
- package/templates/aitable-handoff/wiki/faq-support/12-/351/253/230/347/272/247/346/235/203/351/231/220//351/242/204/350/247/210/351/253/230/347/272/247/346/235/203/351/231/220/347/273/223/346/236/234.md +0 -43
- package/templates/aitable-handoff/wiki/faq-support/12-/351/253/230/347/272/247/346/235/203/351/231/220//351/253/230/347/272/247/346/235/203/351/231/220/345/270/270/350/247/201/351/227/256/351/242/230.md +0 -47
- package/templates/aitable-handoff/wiki/faq-support/12-/351/253/230/347/272/247/346/235/203/351/231/220//351/253/230/347/272/247/346/235/203/351/231/220/347/232/204/351/273/230/350/256/244/350/247/222/350/211/262.md +0 -36
- package/templates/aitable-handoff/wiki/faq-support/13-/346/217/222/344/273/266/344/270/255/345/277/203/AI/350/241/250/346/240/274/344/270/211/346/226/271/346/217/222/344/273/266/344/275/277/347/224/250/346/216/210/346/235/203.md +0 -19
- package/templates/aitable-handoff/wiki/faq-support/13-/346/217/222/344/273/266/344/270/255/345/277/203/AI/350/241/250/346/240/274/346/217/222/344/273/266-/350/204/232/346/234/254/346/217/222/344/273/266.md +0 -42
- package/templates/aitable-handoff/wiki/faq-support/13-/346/217/222/344/273/266/344/270/255/345/277/203/AI/350/241/250/346/240/274/346/217/222/344/273/266-/350/207/252/345/256/232/344/271/211/346/217/222/344/273/266.md +0 -51
- package/templates/aitable-handoff/wiki/faq-support/13-/346/217/222/344/273/266/344/270/255/345/277/203/AI/350/241/250/346/240/274/346/217/222/344/273/266/344/270/255/345/277/203-/344/275/277/347/224/250/346/214/207/345/215/227.md +0 -97
- package/templates/aitable-handoff/wiki/faq-support/14-/347/256/241/347/220/206/345/220/216/345/217/260//344/275/277/347/224/250/346/225/260/346/215/256/350/257/264/346/230/216.md +0 -82
- package/templates/aitable-handoff/wiki/faq-support/14-/347/256/241/347/220/206/345/220/216/345/217/260//346/235/203/347/233/212/346/225/260/346/215/256/350/257/264/346/230/216.md +0 -111
- package/templates/aitable-handoff/wiki/faq-support/15-/345/234/272/346/231/257/345/256/236/350/267/265/AI/350/241/250/346/240/274/350/257/257/345/210/240/346/201/242/345/244/215/346/214/207/345/215/227.md +0 -37
- package/templates/aitable-handoff/wiki/faq-support/15-/345/234/272/346/231/257/345/256/236/350/267/265//345/234/250/350/241/250/346/240/274/344/270/255/346/240/207/350/256/260/351/207/215/345/244/215/345/206/205/345/256/271.md +0 -43
- package/templates/aitable-handoff/wiki/faq-support/15-/345/234/272/346/231/257/345/256/236/350/267/265//347/233/264/346/222/255/345/205/254/345/274/200/347/263/273/345/210/227/350/257/276.md +0 -21
- package/templates/aitable-handoff/wiki/faq-support/16-/344/273/230/350/264/271/346/235/203/347/233/212//351/222/211/351/222/211AI/350/241/250/346/240/274/344/273/230/350/264/271/346/235/203/347/233/212.md +0 -144
- package/templates/aitable-handoff/wiki/faq-support/16-/344/273/230/350/264/271/346/235/203/347/233/212//351/222/211/351/222/211AI/350/241/250/346/240/274/346/220/255/345/273/272/346/234/215/345/212/241.md +0 -95
- package/templates/aitable-handoff/wiki/faq-support/17-/345/205/254/345/221/212/AI/350/241/250/346/240/274-/346/216/222/347/211/210/346/211/223/345/215/260/345/215/207/347/272/247/350/257/264/346/230/216.md +0 -40
- package/templates/aitable-handoff/wiki/faq-support/17-/345/205/254/345/221/212/AI/350/241/250/346/240/274-/347/211/210/346/234/254/345/215/207/347/272/247/351/200/232/347/237/245.md +0 -21
- package/templates/aitable-handoff/wiki/faq-support/17-/345/205/254/345/221/212//350/267/250AI/350/241/250/346/240/274/346/225/260/346/215/256/345/220/214/346/255/245/350/260/203/346/225/264/350/257/264/346/230/216.md +0 -55
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI /350/241/250/346/240/274/346/217/222/344/273/266 - /344/274/201/344/270/232/345/206/205/346/217/222/344/273/266/345/217/221/345/270/203/346/214/207/345/215/227.md" +0 -159
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274 AI /345/255/227/346/256/265 /345/274/200/345/217/221/346/214/207/345/215/227/AI/350/241/250/346/240/274 AI /345/255/227/346/256/265/345/274/200/345/217/221/346/214/207/345/215/227/357/274/210FaaS/347/211/210/357/274/211.md" +0 -1362
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274 AI /345/255/227/346/256/265 /345/274/200/345/217/221/346/214/207/345/215/227/AI/350/241/250/346/240/274 AI /345/255/227/346/256/265/345/274/200/345/217/221/346/214/207/345/215/227/357/274/210/345/205/254/345/274/217/347/211/210/357/274/211.md" +0 -556
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274 AI /345/255/227/346/256/265 /345/274/200/345/217/221/346/214/207/345/215/227.md" +0 -15
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/345/255/227/346/256/265/346/250/241/347/211/210 /344/275/277/347/224/250/346/214/207/345/215/227/AI /350/241/250/346/240/274 AI /345/255/227/346/256/265/345/270/270/350/247/201/346/212/245/351/224/231/350/257/264/346/230/216.md" +0 -649
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/345/255/227/346/256/265/346/250/241/347/211/210 /344/275/277/347/224/250/346/214/207/345/215/227/Dify/346/231/272/350/203/275/344/275/223.md" +0 -55
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/345/255/227/346/256/265/346/250/241/347/211/210 /344/275/277/347/224/250/346/214/207/345/215/227/GPTPro /345/255/227/346/256/265/346/215/267/345/276/204 /345/257/206/351/222/245/350/216/267/345/217/226/346/214/207/345/215/227.md" +0 -23
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/345/255/227/346/256/265/346/250/241/347/211/210 /344/275/277/347/224/250/346/214/207/345/215/227/OpenClaw /345/260/217/351/276/231/350/231/276/345/212/251/346/211/213/351/205/215/347/275/256/346/225/231/347/250/213.md" +0 -27
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/345/255/227/346/256/265/346/250/241/347/211/210 /344/275/277/347/224/250/346/214/207/345/215/227//345/233/275/345/206/205/345/244/226/345/277/253/351/200/222/347/211/251/346/265/201/344/277/241/346/201/257/346/237/245/350/257/242/344/275/277/347/224/250/346/214/207/345/215/227.md" +0 -907
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/345/255/227/346/256/265/346/250/241/347/211/210 /344/275/277/347/224/250/346/214/207/345/215/227//345/277/253/351/200/222/347/211/251/346/265/201/346/237/245/350/257/242/345/212/251/346/211/213/344/275/277/347/224/250/346/214/207/345/215/227.md" +0 -1
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/345/257/271/350/261/241/346/250/241/345/236/213API/345/217/202/350/200/203/346/226/207/346/241/243/AI/350/241/250/346/240/274JSAPI /347/261/273/345/236/213/346/217/217/350/277/260.xlsx +0 -0
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/345/257/271/350/261/241/346/250/241/345/236/213API/345/217/202/350/200/203/346/226/207/346/241/243/Base /346/250/241/345/235/227.md" +0 -391
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/345/257/271/350/261/241/346/250/241/345/236/213API/345/217/202/350/200/203/346/226/207/346/241/243/Field /346/250/241/345/235/227/AttachmentField /351/231/204/344/273/266/345/255/227/346/256/265.md" +0 -200
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/345/257/271/350/261/241/346/250/241/345/236/213API/345/217/202/350/200/203/346/226/207/346/241/243/Field /346/250/241/345/235/227/AutoNumberField /350/207/252/345/212/250/347/274/226/345/217/267/345/255/227/346/256/265.md" +0 -75
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/345/257/271/350/261/241/346/250/241/345/236/213API/345/217/202/350/200/203/346/226/207/346/241/243/Field /346/250/241/345/235/227/BarcodeField /346/235/241/347/240/201/345/255/227/346/256/265.md" +0 -95
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/345/257/271/350/261/241/346/250/241/345/236/213API/345/217/202/350/200/203/346/226/207/346/241/243/Field /346/250/241/345/235/227/BidirectionalLinkField /345/217/214/345/220/221/345/205/263/350/201/224/345/255/227/346/256/265.md" +0 -294
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/345/257/271/350/261/241/346/250/241/345/236/213API/345/217/202/350/200/203/346/226/207/346/241/243/Field /346/250/241/345/235/227/CheckboxField /345/244/215/351/200/211/346/241/206/345/255/227/346/256/265.md" +0 -95
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/345/257/271/350/261/241/346/250/241/345/236/213API/345/217/202/350/200/203/346/226/207/346/241/243/Field /346/250/241/345/235/227/CreatedTimeField /345/210/233/345/273/272/346/227/266/351/227/264/345/255/227/346/256/265.md" +0 -134
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/345/257/271/350/261/241/346/250/241/345/236/213API/345/217/202/350/200/203/346/226/207/346/241/243/Field /346/250/241/345/235/227/CurrencyField /350/264/247/345/270/201/345/255/227/346/256/265.md" +0 -260
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/345/257/271/350/261/241/346/250/241/345/236/213API/345/217/202/350/200/203/346/226/207/346/241/243/Field /346/250/241/345/235/227/DateField /346/227/245/346/234/237/345/255/227/346/256/265.md" +0 -183
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/345/257/271/350/261/241/346/250/241/345/236/213API/345/217/202/350/200/203/346/226/207/346/241/243/Field /346/250/241/345/235/227/DepartmentField /351/203/250/351/227/250/345/255/227/346/256/265.md" +0 -111
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/345/257/271/350/261/241/346/250/241/345/236/213API/345/217/202/350/200/203/346/226/207/346/241/243/Field /346/250/241/345/235/227/EmailField /351/202/256/347/256/261/345/255/227/346/256/265.md" +0 -99
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/345/257/271/350/261/241/346/250/241/345/236/213API/345/217/202/350/200/203/346/226/207/346/241/243/Field /346/250/241/345/235/227/FilterUpField /346/237/245/346/211/276/345/274/225/347/224/250/345/255/227/346/256/265.md" +0 -73
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/345/257/271/350/261/241/346/250/241/345/236/213API/345/217/202/350/200/203/346/226/207/346/241/243/Field /346/250/241/345/235/227/FormulaField /345/205/254/345/274/217/345/255/227/346/256/265.md" +0 -109
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/345/257/271/350/261/241/346/250/241/345/236/213API/345/217/202/350/200/203/346/226/207/346/241/243/Field /346/250/241/345/235/227/GeoLocationField /345/234/260/347/220/206/344/275/215/347/275/256/345/255/227/346/256/265.md" +0 -33
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/345/257/271/350/261/241/346/250/241/345/236/213API/345/217/202/350/200/203/346/226/207/346/241/243/Field /346/250/241/345/235/227/GroupField /347/276/244/347/273/204/345/255/227/346/256/265.md" +0 -111
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/345/257/271/350/261/241/346/250/241/345/236/213API/345/217/202/350/200/203/346/226/207/346/241/243/Field /346/250/241/345/235/227/LastModifiedTimeField /346/234/200/345/220/216/346/233/264/346/226/260/346/227/266/351/227/264/345/255/227/346/256/265.md" +0 -134
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/345/257/271/350/261/241/346/250/241/345/236/213API/345/217/202/350/200/203/346/226/207/346/241/243/Field /346/250/241/345/235/227/LookupField /345/205/263/350/201/224/345/274/225/347/224/250/345/255/227/346/256/265.md" +0 -71
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/345/257/271/350/261/241/346/250/241/345/236/213API/345/217/202/350/200/203/346/226/207/346/241/243/Field /346/250/241/345/235/227/MultiSelectField /345/244/232/351/200/211/345/255/227/346/256/265.md" +0 -349
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/345/257/271/350/261/241/346/250/241/345/236/213API/345/217/202/350/200/203/346/226/207/346/241/243/Field /346/250/241/345/235/227/NumberField /346/225/260/345/255/227/345/255/227/346/256/265.md" +0 -175
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/345/257/271/350/261/241/346/250/241/345/236/213API/345/217/202/350/200/203/346/226/207/346/241/243/Field /346/250/241/345/235/227/PrimaryField /344/270/273/351/224/256/346/226/207/346/241/243/345/255/227/346/256/265.md" +0 -91
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/345/257/271/350/261/241/346/250/241/345/236/213API/345/217/202/350/200/203/346/226/207/346/241/243/Field /346/250/241/345/235/227/ProgressField /350/277/233/345/272/246/345/255/227/346/256/265.md" +0 -324
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/345/257/271/350/261/241/346/250/241/345/236/213API/345/217/202/350/200/203/346/226/207/346/241/243/Field /346/250/241/345/235/227/RatingField /350/257/204/345/210/206/345/255/227/346/256/265.md" +0 -320
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/345/257/271/350/261/241/346/250/241/345/236/213API/345/217/202/350/200/203/346/226/207/346/241/243/Field /346/250/241/345/235/227/RichTextField /345/257/214/346/226/207/346/234/254/345/255/227/346/256/265.md" +0 -45
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/345/257/271/350/261/241/346/250/241/345/236/213API/345/217/202/350/200/203/346/226/207/346/241/243/Field /346/250/241/345/235/227/SingleSelectField /345/215/225/351/200/211/345/255/227/346/256/265.md" +0 -336
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/345/257/271/350/261/241/346/250/241/345/236/213API/345/217/202/350/200/203/346/226/207/346/241/243/Field /346/250/241/345/235/227/TelephoneField /347/224/265/350/257/235/345/255/227/346/256/265.md" +0 -99
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/345/257/271/350/261/241/346/250/241/345/236/213API/345/217/202/350/200/203/346/226/207/346/241/243/Field /346/250/241/345/235/227/TextField /346/226/207/346/234/254/345/255/227/346/256/265.md" +0 -93
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/345/257/271/350/261/241/346/250/241/345/236/213API/345/217/202/350/200/203/346/226/207/346/241/243/Field /346/250/241/345/235/227/UnidirectionalLinkFields /345/215/225/345/220/221/345/205/263/350/201/224/345/255/227/346/256/265.md" +0 -295
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/345/257/271/350/261/241/346/250/241/345/236/213API/345/217/202/350/200/203/346/226/207/346/241/243/Field /346/250/241/345/235/227/UrlField /351/223/276/346/216/245/345/255/227/346/256/265.md" +0 -163
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/345/257/271/350/261/241/346/250/241/345/236/213API/345/217/202/350/200/203/346/226/207/346/241/243/Field /346/250/241/345/235/227/UserField /344/272/272/345/221/230/345/255/227/346/256/265.md" +0 -266
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/345/257/271/350/261/241/346/250/241/345/236/213API/345/217/202/350/200/203/346/226/207/346/241/243/Field /346/250/241/345/235/227.md" +0 -379
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/345/257/271/350/261/241/346/250/241/345/236/213API/345/217/202/350/200/203/346/226/207/346/241/243/Record /346/250/241/345/235/227.md" +0 -277
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/345/257/271/350/261/241/346/250/241/345/236/213API/345/217/202/350/200/203/346/226/207/346/241/243/Sheet /346/250/241/345/235/227.md" +0 -1013
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/345/257/271/350/261/241/346/250/241/345/236/213API/345/217/202/350/200/203/346/226/207/346/241/243/UI /346/250/241/345/235/227.md" +0 -472
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/345/257/271/350/261/241/346/250/241/345/236/213API/345/217/202/350/200/203/346/226/207/346/241/243/View /346/250/241/345/235/227/GridView /350/241/250/346/240/274/350/247/206/345/233/276.md" +0 -835
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/345/257/271/350/261/241/346/250/241/345/236/213API/345/217/202/350/200/203/346/226/207/346/241/243/View /346/250/241/345/235/227.md" +0 -203
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/345/257/271/350/261/241/346/250/241/345/236/213API/345/217/202/350/200/203/346/226/207/346/241/243//345/255/227/346/256/265/346/225/260/346/215/256/347/273/223/346/236/204.md +0 -65
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/345/257/271/350/261/241/346/250/241/345/236/213API/345/217/202/350/200/203/346/226/207/346/241/243//350/257/273/345/206/231AI /350/241/250/346/240/274/346/250/241/345/236/213.md" +0 -29
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/346/225/260/346/215/256/346/272/220 /345/274/200/345/217/221/346/214/207/345/215/227.md" +0 -607
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/350/204/232/346/234/254/346/217/222/344/273/266 /345/274/200/345/217/221/346/214/207/345/215/227/Base /346/250/241/345/235/227.md" +0 -391
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/350/204/232/346/234/254/346/217/222/344/273/266 /345/274/200/345/217/221/346/214/207/345/215/227/Field /346/250/241/345/235/227.md" +0 -379
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/350/204/232/346/234/254/346/217/222/344/273/266 /345/274/200/345/217/221/346/214/207/345/215/227/Input/346/250/241/345/235/227.md" +0 -331
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/350/204/232/346/234/254/346/217/222/344/273/266 /345/274/200/345/217/221/346/214/207/345/215/227/Output/346/250/241/345/235/227.md" +0 -197
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/350/204/232/346/234/254/346/217/222/344/273/266 /345/274/200/345/217/221/346/214/207/345/215/227/Record /346/250/241/345/235/227.md" +0 -277
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/350/204/232/346/234/254/346/217/222/344/273/266 /345/274/200/345/217/221/346/214/207/345/215/227/Sheet /346/250/241/345/235/227.md" +0 -1013
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/350/204/232/346/234/254/346/217/222/344/273/266 /345/274/200/345/217/221/346/214/207/345/215/227/UI /346/250/241/345/235/227.md" +0 -472
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/350/204/232/346/234/254/346/217/222/344/273/266 /345/274/200/345/217/221/346/214/207/345/215/227/View /346/250/241/345/235/227.md" +0 -203
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/350/204/232/346/234/254/346/217/222/344/273/266 /345/274/200/345/217/221/346/214/207/345/215/227//345/255/227/346/256/265/346/225/260/346/215/256/347/273/223/346/236/204.md" +0 -65
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/350/204/232/346/234/254/346/217/222/344/273/266 /345/274/200/345/217/221/346/214/207/345/215/227.md" +0 -142
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/350/276/271/346/240/217/346/217/222/344/273/266 /345/274/200/345/217/221/346/214/207/345/215/227/Base /346/250/241/345/235/227.md" +0 -391
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/350/276/271/346/240/217/346/217/222/344/273/266 /345/274/200/345/217/221/346/214/207/345/215/227/Event/344/272/213/344/273/266/346/250/241/345/235/227.md" +0 -182
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/350/276/271/346/240/217/346/217/222/344/273/266 /345/274/200/345/217/221/346/214/207/345/215/227/Field /346/250/241/345/235/227.md" +0 -379
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/350/276/271/346/240/217/346/217/222/344/273/266 /345/274/200/345/217/221/346/214/207/345/215/227/Record /346/250/241/345/235/227.md" +0 -277
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/350/276/271/346/240/217/346/217/222/344/273/266 /345/274/200/345/217/221/346/214/207/345/215/227/Sheet /346/250/241/345/235/227.md" +0 -1013
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/350/276/271/346/240/217/346/217/222/344/273/266 /345/274/200/345/217/221/346/214/207/345/215/227/UI /346/250/241/345/235/227.md" +0 -472
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/350/276/271/346/240/217/346/217/222/344/273/266 /345/274/200/345/217/221/346/214/207/345/215/227/View /346/250/241/345/235/227.md" +0 -203
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/350/276/271/346/240/217/346/217/222/344/273/266 /345/274/200/345/217/221/346/214/207/345/215/227//345/205/266/344/273/226/346/216/245/345/217/243.md" +0 -146
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/350/276/271/346/240/217/346/217/222/344/273/266 /345/274/200/345/217/221/346/214/207/345/215/227//345/255/227/346/256/265/346/225/260/346/215/256/347/273/223/346/236/204.md" +0 -65
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/350/276/271/346/240/217/346/217/222/344/273/266 /345/274/200/345/217/221/346/214/207/345/215/227//346/240/270/345/277/203/347/237/245/350/257/206.md" +0 -54
- package/templates/aitable-handoff/wiki/faq-support/18-/345/274/200/345/217/221/350/200/205/346/214/207/345/215/227/AI/350/241/250/346/240/274/350/276/271/346/240/217/346/217/222/344/273/266 /345/274/200/345/217/221/346/214/207/345/215/227.md" +0 -192
- package/templates/aitable-handoff/wiki/faq-support//351/222/211/351/222/211AI/350/241/250/346/240/274FAQ.md +0 -611
- package/templates/aitable-handoff/workflows/admin-kb-update/recipes/kb-refine.recipe.ts +0 -131
- package/templates/aitable-handoff/workflows/admin-kb-update/recipes/kb_sync_handler.recipe.ts +0 -130
- package/templates/aitable-handoff/workflows/admin-kb-update/workflow.yml +0 -125
- package/templates/aitable-handoff/workflows/config-sync/recipes/config_sync.recipe.ts +0 -448
- package/templates/aitable-handoff/workflows/config-sync/recipes/config_sync_handler.recipe.ts +0 -16
- package/templates/aitable-handoff/workflows/config-sync/workflow.yml +0 -73
- package/templates/aitable-handoff/workflows/daily-review/recipes/daily_review.recipe.ts +0 -529
- package/templates/aitable-handoff/workflows/daily-review/recipes/daily_review_handler.recipe.ts +0 -26
- package/templates/aitable-handoff/workflows/daily-review/recipes/memory-events.ts +0 -56
- package/templates/aitable-handoff/workflows/daily-review/workflow.yml +0 -92
- package/templates/aitable-handoff/workflows/group-qa/error-replies.json +0 -53
- package/templates/aitable-handoff/workflows/group-qa/recipes/answer.recipe.ts +0 -197
- package/templates/aitable-handoff/workflows/group-qa/recipes/conversation_handler.recipe.ts +0 -294
- package/templates/aitable-handoff/workflows/group-qa/recipes/issue-classifier.ts +0 -120
- package/templates/aitable-handoff/workflows/group-qa/recipes/known-error-match.recipe.ts +0 -75
- package/templates/aitable-handoff/workflows/group-qa/recipes/memory-events.ts +0 -55
- package/templates/aitable-handoff/workflows/group-qa/recipes/reply-to-group.recipe.ts +0 -132
- package/templates/aitable-handoff/workflows/group-qa/recipes/troubleshoot-issue.recipe.ts +0 -195
- package/templates/aitable-handoff/workflows/group-qa/workflow.yml +0 -210
- package/templates/aitable-handoff/workspaces/daily-review/AGENTS.md +0 -189
- package/templates/aitable-handoff/workspaces/faq-support/AGENTS.md +0 -448
- package/templates/aitable-handoff/workspaces/faq-support/contacts.json +0 -14
- package/templates/aitable-handoff/workspaces/faq-support/owner-map.json +0 -18
- package/templates/aitable-handoff/workspaces/faq-support/skills/bug-triage/SKILL.md +0 -130
- package/templates/aitable-handoff/workspaces/faq-troubleshooter/AGENTS.md +0 -53
- package/templates/aitable-handoff/workspaces/faq-troubleshooter/skills/troubleshooting/SKILL.md +0 -58
- package/templates/aitable-handoff/workspaces/faq-troubleshooter/skills/troubleshooting/aitable-import-troubleshooter/SKILL.md +0 -485
- package/templates/aitable-handoff/workspaces/faq-troubleshooter/skills/troubleshooting/aitable-openapi-troubleshooter/SKILL.md +0 -183
- package/templates/aitable-handoff/workspaces/faq-troubleshooter/skills/troubleshooting/import-openapi-e2e-troubleshooter/SKILL.md +0 -459
- package/templates/aitable-handoff/workspaces/faq-troubleshooter/skills/troubleshooting/notable-datasource-troubleshooter/SKILL.md +0 -1286
- package/templates/aitable-handoff/workspaces/faq-troubleshooter/skills/troubleshooting/notable-field-troubleshooter/SKILL.md +0 -673
- package/templates/aitable-handoff/workspaces/faq-troubleshooter/skills/troubleshooting/spreadsheet-datasync-troubleshooter/SKILL.md +0 -322
- package/templates/aitable-handoff/workspaces/kb-editor/AGENTS.md +0 -32
- package/templates/support-qa/lib/assemble-cli.ts +0 -30
- package/templates/support-qa/lib/assemble.ts +0 -279
- package/templates/support-qa/lib/echo-guard.ts +0 -50
- package/templates/support-qa/lib/fastpath.ts +0 -227
- package/templates/support-qa/lib/owner-mention.ts +0 -140
- package/templates/support-qa/lib/profile-guard.ts +0 -55
- package/templates/support-qa/lib/send-failure-guard.ts +0 -59
- package/templates/support-qa/lib/troubleshoot.ts +0 -236
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { createHash } from "node:crypto";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* 出站回声防护(echo guard)
|
|
5
|
-
*
|
|
6
|
-
* 背景:webhook 发出的机器人回复可能被 dws 轮询以"某个真人"的名义重新拉回
|
|
7
|
-
* (真实案例:机器人答案以创建者名义回流,身份匹配失效,被当新消息判定建行)。
|
|
8
|
-
* 方案:reply 发送成功后发布内容指纹到 globalVar;conversation_handler 同步比对,
|
|
9
|
-
* 命中即按机器人消息处理(只记历史,不建单)。
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
const VAR_KEY = "sent_reply_fingerprints";
|
|
13
|
-
const CAPACITY = 50;
|
|
14
|
-
const TTL_MS = 10 * 60 * 1000;
|
|
15
|
-
|
|
16
|
-
type Fingerprint = { h: string; ts: number };
|
|
17
|
-
|
|
18
|
-
function normalize(content: string): string {
|
|
19
|
-
return content.replace(/\s+/g, "").slice(0, 300);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export function replyFingerprint(content: string): string {
|
|
23
|
-
return createHash("sha1").update(normalize(content)).digest("hex");
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
function loadList(get: (key: string) => unknown): Fingerprint[] {
|
|
27
|
-
const raw = get(VAR_KEY);
|
|
28
|
-
if (!Array.isArray(raw)) return [];
|
|
29
|
-
const now = Date.now();
|
|
30
|
-
return (raw as Fingerprint[]).filter((f) => f && typeof f.h === "string" && now - f.ts <= TTL_MS);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/** reply 发送成功后调用:发布指纹(带容量与 TTL 裁剪) */
|
|
34
|
-
export function publishSentFingerprint(
|
|
35
|
-
get: (key: string) => unknown,
|
|
36
|
-
set: (key: string, value: unknown) => void,
|
|
37
|
-
content: string,
|
|
38
|
-
): void {
|
|
39
|
-
const list = loadList(get);
|
|
40
|
-
list.push({ h: replyFingerprint(content), ts: Date.now() });
|
|
41
|
-
while (list.length > CAPACITY) list.shift();
|
|
42
|
-
set(VAR_KEY, list);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/** 入站消息比对:近期是否是我们自己发出的内容(同步、无 IO) */
|
|
46
|
-
export function isRecentOutboundEcho(get: (key: string) => unknown, content: string): boolean {
|
|
47
|
-
if (!content.trim()) return false;
|
|
48
|
-
const h = replyFingerprint(content);
|
|
49
|
-
return loadList(get).some((f) => f.h === h);
|
|
50
|
-
}
|
|
@@ -1,227 +0,0 @@
|
|
|
1
|
-
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
import { parse as parseYaml } from "yaml";
|
|
4
|
-
import { z } from "zod";
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* fastpath 声明式规则引擎(support-qa L3,场景层,零 core 依赖)
|
|
8
|
-
*
|
|
9
|
-
* 确定性秒回:按 profile/fastpath/known-answers.yml 声明的规则,用纯匹配(非 LLM)
|
|
10
|
-
* 把命中消息直接映射为固定话术。规则三选一:
|
|
11
|
-
* - template:与消息全文(空白归一后)全等;
|
|
12
|
-
* - contains:消息包含该子串(单向);
|
|
13
|
-
* - regex:正则 test 消息。
|
|
14
|
-
* 另有 safety 安全兜底关键词(最高优先级),命中即返回安全话术。
|
|
15
|
-
*
|
|
16
|
-
* 关键不变量——【单向匹配】:一律「消息文案 message 包含/匹配规则模式」,
|
|
17
|
-
* 绝不反向(规则 key/pattern 包含 message)。这修复了 aitable-handoff
|
|
18
|
-
* known-error-match 里 `errorMessage.includes(k) || k.includes(errorMessage)`
|
|
19
|
-
* 的双向 includes 误配 bug(短消息会错误命中长规则)。
|
|
20
|
-
*
|
|
21
|
-
* 关键不变量——【只看用户本轮新话】:规则匹配前剥离钉钉「引用消息:」块
|
|
22
|
-
* (引用内容往往就是本机器人上一轮的回复,不剥离就会在用户追问时把同一段
|
|
23
|
-
* 话术复读一遍);safety 安全兜底依然看全文,防止注入/敏感内容藏在引用块里绕过拦截。
|
|
24
|
-
*
|
|
25
|
-
* 关闭语义:profile.fastpath.rules 未配置或文件缺失 → config=null → 透传给 answer。
|
|
26
|
-
*/
|
|
27
|
-
|
|
28
|
-
export const fastpathRulesSchema = z.object({
|
|
29
|
-
safety: z.object({
|
|
30
|
-
keywords: z.array(z.string().min(1)).min(1),
|
|
31
|
-
reply: z.string().min(1),
|
|
32
|
-
}).optional(),
|
|
33
|
-
rules: z.array(z.object({
|
|
34
|
-
key: z.string().min(1),
|
|
35
|
-
template: z.string().optional(),
|
|
36
|
-
contains: z.string().optional(),
|
|
37
|
-
regex: z.string().optional(),
|
|
38
|
-
reply: z.string().min(1),
|
|
39
|
-
}).refine(
|
|
40
|
-
(r) => [r.template, r.contains, r.regex].filter((v) => v !== undefined && v.trim()).length === 1,
|
|
41
|
-
{ message: "必须且只能有 template/contains/regex 之一" },
|
|
42
|
-
)),
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
export type FastpathRule = {
|
|
46
|
-
/** 规则标识(报错/日志文案含此 key,便于排障与追溯) */
|
|
47
|
-
key: string;
|
|
48
|
-
template?: string;
|
|
49
|
-
contains?: string;
|
|
50
|
-
regex?: string;
|
|
51
|
-
/** 加载时预编译的正则(与校验同一实例),避免逐消息重编 */
|
|
52
|
-
compiledRegex?: RegExp;
|
|
53
|
-
reply: string;
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
export type FastpathSafety = {
|
|
57
|
-
keywords: string[];
|
|
58
|
-
reply: string;
|
|
59
|
-
};
|
|
60
|
-
|
|
61
|
-
export type FastpathConfig = {
|
|
62
|
-
safety?: FastpathSafety;
|
|
63
|
-
rules: FastpathRule[];
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
export type FastpathMatch = {
|
|
67
|
-
key: string;
|
|
68
|
-
reply: string;
|
|
69
|
-
kind: "safety" | "template" | "contains" | "regex";
|
|
70
|
-
};
|
|
71
|
-
|
|
72
|
-
export type FastpathLoadResult = {
|
|
73
|
-
/** null = 未配置或文件缺失(fastpath 关闭,透传 answer) */
|
|
74
|
-
config: FastpathConfig | null;
|
|
75
|
-
issues: string[];
|
|
76
|
-
};
|
|
77
|
-
|
|
78
|
-
const cache = new Map<string, FastpathLoadResult>();
|
|
79
|
-
|
|
80
|
-
/** 空白归一(template 全等匹配用) */
|
|
81
|
-
function normalizeWs(s: string): string {
|
|
82
|
-
return s.replace(/\s+/g, " ").trim();
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* 钉钉「引用消息:」标记:其后内容是被引用的历史消息,不属于用户本轮诉求。
|
|
87
|
-
* 包含半角/全角冒号两种变体(不同客户端文案不一致)。
|
|
88
|
-
*/
|
|
89
|
-
const QUOTE_MARKERS = ["引用消息:", "引用消息:"];
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* 剥离引用块,只保留用户本轮新话(确定性秒回只能据用户新诉求判定)。
|
|
93
|
-
*
|
|
94
|
-
* 为何需要:用户带引用追问时,引用块里往往完整包含上一轮的报错文案与本机器人的
|
|
95
|
-
* 回复,全文 contains 会再匹配到同一条规则 → 复读同一段话术(7-25 评测 g4-21/g4-22)。
|
|
96
|
-
*
|
|
97
|
-
* 边界:剥离后为空(用户只转发引用、自己没打字)→ 返回原文,那种场景本来就应该秒回。
|
|
98
|
-
*/
|
|
99
|
-
export function stripQuotedBlock(message: string): string {
|
|
100
|
-
const msg = message ?? "";
|
|
101
|
-
let cut = msg.length;
|
|
102
|
-
for (const marker of QUOTE_MARKERS) {
|
|
103
|
-
const i = msg.indexOf(marker);
|
|
104
|
-
if (i >= 0 && i < cut) cut = i;
|
|
105
|
-
}
|
|
106
|
-
if (cut >= msg.length) return msg;
|
|
107
|
-
const head = msg.slice(0, cut).trim();
|
|
108
|
-
return head || msg;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
/** 加载并校验 fastpath 规则;按解析后的绝对路径缓存 */
|
|
112
|
-
export function loadFastpathRules(configDir: string, rulesRel: string | undefined): FastpathLoadResult {
|
|
113
|
-
const rel = String(rulesRel ?? "").trim();
|
|
114
|
-
if (!rel) return { config: null, issues: [] }; // 未配置 → 关闭
|
|
115
|
-
const abs = path.resolve(configDir, "profile", rel);
|
|
116
|
-
const hit = cache.get(abs);
|
|
117
|
-
if (hit) return hit;
|
|
118
|
-
|
|
119
|
-
let res: FastpathLoadResult;
|
|
120
|
-
if (!existsSync(abs)) {
|
|
121
|
-
// 文件缺失 → 关闭(graceful,不阻断 L0);preflight 另行告警
|
|
122
|
-
res = { config: null, issues: [`fastpath.rules 引用的文件不存在: profile/${rel}`] };
|
|
123
|
-
} else {
|
|
124
|
-
try {
|
|
125
|
-
const raw = (parseYaml(readFileSync(abs, "utf8")) ?? {}) as Record<string, unknown>;
|
|
126
|
-
const issues: string[] = [];
|
|
127
|
-
res = { config: normalizeConfig(raw, issues), issues };
|
|
128
|
-
} catch (err) {
|
|
129
|
-
res = { config: null, issues: [`fastpath 规则解析失败 profile/${rel}: ${err instanceof Error ? err.message : String(err)}`] };
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
cache.set(abs, res);
|
|
133
|
-
return res;
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
function normalizeConfig(raw: Record<string, unknown>, issues: string[]): FastpathConfig {
|
|
137
|
-
const rules: FastpathRule[] = [];
|
|
138
|
-
const rawRules = Array.isArray(raw.rules) ? raw.rules : [];
|
|
139
|
-
for (let i = 0; i < rawRules.length; i++) {
|
|
140
|
-
const r = rawRules[i] as Record<string, unknown> | null;
|
|
141
|
-
if (!r || typeof r !== "object") {
|
|
142
|
-
issues.push(`rules[${i}] 不是对象`);
|
|
143
|
-
continue;
|
|
144
|
-
}
|
|
145
|
-
const key = String(r.key ?? "").trim();
|
|
146
|
-
const reply = String(r.reply ?? "").trim();
|
|
147
|
-
if (!key) {
|
|
148
|
-
issues.push(`rules[${i}] 缺少 key`);
|
|
149
|
-
continue;
|
|
150
|
-
}
|
|
151
|
-
if (!reply) {
|
|
152
|
-
issues.push(`rules[${key}] 缺少 reply`);
|
|
153
|
-
continue;
|
|
154
|
-
}
|
|
155
|
-
const present = (["template", "contains", "regex"] as const).filter(
|
|
156
|
-
(k) => typeof r[k] === "string" && String(r[k]).trim(),
|
|
157
|
-
);
|
|
158
|
-
if (present.length !== 1) {
|
|
159
|
-
issues.push(`rules[${key}] 必须且只能有 template/contains/regex 之一(当前 ${present.length} 个)`);
|
|
160
|
-
continue;
|
|
161
|
-
}
|
|
162
|
-
const rule: FastpathRule = { key, reply };
|
|
163
|
-
if (typeof r.template === "string") rule.template = r.template;
|
|
164
|
-
if (typeof r.contains === "string") rule.contains = r.contains;
|
|
165
|
-
if (typeof r.regex === "string") {
|
|
166
|
-
try {
|
|
167
|
-
rule.compiledRegex = new RegExp(r.regex);
|
|
168
|
-
} catch {
|
|
169
|
-
issues.push(`rules[${key}] 非法正则: ${r.regex}`);
|
|
170
|
-
continue;
|
|
171
|
-
}
|
|
172
|
-
rule.regex = r.regex;
|
|
173
|
-
}
|
|
174
|
-
rules.push(rule);
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
let safety: FastpathSafety | undefined;
|
|
178
|
-
const rawSafety = raw.safety as Record<string, unknown> | undefined;
|
|
179
|
-
if (rawSafety && typeof rawSafety === "object") {
|
|
180
|
-
const keywords = Array.isArray(rawSafety.keywords)
|
|
181
|
-
? rawSafety.keywords.map((k) => String(k)).filter(Boolean)
|
|
182
|
-
: [];
|
|
183
|
-
const reply = String(rawSafety.reply ?? "").trim();
|
|
184
|
-
if (keywords.length > 0 && reply) safety = { keywords, reply };
|
|
185
|
-
else issues.push("safety 需同时提供非空 keywords 与 reply(否则忽略)");
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
return { safety, rules };
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
/**
|
|
192
|
-
* 匹配 fastpath(单向):安全兜底优先,其次规则按声明顺序。
|
|
193
|
-
* 一律「消息包含/匹配规则模式」,不做反向包含。
|
|
194
|
-
*
|
|
195
|
-
* safety 看全文(敏感内容/注入藏在引用块里也要拦);普通规则只看剥离引用后的
|
|
196
|
-
* 用户新话(避免带引用追问时复读上一轮话术)。
|
|
197
|
-
*/
|
|
198
|
-
export function matchFastpath(config: FastpathConfig | null, message: string): FastpathMatch | null {
|
|
199
|
-
if (!config) return null;
|
|
200
|
-
const msg = message ?? "";
|
|
201
|
-
if (!msg.trim()) return null;
|
|
202
|
-
|
|
203
|
-
// 安全兜底:消息(含引用内容)包含任一安全关键词(单向)
|
|
204
|
-
if (config.safety) {
|
|
205
|
-
for (const kw of config.safety.keywords) {
|
|
206
|
-
if (kw && msg.includes(kw)) return { key: "safety", reply: config.safety.reply, kind: "safety" };
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
// 普通规则:只对用户本轮新话匹配
|
|
211
|
-
const own = stripQuotedBlock(msg);
|
|
212
|
-
if (!own.trim()) return null;
|
|
213
|
-
|
|
214
|
-
for (const rule of config.rules) {
|
|
215
|
-
if (rule.template !== undefined) {
|
|
216
|
-
if (normalizeWs(own) === normalizeWs(rule.template)) {
|
|
217
|
-
return { key: rule.key, reply: rule.reply, kind: "template" };
|
|
218
|
-
}
|
|
219
|
-
} else if (rule.contains !== undefined) {
|
|
220
|
-
if (own.includes(rule.contains)) return { key: rule.key, reply: rule.reply, kind: "contains" }; // 单向
|
|
221
|
-
} else if (rule.regex !== undefined) {
|
|
222
|
-
// 用预编译实例(加载期已校验),避免逐消息重编
|
|
223
|
-
if (rule.compiledRegex?.test(own)) return { key: rule.key, reply: rule.reply, kind: "regex" };
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
return null;
|
|
227
|
-
}
|
|
@@ -1,140 +0,0 @@
|
|
|
1
|
-
import { execFile } from "node:child_process";
|
|
2
|
-
import { promisify } from "node:util";
|
|
3
|
-
|
|
4
|
-
export type OwnerGroupMention =
|
|
5
|
-
| { mode: "at"; userId: string }
|
|
6
|
-
| { mode: "name" };
|
|
7
|
-
|
|
8
|
-
export type OwnerMentionCommandRunner = (
|
|
9
|
-
args: string[],
|
|
10
|
-
timeoutMs: number,
|
|
11
|
-
) => Promise<unknown>;
|
|
12
|
-
|
|
13
|
-
export type OwnerMentionDeps = {
|
|
14
|
-
runDws?: OwnerMentionCommandRunner;
|
|
15
|
-
now?: () => number;
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
type CacheEntry<T> = { value: T; expiresAt: number };
|
|
19
|
-
|
|
20
|
-
const execFileAsync = promisify(execFile);
|
|
21
|
-
const DWS_TIMEOUT_MS = 8_000;
|
|
22
|
-
const MEMBER_CACHE_TTL_MS = 10 * 60_000;
|
|
23
|
-
const MEMBER_CACHE_MAX = 500;
|
|
24
|
-
|
|
25
|
-
const memberCache = new Map<string, CacheEntry<OwnerGroupMention>>();
|
|
26
|
-
let commandRunnerOverride: OwnerMentionCommandRunner | undefined;
|
|
27
|
-
|
|
28
|
-
function getCached<T>(
|
|
29
|
-
cache: Map<string, CacheEntry<T>>,
|
|
30
|
-
key: string,
|
|
31
|
-
now: number,
|
|
32
|
-
): T | undefined {
|
|
33
|
-
const hit = cache.get(key);
|
|
34
|
-
if (!hit) return undefined;
|
|
35
|
-
if (hit.expiresAt <= now) {
|
|
36
|
-
cache.delete(key);
|
|
37
|
-
return undefined;
|
|
38
|
-
}
|
|
39
|
-
// Map 插入顺序作为轻量 LRU;命中后移到队尾。
|
|
40
|
-
cache.delete(key);
|
|
41
|
-
cache.set(key, hit);
|
|
42
|
-
return hit.value;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
function setCached<T>(
|
|
46
|
-
cache: Map<string, CacheEntry<T>>,
|
|
47
|
-
key: string,
|
|
48
|
-
value: T,
|
|
49
|
-
expiresAt: number,
|
|
50
|
-
max: number,
|
|
51
|
-
): void {
|
|
52
|
-
cache.delete(key);
|
|
53
|
-
cache.set(key, { value, expiresAt });
|
|
54
|
-
while (cache.size > max) {
|
|
55
|
-
const oldest = cache.keys().next().value as string | undefined;
|
|
56
|
-
if (oldest === undefined) break;
|
|
57
|
-
cache.delete(oldest);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
async function defaultRunDws(args: string[], timeoutMs: number): Promise<unknown> {
|
|
62
|
-
const { stdout } = await execFileAsync("dws", args, {
|
|
63
|
-
encoding: "utf8",
|
|
64
|
-
timeout: timeoutMs,
|
|
65
|
-
maxBuffer: 5 * 1024 * 1024,
|
|
66
|
-
});
|
|
67
|
-
return JSON.parse(String(stdout));
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
function memberList(payload: unknown): Array<Record<string, unknown>> {
|
|
71
|
-
if (!payload || typeof payload !== "object") return [];
|
|
72
|
-
const obj = payload as Record<string, unknown>;
|
|
73
|
-
const result = obj.result;
|
|
74
|
-
if (!result || typeof result !== "object" || Array.isArray(result)) return [];
|
|
75
|
-
const members = (result as Record<string, unknown>).members;
|
|
76
|
-
return Array.isArray(members)
|
|
77
|
-
? members.filter((item): item is Record<string, unknown> => Boolean(item) && typeof item === "object" && !Array.isArray(item))
|
|
78
|
-
: [];
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
function readOpenDingTalkId(item: Record<string, unknown>): string {
|
|
82
|
-
const value = item.openDingTalkId ?? item.openDingtalkId;
|
|
83
|
-
return typeof value === "string" ? value.trim() : "";
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* 判定 Owner 是否能在目标群真实 @。
|
|
88
|
-
*
|
|
89
|
-
* Owner 的 userId/openDingTalkId 由 config-sync 从功能模块人员配置表解析
|
|
90
|
-
* (dws contact user get→search 链路)后随快照传入,这里只做群成员在群校验。
|
|
91
|
-
* 任一参数、命令、超时或响应解析失败都返回 name;本函数不向主流程抛错。
|
|
92
|
-
*/
|
|
93
|
-
export async function resolveOwnerGroupMention(
|
|
94
|
-
conversationId: string,
|
|
95
|
-
owner: { userId: string; openDingTalkId?: string },
|
|
96
|
-
deps: OwnerMentionDeps = {},
|
|
97
|
-
): Promise<OwnerGroupMention> {
|
|
98
|
-
const cid = String(conversationId ?? "").trim();
|
|
99
|
-
const userId = String(owner?.userId ?? "").trim();
|
|
100
|
-
const openDingTalkId = String(owner?.openDingTalkId ?? "").trim();
|
|
101
|
-
if (!cid || !userId || !openDingTalkId) return { mode: "name" };
|
|
102
|
-
|
|
103
|
-
const now = (deps.now ?? Date.now)();
|
|
104
|
-
const cacheKey = `${cid}\u0000${userId}\u0000${openDingTalkId}`;
|
|
105
|
-
const cached = getCached(memberCache, cacheKey, now);
|
|
106
|
-
if (cached !== undefined) return cached;
|
|
107
|
-
|
|
108
|
-
const fallback: OwnerGroupMention = { mode: "name" };
|
|
109
|
-
const runDws = deps.runDws ?? commandRunnerOverride ?? defaultRunDws;
|
|
110
|
-
|
|
111
|
-
let result: OwnerGroupMention = fallback;
|
|
112
|
-
try {
|
|
113
|
-
const payload = await runDws([
|
|
114
|
-
"chat", "group", "members", "list-by-ids",
|
|
115
|
-
"--id", cid,
|
|
116
|
-
"--users", openDingTalkId,
|
|
117
|
-
"--format", "json",
|
|
118
|
-
"--timeout", "8",
|
|
119
|
-
], DWS_TIMEOUT_MS);
|
|
120
|
-
const matched = memberList(payload).some((member) => readOpenDingTalkId(member) === openDingTalkId);
|
|
121
|
-
if (matched) result = { mode: "at", userId };
|
|
122
|
-
} catch {
|
|
123
|
-
result = fallback;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
setCached(memberCache, cacheKey, result, now + MEMBER_CACHE_TTL_MS, MEMBER_CACHE_MAX);
|
|
127
|
-
return result;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
/** 仅供单测隔离模块级缓存。 */
|
|
131
|
-
export function resetOwnerMentionCachesForTests(): void {
|
|
132
|
-
memberCache.clear();
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
/** 仅供 recipe 单测注入 dws runner;传 undefined 恢复真实命令。 */
|
|
136
|
-
export function setOwnerMentionCommandRunnerForTests(
|
|
137
|
-
runner?: OwnerMentionCommandRunner,
|
|
138
|
-
): void {
|
|
139
|
-
commandRunnerOverride = runner;
|
|
140
|
-
}
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import type { RecipeContext, RecipeResult } from "aitable-workflow-core";
|
|
2
|
-
import { ensureAssembled } from "./assemble.js";
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* L3 直出路径共享的 profile 装配闸门(评审 P1)
|
|
6
|
-
*
|
|
7
|
-
* fastpath / troubleshoot 排在 answer 之前,命中即直接产出回答并让 answer 跳过。若只有
|
|
8
|
-
* answer 做 ensureAssembled 校验,则 profile 装配错误(overlay 放开闸门、KB collection
|
|
9
|
-
* 缺失、role 解析失败等)下 fastpath / troubleshoot 仍可能带病作答,违背“profile 错误
|
|
10
|
-
* 阻断作答 / 闸门只准收紧”的纪律。故所有会直接产出回答的 recipe 在执行实际逻辑前都调用本闸门。
|
|
11
|
-
*
|
|
12
|
-
* 返回:
|
|
13
|
-
* - RecipeResult —— 存在装配 error:阻断作答的 agent_failure 静默(tracker:false,
|
|
14
|
-
* 留痕与否交 on_action 按策略裁决);
|
|
15
|
-
* - RecipeResult —— 本次发生写入(wrote 非空):配置刚被自动更新,同一进程内
|
|
16
|
-
* 已加载的 workflow/role 可能仍是旧值,阻断作答并提示重启(正常 npm 入口已在
|
|
17
|
-
* 进程启动前完成装配,不会走到这里;这是直接执行 aitable-workflow run 的兜底);
|
|
18
|
-
* - null —— 无 error 且无写入,放行。
|
|
19
|
-
*
|
|
20
|
-
* ensureAssembled 按 configDir 进程内缓存,重复调用(同一消息经 fastpath→troubleshoot→answer
|
|
21
|
-
* 多步)无额外磁盘开销。
|
|
22
|
-
*/
|
|
23
|
-
export function profileAssembleGuard(
|
|
24
|
-
ctx: RecipeContext,
|
|
25
|
-
log: (msg: string) => void,
|
|
26
|
-
): RecipeResult | null {
|
|
27
|
-
const asm = ensureAssembled(ctx.configDir, log);
|
|
28
|
-
const errors = asm.issues.filter((i) => i.level === "error");
|
|
29
|
-
if (errors.length === 0 && asm.wrote.length === 0) return null;
|
|
30
|
-
if (errors.length > 0) {
|
|
31
|
-
log(`profile 校验失败(${errors.length} 个错误),阻断作答`);
|
|
32
|
-
return {
|
|
33
|
-
status: "success",
|
|
34
|
-
output: {
|
|
35
|
-
action: "agent_failure",
|
|
36
|
-
answer: "",
|
|
37
|
-
reason: `profile 校验失败: ${errors[0]!.message}`,
|
|
38
|
-
},
|
|
39
|
-
tracker: false, // 留痕与否由 on_action 按 agent_failure 策略裁决
|
|
40
|
-
logs: ["profile 校验失败 → 阻断作答", errors[0]!.message],
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
// 本次装配发生了写入:不在同一进程内带着刚改写的配置继续运行
|
|
44
|
-
log(`profile 配置已自动更新(${asm.wrote.length} 个文件),请重启进程后继续(推荐用 npm run run / npm run setup 入口)`);
|
|
45
|
-
return {
|
|
46
|
-
status: "success",
|
|
47
|
-
output: {
|
|
48
|
-
action: "agent_failure",
|
|
49
|
-
answer: "",
|
|
50
|
-
reason: "配置已自动更新,需重启进程后生效",
|
|
51
|
-
},
|
|
52
|
-
tracker: false,
|
|
53
|
-
logs: ["装配发生写入 → 阻断本次作答,请重启"],
|
|
54
|
-
};
|
|
55
|
-
}
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import { createHash } from "node:crypto";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* 发送失败留痕去重(send_failure guard)
|
|
5
|
-
*
|
|
6
|
-
* 背景:发送失败会被步骤重试 + 外层重投多次驱动(真实案例:同一条待发内容、同一
|
|
7
|
-
* "无可用 sessionWebhook" 原因,在 1.5 分钟内写了 18 条 send_failed)。失败重试本身是
|
|
8
|
-
* 对的,但每次尝试都往短期记忆里追加一条,会把同一个故障放大成十几条同质记录:
|
|
9
|
-
* 复盘的 sendFailedCount 被严重虚高,学习语料里也全是重复噪声。
|
|
10
|
-
*
|
|
11
|
-
* 方案:按「群 + 待发内容 + 失败原因」做窗口内去重——同一故障只记第一次;窗口过后
|
|
12
|
-
* 若仍失败则再记一次(作为"故障持续"的新信号)。不同内容或不同原因永不互相吞掉。
|
|
13
|
-
*
|
|
14
|
-
* 注意:这里去重的只是「留痕」,不改变发送重试与 step 失败语义。
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
const VAR_KEY = "send_failure_marks";
|
|
18
|
-
const CAPACITY = 50;
|
|
19
|
-
const TTL_MS = 10 * 60 * 1000;
|
|
20
|
-
|
|
21
|
-
type Mark = { h: string; ts: number };
|
|
22
|
-
|
|
23
|
-
function loadList(get: (key: string) => unknown): Mark[] {
|
|
24
|
-
const raw = get(VAR_KEY);
|
|
25
|
-
if (!Array.isArray(raw)) return [];
|
|
26
|
-
const now = Date.now();
|
|
27
|
-
return (raw as Mark[]).filter((m) => m && typeof m.h === "string" && now - m.ts <= TTL_MS);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export function sendFailureFingerprint(args: { conversationId: string; content: string; reason: string }): string {
|
|
31
|
-
const normalized = [
|
|
32
|
-
args.conversationId,
|
|
33
|
-
args.content.replace(/\s+/g, "").slice(0, 300),
|
|
34
|
-
args.reason.replace(/\s+/g, "").slice(0, 200),
|
|
35
|
-
].join("|");
|
|
36
|
-
return createHash("sha1").update(normalized).digest("hex");
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* 是否应为本次发送失败写短期记忆。
|
|
41
|
-
* 首次出现 → 登记并返回 true;窗口内同签名重试 → 返回 false(调用方只记日志)。
|
|
42
|
-
*/
|
|
43
|
-
export function shouldRecordSendFailure(
|
|
44
|
-
get: (key: string) => unknown,
|
|
45
|
-
set: (key: string, value: unknown) => void,
|
|
46
|
-
args: { conversationId: string; content: string; reason: string },
|
|
47
|
-
): boolean {
|
|
48
|
-
const h = sendFailureFingerprint(args);
|
|
49
|
-
const list = loadList(get);
|
|
50
|
-
if (list.some((m) => m.h === h)) {
|
|
51
|
-
// 仍写回裁剪后的列表:顺带完成 TTL 清理,避免只读路径让过期项常驻
|
|
52
|
-
set(VAR_KEY, list);
|
|
53
|
-
return false;
|
|
54
|
-
}
|
|
55
|
-
list.push({ h, ts: Date.now() });
|
|
56
|
-
while (list.length > CAPACITY) list.shift();
|
|
57
|
-
set(VAR_KEY, list);
|
|
58
|
-
return true;
|
|
59
|
-
}
|