-
…e shared kernel + PreviewService (previewId Redis binding, save-side re-validation, state legality checks) + queue-only OpService (sMakePerson dual-write, status=confirmed); retire ProposeWriteTool/OpController/AuditService/ErpClient writes; preview card frontend; skills/prompt/bench sync; D: checkBusinessData stub behind erp.dry-run.enabled
-
…h (DB exclusive / classpath fallback / outage degrades to zero skills), bEnabled, md->SQL idempotent seed script, zero-skill graceful prompt
-
…-budget projection (conservative estimator, in-turn demotion, pre-send self-check, prompt_eval_count calibration)
-
P4 retirement + code slim-down (~18.5k lines deleted), on top of the intent-gate WIP (docs §17/§18 + agent/tool refinements): - Delete old 8-scene multi-agent stack: XlyErpService, SceneSelector/ Chati/ErpAi/DynamicTableNl2Sql agents, DynamicToolProvider (62 meta tools), Scene/ToolMeta/ParamRule entities+mappers+startup caches - Delete whole milvus/tts/ocr packages, /api/tts + /api/ocr endpoints, tts.html, python stream_server.py; strip dead TTS JS from chat.html (playByIndex/handleNormalResponse had no callers) - Three-pass orphan sweep: 17 dead utils, 16 dead entities, dead constants/exceptions, RedisService+RedisConfig, duplicate JacksonConfig, OperableChatMemoryProvider, old prompt generators; fold PageController into MvcConfig; trim OkHttpUtil 495→39 lines - pom: ~35→13 deps (drop mybatis/JPA/webflux/tika/pdfbox/poi/jieba/ jsoup/gson/fastjson2/springdoc/mapstruct/pagehelper/pinyin4j/ spring-retry/jnr-ffi/hutool/ocr/milvus/embeddings; add starter-jdbc); war 200M+→48M - application.yml: drop milvus/tts/ocr/tesseract/mybatis blocks; GlobalExceptionHandler returns plain {code,message} JSON - docs: mark P4 retirement done in agent-architecture §13/§18 Verified: mvn clean package OK; boot smoke on :8199 (Started 0.9s, /chat 200, health db UP). Old /api/tts & /api/ocr now 404 by design.
-
…i_op_queue staging cols + ai_skill registry - proposeCreate tool -> ai_op_queue draft(payload) -> confirm executes addBusinessData - ai_op_queue: add sPayload/sSourceRef/bAutoExecute/sResultBillId/sErrorMsg/tExecutedDate/tExpireAt (create/examine/auto-flow ready) - ai_skill registry table + seed playbooks (Skills §6) - QueryTool: self-repair retry (feed SQL error back to model, up to 3x) - TracingChatModelListener: per-call LLM latency/token/error trace (Langfuse hook point)
-
- FormResolverService: shared KG resolution (entity->master table excl. viw_*, field 中文->column, name field, labels) - ErpReadTool.lookupRecord(entity, record): reliably resolves the master table + returns a single record's full labelled fields — fixes the 'specific field of a specific record' case (e.g. 必胜客的销售员 -> 马艺祖) - AuditService + ai_audit_log: immutable audit of propose/confirm/cancel/query (who/when/action/target/result) - QueryTool.queryData(question): read-only SQL escape hatch — coder-model NL2SQL grounded on 字段字典, jsqlparser single-SELECT guard, blocks OUTFILE/LOAD_FILE/information_schema/SLEEP, forced LIMIT, audited. SAFE by construction; NL2SQL table/join accuracy for complex questions is limited (architecture-flagged, deferred). Verified: lookupRecord works; audit rows written; Query guards + LIMIT + audit work (NL2SQL grounding still mis-picks entity master on multi-table questions).
-
- ai_op_queue: staging table for AI write ops (draft|confirmed|executed|failed|cancelled) - ProposeWriteTool.proposeUpdate(entity, record, field, newValue): self-resolves the entity master table (excludes viw_* report views), resolves field via 字段字典, locates the unique record + old value, stages a DRAFT to ai_op_queue — DOES NOT execute; returns a proposal - ErpClient.updateForm: executes via ERP addUpdateDelBusinessData with the frontend-compatible payload {data:[{sTable,name:master,column:[{handleType:update,sId,field:value}]}]} - OpController: deterministic (non-LLM) POST /op/{id}/confirm (executes + writes back status) / cancel / GET pending - AgentChatController.onToolExecuted: on proposeUpdate, attach conversation + push write_proposal SSE - chat.html: confirm/cancel card + result echo - system prompt: proposeUpdate flow; never claim a write is done before confirm Verified end-to-end: '把必胜客简称改成必胜客中国' -> proposal card -> confirm -> ERP update -> DB changed; cancel -> DB unchanged. Nothing executes without explicit user confirm. -
Roll L2 flow up to domain->domain adjacency (11 domains) with anchor forms, form/tool counts, and the matching AI-agent scene. This is the coarse L1 tier meant to live in the agent system prompt for routing; L2/L3 stay as on-demand tools. Domains align to ai_agent's 8 business 智能体 (+ 基础资料/设备/其他 -> ERP代理人).
-
Materialize each form's L2 neighbors (upstream/downstream documents) and L3 neighbors (referenced entity tables) so the retriever can expand a vector-recalled form-card into a subgraph context via a single JOIN. 702 forms have downstream, 476 upstream, 1467 reference entity tables.
-
Map 业务中文名 -> real column -> table (38342 mappings, 6075 terms, 539 tables), ranked by form-usage for same-name disambiguation, with FK target (sFkTable/sFkKey) attached from viw_kg_edge_ref so NL2SQL knows the join. This is the field-dictionary half of the GraphRAG package.
-
Assemble one structured, embeddable text card per form (1748) merging node metadata, upstream/downstream document names, and the field 中文名 list. export_form_cards.sh emits JSONL for vector-store ingestion (group_concat_max_len raised to avoid truncating 269-field forms). Generated corpus is gitignored — regenerate deterministically via script.
-
Parse gdsconfigformslave.sRelation (comma-separated field&table&pk&display hops) into FK edges: src_table.field -> tgt_table.pk, with the set of display columns each FK surfaces aggregated per edge. 1597 distinct FK edges / 368 source tables / 109 target tables (mostly ele*/sis* master data). Provides the join dictionary for NL2SQL grounding.
-
One row per useful form enriched with business domain (L1, derived from normalized data-source prefix + AI-scene override), data source/exec type, and upstream/downstream flow counts from viw_kg_edge_flow. 857 forms participate in document flow; 63 back an AI tool; 92% domain-classified.
-
Materialize source-form -->generate--> target-form flow edges from the low-code config. Resolves BtnCopyTo.<Action>.sActiveId to the target gdsmodule exactly as Sp_Ai_AddCommonAfterNew does (sActiveId is the real target; the .ActXxx suffix is only a label). 411 distinct edges / 405 (src,tgt) pairs / 51 self-loops; 404 endpoints hit viw_ai_useful_forms. Captures full order-to-cash and procure-to-pay chains plus cross-domain (order->workorder, quote->process-card).