{"schema_version":"1.0","source":"registry/module-registry.json","total":364,"modules":[{"path":"app/api/command/route.ts","owner":"api","layer":"api","purpose_th":"API สำหรับคำสั่ง — ส่งต่อไปยัง cognitive pipeline และใช้ state cache ของ Supabase","exports":["POST","GET"],"status":"active"},{"path":"app/api/chat/route.ts","owner":"api","layer":"api","purpose_th":"API สำหรับแชท — เป็น Endpoint หลักของ cognitive pipeline","exports":["POST"],"status":"active"},{"path":"app/api/chat/confirm/route.ts","owner":"app","layer":"app","purpose_th":"จุดยืนยันเอกสารจากแชตเลขา (Rule 72)","exports":["POST"],"status":"active"},{"path":"app/api/document/route.ts","owner":"api","layer":"api","purpose_th":"API เอกสาร — สร้างเอกสารในรูปแบบ HTML จากข้อมูล DocData","exports":["POST"],"status":"active"},{"path":"app/api/explain/route.ts","owner":"api","layer":"api","purpose_th":"API อธิบายผล — ใช้ V5 Explainable Calculator สำหรับใบเสนอราคา","exports":["POST"],"status":"active"},{"path":"app/page.tsx","owner":"app","layer":"app","purpose_th":"หน้าแรกของเว็บ — แสดงลิงก์เพื่อไปยัง Dead Board และ Dashboard","exports":["default"],"status":"active"},{"path":"app/layout.tsx","owner":"app","layer":"app","purpose_th":"โครงสร้างหลักของหน้าเว็บ — ตั้งค่าฟอนต์, metadata, และโครงสร้าง HTML","exports":["metadata","default"],"status":"active"},{"path":"next.config.ts","owner":"config","layer":"config","purpose_th":"ไฟล์ตั้งค่า Next.js — การตั้งค่าสำหรับ Turbopack","exports":["default"],"status":"active"},{"path":"scripts/sync-registry.ts","owner":"system","layer":"scripts","purpose_th":"Script sync module-registry.json กับ source code จริง","exports":["bar","foo"],"status":"active"},{"path":"scripts/build-arch-book.ts","owner":"system","layer":"scripts","purpose_th":"Script สร้าง architecture-book.json จาก registry + source","exports":["ArchEdge","ArchNode","ArchitectureBook"],"status":"active"},{"path":"config/document-service-categories.ts","owner":"documents","layer":"config","purpose_th":"ประเภทบริการสำหรับเอกสาร — ห้าม hardcode ในไฟล์อื่น","exports":["DEFAULT_DOCUMENT_SERVICE_CATEGORY","DOCUMENT_SERVICE_CATEGORIES","DocumentServiceCategory","getServiceCategoryMeta"],"status":"active"},{"path":"supabase/functions/line-webhook-v2/helpers.ts","owner":"supabase","layer":"supabase","purpose_th":"Helper functions สำหรับ LINE webhook v2","exports":["ConversationState","checkBusinessQualification","executeBusinessValidation","extractEntities","extractStructuredEntitiesWithGemini","getOrInitState","resolveAddressToCoordinates","saveEntitiesToRegistry","updateConversationState"],"status":"active"},{"path":"supabase/functions/_shared/haversine.ts","owner":"supabase","layer":"supabase","purpose_th":"คำนวณระยะทาง Haversine สำหรับ Supabase functions","exports":["haversine"],"status":"active"},{"path":"app/api/traces/route.ts","owner":"system","layer":"api","purpose_th":"API Traces — expose runtime trace store","exports":["GET"],"status":"active"},{"path":"app/api/self-description/route.ts","owner":"system","layer":"api","purpose_th":"API Self-Description — ระบบอธิบายตัวเองจาก existence.json","exports":["GET"],"status":"active"},{"path":"app/api/reader/route.ts","owner":"system","layer":"api","purpose_th":"API อ่านไฟล์ source code — เปิด reader panel","exports":["GET"],"status":"active"},{"path":"app/api/governance/route.ts","owner":"system","layer":"api","purpose_th":"API Governance — อ่าน architecture-book.json","exports":["GET"],"status":"active"},{"path":"app/api/routes/route.ts","owner":"system","layer":"api","purpose_th":"API สแกน route.ts ทั้งหมดในโปรเจกต์","exports":["GET","METHOD"],"status":"active"},{"path":"app/api/manual-doc/route.ts","owner":"admin","layer":"api","purpose_th":"API สร้างเอกสารด้วยมือ","exports":["GET","dynamic"],"status":"active"},{"path":"app/api/deploy/route.ts","owner":"system","layer":"api","purpose_th":"API Deploy status — ตรวจสอบสถานะ deployment","exports":["GET"],"status":"active"},{"path":"app/api/dbd/route.ts","owner":"system","layer":"api","purpose_th":"API DBD Center — รวมข้อมูล registry + runtime + governance","exports":["GET","dynamic"],"status":"active"},{"path":"app/api/build/route.ts","owner":"system","layer":"api","purpose_th":"API ตรวจสอบ Build status และ Architecture book","exports":["GET","POST"],"status":"active"},{"path":"supabase/functions/line-webhook-v2/middleware/sanitizer.ts","owner":"supabase","layer":"supabase","purpose_th":"Sanitizer middleware สำหรับ LINE webhook v2","exports":["RawPricingData","SanitizedPricing","sanitizePricing"],"status":"active"},{"path":"supabase/functions/line-webhook-v2/engines/response.ts","owner":"supabase","layer":"supabase","purpose_th":"สร้าง response สำหรับ LINE webhook v2","exports":["ResponseGateway","ResponsePayload"],"status":"active"},{"path":"app/api/admin/settings/route.ts","owner":"admin","layer":"api","purpose_th":"API ตั้งค่าระบบ","exports":["GET","PUT"],"status":"active"},{"path":"app/api/admin/partners/route.ts","owner":"admin","layer":"api","purpose_th":"API รายชื่อ partners ทั้งหมด","exports":["GET"],"status":"active"},{"path":"app/api/admin/debt-trackings/route.ts","owner":"admin","layer":"api","purpose_th":"API รายการ debt tracking ทั้งหมด","exports":["GET","POST"],"status":"active"},{"path":"app/api/admin/documents/route.ts","owner":"admin","layer":"api","purpose_th":"API รายการเอกสารทั้งหมด","exports":["GET","POST"],"status":"active"},{"path":"app/api/admin/debt-trackings/[id]/route.ts","owner":"admin","layer":"api","purpose_th":"API อ่าน/อัปเดต debt tracking รายการ","exports":["DELETE","GET","PATCH"],"status":"active"},{"path":"app/api/admin/documents/[id]/route.ts","owner":"admin","layer":"api","purpose_th":"API อ่าน/แก้ไข/ลบเอกสารรายการ","exports":["DELETE","GET","PATCH"],"status":"active"},{"path":"app/api/admin/debt-trackings/[id]/draft/route.ts","owner":"admin","layer":"api","purpose_th":"API สร้าง draft สำหรับ debt tracking รายการ","exports":["GET"],"status":"active"},{"path":"app/api/admin/documents/[id]/confirm/route.ts","owner":"admin","layer":"api","purpose_th":"API ยืนยันเอกสาร","exports":["POST"],"status":"active"},{"path":"app/api/admin/partners/[id]/timeline/route.ts","owner":"admin","layer":"api","purpose_th":"ดึง summary + timeline entries ของ partner คนนั้นทั้งหมด","exports":["GET"],"status":"active"},{"path":"app/admin/partners/page.tsx","owner":"admin","layer":"ui","purpose_th":"หน้ารายชื่อคู่ค้า (ทดแทนมุมมองเอกสารเป็นศูนย์กลาง)","exports":["default"],"status":"active"},{"path":"app/admin/partners/[id]/page.tsx","owner":"admin","layer":"ui","purpose_th":"แสดงประวัติเหตุการณ์และเอกสารทั้งหมดของคู่ค้า จากปัจจุบันย้อนหลังไปถึงเหตุการณ์แรก","exports":["default"],"status":"active"},{"path":"app/observer/page.tsx","owner":"system","layer":"ui","purpose_th":"ท่อเชื่อม AI ภายนอก: วาง URL /observer ใน Gemini/ChatGPT/Claude เพื่ออ่านโครงสร้างระบบ","exports":["default"],"status":"active","access":"public_readonly"},{"path":"app/api/v1/spec/route.ts","owner":"system","layer":"api","purpose_th":"API สาธารณะ: คืน tool spec ในรูปแบบ OpenAI function-calling ให้ AI ภายนอกรู้จัก DNA OS commands","exports":["GET"],"status":"active","access":"public"},{"path":"app/api/v1/query/route.ts","owner":"system","layer":"api","purpose_th":"ท่อหลัก: รับ command + X-DNA-Token → ผ่าน Dispatcher → คืนผล; บล็อก write commands (Rule 72)","exports":["POST","OPTIONS"],"status":"active","access":"token_auth"},{"path":"app/admin/api-tokens/page.tsx","owner":"admin","layer":"ui","purpose_th":"หน้าจัดการ token สำหรับ AI ภายนอก: สร้าง token ใหม่ผูกกับอีเมล, ดูวันที่ใช้ล่าสุด, revoke","exports":["default"],"status":"active"},{"path":"app/api/admin/api-tokens/route.ts","owner":"admin","layer":"api","purpose_th":"API สำหรับ token management UI: list tokens ของ user ปัจจุบัน + สร้าง token ใหม่","exports":["GET","POST"],"status":"active"},{"path":"app/api/admin/api-tokens/[id]/route.ts","owner":"admin","layer":"api","purpose_th":"Revoke token โดย id — guard: เจ้าของเท่านั้น (email ต้องตรงกัน)","exports":["DELETE"],"status":"active"},{"path":"app/observer.json/route.ts","owner":"system","layer":"api","purpose_th":"ท่อหลักสำหรับ AI: JSON ครบทั้งระบบ มี _links ไป spec/modules/workflows/constitution/capabilities/drivers","exports":["GET"],"status":"active","access":"public"},{"path":"app/api/v1/modules/route.ts","owner":"system","layer":"api","purpose_th":"ส่ง module-registry.json ให้ AI ภายนอกรู้โครงสร้าง module ทั้งหมด","exports":["GET"],"status":"active","access":"public"},{"path":"app/api/v1/workflows/route.ts","owner":"system","layer":"api","purpose_th":"ส่ง workflow-registry.json ให้ AI ภายนอกรู้ workflow ทั้งหมด","exports":["GET"],"status":"active","access":"public"},{"path":"app/api/v1/constitution/route.ts","owner":"system","layer":"api","purpose_th":"ส่ง Constitution ให้ AI รู้กฎเหล็กทั้งหมดก่อนใช้งานระบบ","exports":["GET"],"status":"active","access":"public"},{"path":"app/api/v1/capabilities/route.ts","owner":"system","layer":"api","purpose_th":"ส่ง existence registry ให้รู้ว่า DNA OS ทำอะไรได้/ไม่ได้","exports":["GET"],"status":"active","access":"public"},{"path":"app/api/v1/drivers/route.ts","owner":"system","layer":"api","purpose_th":"ส่ง drivers registry รายการ hardware และ platform ที่ DNA OS ควบคุมได้","exports":["GET"],"status":"active","access":"public"},{"path":"app/start/page.tsx","owner":"system","layer":"ui","purpose_th":"หน้า Portal หลักสำหรับทุกคนที่ต้องการสร้างสิ่งใหม่บน DNA OS","exports":["default"],"status":"active","access":"public"},{"path":"app/examples/page.tsx","owner":"system","layer":"ui","purpose_th":"แสดงว่าแต่ละหน้าจอต้องใช้ command อะไร — สำหรับ UI designer ที่เริ่มต้น","exports":["default"],"status":"active","access":"public"},{"path":"app/playground/page.tsx","owner":"system","layer":"ui","purpose_th":"ทดลองเรียก command ผ่านเบราว์เซอร์ด้วย token — เห็นผลจริงทันที","exports":["default"],"status":"active","access":"token_auth"},{"path":"middleware.ts","owner":"middleware.ts","layer":"middleware.ts","purpose_th":"TASK-001 SSO: refresh session ของ Supabase Auth ที่ใช้ร่วมกันทุก Portal + ป้องกันหน้า/route ที่ต้อง login — ตรวจ role จริงทำที่ core/auth ไม่ใช่ที่นี่","exports":["config","middleware"],"status":"active"},{"path":"app/api/admin/transactions/route.ts","owner":"app","layer":"app","purpose_th":"แสดงรายการ transaction ทั้งหมด กรองตามค้าง/partner/ประเภทงานได้","exports":["GET","POST"],"status":"active"},{"path":"app/api/admin/transactions/[id]/route.ts","owner":"app","layer":"app","purpose_th":"ดึงข้อมูล transaction เดี่ยว พร้อม business_events และเอกสารที่ผูกอยู่","exports":["DELETE","GET","PATCH"],"status":"active"},{"path":"app/api/admin/transactions/[id]/advance/route.ts","owner":"app","layer":"app","purpose_th":"สั่งให้ transaction เดินหน้าไป state ถัดไป ผ่าน transaction state machine","exports":["POST"],"status":"active"},{"path":"app/api/admin/partners/[id]/chain/route.ts","owner":"app","layer":"app","purpose_th":"ดึงข้อมูล partner พร้อมสาย transaction/เอกสาร/event ทั้งหมด ใช้ในหน้ารายละเอียด partner","exports":["GET"],"status":"active"},{"path":"cognitive/board/index.ts","owner":"cognitive","layer":"cognitive","purpose_th":"ตัวประกอบบอร์ด — รวบรวมผลลัพธ์จากทุกส่วนเพื่อแสดงบนบอร์ด","exports":["BoardResponse","composeBoard"],"status":"active"},{"path":"cognitive/evaluation/engine.ts","owner":"cognitive","layer":"cognitive","purpose_th":"เครื่องมือวัดผล — ตรวจสอบว่าผลลัพธ์ตรงตามเกณฑ์ความสำเร็จหรือไม่","exports":["EvaluationGap","EvaluationResult","ExecutionOutput","evaluate"],"status":"active"},{"path":"cognitive/evaluation/index.ts","owner":"cognitive","layer":"cognitive","purpose_th":"ส่วนวัดผล — วัดความสำเร็จของการทำงานตามแผน","exports":["evaluate"],"status":"active"},{"path":"cognitive/executor/index.ts","owner":"cognitive","layer":"cognitive","purpose_th":"ส่วนปฏิบัติการ — ทำงานตามแผนที่วางไว้โดยเรียกใช้โมดูลต่างๆ","exports":["executePlan"],"status":"active"},{"path":"cognitive/hypothesis/engine.ts","owner":"cognitive","layer":"cognitive","purpose_th":"เครื่องมือตั้งสมมติฐาน — สร้างสมมติฐานที่เป็นไปได้","exports":["Hypothesis","generateHypotheses"],"status":"active"},{"path":"cognitive/hypothesis/index.ts","owner":"cognitive","layer":"cognitive","purpose_th":"ส่วนตั้งสมมติฐาน — สร้างสมมติฐานจากสถานะของโลกรอบตัว","exports":["generateHypotheses"],"status":"active"},{"path":"cognitive/integration.test.ts","owner":"cognitive","layer":"cognitive","purpose_th":"ชุดทดสอบ Integration สำหรับกระบวนการคิดทั้งหมด","exports":[],"status":"active"},{"path":"cognitive/intent/index.ts","owner":"cognitive","layer":"cognitive","purpose_th":"ส่วนเจตนา — จำแนกประเภทของเจตนาผู้ใช้","exports":["/* Operating Intent + Intent Catalog จะอยู่ที่นี่ */"],"status":"active"},{"path":"cognitive/knowledge/index.ts","owner":"cognitive","layer":"cognitive","purpose_th":"ส่วนความรู้ — ส่วนเชื่อมต่อกับฐานความรู้ของระบบ","exports":["/* Domain Knowledge จะอยู่ที่นี่ */"],"status":"active"},{"path":"cognitive/learning/index.ts","owner":"cognitive","layer":"cognitive","purpose_th":"ส่วนการเรียนรู้ — เรียนรู้จากผลการประเมินและวัดผล","exports":["LearningOutput","learn"],"status":"active"},{"path":"cognitive/memory/context.ts","owner":"cognitive","layer":"cognitive","purpose_th":"บริบทความจำ — เพิ่มข้อมูลแวดล้อมเพื่อให้เข้าใจสถานการณ์ดีขึ้น","exports":["Context","ExecutorResult","GoalOutput","clear","get","hasWho","hasWhoId","isSameSubject","isStale","updateFromExecutor","updateFromGoal"],"status":"active"},{"path":"cognitive/memory/index.ts","owner":"cognitive","layer":"cognitive","purpose_th":"ส่วนความจำ — จัดการหน่วยความจำสำหรับแต่ละ session","exports":["applyReflection","cancelPending","enrichWithMemory","executePending","getMemory","newSession","resetMemory","whatChanged","whatIsCurrentGoal","whatIsPending","whatWasCancelled"],"status":"active"},{"path":"cognitive/memory/session.ts","owner":"cognitive","layer":"cognitive","purpose_th":"หน่วยความจำเซสชัน — ติดตามสถานะของแต่ละเซสชันการทำงาน","exports":["SessionMemory","applyReflection","cancelPending","enrichWithMemory","executePending","getMemory","isStale","newSession","resetMemory","whatChanged","whatIsCurrentGoal","whatIsPending","whatWasCancelled"],"status":"active"},{"path":"cognitive/objective/contract.ts","owner":"cognitive","layer":"cognitive","purpose_th":"ชนิดข้อมูลเป้าหมาย — นิยามชนิดข้อมูลที่เกี่ยวกับเป้าหมาย","exports":["Objective","SessionSnapshot","createObjective"],"status":"active"},{"path":"cognitive/objective/index.ts","owner":"cognitive","layer":"cognitive","purpose_th":"ส่วนเป้าหมาย — กำหนดเป้าหมายจากข้อมูลอินพุตที่ผ่านการเสริม","exports":["createObjective","resolveObjective"],"status":"active"},{"path":"cognitive/objective/manager.test.ts","owner":"cognitive","layer":"cognitive","purpose_th":"ชุดทดสอบสำหรับผู้จัดการเป้าหมาย","exports":[],"status":"active"},{"path":"cognitive/objective/manager.ts","owner":"cognitive","layer":"cognitive","purpose_th":"ผู้จัดการเป้าหมาย — จัดการวงจรชีวิตของเป้าหมาย","exports":["EnrichedInput","Session","resolveObjective"],"status":"active"},{"path":"cognitive/pipeline.ts","owner":"cognitive","layer":"cognitive","purpose_th":"กระบวนการคิดหลักของระบบ — เจตนา → วางแผน → ปฏิบัติ → ประเมินผล → แสดงผล","exports":["runCognitivePipeline"],"status":"active"},{"path":"cognitive/planner/engine.test.ts","owner":"cognitive","layer":"cognitive","purpose_th":"ชุดทดสอบสำหรับส่วนวางแผน","exports":[],"status":"active"},{"path":"cognitive/planner/engine.ts","owner":"cognitive","layer":"cognitive","purpose_th":"เครื่องมือวางแผน — ตรรกะหลักในการค้นหาและสร้างขั้นตอนการทำงาน","exports":["Decision","ExecutionPlan","RequiredInput","RollbackStep","ToolStepPlan","WorkflowDefinition","WorkflowStep","plan"],"status":"active"},{"path":"cognitive/planner/index.ts","owner":"cognitive","layer":"cognitive","purpose_th":"ส่วนวางแผน — แปลงการตัดสินใจให้เป็นแผนการปฏิบัติงานพร้อมขั้นตอน","exports":["plan"],"status":"active"},{"path":"cognitive/priority/index.ts","owner":"cognitive","layer":"cognitive","purpose_th":"ส่วนจัดลำดับความสำคัญ — จัดลำดับการกระทำและเป้าหมาย","exports":["/* Priority Engine จะอยู่ที่นี่ */"],"status":"active"},{"path":"cognitive/reasoning/engine.test.ts","owner":"cognitive","layer":"cognitive","purpose_th":"ชุดทดสอบสำหรับส่วนหาเหตุผล","exports":[],"status":"active"},{"path":"cognitive/reasoning/engine.ts","owner":"cognitive","layer":"cognitive","purpose_th":"เครื่องมือหาเหตุผล — แปลงเป้าหมายเป็นการตัดสินใจและแผนงาน","exports":["DomainKnowledge","DomainObject","Goal","PlanStep","ReasoningOutput","Session","reason"],"status":"active"},{"path":"cognitive/reasoning/index.ts","owner":"cognitive","layer":"cognitive","purpose_th":"ส่วนหาเหตุผล — ตัดสินใจว่าจะต้องใช้เครื่องมืออะไรบ้างเพื่อบรรลุเป้าหมาย","exports":["reason"],"status":"active"},{"path":"cognitive/reflection/engine.ts","owner":"cognitive","layer":"cognitive","purpose_th":"เครื่องมือประเมินผล — สร้างข้อมูลเชิงลึกจากผลลัพธ์การทำงาน","exports":["ExecutionResult","MemoryUpdate","ReflectionOutput","StateTransition","reflect"],"status":"active"},{"path":"cognitive/reflection/index.ts","owner":"cognitive","layer":"cognitive","purpose_th":"ส่วนประเมินผล — ตรวจสอบและประเมินผลลัพธ์จากการปฏิบัติงาน","exports":["reflect"],"status":"active"},{"path":"cognitive/situation/builder.ts","owner":"cognitive","layer":"cognitive","purpose_th":"ตัวสร้างสถานการณ์ — สร้าง WorldState จากข้อมูลอินพุต","exports":["buildSituation"],"status":"active"},{"path":"cognitive/situation/entity-extractor.ts","owner":"cognitive","layer":"cognitive","purpose_th":"ตัวสกัดข้อมูล — ดึงข้อมูลสำคัญ (entity) จากอินพุต","exports":["extractEntities"],"status":"active"},{"path":"cognitive/situation/event-extractor.ts","owner":"cognitive","layer":"cognitive","purpose_th":"ตัวสกัดเหตุการณ์ — ดึงเหตุการณ์ (event) จากอินพุต","exports":["extractEvents"],"status":"active"},{"path":"cognitive/situation/index.ts","owner":"cognitive","layer":"cognitive","purpose_th":"ส่วนสถานการณ์ — ส่งออกโมดูลที่เกี่ยวกับสถานการณ์","exports":["buildSituation","extractEntities","extractEvents"],"status":"active"},{"path":"cognitive/state/constraint-engine.ts","owner":"cognitive","layer":"cognitive","purpose_th":"เครื่องมือตรวจสอบข้อจำกัด — ตรวจสอบว่าสถานะปัจจุบันเป็นไปตามข้อจำกัดหรือไม่","exports":["checkConstraints"],"status":"active"},{"path":"cognitive/state/index.ts","owner":"cognitive","layer":"cognitive","purpose_th":"ส่วนสถานะ — ส่งออกโมดูลที่เกี่ยวกับสถานะทั้งหมด","exports":["buildResourceGraph","buildTimeline","buildWorldState","checkConstraints"],"status":"active"},{"path":"cognitive/state/resource-graph.ts","owner":"cognitive","layer":"cognitive","purpose_th":"กราฟทรัพยากร — แสดงความสัมพันธ์ระหว่างทรัพยากรต่างๆ","exports":["buildResourceGraph"],"status":"active"},{"path":"cognitive/state/timeline.ts","owner":"cognitive","layer":"cognitive","purpose_th":"เส้นเวลา — แสดงลำดับเวลาของเหตุการณ์ที่เกิดขึ้น","exports":["buildTimeline"],"status":"active"},{"path":"cognitive/state/types.ts","owner":"cognitive","layer":"cognitive","purpose_th":"ชนิดข้อมูลสถานะ — นิยาม WorldState และ SituationInput","exports":["Constraint","ConstraintType","Entity","EntityType","EventType","RelationType","ResourceEdge","ResourceGraph","SituationEvent","SituationInput","Timeline","WorldState"],"status":"active"},{"path":"cognitive/state/world-state.ts","owner":"cognitive","layer":"cognitive","purpose_th":"สถานะโลก — ภาพรวมของสถานะทั้งหมด ณ เวลานั้นๆ","exports":["buildWorldState"],"status":"active"},{"path":"core/config/company-settings.ts","owner":"core","layer":"core","purpose_th":"ตั้งค่าบริษัท — ชื่อ, ที่อยู่, เลขภาษี โหลดจาก Supabase","exports":["CompanySettings","loadCompanySettings","saveCompanySettings"],"status":"active"},{"path":"core/executor/audit.ts","owner":"core","layer":"core","purpose_th":"ล็อกการตรวจสอบ — บันทึกทุกขั้นตอนการทำงานของ workflow","exports":["record","recent","clear"],"status":"active"},{"path":"core/executor/engine.ts","owner":"core","layer":"core","purpose_th":"เครื่องมือ Workflow — โหลดทะเบียน JSON, แบ่งเป็นขั้นตอน, และส่งให้ Driver ทำงาน","exports":["getWorkflow","execute","listWorkflows"],"status":"active"},{"path":"core/executor/init.ts","owner":"core","layer":"core","purpose_th":"ลงทะเบียนไดรเวอร์ทั้งหมดเข้าสู่ระบบโดยอัตโนมัติ","exports":[],"status":"active"},{"path":"core/executor/registry.ts","owner":"core","layer":"core","purpose_th":"ทะเบียนไดรเวอร์ — ลงทะเบียน, ค้นหา, และแสดงรายการไดรเวอร์สำหรับโปรแกรมบน macOS","exports":["register","get","list","has"],"status":"active"},{"path":"core/runtime/dbd.ts","owner":"core","layer":"core","purpose_th":"ผู้ช่วย DBD — ตอบคำถามอิสระจากข้อมูลจริงใน registry/infrastructure เท่านั้น ห้ามเดา ใช้ทั้งจาก CLI (npm run dbd) และ API","exports":["answerQuestion"],"status":"active"},{"path":"core/runtime/engine.ts","owner":"core","layer":"core","purpose_th":"เครื่องยนต์ Runtime — โหลดทะเบียน, ค้นหาโมดูล, รันคำสั่ง, และกระจายเหตุการณ์","exports":["createResult","dispatchEvent","executeCommand","getEventsByTrace","getRecentEvents","loadRegistry","registerCommand","resolveModule"],"status":"active"},{"path":"core/runtime/existence-intelligence.ts","owner":"core","layer":"core","purpose_th":"วิเคราะห์ Existence Intelligence 16 ชั้น จาก existence.json","exports":["runExistenceIntelligence"],"status":"active"},{"path":"core/runtime/self-awareness.ts","owner":"core","layer":"core","purpose_th":"Self-Awareness — ระบบรู้จักตัวเอง อธิบาย DNA ของตัวเอง","exports":["getDiagnosisJSON","runDiagnosis","runExistenceIntelligence"],"status":"active"},{"path":"core/runtime/trace.ts","owner":"core","layer":"core","purpose_th":"การติดตามคำขอ — บันทึกทุกขั้นตอนของคำขอเพื่อให้สามารถเล่นซ้ำได้","exports":["DataSource","RequestTrace","TraceStep","addStep","completeTrace","getRecentTraces","getTrace","replayTrace","setIntent","startTrace","traceLineage"],"status":"active"},{"path":"core/shared/types.ts","owner":"core","layer":"core","purpose_th":"ศูนย์กลางชนิดข้อมูล (Types) สำหรับทั้งระบบ","exports":["AppDriver","AppStatus","AuditEntry","AuditTrail","BusinessEvent","BusinessEventType","Command","CommandEntry","CommandMatch","CommandResult","DebtStatus","PartnerSummary","PartnerTimelineEntry","RuntimeCommand","RuntimeEvent","RuntimeResult","StepResult","TimelineEntryKind","Transaction","TxState","TxType","ViewMode","WorkflowDef","WorkflowResult","round"],"status":"active"},{"path":"engines/business.ts","owner":"engines","layer":"engines","purpose_th":"เครื่องยนต์ธุรกิจ — คำนวณราคา, หนี้, ภาษี และลงทะเบียนคำสั่งเข้าสู่ Runtime","exports":["loadBusinessRules","calculatePrice","calculateDebt","calculateTax","registerBusinessCommands"],"status":"active"},{"path":"engines/capacity.ts","owner":"engines","layer":"engines","purpose_th":"คำนวณจำนวนเที่ยวที่ต้องวิ่งจากปริมาณสินค้าและความจุของรถ","exports":["CapacityInput","CapacityResult","calcCapacity"],"status":"active"},{"path":"engines/cost.ts","owner":"engines","layer":"engines","purpose_th":"คำนวณต้นทุนรวมทั้งหมด (ค่าวัสดุ, ค่าน้ำมัน, และค่าแรง)","exports":["CostInput","CostResult","calcCost"],"status":"active"},{"path":"engines/debt/calculator.ts","owner":"engines","layer":"engines","purpose_th":"คำนวณยอดหนี้รวม ณ วันที่กำหนด (เงินต้น, ค่าธรรมเนียม, ดอกเบี้ย, ค่าทวงถาม, หักยอดชำระแล้ว)","exports":["DebtSummaryInput","DebtSummary","calcDebtSummary"],"status":"active"},{"path":"engines/debt/collection.ts","owner":"engines","layer":"engines","purpose_th":"คำนวณค่าทวงถาม โดยมีเพดานสูงสุดตามที่กฎหมายกำหนด","exports":["CollectionFeeInput","CollectionFeeResult","calcCollectionFee"],"status":"active"},{"path":"engines/debt/engine.ts","owner":"engines","layer":"engines","purpose_th":"เครื่องยนต์จัดการหนี้หลัก — รวมการคำนวณสถานะ, ดอกเบี้ย, ค่าทวงถาม, และยอดรวม","exports":["DebtCalcInput","DebtCalcResult","applyTransition","buildTransitionChain","calcCollectionFee","calcCompoundInterest","calcDaysOverdue","calcDebtFull","calcDebtSummary","canAccrueInterest","canChargeCollectionFee","checkBatch","checkDebtSchedule","checkOverdue","isTerminal","nextStatus"],"status":"active"},{"path":"engines/debt/interest.ts","owner":"engines","layer":"engines","purpose_th":"คำนวณดอกเบี้ยแบบทบต้น และจำนวนวันที่ค้างชำระ","exports":["InterestInput","InterestResult","calcCompoundInterest","calcDaysOverdue"],"status":"active"},{"path":"engines/debt/overdue.ts","owner":"engines","layer":"engines","purpose_th":"ตรวจสอบว่าหนี้ถึงกำหนดชำระแล้วหรือยัง และเลยช่วงผ่อนผันไปแล้วหรือไม่","exports":["OverdueCheck","checkOverdue"],"status":"active"},{"path":"engines/debt/scheduler.ts","owner":"engines","layer":"engines","purpose_th":"ระบบตั้งเวลาตรวจหนี้ — ตรวจสอบหนี้ที่ครบกำหนดและสร้าง Event เปลี่ยนสถานะอัตโนมัติ","exports":["DebtRecord","SchedulerResult","checkDebtSchedule","checkBatch"],"status":"active"},{"path":"engines/debt/status.ts","owner":"engines","layer":"engines","purpose_th":"ระบบสถานะหนี้ — จัดการ 7 สถานะของหนี้และการเปลี่ยนสถานะตามเหตุการณ์","exports":["DebtStatus","StatusTransition","nextStatus","isTerminal","canAccrueInterest","canChargeCollectionFee"],"status":"active"},{"path":"engines/debt/tracking.ts","owner":"engines","layer":"engines","purpose_th":"คำนวณ tracking สถานะหนี้ — ดอกเบี้ย, งวด, ยอดค้าง","exports":["DEBT_TRACKING_GRACE_DAYS","DEBT_TRACKING_INTEREST_RATE","DEBT_TRACKING_PENALTY_PER_DAY","DebtTrackingInput","DebtTrackingSummary","calcDebtTrackingSummary"],"status":"active"},{"path":"engines/debt/transition.ts","owner":"engines","layer":"engines","purpose_th":"เปลี่ยนสถานะหนี้ตามเหตุการณ์ และสร้างประวัติการเปลี่ยนแปลงสถานะ","exports":["TransitionEvent","TransitionResult","applyTransition","buildTransitionChain"],"status":"active"},{"path":"engines/distance.ts","owner":"engines","layer":"engines","purpose_th":"คำนวณระยะทางด้วยสูตร Haversine และค้นหาบ่อวัสดุที่ใกล้ที่สุด","exports":["DistanceInput","DistanceResult","calcDistance","findNearestPit","haversine"],"status":"active"},{"path":"engines/documents/debt-notice-draft.ts","owner":"engines","layer":"engines","purpose_th":"สร้าง draft หนังสือแจ้งหนี้จาก template","exports":["buildDebtNoticeDraft"],"status":"active"},{"path":"engines/documents/document-editor.ts","owner":"engines","layer":"engines","purpose_th":"Editor สำหรับแก้ไขเอกสาร","exports":["DOCUMENT_TYPE_META","DOCUMENT_TYPE_ORDER","DOCUMENT_UNIT_OPTIONS","DocumentCustomer","DocumentDebtInfo","DocumentDraftInput","DocumentLineItem","DocumentStatus","DocumentTotals","DocumentType","DocumentTypeMeta","VAT_RATE","VatMode","calculateDocumentTotals","createEmptyDocumentDraft","draftToDocData","formatMoney","mapPartnerToCustomer","roundMoney","toThaiDate"],"status":"active"},{"path":"engines/documents/draft-builders.ts","owner":"engines","layer":"engines","purpose_th":"สร้าง DocumentDraftInput จากข้อมูล partner/เอกสารที่มีอยู่แล้ว เพื่อ pre-fill ฟอร์มสร้างเอกสาร ไม่ต้องกรอกซ้ำ","exports":["NEXT_DOC_SUGGESTIONS","buildDraftFromDocument","buildDraftFromPartner"],"status":"active"},{"path":"engines/documents/engine.ts","owner":"engines","layer":"engines","purpose_th":"เครื่องมือสร้างเอกสาร — โหมดการแสดงผลแบบเข้มงวด, ใช้ template เดียวสำหรับทุกประเภทเอกสาร","exports":["DocType","DOC_LABELS","DocItem","DocEvent","DocData","DocResult","generateDoc"],"status":"active"},{"path":"engines/documents/template.ts","owner":"engines","layer":"engines","purpose_th":"Template engine สำหรับสร้างเอกสาร","exports":["RenderInput","renderDocument"],"status":"active"},{"path":"engines/fuel.ts","owner":"engines","layer":"engines","purpose_th":"คำนวณต้นทุนค่าน้ำมัน (จากระยะทาง, อัตราสิ้นเปลือง, และราคาต่อลิตร)","exports":["FuelInput","FuelResult","calcFuel"],"status":"active"},{"path":"engines/impact/engine.ts","owner":"engines","layer":"engines","purpose_th":"คำนวณการ์ดผลกระทบธุรกิจจริง (การเงิน/ปฏิบัติการ) จาก debt_trackings และ jobs เท่านั้น ห้าม hardcode ตัวเลข","exports":["ImpactCard","getBusinessImpact","getFinancialImpact","getOperationalImpact"],"status":"active"},{"path":"engines/index.ts","owner":"engines","layer":"engines","purpose_th":"ส่งออก Engine ทั้งหมดอีกครั้ง และรวมกระบวนการคำนวณใบเสนอราคาเต็มรูปแบบ","exports":["QuoteInput","QuoteResult","STALENESS_HOURS","assertAllKnown","assertNotStale","calcCapacity","calcCompoundInterest","calcCost","calcDaysOverdue","calcDebtFull","calcDistance","calcFuel","calcFullQuote","calcPricing","calcTax","calcTime","calculateDebt","calculatePrice","checkOverdue","effectiveCapacity","findNearestPit","getConfigUpdatedAt","loadBusinessRules","loadConfigs","nextStatus","selectVehicle"],"status":"active"},{"path":"engines/partner/timeline.ts","owner":"engines","layer":"engines","purpose_th":"รวมข้อมูลเอกสารและ business events ของคู่ค้าให้เป็น timeline เรียงตามวันที่","exports":["buildPartnerTimeline","buildPartnerSummary"],"status":"active"},{"path":"engines/pricing.ts","owner":"engines","layer":"engines","purpose_th":"คำนวณราคาขาย (จากต้นทุน, ส่วนเพิ่ม, ค่าธรรมเนียมระบบ, และค่างานด่วน)","exports":["PricingInput","PricingResult","calcPricing"],"status":"active"},{"path":"engines/tax.ts","owner":"engines","layer":"engines","purpose_th":"คำนวณภาษีมูลค่าเพิ่ม (VAT) และภาษีหัก ณ ที่จ่าย","exports":["TaxInput","TaxResult","calcTax"],"status":"active"},{"path":"engines/time.ts","owner":"engines","layer":"engines","purpose_th":"คำนวณเวลาที่ใช้ในการขนส่ง (รวมเวลาเดินทางไป-กลับ และเวลาขึ้นลงของ)","exports":["TimeInput","TimeResult","calcTime"],"status":"active"},{"path":"engines/transactions/document-link.ts","owner":"engines","layer":"engines","purpose_th":"ตัดสินว่าเอกสารที่สร้างใหม่ควรผูกกับ tx_type ไหน และควร advance state ของ transaction ไปถึงขั้นไหน","exports":["DOC_LINK_RULES","DocLinkRule","buildAutoTitle","getLinkRule","shouldAdvance"],"status":"active"},{"path":"engines/transactions/state-machine.ts","owner":"engines","layer":"engines","purpose_th":"ตัวห่อบางๆ เหนือ Workflow Registry — ใช้หา state ถัดไปของ transaction เมื่อเกิด event","exports":["getAvailableActions","getWorkflow","isFinalEvent","isPendingEvent","resolveTransition","type ExpectedDoc","type TxEvent","type TxType","type TxWorkflow","type WorkflowStep"],"status":"active"},{"path":"engines/transactions/workflows.ts","owner":"engines","layer":"engines","purpose_th":"ทะเบียน workflow ของแต่ละประเภทธุรกรรม (tx_type) — ลำดับขั้นตอนอ่านจากที่นี่ที่เดียว ไม่ hardcode ใน UI","exports":["ExpectedDoc","TX_TYPE_LABELS","TX_TYPE_ORDER","TxEvent","TxType","TxWorkflow","WORKFLOWS","WorkflowStep","getNextStep","getStepIndex","getWorkflow","isFinalEvent","isPendingEvent"],"status":"active"},{"path":"engines/validation/dispatcher.ts","owner":"engines","layer":"engines","purpose_th":"ผู้จ่ายงาน — ผู้บังคับใช้กฎ อ่านทะเบียนและบังคับใช้ filter, การยืนยัน, และการตรวจสอบข้อมูล","exports":["DispatchResult","dispatch","getCommandDef","isRegistered","listCommands","validateInput"],"status":"active"},{"path":"gateway/actions.ts","owner":"gateway","layer":"gateway","purpose_th":"API สำหรับ Action — จัดการรูปแบบ preview/execute สำหรับการชำระเงิน, สร้างเอกสาร, สร้างหนี้ พร้อมการป้องกันด้วย token","exports":["ActionRequest","ActionResponse","previewPayment","executePayment","previewDocumentCreate","executeDocumentCreate","previewDebtCreate","executeDebtCreate","dispatchAction"],"status":"active"},{"path":"gateway/index.ts","owner":"gateway","layer":"gateway","purpose_th":"ประตูข้อมูล — เป็นประตูเดียวสำหรับเขียนข้อมูลลง DB (ตามกฎข้อ 71) โดยเรียกใช้จาก v2-rules/actions","exports":["dispatchAction","executeDebtCreate","executeDocumentCreate","executePayment","previewDebtCreate","previewDocumentCreate","previewPayment","type ActionRequest","type ActionResponse"],"status":"active"},{"path":"plugins/capabilities.ts","owner":"plugins","layer":"plugins","purpose_th":"ทะเบียนความสามารถ — ลงทะเบียนเครื่องมือภายนอกที่เชื่อมต่อได้ (เช่น LINE, Maps, Drive)","exports":["CapabilityType","ToolStatus","Tool","CAPABILITIES","TOOLS","getToolsByCapability","getConnectedTools","findTool","getStatusColor","getStatusLabel"],"status":"active"},{"path":"plugins/capability-manager.ts","owner":"plugins","layer":"plugins","purpose_th":"ผู้จัดการความสามารถ — จัดการการเรียกใช้ความสามารถโดยไม่ขึ้นกับยี่ห้อ และมีระบบสำรองอัตโนมัติ","exports":["CapabilityAction","CapabilityResult","executeCapability","getCapabilityInfo","listAllCapabilities","listReadCapabilities","listWriteCapabilities"],"status":"active"},{"path":"plugins/drivers/base.ts","owner":"plugins","layer":"plugins","purpose_th":"ไดรเวอร์พื้นฐาน — กำหนดมาตรฐานการ เปิด/โฟกัส/ปิด/ตรวจสอบสถานะ สำหรับทุกโปรแกรมบน macOS","exports":["BaseDriver","ok","fail"],"status":"active"},{"path":"plugins/drivers/calendar.ts","owner":"plugins","layer":"plugins","purpose_th":"ไดรเวอร์ Calendar — ควบคุมโปรแกรม Apple Calendar ผ่าน AppleScript","exports":["default"],"status":"active"},{"path":"plugins/drivers/chrome.ts","owner":"plugins","layer":"plugins","purpose_th":"ไดรเวอร์ Chrome — ควบคุมโปรแกรม Google Chrome ผ่าน AppleScript","exports":["default"],"status":"active"},{"path":"plugins/drivers/earth.ts","owner":"plugins","layer":"plugins","purpose_th":"ไดรเวอร์ Google Earth — ควบคุมโปรแกรม Google Earth Pro ผ่าน AppleScript","exports":["default"],"status":"active"},{"path":"plugins/drivers/finder.ts","owner":"plugins","layer":"plugins","purpose_th":"ไดรเวอร์ Finder — ควบคุมโปรแกรม Finder ของ macOS ผ่าน AppleScript","exports":["default"],"status":"active"},{"path":"plugins/drivers/github.ts","owner":"plugins","layer":"plugins","purpose_th":"ไดรเวอร์ GitHub Desktop — ควบคุมโปรแกรม GitHub Desktop ผ่าน AppleScript","exports":["default"],"status":"active"},{"path":"plugins/drivers/line.ts","owner":"plugins","layer":"plugins","purpose_th":"ไดรเวอร์ LINE — ควบคุมโปรแกรม LINE บน Desktop ผ่าน AppleScript","exports":["default"],"status":"active"},{"path":"plugins/drivers/mail.ts","owner":"plugins","layer":"plugins","purpose_th":"ไดรเวอร์ Mail — ควบคุมโปรแกรม Apple Mail ผ่าน AppleScript","exports":["default"],"status":"active"},{"path":"plugins/drivers/maps.ts","owner":"plugins","layer":"plugins","purpose_th":"ไดรเวอร์ Google Maps — เปิดและค้นหาแผนที่ผ่าน URL","exports":["default"],"status":"active"},{"path":"plugins/drivers/pdf.ts","owner":"plugins","layer":"plugins","purpose_th":"ไดรเวอร์ PDF — ควบคุมโปรแกรม Preview สำหรับดู PDF ผ่าน AppleScript","exports":["default"],"status":"active"},{"path":"plugins/drivers/terminal.ts","owner":"plugins","layer":"plugins","purpose_th":"ไดรเวอร์ Terminal — ควบคุมโปรแกรม Terminal ของ macOS ผ่าน AppleScript","exports":["default"],"status":"active"},{"path":"plugins/drivers/vscode.ts","owner":"plugins","layer":"plugins","purpose_th":"ไดรเวอร์ VS Code — ควบคุมโปรแกรม Visual Studio Code ผ่าน AppleScript และ CLI","exports":["default"],"status":"active"},{"path":"plugins/executor.ts","owner":"plugins","layer":"plugins","purpose_th":"ส่วนปฏิบัติการ V6 — เป็น Layer เดียวที่ได้รับอนุญาตให้เขียนข้อมูลลงฐานข้อมูลได้","exports":["ExecuteRequest","ExecuteResult","execute"],"status":"active"},{"path":"plugins/index.ts","owner":"plugins","layer":"plugins","purpose_th":"ส่งออกโมดูล V6 ทั้งหมดอีกครั้ง (ส่วนปฏิบัติการ, ความสามารถ, และผู้จัดการความสามารถ)","exports":["CAPABILITIES","TOOLS","execute","executeCapability","findTool","getCapabilityInfo","getConnectedTools","getStatusColor","getStatusLabel","getToolsByCapability","listAllCapabilities","listReadCapabilities","listWriteCapabilities"],"status":"active"},{"path":"plugins/line/line.ts","owner":"plugins","layer":"plugins","purpose_th":"ไดรเวอร์ LINE (Node.js) — เป็นตัวกลางสำหรับเรียกใช้ binary ของ line-driver","exports":["default"],"status":"active"},{"path":"plugins/platform/mac/accessibility.ts","owner":"plugins","layer":"plugins","purpose_th":"ส่วนปฏิบัติการ Accessibility — จัดการการ คลิก/พิมพ์/กดปุ่ม/เลื่อน/อ่านหน้าจอ","exports":["click","typeText","pressKey","scroll","readWindow"],"status":"active"},{"path":"plugins/platform/mac/app-executor.ts","owner":"plugins","layer":"plugins","purpose_th":"ส่วนปฏิบัติการโปรแกรม — จัดการการ เปิด/ปิด/ตรวจสอบสถานะ/รอ โปรแกรม","exports":["open","close","isRunning","waitReady"],"status":"active"},{"path":"plugins/platform/mac/applescript.ts","owner":"plugins","layer":"plugins","purpose_th":"ตัวรัน AppleScript — เป็นจุดเดียวที่เรียกใช้ child_process สำหรับคำสั่งบน macOS","exports":["MacResult","runScript","runShell","esc"],"status":"active"},{"path":"plugins/platform/mac/mac-platform.ts","owner":"plugins","layer":"plugins","purpose_th":"จุดเริ่มต้นของ Platform Layer (macOS) — ส่ง action ไปยังส่วนปฏิบัติการที่ถูกต้อง","exports":["ActionInfo","ActionName","checkPermission","executeAction","executeActions","getActionInfo","isLocalMac","listActions","openSettings"],"status":"active"},{"path":"plugins/platform/mac/permissions.ts","owner":"plugins","layer":"plugins","purpose_th":"ตัวตรวจสอบสิทธิ์บน macOS — ตรวจสอบสิทธิ์การเข้าถึง, automation, และการบันทึกหน้าจอ","exports":["PermissionName","checkPermission","openSettings"],"status":"active"},{"path":"plugins/platform/mac/shortcuts.ts","owner":"plugins","layer":"plugins","purpose_th":"ส่วนปฏิบัติการ Shortcuts — สั่งรัน Shortcut ผ่าน CLI ของ macOS","exports":["run","list"],"status":"active"},{"path":"plugins/platform/mac/url-schemes.ts","owner":"plugins","layer":"plugins","purpose_th":"ส่วนปฏิบัติการ URL Scheme — เปิดโปรแกรมผ่าน URL scheme (เช่น line://, vscode://)","exports":["open","openByScheme"],"status":"active"},{"path":"plugins/platform/mac/window-executor.ts","owner":"plugins","layer":"plugins","purpose_th":"ส่วนปฏิบัติการหน้าต่าง — จัดการการ โฟกัส/แสดงรายการ/จับภาพ/ทำ OCR","exports":["focus","list","capture","captureWindow","ocr"],"status":"active"},{"path":"plugins/runtime/platform.ts","owner":"plugins","layer":"plugins","purpose_th":"การตรวจจับแพลตฟอร์ม — ตรวจสอบว่ากำลังทำงานบน macOS หรือไม่ (ปลอดภัยสำหรับเบราว์เซอร์)","exports":["isLocalMac"],"status":"active"},{"path":"plugins/runtime/shell.ts","owner":"plugins","layer":"plugins","purpose_th":"ตัวรัน Shell/AppleScript — เป็นจุดเดียวที่เรียกใช้ child_process","exports":["shell","osascript","openApp","openUrl","isProcessRunning","waitUntilRunning","esc"],"status":"active"},{"path":"presenter/enricher.ts","owner":"presenter","layer":"presenter","purpose_th":"เสริมข้อมูลดิบ — เพิ่มข้อมูลวัสดุ, ราคา, หรือระยะทางจากฐานข้อมูล","exports":["EnrichedRecord","enrichPitResults","enrichPartnerResults"],"status":"active"},{"path":"presenter/explainer.ts","owner":"presenter","layer":"presenter","purpose_th":"เครื่องคำนวณที่อธิบายได้ — ทุกตัวเลขสามารถตอบได้ว่า มาจากไหน, คำนวณอย่างไร, และอัปเดตเมื่อไหร่","exports":["TracedValue","ExplainedQuote","explainQuote"],"status":"active"},{"path":"presenter/formatter.ts","owner":"presenter","layer":"presenter","purpose_th":"จัดรูปแบบผลลัพธ์ให้อยู่ในโครงสร้างที่ UI นำไปใช้แสดงผลได้ง่าย","exports":["FormattedItem","FormattedResult","formatDebtResults","formatDocumentCreateResult","formatPartnerResults","formatPitResults"],"status":"active"},{"path":"presenter/index.ts","owner":"presenter","layer":"presenter","purpose_th":"ส่งออกโมดูลสำหรับจัดรูปแบบการแสดงผลทั้งหมดอีกครั้ง","exports":["enrichPitResults","enrichPartnerResults","formatPitResults","formatPartnerResults","formatDebtResults","detectRankContext","rankResults","EnrichedRecord","FormattedResult","FormattedItem","RankPolicy","RankContext"],"status":"active"},{"path":"presenter/ranker.ts","owner":"presenter","layer":"presenter","purpose_th":"จัดอันดับผลลัพธ์ตามบริบท เช่น เรียงตามระยะทาง, ราคา, หรือชื่อ","exports":["RankPolicy","RankContext","detectRankContext","rankResults"],"status":"active"},{"path":"services/ai/bridge-local.ts","owner":"services","layer":"services","purpose_th":"สะพานเชื่อม AI (Local) — แปลภาษาไทยเป็นคำสั่ง JSON ด้วยการจับคู่คีย์เวิร์ด","exports":["BridgeCommand","BridgeResult","translate"],"status":"active"},{"path":"services/ai/bridge-openai.ts","owner":"services","layer":"services","purpose_th":"สะพานเชื่อม AI (OpenAI) — ใช้ GPT-4o-mini แปลภาษาไทยเป็นคำสั่ง JSON","exports":["translateWithAI"],"status":"active"},{"path":"services/ai/translator.ts","owner":"services","layer":"services","purpose_th":"ชั้นแปลภาษาด้วย AI — แปลเจตนาและข้อมูลจากภาษาไทย และลงทะเบียนคำสั่งเข้าสู่ Runtime","exports":["Entity","Intent","TranslationResult","translate"],"status":"active"},{"path":"services/middleware/sanitize.ts","owner":"services","layer":"services","purpose_th":"Middleware กรองข้อมูล — ป้องกันการโจมตีแบบ XSS และ SQL injection","exports":["sanitizeText","sanitizeHtml"],"status":"active"},{"path":"services/supabase/api-tokens.ts","owner":"services","layer":"services","purpose_th":"จัดการ token สำหรับ AI ภายนอก: validate, list, สร้างใหม่, revoke — ผ่าน service role key เท่านั้น","exports":["validateApiToken","listTokensForEmail","createApiToken","revokeApiToken","ApiToken"],"status":"active"},{"path":"services/supabase/realtime.ts","owner":"services","layer":"services","purpose_th":"ส่วนจัดการ Realtime Subscription ของ Supabase สำหรับตาราง payments, debts, documents","exports":["subscribePayments"],"status":"active"},{"path":"services/supabase/state-cache.ts","owner":"services","layer":"services","purpose_th":"แคชสถานะการแสดงผล — ใช้ Supabase เป็นที่เก็บสถานะสำหรับ Serverless","exports":["DisplayState","getDisplayState","setDisplayState"],"status":"active"},{"path":"engines/vehicle-selector.ts","owner":"engines","layer":"engines","purpose_th":"กฎเลือกรถบรรทุกตามระยะทาง (หกล้อ/สิบล้อ/พ่วง) ตามช่วง <=30 / 31-100 / >100 กม. และ effectiveCapacity() แปลง spec รถ + ความหนาแน่นวัสดุ เป็นปริมาณบรรทุกจริงที่ใช้ได้","exports":["VehicleSelectorInput","VehicleSelectorResult","VehicleSpec","effectiveCapacity","selectVehicle"],"status":"active"},{"path":"core/config-loader.ts","owner":"core","layer":"core","purpose_th":"โหลดกฎธุรกิจจากตาราง app_configs พร้อมระบบแคช 60 วินาที","exports":["AuditTrail","RulesConfig","STALENESS_HOURS","SourceTag","VerifiedValue","assertAllKnown","assertNotStale","audit","clearConfigCache","getConfigUpdatedAt","getNum","getStr","loadConfigs"],"status":"active"},{"path":"config/system-links.ts","owner":"config","layer":"config","purpose_th":"[ตรวจพบอัตโนมัติ] config/system-links.ts","exports":["SYSTEM_LINKS","SystemLinkGroup","SystemLinkItem"],"status":"unregistered"},{"path":"services/supabase/queries.ts","owner":"services","layer":"services","purpose_th":"ส่วนเชื่อมต่อ Supabase และฟังก์ชันสำหรับดึงข้อมูลจากทุกตาราง","exports":["canonicalDocumentType","createDebtTracking","createDocument","deleteDebtTracking","documentTypeVariants","getAllDebts","getBusinessEventsByPartner","getDebtTrackingById","getDebtTrackings","getDebtorPartners","getDebtsByCustomerName","getDocumentTypeCounts","getDocuments","getDocumentsByPartner","getFirstInvoiceForPartner","getJobs","getLatestInvoice","getMaterialTypes","getOpenDebts","getPartnerById","getPartnerByName","getPartners","getPartnersWithDocumentSummary","getPendingDrafts","getReceipts","getTransactionById","getTransactions","supabase","supabaseAdmin","updateDebtTracking"],"status":"active"},{"path":"supabase/functions/line-webhook-v2/middleware/signature.ts","owner":"supabase","layer":"supabase","purpose_th":"[ตรวจพบอัตโนมัติ] supabase/functions/line-webhook-v2/middleware/signature.ts","exports":["verifyLineSignature"],"status":"unregistered"},{"path":"supabase/functions/line-webhook-v2/handlers/unfollow.ts","owner":"supabase","layer":"supabase","purpose_th":"[ตรวจพบอัตโนมัติ] supabase/functions/line-webhook-v2/handlers/unfollow.ts","exports":["handleUnfollow"],"status":"unregistered"},{"path":"supabase/functions/line-webhook-v2/handlers/text.ts","owner":"supabase","layer":"supabase","purpose_th":"[ตรวจพบอัตโนมัติ] supabase/functions/line-webhook-v2/handlers/text.ts","exports":["handleText"],"status":"unregistered"},{"path":"supabase/functions/line-webhook-v2/handlers/postback.ts","owner":"supabase","layer":"supabase","purpose_th":"[ตรวจพบอัตโนมัติ] supabase/functions/line-webhook-v2/handlers/postback.ts","exports":["handlePostback"],"status":"unregistered"},{"path":"supabase/functions/line-webhook-v2/handlers/location.ts","owner":"supabase","layer":"supabase","purpose_th":"[ตรวจพบอัตโนมัติ] supabase/functions/line-webhook-v2/handlers/location.ts","exports":["handleLocation","parseThaiAddress"],"status":"active"},{"path":"supabase/functions/line-webhook-v2/handlers/image.ts","owner":"supabase","layer":"supabase","purpose_th":"[ตรวจพบอัตโนมัติ] supabase/functions/line-webhook-v2/handlers/image.ts","exports":["handleImage"],"status":"unregistered"},{"path":"supabase/functions/line-webhook-v2/handlers/group.ts","owner":"supabase","layer":"supabase","purpose_th":"[ตรวจพบอัตโนมัติ] supabase/functions/line-webhook-v2/handlers/group.ts","exports":["handleGroup"],"status":"unregistered"},{"path":"supabase/functions/line-webhook-v2/handlers/follow.ts","owner":"supabase","layer":"supabase","purpose_th":"[ตรวจพบอัตโนมัติ] supabase/functions/line-webhook-v2/handlers/follow.ts","exports":["handleFollow"],"status":"unregistered"},{"path":"supabase/functions/line-webhook-v2/handlers/fallback.ts","owner":"supabase","layer":"supabase","purpose_th":"[ตรวจพบอัตโนมัติ] supabase/functions/line-webhook-v2/handlers/fallback.ts","exports":["handleFallback"],"status":"unregistered"},{"path":"supabase/functions/line-webhook-v2/events/types.ts","owner":"supabase","layer":"supabase","purpose_th":"[ตรวจพบอัตโนมัติ] supabase/functions/line-webhook-v2/events/types.ts","exports":["HandlerContext","LineBaseEvent","LineEvent","LineFollowEvent","LineImageMessage","LineLocationMessage","LineMessage","LineMessageEvent","LinePostbackEvent","LineSource","LineTextMessage","LineUnfollowEvent","LineWebhookPayload"],"status":"unregistered"},{"path":"supabase/functions/line-webhook-v2/events/store.ts","owner":"supabase","layer":"supabase","purpose_th":"[ตรวจพบอัตโนมัติ] supabase/functions/line-webhook-v2/events/store.ts","exports":["SaveEventInput","SavedEvent","markEventError","markEventProcessed","saveEvent"],"status":"unregistered"},{"path":"app/api/admin/pulse/route.ts","owner":"app","layer":"app","purpose_th":"[ตรวจพบอัตโนมัติ] app/api/admin/pulse/route.ts","exports":["GET"],"status":"unregistered"},{"path":"app/api/admin/backup/route.ts","owner":"app","layer":"app","purpose_th":"[ตรวจพบอัตโนมัติ] app/api/admin/backup/route.ts","exports":["GET","POST"],"status":"unregistered"},{"path":"supabase/functions/line-webhook-v2/templates/quick-reply/vehicle-select.ts","owner":"supabase","layer":"supabase","purpose_th":"[ตรวจพบอัตโนมัติ] supabase/functions/line-webhook-v2/templates/quick-reply/vehicle-select.ts","exports":["vehicleSelectQuickReply"],"status":"unregistered"},{"path":"supabase/functions/line-webhook-v2/templates/quick-reply/confirm-job.ts","owner":"supabase","layer":"supabase","purpose_th":"[ตรวจพบอัตโนมัติ] supabase/functions/line-webhook-v2/templates/quick-reply/confirm-job.ts","exports":["confirmJobQuickReply"],"status":"unregistered"},{"path":"supabase/functions/line-webhook-v2/templates/flex/location-received.ts","owner":"supabase","layer":"supabase","purpose_th":"[ตรวจพบอัตโนมัติ] supabase/functions/line-webhook-v2/templates/flex/location-received.ts","exports":["locationReceivedFlex"],"status":"unregistered"},{"path":"supabase/functions/line-webhook-v2/templates/flex/job-status-card.ts","owner":"supabase","layer":"supabase","purpose_th":"[ตรวจพบอัตโนมัติ] supabase/functions/line-webhook-v2/templates/flex/job-status-card.ts","exports":["jobStatusCardFlex"],"status":"unregistered"},{"path":"supabase/functions/line-webhook-v2/templates/flex/boq-card.ts","owner":"supabase","layer":"supabase","purpose_th":"[ตรวจพบอัตโนมัติ] supabase/functions/line-webhook-v2/templates/flex/boq-card.ts","exports":["boqCardFlex"],"status":"unregistered"},{"path":"app/api/admin/partners/[id]/credit/route.ts","owner":"app","layer":"app","purpose_th":"[ตรวจพบอัตโนมัติ] app/api/admin/partners/[id]/credit/route.ts","exports":["GET"],"status":"unregistered"},{"path":"registry/index.ts","owner":"registry","layer":"registry","purpose_th":"ทะเบียนกลาง — ค้นหาและเข้าถึงส่วนประกอบต่างๆ ของระบบสำหรับ Runtime (V1)","exports":["getActiveChannels","getCommunicationCapabilities","getCommunicationChannel","getCommunicationIndex","getCommunicationLifecycle","getCommunicationRegistry","getCommunicationTopology","getDriver","getEvent","getInterface","getLINEAPIs","getLINEChannel","getLINECleanupList","getLINELifecycle","getLINEOAFeatures","getLINERegistry","getLINETopology","getLayer","getModule","getSchema","getService","isFeatureEnabled","isLINEFeatureEnabled","isPolicyAllowed","isRegistered","listCommunicationChannels","listDrivers","listEvents","listInterfaces","listLayers","listModules","listSchemas","listServices","loadAllCommunicationChannels","loadCommunicationChannel","resolveCapability","resolveCommunication","resolveDependencies","resolveHealth","resolveLifecycle","resolvePipeline","resolvePolicy","resolveSecurityContract","resolveTopology","validateAllCommunicationRegistries","validateCommunicationRegistry"],"status":"active"},{"path":"registry/trace/_validator.ts","owner":"registry","layer":"registry","purpose_th":"ตรวจสอบความถูกต้องของข้อมูล registry โดเมนการตรวจสอบย้อนรอย (Trace) เทียบกับ schema","exports":["validateTraceRegistry"],"status":"active"},{"path":"registry/trace/_schema.ts","owner":"registry","layer":"registry","purpose_th":"สัญญาชนิดข้อมูล (schema) ของ registry โดเมนการตรวจสอบย้อนรอย (Trace)","exports":["MetricDefinition","MetricType","SpanDefinition","SpanStatus","TraceManifest","TraceSchema","ValidationResult"],"status":"active"},{"path":"registry/trace/_resolver.ts","owner":"registry","layer":"registry","purpose_th":"API สำหรับดึงข้อมูล registry โดเมนการตรวจสอบย้อนรอย (Trace) — ผู้ใช้ต้องเรียกผ่านนี้เท่านั้น ห้ามอ่านไฟล์ JSON ตรง","exports":["isTraceEnabled","resolveAllMetrics","resolveAllSpans","resolveMetric","resolveSpan","resolveTraceSchema","resolveTraceStorageTable"],"status":"active"},{"path":"registry/trace/_loader.ts","owner":"registry","layer":"registry","purpose_th":"ตัวโหลดไฟล์ JSON ของ registry โดเมนการตรวจสอบย้อนรอย (Trace) แบบ static import ใช้ได้ทุก environment ของ Next.js","exports":["getTraceManifest","listMetrics","listSpans","loadMetric","loadSpan","loadTraceSchema","validateAllTrace"],"status":"active"},{"path":"registry/communication/_validator.ts","owner":"registry","layer":"registry","purpose_th":"ตรวจสอบความถูกต้องของข้อมูล registry โดเมนการสื่อสาร (Communication) เทียบกับ schema","exports":["validateRegistry"],"status":"active"},{"path":"registry/communication/_schema.ts","owner":"registry","layer":"registry","purpose_th":"สัญญาชนิดข้อมูล (schema) ของ registry โดเมนการสื่อสาร (Communication)","exports":["AuthoritySource","CommunicationCapabilities","CommunicationCapability","CommunicationManifest","CommunicationRegistry","DependencyGraph","HealthStatus","LifecycleValue","MonitoringConfig","RuntimePolicy","SecurityContract","Topology","TopologyNode","ValidationError","ValidationResult","ValidationWarning"],"status":"active"},{"path":"registry/communication/_resolver.ts","owner":"registry","layer":"registry","purpose_th":"API สำหรับดึงข้อมูล registry โดเมนการสื่อสาร (Communication) — ผู้ใช้ต้องเรียกผ่านนี้เท่านั้น ห้ามอ่านไฟล์ JSON ตรง","exports":["getCommunicationCapabilities","getCommunicationChannel","getCommunicationLifecycle","getCommunicationRegistry","getCommunicationTopology","isFeatureEnabled","isPolicyAllowed","resolveCapability","resolveCommunication","resolveDependencies","resolveHealth","resolveLifecycle","resolvePipeline","resolvePolicy","resolveSecurityContract","resolveTopology"],"status":"active"},{"path":"registry/communication/_loader.ts","owner":"registry","layer":"registry","purpose_th":"ตัวโหลดไฟล์ JSON ของ registry โดเมนการสื่อสาร (Communication) แบบ static import ใช้ได้ทุก environment ของ Next.js","exports":["getManifest","listChannels","load","loadAll","validateAll"],"status":"active"},{"path":"registry/execution/_validator.ts","owner":"registry","layer":"registry","purpose_th":"ตรวจสอบความถูกต้องของข้อมูล registry โดเมนการรันงาน (Execution) เทียบกับ schema","exports":["validateExecutionRegistry"],"status":"active"},{"path":"registry/execution/_schema.ts","owner":"registry","layer":"registry","purpose_th":"สัญญาชนิดข้อมูล (schema) ของ registry โดเมนการรันงาน (Execution)","exports":["EngineDefinition","EngineType","ExecutionManifest","ExecutionStatus","PipelineDefinition","PipelineStep","StageDefinition","StageStatus","TraceConfig","ValidationResult"],"status":"active"},{"path":"registry/execution/_resolver.ts","owner":"registry","layer":"registry","purpose_th":"API สำหรับดึงข้อมูล registry โดเมนการรันงาน (Execution) — ผู้ใช้ต้องเรียกผ่านนี้เท่านั้น ห้ามอ่านไฟล์ JSON ตรง","exports":["getEngineForStep","isEngineActive","isPipelineActive","resolveActivePipelines","resolveDefaultPipeline","resolveEngine","resolveNextStages","resolvePipelineSteps","resolveStage","resolveTraceConfig"],"status":"active"},{"path":"registry/execution/_loader.ts","owner":"registry","layer":"registry","purpose_th":"ตัวโหลดไฟล์ JSON ของ registry โดเมนการรันงาน (Execution) แบบ static import ใช้ได้ทุก environment ของ Next.js","exports":["getExecutionManifest","listEngines","listPipelines","listStages","loadEngine","loadPipeline","loadStage","loadTraceConfig","validateAllExecution"],"status":"active"},{"path":"registry/conversation/_validator.ts","owner":"registry","layer":"registry","purpose_th":"ตรวจสอบความถูกต้องของข้อมูล registry โดเมนบทสนทนา (Conversation) เทียบกับ schema","exports":["validateConversationRegistry"],"status":"active"},{"path":"registry/conversation/_schema.ts","owner":"registry","layer":"registry","purpose_th":"สัญญาชนิดข้อมูล (schema) ของ registry โดเมนบทสนทนา (Conversation)","exports":["ConversationManifest","EntityDefinition","EntityId","IntentDefinition","IntentId","MemoryConfig","MemoryScope","StateDefinition","StateId","TransitionDefinition","ValidationResult"],"status":"active"},{"path":"registry/conversation/_resolver.ts","owner":"registry","layer":"registry","purpose_th":"API สำหรับดึงข้อมูล registry โดเมนบทสนทนา (Conversation) — ผู้ใช้ต้องเรียกผ่านนี้เท่านั้น ห้ามอ่านไฟล์ JSON ตรง","exports":["isConversationStateActive","isEntityActive","isIntentActive","isTerminalState","resolveConversationState","resolveEntity","resolveInitialState","resolveIntent","resolveRequiredEntities","resolveTerminalStates","resolveTransitionsFrom"],"status":"active"},{"path":"registry/conversation/_loader.ts","owner":"registry","layer":"registry","purpose_th":"ตัวโหลดไฟล์ JSON ของ registry โดเมนบทสนทนา (Conversation) แบบ static import ใช้ได้ทุก environment ของ Next.js","exports":["getConversationManifest","listConversationStates","listEntities","listIntents","loadConversationState","loadEntity","loadIntent","loadMemoryConfig","loadTransitions","validateAllConversation"],"status":"active"},{"path":"gateway/connectors.ts","owner":"gateway","layer":"gateway","purpose_th":"[ตรวจพบอัตโนมัติ] gateway/connectors.ts","exports":["CreateConnectorInput","createConnector","deleteConnector","getConnectorById","listConnectors","recordConnectorTest","recordWebhookEvent","redactConnector","redactConnectors","runConnectorTest","setConnectorEnabled","updateConnector"],"status":"active"},{"path":"core/connector-loader.ts","owner":"core","layer":"core","purpose_th":"[ตรวจพบอัตโนมัติ] core/connector-loader.ts","exports":["ConnectorAuthType","ConnectorLifecycleAction","ConnectorRecord","ConnectorRejectedError","ConnectorStatus","clearConnectorCache","getConnectedConnector","getConnector","listConnectorsByAuthType","loadConnectors","logConnectorLifecycleEvent","requireConnector"],"status":"active"},{"path":"engines/connectors/tester.ts","owner":"engines","layer":"engines","purpose_th":"[ตรวจพบอัตโนมัติ] engines/connectors/tester.ts","exports":["TestResult","testConnector"],"status":"unregistered"},{"path":"app/api/admin/connectors/route.ts","owner":"app","layer":"app","purpose_th":"[ตรวจพบอัตโนมัติ] app/api/admin/connectors/route.ts","exports":["GET","POST"],"status":"unregistered"},{"path":"app/api/connectors/webhook/[slug]/route.ts","owner":"app","layer":"app","purpose_th":"[ตรวจพบอัตโนมัติ] app/api/connectors/webhook/[slug]/route.ts","exports":["POST"],"status":"unregistered"},{"path":"app/api/admin/connectors/[id]/route.ts","owner":"app","layer":"app","purpose_th":"[ตรวจพบอัตโนมัติ] app/api/admin/connectors/[id]/route.ts","exports":["DELETE","GET","PATCH"],"status":"unregistered"},{"path":"app/api/connectors/oauth/callback/[slug]/route.ts","owner":"app","layer":"app","purpose_th":"[ตรวจพบอัตโนมัติ] app/api/connectors/oauth/callback/[slug]/route.ts","exports":["GET"],"status":"unregistered"},{"path":"app/api/connectors/oauth/authorize/[slug]/route.ts","owner":"app","layer":"app","purpose_th":"[ตรวจพบอัตโนมัติ] app/api/connectors/oauth/authorize/[slug]/route.ts","exports":["GET"],"status":"unregistered"},{"path":"app/api/admin/connectors/[id]/test/route.ts","owner":"app","layer":"app","purpose_th":"[ตรวจพบอัตโนมัติ] app/api/admin/connectors/[id]/test/route.ts","exports":["POST"],"status":"unregistered"},{"path":"app/login/page.tsx","owner":"app","layer":"app","purpose_th":"หน้า login เดียวของทั้งระบบ — Supabase Auth จริง, redirect ตาม role หลัง login","exports":["default"],"status":"active"},{"path":"app/admin/login/page.tsx","owner":"app","layer":"app","purpose_th":"redirect ไป /login สำหรับลิงก์เก่าที่ยังชี้มาที่ /admin/login — ไม่ใช่ฟอร์ม login ที่สอง","exports":["default"],"status":"active"},{"path":"app/api/auth/logout/route.ts","owner":"app","layer":"api","purpose_th":"logout จริงฝั่ง server ผ่าน Supabase Auth signOut — ตัด session ทุก Portal พร้อมกัน","exports":["POST"],"status":"active"},{"path":"services/supabase/server.ts","owner":"services","layer":"services","purpose_th":"Supabase client ฝั่ง server ที่ผูกกับ cookie จริง — session เดียวที่ทุก Server Component/API route อ่าน","exports":["createServerSupabase"],"status":"active"},{"path":"services/supabase/browser.ts","owner":"services","layer":"services","purpose_th":"Supabase client ฝั่ง browser ที่เก็บ session เป็น cookie — ใช้ใน app/login และ LogoutButton","exports":["SESSION_COOKIE_MAX_AGE","createBrowserSupabase"],"status":"active"},{"path":"core/auth/session.ts","owner":"core","layer":"core","purpose_th":"จุดเดียวที่ resolve user + role จริงจาก session — นิยาม AppRole และ role tier จาก registry/permissions.json","exports":["getAuthedUser","getAccessToken","ADMIN_TIER","SUPER_ADMIN_ONLY","ANY_AUTHENTICATED","AppRole","AuthedUser"],"status":"active"},{"path":"core/auth/requireAuth.ts","owner":"core","layer":"core","purpose_th":"guard กลางสำหรับ API route — ทุก /api/admin/* เรียกอันนี้แทนการ copy-paste เช็คเอง","exports":["requireAuth"],"status":"active"},{"path":"core/auth/requireAuthPage.ts","owner":"core","layer":"core","purpose_th":"guard กลางสำหรับหน้า/layout — redirect ไป /login แทนการตอบ JSON","exports":["requireAuthPage"],"status":"active"},{"path":"core/auth/index.ts","owner":"core","layer":"core","purpose_th":"รวม export ของ core/auth","exports":["ADMIN_TIER","ANY_AUTHENTICATED","SUPER_ADMIN_ONLY","getAccessToken","getAuthedUser","requireAuth","requireAuthPage","type AppRole","type AuthedUser"],"status":"active"},{"path":"app/admin/users/page.tsx","owner":"admin","layer":"ui","purpose_th":"หน้าจัดการ Role — super_admin กำหนด role ให้ user จริง","exports":["default"],"status":"active"},{"path":"app/api/admin/users/route.ts","owner":"admin","layer":"api","purpose_th":"API list user + role ทั้งหมด (super_admin เท่านั้น)","exports":["GET"],"status":"active"},{"path":"app/api/admin/users/[id]/role/route.ts","owner":"admin","layer":"api","purpose_th":"API เปลี่ยน role ของ user รายคน (super_admin เท่านั้น)","exports":["PATCH"],"status":"active"},{"path":"components/admin/AdminSidebarNav.tsx","owner":"admin","layer":"ui","purpose_th":"nav ฝั่ง client ของ admin layout — แยกออกมาเพื่อให้ layout เป็น Server Component เช็ค role ได้","exports":["default"],"status":"active"},{"path":"components/admin/SecretaryChat.tsx","owner":"admin","layer":"ui","purpose_th":"หน้าตาแชตเลขาส่วนตัวบน Dashboard — ยิงไป /api/chat, render ผลลัพธ์ cognitive pipeline, โชว์ปุ่มยืนยัน/ยกเลิกเมื่อมี preview_token (Rule 72) ก่อนยิงไป /api/chat/confirm","exports":["SecretaryChat"],"status":"active"},{"path":"components/business/BusinessSidebarNav.tsx","owner":"business","layer":"ui","purpose_th":"nav ฝั่ง client ของ business layout — แยกออกมาเพื่อให้ layout เป็น Server Component เช็ค role ได้","exports":["default"],"status":"active"},{"path":"components/admin/UsersRoleTable.tsx","owner":"admin","layer":"ui","purpose_th":"ตาราง client สำหรับหน้า Users & Roles — list user + เปลี่ยน role ผ่าน API","exports":["default"],"status":"active"},{"path":"app/api/admin/upload/route.ts","owner":"app","layer":"app","purpose_th":"[ตรวจพบอัตโนมัติ] app/api/admin/upload/route.ts","exports":["DELETE","GET","POST"],"status":"unregistered"},{"path":"app/api/admin/notifications/send/route.ts","owner":"app","layer":"app","purpose_th":"[ตรวจพบอัตโนมัติ] app/api/admin/notifications/send/route.ts","exports":["POST"],"status":"unregistered"},{"path":"app/api/admin/connectors/[id]/enable/route.ts","owner":"app","layer":"app","purpose_th":"[ตรวจพบอัตโนมัติ] app/api/admin/connectors/[id]/enable/route.ts","exports":["POST"],"status":"unregistered"},{"path":"app/admin/invoice/page.tsx","owner":"app","layer":"app","purpose_th":"หน้าย่อยสร้างใบแจ้งหนี้ — เรียก DocumentBuilder ตั้ง type ไว้ล่วงหน้า ไม่อยู่ในเมนูหลักแล้ว (รวมเข้า 'ออกเอกสาร')","exports":["default"],"status":"active"},{"path":"app/admin/purchase-order/page.tsx","owner":"app","layer":"app","purpose_th":"หน้าย่อยสร้างใบสั่งซื้อ — เรียก DocumentBuilder ตั้ง type ไว้ล่วงหน้า ไม่อยู่ในเมนูหลักแล้ว (รวมเข้า 'ออกเอกสาร')","exports":["default"],"status":"active"},{"path":"app/admin/delivery-order/page.tsx","owner":"app","layer":"app","purpose_th":"หน้าย่อยสร้างใบส่งของ — เรียก DocumentBuilder ตั้ง type ไว้ล่วงหน้า ไม่อยู่ในเมนูหลักแล้ว (รวมเข้า 'ออกเอกสาร')","exports":["default"],"status":"active"},{"path":"app/admin/payment-voucher/page.tsx","owner":"app","layer":"app","purpose_th":"หน้าย่อยสร้างใบสำคัญจ่าย — เรียก DocumentBuilder ตั้ง type ไว้ล่วงหน้า ไม่อยู่ในเมนูหลักแล้ว (รวมเข้า 'ออกเอกสาร')","exports":["default"],"status":"active"},{"path":"app/admin/receipt/page.tsx","owner":"app","layer":"app","purpose_th":"หน้าย่อยสร้างใบเสร็จ — เรียก DocumentBuilder ตั้ง type ไว้ล่วงหน้า ไม่อยู่ในเมนูหลักแล้ว (รวมเข้า 'ออกเอกสาร')","exports":["default"],"status":"active"},{"path":"app/admin/debt-notice/page.tsx","owner":"app","layer":"app","purpose_th":"หน้าย่อยสร้างหนังสือทวงหนี้ — เรียก DocumentBuilder ตั้ง type ไว้ล่วงหน้า ไม่อยู่ในเมนูหลักแล้ว (รวมเข้า 'ออกเอกสาร')","exports":["default"],"status":"active"},{"path":"app/admin/api-explorer/page.tsx","owner":"app","layer":"app","purpose_th":"หน้ารายการ API route ทั้งหมดของระบบจริง สีตาม method — เครื่องมือนักพัฒนา","exports":["default"],"status":"active"},{"path":"app/admin/architecture/page.tsx","owner":"app","layer":"app","purpose_th":"หน้าแสดงรายการโมดูลทั้งหมดพร้อมสถานะ จาก module-registry.json — เครื่องมือนักพัฒนา","exports":["default"],"status":"active"},{"path":"app/admin/backup/page.tsx","owner":"app","layer":"app","purpose_th":"หน้าแสดงสถิติการสำรองข้อมูลล่าสุด — เครื่องมือฝั่ง ops","exports":["default"],"status":"active"},{"path":"app/admin/build/page.tsx","owner":"app","layer":"app","purpose_th":"หน้าแสดงสถานะ build ล่าสุด — เครื่องมือนักพัฒนา","exports":["default"],"status":"active"},{"path":"app/admin/connectors/page.tsx","owner":"app","layer":"app","purpose_th":"ฟอร์ม+รายการ Connector ภายนอก (5 ขั้นตอน) — เครื่องมือตั้งค่าเทคนิค ไม่ใช่หน้าใช้งานประจำวัน","exports":["default"],"status":"active"},{"path":"app/admin/dashboard/page.tsx","owner":"app","layer":"app","purpose_th":"แดชบอร์ดธุรกิจจริง — รายได้วันนี้/งานที่ทำอยู่/เอกสารค้าง (หน้าแรกที่ /admin redirect มา)","exports":["default"],"status":"active"},{"path":"app/admin/dbd/page.tsx","owner":"app","layer":"app","purpose_th":"หน้ารายงานสุขภาพระบบรวม (Constitution/Business/Rule coverage) — เครื่องมือนักพัฒนา","exports":["default"],"status":"active"},{"path":"app/admin/deploy/page.tsx","owner":"app","layer":"app","purpose_th":"หน้าแสดงข้อมูล deploy ปัจจุบัน (git commit, Vercel project) — เครื่องมือ ops","exports":["default"],"status":"active"},{"path":"app/admin/dna/page.tsx","owner":"app","layer":"app","purpose_th":"หน้าสรุป 'ดีเอ็นเอ' ของระบบ (อายุ, จำนวนกฎ/workflow/module) — เครื่องมือนักพัฒนา","exports":["default"],"status":"active"},{"path":"app/admin/graph/page.tsx","owner":"app","layer":"app","purpose_th":"หน้าควบคุม + ดึงข้อมูลให้กราฟ 3D สถาปัตยกรรม — เครื่องมือนักพัฒนา","exports":["default"],"status":"active"},{"path":"app/admin/graph/ForceGraph3DView.tsx","owner":"app","layer":"app","purpose_th":"คอมโพเนนต์กราฟ 3D (Three.js) แสดงความสัมพันธ์โมดูล — เครื่องมือนักพัฒนา","exports":["default","FGNode","FGData"],"status":"active"},{"path":"app/admin/jobs/page.tsx","owner":"app","layer":"app","purpose_th":"หน้ารายการงาน/ธุรกรรมจริง","exports":["default"],"status":"active"},{"path":"app/admin/jobs/[id]/page.tsx","owner":"app","layer":"app","purpose_th":"หน้ารายละเอียดงาน — โชว์ขั้นตอน workflow และลิงก์ออกเอกสารแต่ละประเภทของงานนั้น","exports":["default"],"status":"active"},{"path":"app/admin/jobs/create/page.tsx","owner":"app","layer":"app","purpose_th":"ฟอร์มสร้างงาน/ธุรกรรมใหม่ เลือกพาร์ทเนอร์และประเภทธุรกรรม","exports":["default"],"status":"active"},{"path":"app/admin/layout.tsx","owner":"app","layer":"app","purpose_th":"Layout ร่วมของทุกหน้า /admin — render sidebar จาก portals.docs (แยกกลุ่มธุรกิจ/นักพัฒนาแล้ว) และเช็คสิทธิ์ admin","exports":["default"],"status":"active"},{"path":"app/admin/links/page.tsx","owner":"app","layer":"app","purpose_th":"หน้ารายการลิงก์ระบบจริงทั้งหมด (จาก config/system-links.ts)","exports":["default"],"status":"active"},{"path":"app/admin/notifications/page.tsx","owner":"app","layer":"app","purpose_th":"หน้าส่ง LINE notification ด้วยมือ ต้องกดยืนยันทุกครั้ง (Rule 72) ไม่ส่งอัตโนมัติ","exports":["default"],"status":"active"},{"path":"app/admin/page.tsx","owner":"app","layer":"app","purpose_th":"redirect ไปหน้า /admin/dashboard เฉยๆ","exports":["default"],"status":"active"},{"path":"app/admin/pending/page.tsx","owner":"app","layer":"app","purpose_th":"หน้าย่อย เรียก TransactionPanel กรองเฉพาะรายการค้าง","exports":["default"],"status":"active"},{"path":"app/admin/reader/page.tsx","owner":"app","layer":"app","purpose_th":"หน้าไล่ดูไฟล์และ dependency graph แบบโต้ตอบ — เครื่องมือนักพัฒนา","exports":["default"],"status":"active"},{"path":"app/admin/traces/page.tsx","owner":"app","layer":"app","purpose_th":"หน้าแสดง trace การทำงานของ request แต่ละครั้ง แยกตาม layer — เครื่องมือนักพัฒนา","exports":["default"],"status":"active"},{"path":"app/admin/transactions/page.tsx","owner":"app","layer":"app","purpose_th":"หน้าย่อย เรียก TransactionPanel โหมดสร้าง แสดงธุรกรรมทั้งหมด","exports":["default"],"status":"active"},{"path":"app/ai-services/page.tsx","owner":"app","layer":"app","purpose_th":"หน้าสาธารณะแสดงรายชื่อ AI agent และสถานะ session จริง","exports":["default"],"status":"active"},{"path":"app/ai-services/loading.tsx","owner":"app","layer":"app","purpose_th":"skeleton ระหว่างโหลดหน้า AI Services","exports":["default"],"status":"active"},{"path":"app/business/page.tsx","owner":"app","layer":"app","purpose_th":"แดชบอร์ด CEO — สถิติจริงจาก module-registry/architecture-book","exports":["default"],"status":"active"},{"path":"app/business/layout.tsx","owner":"app","layer":"app","purpose_th":"Layout ของ Business Portal — sidebar ตามสิทธิ์ /business เช็ค auth","exports":["default"],"status":"active"},{"path":"app/business/loading.tsx","owner":"app","layer":"app","purpose_th":"skeleton ระหว่างโหลด CEO Dashboard","exports":["default"],"status":"active"},{"path":"app/download/page.tsx","owner":"app","layer":"app","purpose_th":"หน้า Download Center — บอกตรงๆ ว่ายังไม่มีไฟล์ดาวน์โหลด โชว์ชุดคำสั่ง CLI จริงแทน","exports":["default"],"status":"active"},{"path":"app/download/loading.tsx","owner":"app","layer":"app","purpose_th":"skeleton ระหว่างโหลดหน้า Download Center","exports":["default"],"status":"active"},{"path":"app/liff/add-friend/page.tsx","owner":"app","layer":"app","purpose_th":"หน้า LINE LIFF เช็ค/ชวนเพิ่มเพื่อน LINE ผ่าน LIFF SDK","exports":["default"],"status":"active"},{"path":"app/liff/layout.tsx","owner":"app","layer":"app","purpose_th":"Layout เปล่าสำหรับหน้า /liff/*","exports":["default"],"status":"active"},{"path":"app/marketplace/page.tsx","owner":"app","layer":"app","purpose_th":"หน้าสาธารณะแสดงขั้นตอน connector lifecycle และ auth type ที่รองรับ","exports":["default"],"status":"active"},{"path":"app/marketplace/loading.tsx","owner":"app","layer":"app","purpose_th":"skeleton ระหว่างโหลดหน้า Marketplace","exports":["default"],"status":"active"},{"path":"app/observer/layout.tsx","owner":"app","layer":"app","purpose_th":"Layout ของหน้า Observer (สำหรับ AI ภายนอกอ่านสถาปัตยกรรมแบบ read-only)","exports":["default"],"status":"active"},{"path":"app/partner/page.tsx","owner":"app","layer":"app","purpose_th":"Partner Portal — เนื้อหาจริงจาก business-coverage.json โดเมน relationship/purchase เช็คสิทธิ์","exports":["default"],"status":"active"},{"path":"app/partner/loading.tsx","owner":"app","layer":"app","purpose_th":"skeleton ระหว่างโหลด Partner Portal","exports":["default"],"status":"active"},{"path":"app/products/page.tsx","owner":"app","layer":"app","purpose_th":"หน้าสาธารณะแสดงรายชื่อ Portal จริงจาก portals.json","exports":["default"],"status":"active"},{"path":"app/products/loading.tsx","owner":"app","layer":"app","purpose_th":"skeleton ระหว่างโหลดหน้า Products","exports":["default"],"status":"active"},{"path":"app/report/page.tsx","owner":"app","layer":"app","purpose_th":"หน้าสาธารณะแสดงสถิติ coverage ต่างๆ เป็นการ์ดรายงาน","exports":["default"],"status":"active"},{"path":"app/report/loading.tsx","owner":"app","layer":"app","purpose_th":"skeleton ระหว่างโหลดหน้า Report","exports":["default"],"status":"active"},{"path":"app/solutions/page.tsx","owner":"app","layer":"app","purpose_th":"หน้าสาธารณะแสดงโดเมนธุรกิจพร้อมสถานะ covered/partial/missing","exports":["default"],"status":"active"},{"path":"app/solutions/loading.tsx","owner":"app","layer":"app","purpose_th":"skeleton ระหว่างโหลดหน้า Solutions","exports":["default"],"status":"active"},{"path":"app/user/page.tsx","owner":"app","layer":"app","purpose_th":"User Portal — รายการ 16 ความสามารถจริงจาก existence.json เช็คสิทธิ์","exports":["default"],"status":"active"},{"path":"app/user/loading.tsx","owner":"app","layer":"app","purpose_th":"skeleton ระหว่างโหลด User Portal","exports":["default"],"status":"active"},{"path":"components/auth/LogoutButton.tsx","owner":"components","layer":"components","purpose_th":"ปุ่ม logout — เรียก /api/auth/logout แล้ว redirect ไป /login","exports":["default"],"status":"active"},{"path":"components/documents/DebtTrackingManager.tsx","owner":"components","layer":"components","purpose_th":"หน้า 'ธุรกิจการเงิน' — แบนเนอร์ยอดรวม, เอกสารล่าสุด, ตารางลูกหนี้แบบ 3 คอลัมน์ที่กดขยายดูรายละเอียดได้","exports":["default"],"status":"active"},{"path":"components/documents/DocumentBuilder.tsx","owner":"components","layer":"components","purpose_th":"คอมโพเนนต์สร้างเอกสารตัวจริงตัวเดียว — ทุกหน้าประเภทเอกสารเป็นแค่ wrapper บาง ๆ ห่อตัวนี้","exports":["default"],"status":"active"},{"path":"components/documents/DocumentPreview.tsx","owner":"components","layer":"components","purpose_th":"พรีวิวเอกสารผ่าน iframe ใช้ template เดียวกับตัวจริง (Single Template Policy)","exports":["default"],"status":"active"},{"path":"components/documents/FileUpload.tsx","owner":"components","layer":"components","purpose_th":"วิดเจ็ตแนบไฟล์ใช้ซ้ำได้ — อัปโหลดผ่าน /api/admin/upload","exports":["default"],"status":"active"},{"path":"components/landing/CapabilityPageShell.tsx","owner":"components","layer":"components","purpose_th":"Shell ส่วนหัว/ท้ายที่ใช้ร่วมกันในหน้า capability สาธารณะ","exports":["default"],"status":"active"},{"path":"components/landing/CapabilitySkeleton.tsx","owner":"components","layer":"components","purpose_th":"Skeleton โหลดร่วมที่ทุกหน้า capability เรียกใช้","exports":["default"],"status":"active"},{"path":"components/landing/CopyButton.tsx","owner":"components","layer":"components","purpose_th":"ปุ่ม copy-to-clipboard เล็กๆ ใช้ซ้ำได้ แยกออกมาให้หน้าแม่เป็น Server Component ได้","exports":["default"],"status":"active"},{"path":"components/portal/PortalShell.tsx","owner":"components","layer":"components","purpose_th":"Shell กลางที่ทุก Portal ใช้ร่วมกัน — ต่างกันแค่ config ใน portals.json","exports":["default"],"status":"active"},{"path":"components/settings/SettingsDrawer.tsx","owner":"components","layer":"components","purpose_th":"แผงตั้งค่าบริษัทแบบ slide-over ไม่ต้องเปลี่ยนหน้า","exports":["default"],"status":"active"},{"path":"components/transactions/TransactionPanel.tsx","owner":"components","layer":"components","purpose_th":"คอมโพเนนต์รายการธุรกรรม+ขั้นตอน workflow ใช้ร่วมกันทั้งหน้า Transactions และ Pending","exports":["default"],"status":"active"},{"path":"core/runtime/cockpit.ts","owner":"core","layer":"core","purpose_th":"สคริปต์ CLI ศูนย์บัญชาการ — คำสั่ง why/status/next/cost/risk ให้ระบบอธิบายตัวเอง","exports":["default"],"status":"active"},{"path":"app/admin/create-document/page.tsx","owner":"app","layer":"app","purpose_th":"หน้า 'ออกเอกสาร' ตัวจริง — เรียก DocumentBuilder รับ query param เพื่อ pre-fill จากบริบทเดิม","exports":["default"],"status":"active"},{"path":"app/admin/debt-tracking/page.tsx","owner":"app","layer":"app","purpose_th":"หน้าย่อย เรียก DebtTrackingManager (หน้า 'ธุรกิจการเงิน')","exports":["default"],"status":"active"},{"path":"engines/material-resolver.ts","owner":"engines","layer":"engines","purpose_th":"จับคู่ชื่อวัสดุที่พิมพ์มาจากแชท LINE กับข้อมูลจริงในตาราง material_types — ไม่เดาเวลาชื่อกำกวม ให้มนุษย์เลือกเอง","exports":["MaterialMatch","MaterialTypeRow","resolveMaterial","resolveMaterialText","splitMaterialText"],"status":"active"},{"path":"engines/events/event-builder.ts","owner":"engines","layer":"engines","purpose_th":"[ตรวจพบอัตโนมัติ] engines/events/event-builder.ts","exports":["ExtractedEvent","RawMessage","buildEventFromMessages","generateEventCode"],"status":"unregistered"},{"path":"supabase/functions/line-webhook-v2/engines/relationship-qa.ts","owner":"supabase","layer":"supabase","purpose_th":"ตอบคำถามลูกค้าจริง (เช่น ถามยอดหนี้) โดยค้นจากตัวบุคคลผ่าน company_line_links — ถ้าไม่มีหนี้ตอบได้ทันที ถ้ามียอดจริงต้องผ่านการอนุมัติก่อนส่ง","exports":["isDebtInquiry","answerDebtInquiry"],"status":"active"},{"path":"supabase/functions/line-webhook-v2/engines/profile.ts","owner":"supabase","layer":"supabase","purpose_th":"ดึงชื่อ/รูปโปรไฟล์จริงของผู้ติดต่อ LINE ผ่าน Get Profile API พร้อม retry เมื่อล้มเหลวชั่วคราว","exports":["fetchLineProfile","LineProfile"],"status":"active"},{"path":"app/api/admin/quotation-queue/route.ts","owner":"app","layer":"app","purpose_th":"คำขอราคาจริงจากแชท LINE ที่ยังไม่มีเอกสารตอบกลับ พร้อมจับคู่ชื่อวัสดุกับข้อมูลจริง — ยังคำนวณราคาไม่ได้ รอเชื่อม geocoding ปลายทาง","exports":["GET"],"status":"active"},{"path":"app/api/admin/outbound-drafts/route.ts","owner":"app","layer":"app","purpose_th":"แสดงรายการข้อความ LINE ที่รอเฮียตรวจสอบก่อนส่งจริง (Rule 72)","exports":["GET"],"status":"active"},{"path":"app/api/admin/event-inbox/route.ts","owner":"app","layer":"app","purpose_th":"[ตรวจพบอัตโนมัติ] app/api/admin/event-inbox/route.ts","exports":["GET"],"status":"unregistered"},{"path":"app/api/admin/line-customers/route.ts","owner":"app","layer":"app","purpose_th":"[ตรวจพบอัตโนมัติ] app/api/admin/line-customers/route.ts","exports":["GET"],"status":"unregistered"},{"path":"app/api/admin/line-customers/[lineUserId]/route.ts","owner":"app","layer":"app","purpose_th":"[ตรวจพบอัตโนมัติ] app/api/admin/line-customers/[lineUserId]/route.ts","exports":["GET"],"status":"unregistered"},{"path":"app/api/admin/partners/[id]/line-messages/route.ts","owner":"app","layer":"app","purpose_th":"ดึงประวัติแชท LINE ทั้งหมดของคู่ค้ารายนี้ รวมทุกบัญชี LINE ที่เชื่อมไว้ — ใช้ในหน้ารายละเอียดคู่ค้าแบบรวมศูนย์","exports":["GET"],"status":"active"},{"path":"app/api/admin/outbound-drafts/[id]/send/route.ts","owner":"app","layer":"app","purpose_th":"ปุ่มยืนยันส่งจริงของข้อความร่าง — ส่งข้อความ (แก้ไขได้ก่อนส่ง) ผ่าน LINE Messaging API","exports":["POST"],"status":"active"},{"path":"app/api/admin/outbound-drafts/[id]/reject/route.ts","owner":"app","layer":"app","purpose_th":"ทำเครื่องหมายยกเลิกข้อความร่างที่รออนุมัติ — ไม่ส่ง","exports":["POST"],"status":"active"},{"path":"app/api/admin/line-customers/[lineUserId]/build-event/route.ts","owner":"app","layer":"app","purpose_th":"[ตรวจพบอัตโนมัติ] app/api/admin/line-customers/[lineUserId]/build-event/route.ts","exports":["POST"],"status":"unregistered"},{"path":"supabase/functions/line-profile-reconcile/index.ts","owner":"supabase","layer":"supabase","purpose_th":"Edge Function ที่รันตาม cron ไล่ดึงชื่อ/รูปโปรไฟล์ LINE ซ้ำให้ผู้ติดต่อที่ยังไม่สำเร็จ","exports":["default"],"status":"active"},{"path":"app/admin/quotation-queue/page.tsx","owner":"app","layer":"app","purpose_th":"หน้าแอดมินแสดงคำขอราคาจริงจาก LINE ที่ยังไม่มีเอกสารตอบกลับ พร้อมสถานะจับคู่วัสดุ","exports":["default"],"status":"active"},{"path":"app/admin/line-customers/page.tsx","owner":"app","layer":"app","purpose_th":"หน้าลูกค้า LINE จับคู่กับข้อมูลบริษัท/หนี้/เอกสารจริง สร้าง business event ได้ และอนุมัติข้อความรอส่งได้ในหน้าเดียว","exports":["default"],"status":"active"},{"path":"app/admin/event-inbox/page.tsx","owner":"app","layer":"app","purpose_th":"หน้าเหตุการณ์เข้า — รายการ business_events ทั้งหมดเรียงตามเวลา นับเป็นเหตุการณ์ธุรกิจ ไม่ใช่ข้อความดิบ","exports":["default"],"status":"active"},{"path":"app/api/admin/sites/route.ts","owner":"app","layer":"app","purpose_th":"จัดการที่อยู่จัดส่งจริงของลูกค้า (customer_sites) — จุดที่ขาดทำให้เปิดงานไม่ได้เลย เพราะ customer_orders ต้องมี customer_site_id","exports":["GET","POST"],"status":"active"},{"path":"engines/jobs/auto-create.ts","owner":"engines","layer":"engines","purpose_th":"เปิดงานจริงอัตโนมัติจาก business_event โดยไม่ต้องให้แอดมินกรอกฟอร์ม — ถ้าข้อมูลจริงไม่ครบ (วัสดุ/จำนวน/ที่อยู่) จะบอกว่าขาดอะไรแทนการเดา เพื่อให้ถามลูกค้าได้ถูกจุด","exports":["AutoCreateEventInput","AutoCreateResult","MissingField","composeMissingInfoMessage","tryAutoCreateJob"],"status":"active"},{"path":"supabase/functions/line-webhook-v2/engines/event-followup.ts","owner":"supabase","layer":"supabase","purpose_th":"ปิดวงจรถาม-ตอบ — ถ้ามี event ที่รอคำตอบจากลูกค้าอยู่ เอาข้อความใหม่มาเติมข้อมูลที่ขาด แล้วเปิดงานจริงหรือถามสิ่งที่ยังขาดต่อ แทนการ echo ข้อความเฉยๆ","exports":["tryCompleteAwaitingEvent"],"status":"active"},{"path":"app/api/admin/schema-audit/route.ts","owner":"app","layer":"app","purpose_th":"อ่านประวัติการเปลี่ยนแปลงโครงสร้างฐานข้อมูล บันทึกโดย Postgres event trigger จับได้แม้เชื่อมต่อฐานข้อมูลตรง","exports":["GET"],"status":"active"},{"path":"app/admin/schema-audit/page.tsx","owner":"app","layer":"app","purpose_th":"หน้าแอดมินแสดงประวัติการเปลี่ยนแปลงโครงสร้างฐานข้อมูล","exports":["default"],"status":"active"},{"path":"app/api/admin/pits/route.ts","owner":"app","layer":"app","purpose_th":"ข้อมูลบ่อวัสดุจริงที่สูตรคำนวณราคาใช้จริง แสดงในห้องควบคุมหลัก","exports":["GET"],"status":"active"},{"path":"app/admin/pits/page.tsx","owner":"app","layer":"app","purpose_th":"หน้าห้องควบคุมแสดงบ่อวัสดุทั้งหมด พร้อมจังหวัด/พิกัด/สถานะราคา ดึงจากฐานข้อมูลจริงสด","exports":["default"],"status":"active"},{"path":"supabase/functions/line-webhook-v2/engines/auto-build-event.ts","owner":"supabase","layer":"supabase","purpose_th":"สร้าง business_event จริงทันทีที่ลูกค้าส่งข้อความมา ไม่ต้องรอแอดมินกดปุ่ม — แก้จากเหตุการณ์จริงที่ลูกค้าถามราคา 5 ข้อความแล้วไม่มีใครตอบเลย","exports":["tryAutoBuildEvent"],"status":"active"},{"path":"supabase/functions/trigger-auto-build/index.ts","owner":"supabase","layer":"supabase","purpose_th":"ทริกเกอร์แบบครั้งเดียวสำหรับไล่ประมวลผลข้อความเก่าที่มาก่อนระบบอัตโนมัติจะมีผล","exports":["default"],"status":"active"},{"path":"supabase/functions/line-webhook-v2/engines/quote-price.ts","owner":"supabase","layer":"supabase","purpose_th":"ปิดคิวด้วยราคาจริงส่งกลับ LINE — หาบ่อที่ใกล้ที่สุดที่ขายวัสดุนั้นจริงด้วย GPS+ระยะทางจริง ตอบราคาวัสดุ×จำนวน เฉพาะราคาวัสดุ ไม่รวมรถ/ขนส่ง","exports":["QuoteResult","tryQuoteMaterialPrice"],"status":"active"},{"path":"supabase/functions/line-webhook-v2/engines/order-status.ts","owner":"supabase","layer":"supabase","purpose_th":"ตอบสถานะงานจริงจาก customer_orders ของบริษัทที่ผูกกับ LINE contact นั้น","exports":["tryOrderStatus"],"status":"active"},{"path":"supabase/functions/line-webhook-v2/engines/purchase-history.ts","owner":"supabase","layer":"supabase","purpose_th":"ตอบประวัติวัสดุที่เคยสั่งซื้อจาก business_events","exports":["tryPurchaseHistory"],"status":"active"},{"path":"supabase/functions/line-webhook-v2/engines/tool-router.ts","owner":"supabase","layer":"supabase","purpose_th":"ให้บอทเลือกเครื่องมือเอง (หนี้/สถานะงาน/ประวัติซื้อ) ผ่าน OpenAI function-calling","exports":["tryRouteToTool"],"status":"active"},{"path":"supabase/functions/trigger-complete/index.ts","owner":"supabase","layer":"supabase","purpose_th":"ทริกเกอร์แบบครั้งเดียวสำหรับไล่ประมวลผล event ที่ค้างอยู่ซ้ำ","exports":["default"],"status":"active"},{"path":"components/ui-kit/IconRail.tsx","owner":"admin","layer":"ui","purpose_th":"แถบไอคอนซ้ายสุดแบบแอป LINE เลือกได้ทีละ 1 — layout primitive ใหม่ของ AppShell","exports":["default"],"status":"active"},{"path":"components/ui-kit/ListColumn.tsx","owner":"admin","layer":"ui","purpose_th":"คอลัมน์รายการกลางแบบแอป LINE (ค้นหา+รายชื่อ+badge) — layout primitive ของ AppShell","exports":["default"],"status":"active"},{"path":"components/ui-kit/AppShell.tsx","owner":"admin","layer":"ui","purpose_th":"ประกอบ IconRail+ListColumn+เนื้อหาหลักเป็นโครง 3 คอลัมน์ถาวรแบบ LINE — หน้าจริงหน้าแรกที่ใช้: line-customers","exports":["default"],"status":"active"},{"path":"components/ui-kit/index.ts","owner":"admin","layer":"ui","purpose_th":"จุด export รวมของ UIKit — Window/Dock/AppShell/IconRail/ListColumn/ChatPanel ฯลฯ ธีมสว่างทั้งหมด รับข้อมูลผ่าน props ไม่ hardcode","exports":["ActionBar","AppShell","ChatPanel","CommandPalette","DataTable","Dock","DocumentViewer","Drawer","EmptyState","IconRail","Inspector","ListColumn","MapView","PartnerCard","Timeline","Window","WindowLayer","WorkspaceCanvas","useWorkspace"],"status":"active"},{"path":"components/ui-kit/ChatPanel.tsx","owner":"admin","layer":"ui","purpose_th":"ส่วนหนึ่งของ UIKit — Chat bubble panel, retheme to light + LINE-style green/white bubbles 2026-07-11, supports variant panel for AppShell main pane","exports":["default","ChatMessage"],"status":"active"},{"path":"components/ui-kit/CommandPalette.tsx","owner":"admin","layer":"ui","purpose_th":"ส่วนหนึ่งของ UIKit — Cmd+K launcher for WorkspaceCanvas, light theme","exports":["default","PaletteCommand"],"status":"active"},{"path":"components/ui-kit/DataTable.tsx","owner":"admin","layer":"ui","purpose_th":"ส่วนหนึ่งของ UIKit — Generic light-themed data table, props-driven","exports":["default","DataTableColumn"],"status":"active"},{"path":"components/ui-kit/Dock.tsx","owner":"admin","layer":"ui","purpose_th":"ส่วนหนึ่งของ UIKit — Multi-toggle floating-window icon dock for WorkspaceCanvas (kept alongside the newer single-select IconRail)","exports":["default","DockItem"],"status":"active"},{"path":"components/ui-kit/DocumentViewer.tsx","owner":"admin","layer":"ui","purpose_th":"ส่วนหนึ่งของ UIKit — Document preview panel, light theme","exports":["default"],"status":"active"},{"path":"components/ui-kit/Drawer.tsx","owner":"admin","layer":"ui","purpose_th":"ส่วนหนึ่งของ UIKit — Edge-anchored sliding panel wrapper around Window","exports":["default"],"status":"active"},{"path":"components/ui-kit/EmptyState.tsx","owner":"admin","layer":"ui","purpose_th":"ส่วนหนึ่งของ UIKit — Shared empty-state placeholder used by every ui-kit content component","exports":["default"],"status":"active"},{"path":"components/ui-kit/Inspector.tsx","owner":"admin","layer":"ui","purpose_th":"ส่วนหนึ่งของ UIKit — Key/value inspector panel, light theme","exports":["default","InspectorField"],"status":"active"},{"path":"components/ui-kit/MapView.tsx","owner":"admin","layer":"ui","purpose_th":"ส่วนหนึ่งของ UIKit — Provider-agnostic marker grid, light theme","exports":["default","MapMarker"],"status":"active"},{"path":"components/ui-kit/PartnerCard.tsx","owner":"admin","layer":"ui","purpose_th":"ส่วนหนึ่งของ UIKit — Compact partner/company summary card, light theme","exports":["default","PartnerCardProps"],"status":"active"},{"path":"components/ui-kit/Timeline.tsx","owner":"admin","layer":"ui","purpose_th":"ส่วนหนึ่งของ UIKit — Vertical event timeline, light theme","exports":["default","TimelineEvent"],"status":"active"},{"path":"components/ui-kit/Window.tsx","owner":"admin","layer":"ui","purpose_th":"ส่วนหนึ่งของ UIKit — Shared frame every ui-kit content component wraps in — added variant window|panel 2026-07-11 for AppShell","exports":["default","WindowProps"],"status":"active"},{"path":"components/ui-kit/WindowLayer.tsx","owner":"admin","layer":"ui","purpose_th":"ส่วนหนึ่งของ UIKit — Renders whichever floating windows are open in a WorkspaceCanvas","exports":["default"],"status":"active"},{"path":"components/ui-kit/WorkspaceCanvas.tsx","owner":"admin","layer":"ui","purpose_th":"ส่วนหนึ่งของ UIKit — Floating-window workspace root + context, light theme","exports":["default","useWorkspace"],"status":"active"},{"path":"components/ui-kit/ActionBar.tsx","owner":"admin","layer":"ui","purpose_th":"แถบปุ่มด้านล่างกระทู้แชต (GPS/เอกสาร/โทร/แนบไฟล์/ถาม AI) — ซ่อนตาราง Events/Documents ไว้หลังปุ่มตามที่เฮียขอ","exports":["default"],"status":"active"},{"path":"app/api/admin/line-customers/[lineUserId]/reply/route.ts","owner":"admin","layer":"api","purpose_th":"ตอบลูกค้าตรงๆ จากหน้าแอดมิน — ส่ง LINE จริง + บันทึกเข้า line_events (direction:out)","exports":["POST"],"status":"active"},{"path":"app/api/admin/line-customers/[lineUserId]/ask/route.ts","owner":"admin","layer":"api","purpose_th":"จุดตัดสินคำถามแบบไม่เดา — ถ้าถามราคาวัสดุ ตอบด้วย engine ราคาจริง ถ้าไม่ใช่ ส่งต่อ cognitive pipeline เดิม","exports":["POST"],"status":"active"},{"path":"engines/quote-price.ts","owner":"engines","layer":"engines","purpose_th":"คำนวณราคาวัสดุจริงฝั่ง Next.js (บ่อใกล้สุด+ราคาจริง) สำหรับกล่องถาม AI ในหน้าแอดมิน คู่กับตัว Deno ที่บอทใช้","exports":["QuoteResult","tryQuoteMaterialPrice"],"status":"active"},{"path":"app/api/admin/pits/[pitId]/materials/route.ts","owner":"admin","layer":"api","purpose_th":"จุดเขียนราคาให้บ่อวัสดุจริง — เดิม /admin/pits ดูได้อย่างเดียว อันนี้คือช่องกรอกราคาที่ขาดไป","exports":["POST"],"status":"active"},{"path":"app/api/admin/pits/[pitId]/route.ts","owner":"admin","layer":"api","purpose_th":"จุดแก้ไขพิกัด GPS ของบ่อวัสดุที่ยังไม่มี","exports":["PATCH"],"status":"active"},{"path":"engines/documents/flex-template.ts","owner":"engines","layer":"engines","purpose_th":"สร้างการ์ด LINE Flex Message จากเอกสารจริง (ใบเสนอราคา/ใบแจ้งหนี้/ใบส่งของ/ใบเสร็จ) ตามแบบ Flex Simulator ของ LINE เอง ต่อยอดจาก boq-card.ts เดิมที่ไม่เคยถูกเรียกใช้","exports":["DebtReminderFlexProps","DocumentFlexProps","debtReminderFlex","documentFlex"],"status":"active"},{"path":"app/api/admin/line-customers/[lineUserId]/send-debt/route.ts","owner":"admin","layer":"api","purpose_th":"ส่งการ์ดแจ้งยอดค้างชำระจริงหาลูกค้าด้วยคลิกเดียว อ่านยอดหนี้จริงจาก DB ฝั่ง server ใหม่ทุกครั้งก่อนส่ง","exports":["POST"],"status":"active"},{"path":"app/api/admin/line-customers/[lineUserId]/send-document/route.ts","owner":"admin","layer":"api","purpose_th":"ส่งเอกสารที่มีอยู่แล้ว (ไม่ใช่แค่เอกสารที่เพิ่งสร้าง) เป็นการ์ด LINE Flex จริงด้วยคลิกเดียว","exports":["POST"],"status":"active"},{"path":"supabase/functions/line-webhook-v2/engines/debt-followup.ts","owner":"supabase","layer":"supabase","purpose_th":"แยกกรณีตอบกลับหลังส่งการ์ดแจ้งหนี้ — รับทราบเฉยๆ ถามวันที่ต่อ / ตอบวันที่มาแล้ว บันทึกจริงไม่เดารูปแบบ","exports":["tryFollowUpDebtAck"],"status":"active"}]}