/volume1/web/gpt/repair_jobs/CODE_NAV.md
2026-05-01 20:43:47
# 영일전기철물 AI 코드 지도
last_updated: 2026-05-01 20:43:47
root: `/volume1/web/gpt`
---
## 0. 요약
- 스캔 PHP 파일: 308개
- 클래스/인터페이스/트레이트: 220개
- 함수/메서드: 2184개
---
## 1. 먼저 보는 핵심 지도
- ✅ **웹 첫 화면**: `index.php`
- ✅ **API 진입**: `api.php`
- ✅ **엔진 진입/오케스트레이션**: `engine.php`
- ✅ **Agent 메인 루프/승인/호출어**: `engine_modules/agent/Agent.php`
- ✅ **도구 선택/라우팅**: `engine_modules/tools/ToolSelector.php`
- ✅ **라우팅 파이프라인**: `engine_modules/tools/routing/RoutePipeline.php`
- ✅ **고객 조회/삭제/점검**: `engine_modules/tools/CustomerTool.php`
- ✅ **고객 라우트**: `engine_modules/tools/routing/CustomerRoute.php`
- ✅ **일정 도구**: `engine_modules/tools/ScheduleTool.php`
- ✅ **현장/작업기록**: `engine_modules/tools/WorklogTool.php`
- ✅ **일반 대화 fallback**: `engine_modules/tools/ChatTool.php`
- ✅ **도구 등록**: `engine_modules/tools/bootstrap.php`
- ✅ **운영자 패널**: `partials/operator_status.php`
- ✅ **엔진 로그 드로어**: `partials/debug_drawer.php`
- ✅ **기록 패널**: `partials/history_panel.php`
- ✅ **작업 상태 뷰어**: `work_state.php`
- ⚠️ **코드 지도 뷰어**: `code_map.php`
---
## 2. 문제별 추적 루트
### UI가 이상할 때
- `partials/operator_status.php`
- `partials/main_body.php`
- `partials/debug_drawer.php`
- `partials/history_panel.php`
- `assets/operator_overhaul.css`
- `assets/app_shell.js`
### 답변이 이상하게 나올 때
- `engine_modules/agent/Agent.php`
- `engine_modules/tools/ToolSelector.php`
- `engine_modules/tools/ChatTool.php`
- 선택된 도구 파일
### 고객 조회/삭제가 이상할 때
- `engine_modules/tools/routing/CustomerRoute.php`
- `engine_modules/tools/CustomerTool.php`
- `engine_modules/agent/Agent.php` 승인 pending 복원부
### 라우팅이 엉뚱하게 갈 때
- `engine_modules/tools/ToolSelector.php`
- `engine_modules/tools/routing/RoutePipeline.php`
- `engine_modules/tools/routing/RouteGuards.php`
- 각 Route 파일: `CustomerRoute.php`, `ScheduleRoute.php`, `MoneyRoute.php`, `StockRoute.php`, `WorksiteRoute.php`
### 건영아 호출어/관리자 세션
- `engine_modules/agent/Agent.php`
- 상태 파일: `data/runtime/geonyeong_admin_session.json`
---
## 3. 클래스/함수 자동 지도
### `api.php`
**Functions / Methods**
- L9: `gpt_ui_history_file_v2()`
- L23: `gpt_ui_history_decode_json_v2()`
- L40: `gpt_ui_history_append_v2()`
- L89: `gpt_ui_history_load_v2()`
- L142: `gpt_ui_history_json_v2()`
- L164: `api_code_keyword_location_bypass_capability_v1()`
- L207: `api_q_person_search_rewrite_v3()`
- L235: `api_person_search_bypass_capability_v1()`
- L378: `gpt_ui_history_search_v1()`
- L552: `api_router_kernel_inject_trace_v1()`
### `engine.php`
**Functions / Methods**
- L191: `gpt_current_trace_id()`
- L206: `gpt_append_api_log()`
- L227: `gpt_process_env()`
- L260: `gpt_format_trace_lines()`
- L294: `gpt_send()`
- L404: `gpt_decode_json_payload()`
### `engine_modules/Memory.php`
**Classes / Interfaces / Traits**
- L8: `Memory`
**Functions / Methods**
- L12: `__construct()`
- L20: `saveFact()`
- L32: `getFact()`
- L40: `getFactsByCategory()`
- L51: `logConversation()`
- L63: `getRecentConversation()`
- L71: `clear()`
- L80: `getState()`
### `engine_modules/NaturalLanguageParser.php`
**Classes / Interfaces / Traits**
- L13: `NaturalLanguageParser`
**Functions / Methods**
- L15: `parse()`
- L29: `normalize()`
- L54: `extractSlots()`
- L86: `classify()`
- L146: `intent()`
- L157: `dedupeIntents()`
- L176: `parseAmount()`
- L200: `parseDate()`
- L223: `extractCustomerName()`
- L239: `extractSiteHint()`
- L263: `cleanSiteHint()`
- L273: `extractWorkContent()`
- L289: `isPaymentReceipt()`
- L304: `isWorklogSave()`
- L313: `isPlanningQuery()`
- L338: `planParam()`
- L346: `periodParam()`
- L359: `hasAny()`
### `engine_modules/agent/Agent.php`
**Classes / Interfaces / Traits**
- L24: `Agent`
**Functions / Methods**
- L34: `__construct()`
- L42: `addTrace()`
- L47: `getTrace()`
- L52: `run()`
- L897: `tryResolveSystemPendingApproval()`
- L1035: `saveSystemPendingApproval()`
- L1076: `guardSystemExecution()`
- L1275: `inspectWorklogBeforeApproval()`
- L1497: `isBadWorklogApprovalTargetToken()`
- L1509: `buildWorklogPreApprovalBlockMessage()`
- L1522: `isJudgeOnlyRequest()`
- L1527: `buildJudgeOnlyMessage()`
- L1571: `buildSystemApprovalPlanMessage()`
- L1612: `executeTool()`
- L1960: `normalizeToolResult()`
- L2361: `classifyQueryForTrace()`
- L2428: `summarizeTools()`
- L2448: `compactJson()`
- L2462: `resultType()`
- L2475: `pendingPath()`
- L2485: `savePendingQuestion()`
- L2501: `resolvePendingQuestion()`
- L2572: `agent_process()`
### `engine_modules/agent/AutoCodeAgent.php`
**Classes / Interfaces / Traits**
- L15: `AutoCodeAgent`
**Functions / Methods**
- L23: `__construct()`
- L50: `run()`
- L109: `selectFiles()`
- L141: `isExcluded()`
- L149: `recentlyScanned()`
- L157: `markScanned()`
- L167: `diagnoseFile()`
- L198: `callLLMDiagnose()`
- L238: `estimateConfidence()`
- L250: `estimateSeverity()`
- L260: `decide()`
- L282: `applyFix()`
- L359: `httpCallLLM()`
- L393: `saveQueue()`
- L415: `getQueue()`
- L424: `generateReport()`
- L442: `saveReport()`
- L447: `getLastReport()`
- L455: `isLocked()`
- L462: `lock()`
- L463: `unlock()`
- L464: `log()`
### `engine_modules/agent/agent_fetchers.php`
**Functions / Methods**
- L7: `_agent_fetch_schedule_rows()`
- L81: `_agent_fetch_income_rows()`
### `engine_modules/agent/agent_gateway.php`
**Functions / Methods**
- L26: `_agent_gateway_build_answer()`
- L57: `_agent_gateway_tool_message()`
- L83: `_agent_gateway_tool_trace()`
- L106: `_agent_gateway_tool_actions()`
- L129: `_agent_gateway_chat_fallback()`
- L185: `agent_gateway_process()`
- L233: `agent_gateway_process_v2()`
### `engine_modules/agent/agent_helpers.php`
**Functions / Methods**
- L12: `_agent_merge_intent_lists()`
- L45: `_agent_trace_value()`
- L66: `_agent_has_any()`
- L79: `_agent_has_intent_type()`
- L96: `_agent_intent_priority()`
- L110: `_agent_is_dry_run()`
- L117: `_agent_query_has_payment_receipt()`
- L124: `_agent_sales_response()`
- L145: `_agent_schedule_response()`
- L165: `_agent_save_memory_from_query()`
- L190: `_agent_save_payment_from_query()`
### `engine_modules/agent/agent_parsers.php`
**Functions / Methods**
- L7: `_agent_has_any()`
- L19: `_agent_context_flag()`
- L46: `_agent_parse_amount()`
- L89: `_agent_extract_customer_name()`
- L138: `_agent_extract_project_hint()`
- L184: `_agent_extract_worklog_content()`
- L253: `_agent_parse_schedule_date()`
- L282: `_agent_extract_schedule_time_text()`
- L306: `_agent_extract_schedule_title()`
- L359: `_agent_schedule_period_range()`
- L476: `_agent_sales_period_range()`
- L512: `_agent_enrich_context_from_query()`
### `engine_modules/agent/agent_payloads.php`
**Functions / Methods**
- L14: `_agent_payment_payload()`
- L44: `_agent_worklog_payload()`
- L77: `_agent_completion_payload()`
- L107: `_agent_schedule_payload()`
- L138: `_agent_merge_payload_context()`
### `engine_modules/agents/MemoryAgent.php`
**Classes / Interfaces / Traits**
- L4: `MemoryAgent`
**Functions / Methods**
- L7: `record()`
### `engine_modules/agents/PaymentAgent.php`
**Classes / Interfaces / Traits**
- L4: `PaymentAgent`
**Functions / Methods**
- L7: `record()`
### `engine_modules/agents/PlanAgent.php`
**Classes / Interfaces / Traits**
- L19: `PlanAgent`
**Functions / Methods**
- L22: `plan()`
- L58: `normalizeTargetParam()`
- L69: `monthRange()`
- L87: `fetchOpenWorkItems()`
- L120: `queryWorkItems()`
- L188: `filterSettledWorkItems()`
- L242: `rowProjectId()`
- L251: `rowQuotationId()`
- L260: `fetchProjectsByIds()`
- L278: `fetchQuotationsByIds()`
- L296: `fetchAssocById()`
- L314: `fetchPaidByQuotationIds()`
- L357: `isSettledWorkItem()`
- L381: `normalizeStatus()`
- L386: `columnExpr()`
- L395: `dedupeWorkItems()`
- L417: `filterPlannerWorkRows()`
- L443: `resolvePlanMode()`
- L465: `formatPlan()`
- L533: `formatReviewPlan()`
- L616: `recentScheduleRows()`
- L632: `formatScheduleRow()`
- L643: `formatWorkItem()`
- L660: `recommendations()`
- L705: `isLeisureQuery()`
- L710: `nextProposalQuestion()`
- L723: `cleanText()`
### `engine_modules/agents/ScheduleAgent.php`
**Classes / Interfaces / Traits**
- L4: `ScheduleAgent`
**Functions / Methods**
- L7: `__construct()`
- L10: `list()`
- L15: `create()`
### `engine_modules/agents/WorklogAgent.php`
**Classes / Interfaces / Traits**
- L4: `WorklogAgent`
**Functions / Methods**
- L7: `__construct()`
- L10: `record()`
### `engine_modules/analysis/answer_parser.php`
**Functions / Methods**
- L14: `gpt_parse_answer_sections()`
- L61: `gpt_extract_section()`
- L82: `gpt_build_section_pattern()`
- L117: `gpt_build_fallback_answer()`
- L131: `gpt_has_structured_sections()`
- L143: `gpt_parse_answer_quick()`
### `engine_modules/analysis/compat_legacy.php`
**Functions / Methods**
- L8: `gpt_is_tagged_answer_text()`
- L19: `gpt_load_recent_trace_block()`
- L74: `gpt_trace_add_branch()`
- L83: `gpt_parse_trace_decision_line()`
- L104: `gpt_extract_route_info()`
- L238: `gpt_build_search_summary()`
- L262: `gpt_expected_path_tokens()`
- L309: `gpt_is_code_path()`
- L325: `gpt_hit_task_alignment()`
- L353: `gpt_norm_path_for_compare()`
- L360: `gpt_paths_refer_same_file()`
- L373: `gpt_analyze_keyword_coverage()`
- L401: `gpt_build_analysis_meta()`
- L552: `gpt_build_trace_route_summary()`
- L647: `gpt_normalize_decision_log()`
- L664: `gpt_build_decision_log()`
### `engine_modules/analysis/keyword_utils.php`
**Functions / Methods**
- L15: `gpt_normalize_keyword_token()`
- L108: `gpt_extract_query_keywords()`
- L177: `gpt_keywords_to_string()`
- L190: `gpt_contains_keyword()`
- L213: `gpt_keyword_match_score()`
### `engine_modules/analysis/label_utils.php`
**Functions / Methods**
- L13: `gpt_lane_label()`
- L34: `gpt_intent_label()`
- L57: `gpt_status_label()`
- L78: `gpt_severity_label()`
- L97: `gpt_combined_label()`
- L119: `gpt_safe_label()`
### `engine_modules/analysis/text_utils.php`
**Functions / Methods**
- L14: `gpt_lower()`
- L31: `gpt_normalize_linebreaks()`
- L50: `gpt_normalize_whitespace()`
- L66: `gpt_normalize_trace_query()`
- L91: `gpt_compact_text()`
- L121: `gpt_contains_text()`
- L140: `gpt_contains_any()`
- L168: `gpt_contains_all()`
- L196: `gpt_safe_substr()`
- L218: `gpt_strlen()`
### `engine_modules/analysis/trace_formatter.php`
**Functions / Methods**
- L16: `gpt_analysis_format_trace_line()`
- L50: `gpt_analysis_format_trace_lines()`
- L81: `gpt_analysis_format_trace_block()`
- L105: `gpt_analysis_format_lane_intent()`
- L120: `gpt_analysis_build_trace_summary()`
- L136: `gpt_analysis_package_trace_output()`
- L175: `gpt_analysis_dump_trace_preview()`
### `engine_modules/analysis/trace_loader.php`
**Functions / Methods**
- L16: `gpt_load_trace_file()`
- L44: `gpt_parse_trace_lines()`
- L70: `gpt_parse_trace_line()`
- L134: `gpt_filter_trace_by_id()`
- L164: `gpt_filter_trace_by_keyword()`
- L207: `gpt_get_recent_traces()`
- L227: `gpt_detect_trace_id()`
- L252: `gpt_trace_file_exists()`
### `engine_modules/approvals/QuotationApprovalExecutor.php`
**Classes / Interfaces / Traits**
- L17: `QuotationApprovalExecutor`
**Functions / Methods**
- L21: `maybeExecute()`
- L161: `hasFixedApprovalPin()`
- L168: `extractApprovalId()`
- L177: `detectCommandType()`
- L194: `notExpired()`
- L205: `buildCreatePayload()`
- L286: `postJson()`
- L391: `buildUrl()`
- L425: `pathEndsWith()`
- L433: `joinPath()`
- L450: `encodePath()`
- L467: `markApproval()`
- L493: `extractSavedId()`
### `engine_modules/approvals/QuotationApprovalGuard.php`
**Classes / Interfaces / Traits**
- L13: `QuotationApprovalGuard`
**Functions / Methods**
- L17: `canSavePending()`
- L54: `isTestTarget()`
- L61: `collectText()`
### `engine_modules/approvals/QuotationApprovalStore.php`
**Classes / Interfaces / Traits**
- L12: `QuotationApprovalStore`
**Functions / Methods**
- L18: `save()`
- L75: `load()`
- L124: `findLatestPending()`
- L175: `ensureDir()`
- L182: `makeId()`
- L189: `pathFor()`
### `engine_modules/auto_modularize/AutoModularizeAnalyzer.php`
**Classes / Interfaces / Traits**
- L3: `AutoModularizeAnalyzer`
**Functions / Methods**
- L6: `analyzeFile()`
- L17: `extractFunctions()`
- L69: `findMatchingBraceEnd()`
- L94: `calcModularityScore()`
- L110: `extractBlock()`
- L126: `guessFunctionGroup()`
### `engine_modules/auto_modularize/AutoModularizeFormatter.php`
**Classes / Interfaces / Traits**
- L3: `AutoModularizeFormatter`
**Functions / Methods**
- L6: `formatTargetPlan()`
- L72: `formatTop3Report()`
- L105: `formatSingleFunctionReport()`
- L208: `formatFunctionTopReport()`
- L255: `functionSplitScore()`
- L280: `splitTargetForFunction()`
- L311: `functionReason()`
- L345: `buildReasons()`
- L389: `buildSplitHints()`
- L449: `normalizeFunctionItems()`
- L488: `riskLabel()`
- L505: `groupTitle()`
- L525: `guessGroup()`
### `engine_modules/auto_modularize/AutoModularizePlanner.php`
**Classes / Interfaces / Traits**
- L3: `AutoModularizePlanner`
**Functions / Methods**
- L6: `buildSplitPlan()`
- L97: `guessProblem()`
- L145: `guessFunctionsToSplit()`
- L194: `guessBenefits()`
### `engine_modules/auto_modularize/AutoModularizeScanner.php`
**Classes / Interfaces / Traits**
- L3: `AutoModularizeScanner`
**Functions / Methods**
- L7: `__construct()`
- L13: `collectMetrics()`
- L83: `isScannablePhpFile()`
- L95: `isIgnoredPath()`
- L107: `buildFileMetric()`
### `engine_modules/brain/GptBrainConfig.php`
**Classes / Interfaces / Traits**
- L8: `GptBrainConfig`
**Functions / Methods**
- L21: `table()`
### `engine_modules/brain/GptBrainStore.php`
**Classes / Interfaces / Traits**
- L18: `GptBrainStore`
**Functions / Methods**
- L22: `__construct()`
- L27: `createPdo()`
- L68: `saveMemory()`
- L91: `saveInsight()`
- L118: `saveToolRun()`
- L142: `saveRepairLog()`
- L168: `upsertDataCatalog()`
- L248: `recentMemories()`
- L269: `insert()`
- L302: `qt()`
- L307: `qi()`
### `engine_modules/business_data/BusinessDb.php`
**Classes / Interfaces / Traits**
- L13: `BusinessDataDb`
**Functions / Methods**
- L16: `pdo()`
### `engine_modules/business_data/BusinessSnapshotBridge.php`
**Functions / Methods**
- L28: `business_snapshot_person_context_tool_result_v1()`
- L63: `business_snapshot_make_tool_result_v1()`
- L127: `business_snapshot_reflection_args_v1()`
- L197: `business_snapshot_fill_public_props_v1()`
### `engine_modules/business_data/presenters/BusinessAnswerPresenter.php`
**Classes / Interfaces / Traits**
- L12: `BusinessAnswerPresenter`
**Functions / Methods**
- L14: `personContext()`
- L55: `appendCustomers()`
- L82: `appendProjects()`
- L109: `appendLikelyRelatedRecords()`
- L148: `appendQuotations()`
- L181: `appendMoney()`
- L244: `appendHistories()`
- L263: `appendUncertainty()`
- L274: `quotationLine()`
- L289: `expenseLine()`
- L302: `esc()`
- L307: `short()`
- L316: `money()`
### `engine_modules/business_data/read_models/PersonContextSnapshot.php`
**Classes / Interfaces / Traits**
- L14: `BusinessPersonContextSnapshot`
**Functions / Methods**
- L16: `build()`
- L193: `aliases()`
- L241: `tagRows()`
- L253: `sumAmount()`
- L275: `buildLikelyRelatedRecords()`
- L338: `projectTerms()`
- L372: `recordText()`
- L401: `recordDate()`
- L421: `recordTitle()`
- L441: `relatedScore()`
- L473: `scoreReason()`
- L507: `compact()`
- L513: `shortText()`
- L525: `uniqueInts()`
- L534: `rowKey()`
- L541: `mergeRows()`
- L558: `subtractRows()`
### `engine_modules/business_data/repositories/CustomerRepository.php`
**Classes / Interfaces / Traits**
- L8: `BusinessCustomerRepository`
**Functions / Methods**
- L10: `table()`
- L16: `findByKeywords()`
- L47: `normalize()`
### `engine_modules/business_data/repositories/ExpenseRepository.php`
**Classes / Interfaces / Traits**
- L8: `BusinessExpenseRepository`
**Functions / Methods**
- L10: `table()`
- L16: `findByProjectIds()`
- L30: `findByKeywords()`
- L53: `findWhere()`
- L72: `normalize()`
### `engine_modules/business_data/repositories/HistoryRepository.php`
**Classes / Interfaces / Traits**
- L8: `BusinessHistoryRepository`
**Functions / Methods**
- L11: `candidateTables()`
- L23: `findByKeywords()`
- L57: `normalize()`
### `engine_modules/business_data/repositories/IncomeRepository.php`
**Classes / Interfaces / Traits**
- L8: `BusinessIncomeRepository`
**Functions / Methods**
- L10: `table()`
- L16: `findByProjectIds()`
- L30: `findByCustomerIds()`
- L44: `findByKeywords()`
- L66: `findWhere()`
- L85: `normalize()`
### `engine_modules/business_data/repositories/ProjectRepository.php`
**Classes / Interfaces / Traits**
- L8: `BusinessProjectRepository`
**Functions / Methods**
- L10: `table()`
- L16: `findByKeywords()`
- L49: `findByCustomerIds()`
- L73: `findByIds()`
- L95: `normalize()`
### `engine_modules/business_data/repositories/QuotationRepository.php`
**Classes / Interfaces / Traits**
- L8: `BusinessQuotationRepository`
**Functions / Methods**
- L10: `table()`
- L16: `findByProjectIds()`
- L30: `findByCustomerIds()`
- L44: `findByKeywords()`
- L67: `findWhere()`
- L86: `normalize()`
### `engine_modules/business_data/repositories/RepositoryBase.php`
**Classes / Interfaces / Traits**
- L13: `BusinessRepositoryBase`
**Functions / Methods**
- L22: `__construct()`
- L29: `tables()`
- L43: `tableExists()`
- L50: `firstTable()`
- L62: `columns()`
- L85: `hasCol()`
- L92: `existingCols()`
- L97: `qi()`
- L106: `orderExpr()`
- L119: `limit()`
- L130: `normalizeIds()`
- L148: `inClause()`
- L170: `likeWhere()`
- L194: `cleanKeywords()`
- L214: `val()`
### `engine_modules/capabilities/CapabilityExecutor.php`
**Classes / Interfaces / Traits**
- L11: `GptCapabilityExecutor`
**Functions / Methods**
- L14: `__construct()`
- L18: `call()`
- L57: `log()`
### `engine_modules/capabilities/CapabilityRouter.php`
**Classes / Interfaces / Traits**
- L12: `GptCapabilityRouter`
**Functions / Methods**
- L15: `__construct()`
- L19: `route()`
- L75: `isFileReadQuery()`
- L100: `isMetaSourceOrFlowQuery()`
- L117: `isSynologySearchQuery()`
- L129: `isBusinessListLookupQuery()`
- L135: `isEntityLookupQuery()`
- L141: `isReceivableJudgeQuery()`
- L146: `isQuotationLookupQuery()`
- L151: `isExternalCandidate()`
- L156: `result()`
- L178: `log()`
### `engine_modules/capabilities/CapabilityTrace.php`
**Classes / Interfaces / Traits**
- L8: `GptCapabilityTrace`
**Functions / Methods**
- L13: `add()`
- L18: `all()`
- L23: `dump()`
### `engine_modules/capabilities/web_preflight.php`
**Functions / Methods**
- L6: `gpt_schedule_year_range_fix_v1()`
- L73: `gpt_web_capability_normalize_query()`
- L121: `gpt_web_capability_append_log_cause_hint()`
- L174: `gpt_web_date_fact_find_pending_day_notes()`
- L371: `gpt_web_date_fact_preflight()`
- L500: `gpt_web_review_human_trace()`
- L617: `gpt_web_is_code_stats_query_v1()`
- L628: `gpt_web_review_preflight()`
- L749: `gpt_web_schedule_overlay_human_trace()`
- L907: `gpt_web_schedule_overlay_parse_range()`
- L977: `gpt_web_schedule_overlay_extract_pending_notes()`
- L1119: `gpt_web_schedule_overlay_extract_dates()`
- L1154: `gpt_web_schedule_overlay_weekday()`
- L1166: `gpt_web_schedule_overlay_append_to_message()`
- L1197: `gpt_web_schedule_overlay_base_query()`
- L1217: `gpt_web_schedule_overlay_preflight()`
- L1338: `gpt_web_capability_human_trace()`
- L1544: `gpt_web_capability_preflight()`
### `engine_modules/common/DateRangeResolver.php`
**Classes / Interfaces / Traits**
- L13: `DateRangeResolver`
**Functions / Methods**
- L28: `resolve()`
- L214: `hasExplicitDateScope()`
- L233: `make()`
### `engine_modules/common/IntentKeywordMatcher.php`
**Classes / Interfaces / Traits**
- L13: `IntentKeywordMatcher`
**Functions / Methods**
- L17: `normalize()`
- L25: `weatherPattern()`
- L34: `weatherFalsePositivePattern()`
- L39: `isWeatherQuery()`
- L53: `transactionPattern()`
- L58: `isTransactionQuery()`
- L63: `paymentPattern()`
- L68: `isPaymentQuery()`
- L73: `expensePattern()`
- L78: `isExpenseQuery()`
- L83: `matchedKeywords()`
- L103: `weatherHits()`
- L112: `transactionHits()`
- L117: `paymentHits()`
- L122: `expenseHits()`
- L127: `quotationPattern()`
- L131: `isQuotationQuery()`
- L136: `quotationHits()`
### `engine_modules/common/NaturalLanguage.php`
**Classes / Interfaces / Traits**
- L22: `NaturalLanguage`
**Functions / Methods**
- L25: `normalize()`
- L41: `lower()`
- L46: `compact()`
- L54: `removeInvisibleChars()`
- L59: `normalizeSpaces()`
- L64: `replaceCommonTypos()`
- L71: `commonReplaceMap()`
- L99: `matches()`
- L104: `matchedTerms()`
- L125: `containsAny()`
- L138: `normalizeKeyword()`
- L188: `stripPunctuation()`
### `engine_modules/common/QueryUnderstanding.php`
**Classes / Interfaces / Traits**
- L11: `QueryUnderstanding`
**Functions / Methods**
- L14: `understand()`
- L91: `result()`
- L103: `isNews()`
- L108: `isWorksiteCreate()`
- L113: `isMoney()`
- L118: `isCustomer()`
- L123: `extractDate()`
- L136: `extractAmount()`
- L151: `extractCustomer()`
- L181: `extractWorkContent()`
### `engine_modules/common/RecordTextClassifier.php`
**Classes / Interfaces / Traits**
- L13: `RecordTextClassifier`
**Functions / Methods**
- L17: `clean()`
- L25: `compactText()`
- L33: `hasLeftoverCommand()`
- L47: `isCompletedLike()`
- L66: `isMoneyLike()`
- L73: `isPersonalSpendLike()`
- L89: `isCompletedPaymentLike()`
- L122: `makeCleanCandidate()`
- L157: `shouldShowCleanCandidate()`
- L181: `classifyRecordText()`
### `engine_modules/common/Trace.php`
**Classes / Interfaces / Traits**
- L17: `Trace`
**Functions / Methods**
- L20: `add()`
- L32: `raw()`
- L43: `version()`
- L48: `kv()`
- L69: `decision()`
- L85: `start()`
- L102: `done()`
- L119: `error()`
- L128: `cleanScope()`
- L141: `stringify()`
### `engine_modules/core/analysis_route.php`
**Functions / Methods**
- L11: `gpt_extract_route_info()`
### `engine_modules/core/data_paths.php`
**Functions / Methods**
- L12: `gpt_env_value()`
- L48: `gpt_data_root()`
- L56: `gpt_web_root()`
- L63: `gpt_data_path()`
- L79: `gpt_ensure_data_dir()`
- L92: `gpt_legacy_web_path()`
- L108: `gpt_data_candidate()`
### `engine_modules/core/engine_core.php`
**Functions / Methods**
- L35: `engine_process()`
- L65: `engine_get_trace_id()`
- L70: `engine_register_log_handler()`
- L84: `_engine_select_strategy()`
- L120: `_engine_init_trace()`
- L137: `_engine_normalize_context()`
- L163: `_engine_build_response()`
- L203: `_engine_lane_label()`
- L218: `_engine_log()`
### `engine_modules/core/executor.php`
**Functions / Methods**
- L20: `executor_run_python()`
- L117: `executor_run_http()`
- L157: `_executor_resolve_python()`
- L187: `_executor_build_env()`
- L205: `_executor_to_utf8()`
- L213: `_executor_fail()`
### `engine_modules/core/file_shortcut.php`
**Functions / Methods**
- L5: `gpt_handle_file_read_shortcut()`
- L267: `_shortcut_elapsed()`
- L276: `gpt_analyze_file_basic()`
### `engine_modules/core/pipeline.php`
**Functions / Methods**
- L8: `gpt_pipeline_trace()`
- L64: `gpt_run_ask_first_direct()`
- L361: `gpt_run_rag()`
### `engine_modules/core/pipeline_helpers.php`
**Functions / Methods**
- L14: `_pipeline_init_validation()`
- L69: `_pipeline_setup_environment()`
- L172: `_pipeline_should_skip_retrieval()`
- L193: `gpt_is_direct_file_analysis_query_local()`
- L219: `_pipeline_finalize_response()`
### `engine_modules/core/pipeline_v2.php`
**Functions / Methods**
- L28: `pipeline_run_agent()`
- L94: `pipeline_run_rag()`
- L155: `pipeline_run_chat_fallback()`
- L222: `_pipeline_extract_answer()`
- L251: `_pipeline_extract_tool_message()`
- L270: `_pipeline_extract_tool_trace()`
- L283: `_pipeline_extract_tool_actions()`
- L296: `_pipeline_parse_rag_output()`
- L337: `_pipeline_empty()`
### `engine_modules/core/reasoning_log.php`
**Functions / Methods**
- L8: `gpt_write_reasoning_log()`
### `engine_modules/core/runtime.php`
**Functions / Methods**
- L4: `gpt_exec_python()`
- L70: `gpt_resolve_python()`
- L79: `gpt_is_code_review_query_local()`
- L105: `gpt_check_shortcuts()`
- L178: `gpt_is_direct_action_query_local()`
- L229: `gpt_is_general_chat_query_local()`
- L261: `gpt_run_health_check()`
### `engine_modules/date/DateFactService.php`
**Classes / Interfaces / Traits**
- L8: `DateFactService`
**Functions / Methods**
- L11: `parseDateQuestion()`
### `engine_modules/date/DateMeaningAnswerComposer.php`
**Classes / Interfaces / Traits**
- L8: `DateMeaningAnswerComposer`
**Functions / Methods**
- L11: `compose()`
- L45: `formatScheduleRow()`
### `engine_modules/date/DateMeaningLookupService.php`
**Classes / Interfaces / Traits**
- L12: `DateMeaningLookupService`
**Functions / Methods**
- L18: `__construct()`
- L25: `lookup()`
- L71: `fetchScheduleRows()`
### `engine_modules/domains/project/ProjectFinder.php`
**Classes / Interfaces / Traits**
- L11: `ProjectFinder`
**Functions / Methods**
- L18: `__construct()`
- L23: `version()`
- L28: `trace()`
- L33: `find()`
- L82: `findFromQuery()`
- L92: `extractKeywordFromQuery()`
- L115: `formatCandidates()`
- L169: `cleanKeyword()`
- L177: `buildMessage()`
### `engine_modules/domains/project/ProjectRepository.php`
**Classes / Interfaces / Traits**
- L10: `ProjectRepository`
**Functions / Methods**
- L16: `version()`
- L21: `trace()`
- L26: `list()`
- L73: `search()`
- L117: `findBest()`
- L140: `findById()`
- L181: `normalizeProject()`
- L251: `buildUrl()`
- L272: `getJson()`
- L331: `extractRows()`
- L377: `extractTotal()`
- L397: `score()`
- L460: `scoreToConfidence()`
- L471: `pick()`
- L484: `findByKey()`
- L511: `guessName()`
- L560: `flattenScalars()`
- L581: `normalizeText()`
- L591: `encodePath()`
### `engine_modules/domains/quotation/QuotationCreateService.php`
**Classes / Interfaces / Traits**
- L11: `GptQuotationCreateService`
**Functions / Methods**
- L17: `trace()`
- L22: `createLinkedToProject()`
- L111: `buildPayload()`
- L178: `quotationCreateUrl()`
- L193: `postJson()`
- L268: `encodePath()`
### `engine_modules/domains/quotation/QuotationRepository.php`
**Classes / Interfaces / Traits**
- L11: `GptQuotationRepository`
**Functions / Methods**
- L17: `version()`
- L22: `trace()`
- L27: `list()`
- L75: `findByProject()`
- L154: `normalizeQuotation()`
- L223: `buildAppUrl()`
- L244: `getJson()`
- L303: `extractRows()`
- L344: `extractTotal()`
- L364: `encodePath()`
- L382: `norm()`
### `engine_modules/expenses/ExpenseFormatter.php`
**Classes / Interfaces / Traits**
- L11: `ExpenseFormatter`
**Functions / Methods**
- L14: `formatEmpty()`
- L39: `formatSummary()`
- L76: `formatFullList()`
- L118: `formatCompactRow()`
- L128: `formatFullRow()`
- L145: `compactTitle()`
- L169: `buildDisplayLabel()`
- L188: `formatMonth()`
- L203: `formatShortDate()`
- L214: `categoryLabel()`
- L227: `shorten()`
### `engine_modules/expenses/ExpenseQueryParser.php`
**Classes / Interfaces / Traits**
- L13: `ExpenseQueryParser`
**Functions / Methods**
- L17: `parse()`
- L56: `extractExpenseFilters()`
- L65: `extractCategoryFilter()`
- L90: `hasAllScope()`
- L95: `extractExpenseKeyword()`
### `engine_modules/expenses/ExpenseRepository.php`
**Classes / Interfaces / Traits**
- L13: `ExpenseRepository`
**Functions / Methods**
- L16: `fetchRows()`
### `engine_modules/expenses/ExpenseSummary.php`
**Classes / Interfaces / Traits**
- L13: `ExpenseSummary`
**Functions / Methods**
- L16: `build()`
### `engine_modules/formatters/ScheduleGroupedFormatter.php`
**Classes / Interfaces / Traits**
- L15: `ScheduleGroupedFormatter`
**Functions / Methods**
- L18: `polish()`
- L64: `cleanOutputText()`
- L96: `label()`
- L158: `labelSummary()`
- L184: `cleanText()`
- L198: `stripTimePrefix()`
### `engine_modules/formatters/ScheduleSummaryFormatter.php`
**Classes / Interfaces / Traits**
- L14: `ScheduleSummaryFormatter`
**Functions / Methods**
- L17: `isSummaryRequest()`
- L21: `format()`
- L100: `classifyRow()`
- L146: `formatItem()`
- L181: `formatDate()`
- L198: `cleanOutputText()`
- L216: `cleanTailText()`
### `engine_modules/llm_intent_classifier.php`
**Functions / Methods**
- L10: `llm_classify_intents()`
### `engine_modules/memory/PendingRecordLookupService.php`
**Classes / Interfaces / Traits**
- L8: `PendingRecordLookupService`
**Functions / Methods**
- L12: `__construct()`
- L17: `findDayMeaningNotes()`
- L154: `extractExplicitDates()`
- L201: `cleanText()`
### `engine_modules/news/NewsConfig.php`
**Classes / Interfaces / Traits**
- L8: `NewsConfig`
**Functions / Methods**
- L21: `fullTableName()`
### `engine_modules/news/NewsFormatter.php`
**Classes / Interfaces / Traits**
- L12: `NewsFormatter`
**Functions / Methods**
- L16: `__construct()`
- L25: `formatList()`
- L55: `formatRow()`
### `engine_modules/news/NewsQueryParser.php`
**Classes / Interfaces / Traits**
- L10: `NewsQueryParser`
**Functions / Methods**
- L18: `extractKeyword()`
- L23: `isNewsQuery()`
### `engine_modules/news/NewsRepository.php`
**Classes / Interfaces / Traits**
- L16: `NewsRepository`
**Functions / Methods**
- L20: `__construct()`
- L25: `tableExists()`
- L48: `getColumns()`
- L73: `detectColumns()`
- L90: `firstExisting()`
- L108: `search()`
- L216: `qi()`
### `engine_modules/news/NewsTextCleaner.php`
**Classes / Interfaces / Traits**
- L8: `NewsTextCleaner`
**Functions / Methods**
- L11: `clean()`
- L35: `shorten()`
### `engine_modules/news/NewsTrace.php`
**Classes / Interfaces / Traits**
- L8: `NewsTrace`
**Functions / Methods**
- L14: `add()`
- L23: `addData()`
### `engine_modules/parsers/ScheduleCreateParser.php`
**Classes / Interfaces / Traits**
- L15: `ScheduleCreateParser`
**Functions / Methods**
- L18: `isCreateText()`
- L32: `parseApprovedText()`
- L37: `parseCreateParams()`
- L49: `parse()`
- L76: `cleanTitle()`
### `engine_modules/parsers/ScheduleRangeParser.php`
**Classes / Interfaces / Traits**
- L12: `ScheduleRangeParser`
**Functions / Methods**
- L15: `parse()`
- L199: `extractTitle()`
- L220: `isCountRequest()`
### `engine_modules/pipeline/DataSourceMap.php`
**Functions / Methods**
- L15: `gpt_pipeline_data_source_map()`
- L302: `gpt_pipeline_find_domain()`
- L320: `gpt_pipeline_data_source_get()`
- L344: `gpt_pipeline_data_source_describe()`
- L393: `gpt_pipeline_data_source_describe_query()`
### `engine_modules/pipeline/FollowupResolver.php`
**Classes / Interfaces / Traits**
- L17: `PipelineFollowupResolver`
**Functions / Methods**
- L21: `resolve()`
- L142: `normalize()`
- L170: `looksLikeFollowup()`
- L196: `isExplicitStandaloneQuestion()`
- L239: `isCountFollowup()`
- L244: `isPriceFollowup()`
- L249: `isPurchaseFollowup()`
- L254: `isScheduleFollowup()`
- L259: `looksStockContext()`
- L267: `looksStockSubject()`
- L275: `looksScheduleContext()`
- L280: `extractContext()`
- L352: `flattenMemory()`
- L383: `collectItems()`
- L434: `extractSubject()`
- L461: `cleanSubject()`
### `engine_modules/quotations/QuotationFormatter.php`
**Classes / Interfaces / Traits**
- L11: `QuotationFormatter`
**Functions / Methods**
- L14: `format()`
- L22: `formatList()`
- L111: `formatDetail()`
- L191: `extractItems()`
- L202: `formatLookupResult()`
- L258: `pick()`
- L269: `pickAmount()`
- L287: `formatDate()`
- L296: `shorten()`
### `engine_modules/quotations/QuotationMutationPlanner.php`
**Classes / Interfaces / Traits**
- L13: `QuotationMutationPlanner`
**Functions / Methods**
- L17: `plan()`
- L51: `detectType()`
- L68: `planCreate()`
- L115: `planUpdate()`
- L191: `planDelete()`
- L242: `candidatePlan()`
- L305: `failPlan()`
- L315: `extractLookupKeyword()`
- L357: `extractCreateKeyword()`
- L388: `extractAmount()`
- L409: `extractStatus()`
- L420: `humanTitle()`
- L443: `pick()`
- L454: `pickAmount()`
### `engine_modules/quotations/QuotationQueryParser.php`
**Classes / Interfaces / Traits**
- L12: `QuotationQueryParser`
**Functions / Methods**
- L16: `parse()`
- L73: `extractId()`
- L82: `extractLookupKeyword()`
### `engine_modules/quotations/QuotationRepository.php`
**Classes / Interfaces / Traits**
- L13: `QuotationRepository`
**Functions / Methods**
- L16: `fetchList()`
- L47: `fetchDetail()`
- L101: `lookupOne()`
- L180: `scoreRow()`
- L211: `rowSearchText()`
- L249: `normalizeSearchText()`
- L257: `pick()`
- L268: `buildUrl()`
- L310: `pathEndsWith()`
- L318: `joinPath()`
- L335: `httpGetJson()`
- L387: `extractRows()`
- L413: `extractDetailRow()`
- L436: `extractTotal()`
- L458: `isListArray()`
- L467: `encodePath()`
### `engine_modules/repositories/CustomerRepositoryLegacy.php`
**Functions / Methods**
- L14: `gpt_customer_search_with_summary()`
- L65: `gpt_customer_income_summary()`
- L116: `gpt_customer_quotation_summary()`
- L174: `gpt_customer_build_message()`
- L215: `gpt_customer_append_income_lines()`
- L253: `gpt_customer_append_quotation_lines()`
### `engine_modules/repositories/DbConnection.php`
**Functions / Methods**
- L14: `gpt_db_pdo()`
- L84: `gpt_operational_pdo()`
### `engine_modules/repositories/MemoryRepository.php`
**Functions / Methods**
- L16: `gpt_scope_key()`
- L24: `gpt_load_memory_from_db()`
- L147: `gpt_save_chat_turn()`
- L230: `gpt_maybe_trigger_reindex()`
- L311: `gpt_spawn_background_reindex()`
- L396: `gpt_windows_cmd_exe()`
- L412: `gpt_escape_batch_value()`
- L420: `gpt_escape_batch_path()`
### `engine_modules/repositories/PaymentRepository.php`
**Functions / Methods**
- L32: `gpt_fetch_payment_rows()`
- L156: `gpt_fetch_sales_rows()`
- L163: `gpt_fetch_income_rows()`
- L170: `gpt_fetch_income_records()`
- L177: `gpt_fetch_payment_records()`
- L184: `gpt_fetch_payments_by_range()`
- L193: `gpt_save_payment_record()`
- L475: `gpt_storage_find_customer_id_for_payment()`
- L554: `gpt_storage_find_project_id_for_payment()`
### `engine_modules/repositories/ProjectRepositoryLegacy.php`
**Functions / Methods**
- L13: `gpt_storage_find_customer_id()`
- L93: `gpt_storage_find_project_id()`
- L222: `gpt_storage_project_title()`
- L256: `gpt_storage_ensure_project()`
- L409: `gpt_storage_match_debug()`
- L427: `gpt_mark_project_completion()`
### `engine_modules/repositories/ScheduleFetchRepository.php`
**Functions / Methods**
- L14: `gpt_fetch_schedule_rows()`
- L345: `gpt_schedule_fetch_virtual_holiday_rows()`
- L411: `gpt_schedule_fetch_dedupe_rows()`
- L443: `gpt_schedule_fetch_table_candidates()`
- L464: `gpt_schedule_fetch_norm()`
- L474: `gpt_schedule_fetch_columns()`
- L498: `gpt_schedule_fetch_col_expr()`
### `engine_modules/repositories/ScheduleRepository.php`
**Functions / Methods**
- L18: `gpt_storage_ensure_calendar_project()`
- L146: `gpt_storage_cleanup_malformed_schedule_duplicates()`
- L238: `gpt_schedule_prepare_normalized_data()`
- L304: `gpt_save_schedule_record_base_v1()`
- L647: `gpt_schedule_update_normalized_extra_fields_wrapper_v1()`
- L694: `gpt_save_schedule_record()`
### `engine_modules/repositories/StockRepository.php`
**Functions / Methods**
- L19: `gpt_fetch_stock_rows()`
- L76: `gpt_filter_stock_rows_by_words()`
- L180: `gpt_stock_primary_breaker_match()`
- L195: `gpt_stock_is_accessory_row()`
- L211: `gpt_normalize_stock_keyword()`
- L237: `gpt_normalize_stock_text()`
- L249: `gpt_dedupe_stock_rows()`
- L278: `gpt_update_stock_row()`
- L364: `gpt_fetch_stock_purchase_logs()`
### `engine_modules/repositories/StorageLogRepository.php`
**Functions / Methods**
- L16: `gpt_scope_key()`
- L27: `gpt_load_memory_from_db()`
- L153: `gpt_save_chat_turn()`
- L247: `gpt_maybe_trigger_reindex()`
- L341: `gpt_spawn_background_reindex()`
- L434: `gpt_windows_cmd_exe()`
- L452: `gpt_escape_batch_value()`
- L462: `gpt_escape_batch_path()`
### `engine_modules/repositories/StorageUtils.php`
**Functions / Methods**
- L13: `gpt_storage_is_dry_run()`
- L37: `gpt_storage_table_exists()`
- L65: `gpt_storage_columns()`
- L99: `gpt_storage_bind()`
- L130: `gpt_storage_money()`
- L191: `gpt_storage_text()`
- L207: `gpt_storage_nullable_text()`
- L219: `gpt_storage_date()`
- L247: `gpt_storage_datetime()`
### `engine_modules/repositories/WorklogRepository.php`
**Functions / Methods**
- L13: `gpt_save_worklog_record()`
### `engine_modules/response/HumanResponseComposer.php`
**Classes / Interfaces / Traits**
- L13: `GptHumanResponseComposer`
**Functions / Methods**
- L15: `compose()`
- L40: `buildSystemPrompt()`
- L64: `buildUserPrompt()`
- L128: `fallback()`
- L168: `callLmStudio()`
- L255: `gpt_human_response_composer()`
### `engine_modules/response/ResponseComposer.php`
**Classes / Interfaces / Traits**
- L17: `GptResponseComposer`
**Functions / Methods**
- L19: `compose()`
- L44: `composeNewsPlanner()`
- L102: `toolMessage()`
- L123: `queryWantsPlanning()`
- L135: `composeSchedulePlanner()`
- L219: `buildScheduleHumanContext()`
- L266: `callLmStudio()`
- L359: `looksNoNews()`
- L364: `extractNewsTitles()`
- L401: `filterNewsTitlesForPlay()`
- L422: `playNewsRelevanceScore()`
- L453: `extractPlannerRecommendation()`
- L479: `gpt_response_composer()`
### `engine_modules/response/ToolAnswerBuilder.php`
**Classes / Interfaces / Traits**
- L10: `GptToolAnswerBuilder`
**Functions / Methods**
- L12: `build()`
- L30: `gpt_tool_answer_builder()`
### `engine_modules/response/ToolResultInspector.php`
**Classes / Interfaces / Traits**
- L17: `GptToolResultInspector`
**Functions / Methods**
- L19: `inspect()`
- L150: `isDryRunOrJudgeOnly()`
- L155: `hasBadEntityFragment()`
- L165: `hasBadEntityInData()`
- L212: `looksLikeGiftOrMemoNotIncome()`
- L225: `gpt_tool_result_inspector()`
### `engine_modules/review/ReviewAnswerComposer.php`
**Classes / Interfaces / Traits**
- L8: `ReviewAnswerComposer`
**Functions / Methods**
- L11: `composePlanOnly()`
- L18: `composeEvidenceAnswer()`
- L145: `firstBucket()`
- L154: `appendBucketSection()`
- L179: `formatCandidateTitle()`
- L194: `shortTitle()`
- L208: `reasonText()`
### `engine_modules/review/ReviewDbExportEvidenceCollector.php`
**Classes / Interfaces / Traits**
- L13: `ReviewDbExportEvidenceCollector`
**Functions / Methods**
- L17: `__construct()`
- L22: `collect()`
- L92: `candidateFiles()`
- L122: `scanFile()`
- L173: `lineToCandidate()`
- L217: `normalizeMarkdownLine()`
- L232: `extractDate()`
- L253: `extractAmount()`
- L278: `detectBucket()`
- L303: `score()`
- L328: `reasons()`
- L347: `makeTitle()`
- L358: `bucketLabel()`
- L370: `emptyResult()`
### `engine_modules/review/ReviewEvidenceCollector.php`
**Classes / Interfaces / Traits**
- L13: `ReviewEvidenceCollector`
**Functions / Methods**
- L16: `collect()`
- L94: `fetchScheduleRows()`
- L117: `normalizeRow()`
- L163: `scoreCandidate()`
- L292: `bucketLabel()`
- L303: `firstNonEmpty()`
### `engine_modules/review/ReviewEvidencePlanner.php`
**Classes / Interfaces / Traits**
- L8: `ReviewEvidencePlanner`
**Functions / Methods**
- L11: `buildPlan()`
### `engine_modules/review/ReviewLookupService.php`
**Classes / Interfaces / Traits**
- L14: `ReviewLookupService`
**Functions / Methods**
- L22: `__construct()`
- L31: `lookup()`
- L71: `mergeEvidence()`
### `engine_modules/review/ReviewQuestionService.php`
**Classes / Interfaces / Traits**
- L8: `ReviewQuestionService`
**Functions / Methods**
- L11: `parse()`
- L80: `detectFocus()`
### `engine_modules/routing/CapabilityRouter.php`
**Classes / Interfaces / Traits**
- L13: `CapabilityRouter`
**Functions / Methods**
- L21: `detect()`
### `engine_modules/routing/HistoryRecentListPolicy.php`
**Classes / Interfaces / Traits**
- L15: `HistoryRecentListPolicy`
**Functions / Methods**
- L18: `makeSpec()`
- L58: `looksLikeDefaultHistoryList()`
- L98: `normalize()`
### `engine_modules/routing/IntentRouter.php`
**Classes / Interfaces / Traits**
- L13: `IntentRouter`
**Functions / Methods**
- L17: `detect()`
### `engine_modules/routing/OperationRouter.php`
**Classes / Interfaces / Traits**
- L12: `OperationRouter`
**Functions / Methods**
- L26: `detect()`
### `engine_modules/routing/PermissionRouter.php`
**Classes / Interfaces / Traits**
- L13: `PermissionRouter`
**Functions / Methods**
- L22: `detect()`
### `engine_modules/routing/PlannerHintAdapter.php`
**Classes / Interfaces / Traits**
- L11: `PlannerHintAdapter`
**Functions / Methods**
- L14: `makeSpec()`
- L53: `extractToolHint()`
- L76: `extractString()`
### `engine_modules/routing/QueryFeatureExtractor.php`
**Classes / Interfaces / Traits**
- L10: `QueryFeatureExtractor`
**Functions / Methods**
- L12: `extract()`
- L56: `normalize()`
- L64: `hasPeriod()`
- L69: `hasSummary()`
- L74: `hasList()`
- L79: `isHistoryKeywordSearch()`
- L88: `isHistoryPeriodList()`
- L98: `isHistoryPeriodSummary()`
- L111: `isWorklogPeriodList()`
- L119: `isPersonLookup()`
- L124: `isWriteRequest()`
- L131: `isScheduleDateLookup()`
- L143: `isSchedulePeriodList()`
- L160: `isStockPriceLookup()`
- L176: `isStockQuantityLookup()`
- L193: `hasProductClue()`
- L205: `isPlannerDaySuggestion()`
- L226: `isPlannerPlaySuggestion()`
- L246: `isPhysicalControlAction()`
### `engine_modules/routing/RouteControlledPolicy.php`
**Classes / Interfaces / Traits**
- L18: `RouteControlledPolicy`
**Functions / Methods**
- L21: `makeSpec()`
- L99: `isAllowed()`
- L138: `applyDomainFlags()`
- L207: `normalizeScheduleDateQuery()`
- L247: `traceLines()`
### `engine_modules/routing/RouteDecision.php`
**Classes / Interfaces / Traits**
- L10: `RouteDecision`
**Functions / Methods**
- L24: `make()`
- L37: `toToolSpec()`
- L55: `summary()`
- L71: `traceLines()`
### `engine_modules/routing/RouteDecisionComparator.php`
**Classes / Interfaces / Traits**
- L12: `RouteDecisionComparator`
**Functions / Methods**
- L14: `compareFromScope()`
- L61: `pickQuery()`
- L87: `pickActualTool()`
- L119: `pickActualMode()`
### `engine_modules/routing/RoutePolicy.php`
**Classes / Interfaces / Traits**
- L13: `RoutePolicy`
**Functions / Methods**
- L15: `decide()`
### `engine_modules/routing/RouteSanityChecker.php`
**Classes / Interfaces / Traits**
- L21: `RouteSanityChecker`
**Functions / Methods**
- L40: `sanitize()`
- L150: `evaluate()`
- L255: `looksPhysicalControl()`
- L277: `looksCodeStructureQuestion()`
- L288: `looksGenuineStockQuery()`
- L300: `looksBusinessModuleDiagnosticQuery()`
- L327: `businessModuleDiagnosticFallback()`
- L339: `looksSynologySearchQuery()`
- L351: `isMutatingTool()`
- L384: `looksHistoryMemoCreateQuery()`
- L406: `norm()`
- L419: `registryHas()`
- L434: `rewriteToolSpec()`
- L495: `dedupeByTool()`
### `engine_modules/routing/RouteTrace.php`
**Classes / Interfaces / Traits**
- L8: `RouteTrace`
**Functions / Methods**
- L12: `add()`
- L45: `export()`
- L56: `short()`
### `engine_modules/routing/RouterKernel.php`
**Classes / Interfaces / Traits**
- L25: `RouterKernel`
**Functions / Methods**
- L29: `observe()`
- L90: `guessIntent()`
- L121: `guessOperation()`
- L138: `guessPermission()`
- L147: `guessCapability()`
- L160: `guessToolHint()`
### `engine_modules/routing/SafetyHintPolicy.php`
**Classes / Interfaces / Traits**
- L18: `SafetyHintPolicy`
**Functions / Methods**
- L21: `makeStockReadExceptionSpec()`
- L54: `looksLikeSafeStockReadException()`
- L83: `normalize()`
### `engine_modules/routing/ToolRoutePlanner.php`
**Classes / Interfaces / Traits**
- L13: `ToolRoutePlanner`
**Functions / Methods**
- L17: `recommend()`
### `engine_modules/services/ScheduleCreateService.php`
**Classes / Interfaces / Traits**
- L18: `ScheduleCreateService`
**Functions / Methods**
- L21: `isApprovedScheduleCreateRequest()`
- L51: `parseApprovedScheduleCreateText()`
- L56: `createFromApprovedText()`
- L66: `create()`
- L76: `saveParsed()`
### `engine_modules/services/ScheduleReviewService.php`
**Classes / Interfaces / Traits**
- L15: `ScheduleReviewService`
**Functions / Methods**
- L19: `isReviewRequest()`
- L42: `review()`
- L213: `formatMessage()`
- L336: `humanItemLine()`
- L347: `isCompletedPaymentLike()`
- L357: `isPersonalSpendLike()`
- L362: `hasLeftoverCommand()`
- L367: `shouldShowCleanCandidate()`
- L372: `compactText()`
- L377: `makeCleanCandidate()`
- L382: `dateOf()`
- L397: `isDone()`
- L414: `isCompletedLike()`
- L420: `isActionLike()`
- L425: `isDeadlineLike()`
- L430: `isMoneyLike()`
- L435: `isWorkLike()`
- L440: `clean()`
- L445: `shorten()`
- L456: `formatDate()`
### `engine_modules/storage_memory.php`
**Functions / Methods**
- L16: `gpt_scope_key()`
- L24: `gpt_load_memory_from_db()`
- L147: `gpt_save_chat_turn()`
- L230: `gpt_maybe_trigger_reindex()`
- L311: `gpt_spawn_background_reindex()`
- L396: `gpt_windows_cmd_exe()`
- L412: `gpt_escape_batch_value()`
- L420: `gpt_escape_batch_path()`
### `engine_modules/system/ApprovalPendingStore.php`
**Classes / Interfaces / Traits**
- L15: `GptApprovalPendingStore`
**Functions / Methods**
- L19: `__construct()`
- L31: `save()`
- L75: `latest()`
- L104: `markLatest()`
- L143: `clearLatest()`
- L156: `gpt_approval_pending_store()`
### `engine_modules/system/IntentRuleEngine.php`
**Classes / Interfaces / Traits**
- L15: `GptIntentRuleEngine`
**Functions / Methods**
- L19: `__construct()`
- L26: `match()`
- L66: `version()`
- L71: `loadConfig()`
- L99: `ruleMatches()`
- L143: `containsAny()`
- L154: `contains()`
- L164: `normalize()`
- L176: `stringList()`
- L198: `gpt_intent_rule_engine()`
- L205: `gpt_match_intent_rule()`
### `engine_modules/system/SystemContextBuilder.php`
**Classes / Interfaces / Traits**
- L16: `GptSystemContextBuilder`
**Functions / Methods**
- L21: `__construct()`
- L26: `version()`
- L31: `build()`
- L123: `analyze()`
- L161: `detectIntent()`
- L250: `detectOperation()`
- L339: `detectPermission()`
- L360: `detectMissingFields()`
- L413: `followupQuestion()`
- L452: `intentRulesText()`
- L468: `intentLabel()`
- L484: `hasTarget()`
- L493: `hasWorkContent()`
- L501: `hasDateHint()`
- L513: `hasAmount()`
- L518: `containsAny()`
- L529: `normalize()`
- L540: `safeInline()`
- L557: `gpt_build_system_context()`
- L565: `gpt_system_analyze_query()`
### `engine_modules/system/SystemGate.php`
**Classes / Interfaces / Traits**
- L18: `GptSystemGate`
**Functions / Methods**
- L20: `analyze()`
- L89: `enrichContext()`
- L110: `traceLines()`
- L147: `analysisFromIntentRule()`
- L172: `intentLabel()`
- L192: `gpt_system_gate_analyze()`
- L199: `gpt_system_gate_enrich_context()`
- L206: `gpt_system_gate_trace_lines()`
### `engine_modules/system/SystemPromptInjector.php`
**Classes / Interfaces / Traits**
- L17: `GptSystemPromptInjector`
**Functions / Methods**
- L19: `injectIntoMessages()`
- L34: `injectIntoPrompt()`
- L45: `buildSystemMessage()`
- L53: `analyzeOnly()`
- L58: `messagesAlreadyHaveSystemContext()`
- L80: `gpt_inject_system_context_into_messages()`
- L87: `gpt_inject_system_context_into_prompt()`
- L94: `gpt_build_system_message()`
### `engine_modules/tools/AutoModularizeTool.php`
**Classes / Interfaces / Traits**
- L17: `AutoModularizeTool`
**Functions / Methods**
- L28: `__construct()`
- L46: `name()`
- L52: `description()`
- L59: `intents()`
- L72: `validate()`
- L78: `execute()`
- L335: `pickTopCandidates()`
- L366: `findTargetMetric()`
### `engine_modules/tools/AutoScanTool.php`
**Classes / Interfaces / Traits**
- L11: `AutoScanTool`
**Functions / Methods**
- L13: `name()`
- L14: `description()`
- L19: `intents()`
- L21: `validate()`
- L26: `execute()`
- L99: `selectCandidates()`
- L133: `recentlyScanned()`
- L140: `markScanned()`
- L151: `pickMostValuable()`
- L172: `autoDiagnose()`
- L247: `filterQualityIssues()`
- L282: `hasSyntaxError()`
- L316: `tooSimilar()`
- L331: `formatProposal()`
- L376: `savePending()`
- L383: `callLLM()`
### `engine_modules/tools/BusinessDataStructureTool.php`
**Classes / Interfaces / Traits**
- L14: `BusinessDataStructureTool`
**Functions / Methods**
- L17: `name()`
- L21: `description()`
- L26: `intents()`
- L35: `validate()`
- L55: `execute()`
### `engine_modules/tools/BusinessModuleDiagnosticTool.php`
**Classes / Interfaces / Traits**
- L10: `BusinessModuleDiagnosticTool`
**Functions / Methods**
- L12: `name()`
- L16: `description()`
- L21: `intents()`
- L30: `validate()`
- L40: `execute()`
- L85: `inspectModule()`
- L186: `summarize()`
- L219: `formatMessage()`
- L267: `moduleProblems()`
- L290: `moduleImprovements()`
- L314: `projectRoot()`
### `engine_modules/tools/CapabilityHelpTool.php`
**Classes / Interfaces / Traits**
- L8: `CapabilityHelpTool`
**Functions / Methods**
- L10: `name()`
- L14: `description()`
- L19: `intents()`
- L29: `validate()`
- L44: `execute()`
### `engine_modules/tools/ChatTool.php`
**Classes / Interfaces / Traits**
- L177: `ChatTool`
**Functions / Methods**
- L18: `gpt_chattool_flow_catalog_answer_v1()`
- L84: `gpt_chattool_flow_catalog_suspicion_v1()`
- L181: `name()`
- L185: `description()`
- L190: `intents()`
- L195: `validate()`
- L208: `execute()`
- L370: `callLLM()`
- L467: `lmBaseUrl()`
- L484: `shortText()`
### `engine_modules/tools/CodeDiagnosticTool.php`
**Functions / Methods**
- L9: `name()`
- L13: `description()`
- L18: `intents()`
- L23: `validate()`
- L35: `execute()`
- L144: `flagIsFalse()`
- L158: `flagIsTrue()`
- L176: `savePendingFix()`
- L189: `extractTarget()`
- L259: `getRecentChangesWithMap()`
- L328: `extractFilesFromDiff()`
- L345: `resolveFilePath()`
- L360: `getRecentChanges()`
- L403: `runGit()`
- L419: `isValidDiff()`
- L445: `truncateDiff()`
- L456: `getRecentlyModifiedFiles()`
- L506: `getPhpFilesInDir()`
- L530: `analyzeCode()`
- L541: `createAnalysisPrompt()`
- L653: `callLLM()`
- L745: `diagnoseLMConnection()`
- L772: `formatAnalysis()`
### `engine_modules/tools/CodeFixTool.php`
**Classes / Interfaces / Traits**
- L8: `CodeFixTool`
**Functions / Methods**
- L10: `name()`
- L14: `description()`
- L19: `intents()`
- L24: `validate()`
- L29: `execute()`
- L177: `resolveTargetFromPending()`
- L245: `handleModularizeApproval()`
- L350: `loadPendingFix()`
- L371: `applyPendingFix()`
- L510: `generateFixFromAnalysis()`
- L563: `extractTargetFile()`
- L575: `resolveFilePath()`
- L588: `createBackup()`
- L603: `generateFix()`
- L610: `createFixPrompt()`
- L648: `callLLM()`
- L700: `parseFixResponse()`
- L739: `generateDiff()`
- L767: `verifySyntax()`
### `engine_modules/tools/CodeMapTool.php`
**Classes / Interfaces / Traits**
- L18: `CodeMapTool`
**Functions / Methods**
- L22: `name()`
- L27: `description()`
- L32: `intents()`
- L43: `validate()`
- L57: `execute()`
- L150: `rootPath()`
- L155: `loadMap()`
- L183: `allCategories()`
- L198: `searchCategories()`
- L278: `domainBoost()`
- L332: `domainPenalty()`
- L351: `containsAnyTerm()`
- L373: `formatMatch()`
- L397: `fileDetail()`
- L412: `splitQueries()`
- L445: `buildMultiQueryMessage()`
- L505: `buildMessage()`
- L554: `wantsFilePreview()`
- L562: `appendPreviewToMessage()`
- L591: `appendMultiPreviewToMessage()`
- L629: `appendFilePreviewSection()`
- L683: `filePreview()`
- L752: `writeMarkdownReport()`
- L805: `normalize()`
### `engine_modules/tools/CodePatchPlannerTool.php`
**Classes / Interfaces / Traits**
- L21: `CodePatchPlannerTool`
**Functions / Methods**
- L24: `name()`
- L28: `description()`
- L33: `intents()`
- L44: `validate()`
- L50: `execute()`
- L276: `isRepairPatchCatalogListRequest()`
- L288: `formatRepairPatchCatalogList()`
- L370: `selectRepairPatchFromCatalog()`
- L505: `isRepairJobJsonRequest()`
- L513: `formatRepairJobJsonTemplate()`
- L742: `extractQuery()`
- L758: `resolveProjectRoot()`
- L774: `resolveScanPath()`
### `engine_modules/tools/CodeSearchTool.php`
**Classes / Interfaces / Traits**
- L15: `CodeSearchTool`
**Functions / Methods**
- L18: `name()`
- L22: `description()`
- L27: `intents()`
- L36: `validate()`
- L47: `execute()`
- L79: `root()`
- L84: `keywords()`
- L132: `searchIndex()`
- L220: `flattenIndexEntries()`
- L268: `looksLikeEntry()`
- L279: `searchFiles()`
- L373: `rankAndDedupe()`
- L404: `formatMessage()`
- L483: `entryString()`
- L494: `entryLine()`
- L505: `entryText()`
- L518: `snippet()`
- L557: `normalizePath()`
- L575: `relative()`
### `engine_modules/tools/CodeStatsTool.php`
**Classes / Interfaces / Traits**
- L8: `CodeStatsTool`
**Functions / Methods**
- L28: `name()`
- L33: `description()`
- L38: `intents()`
- L43: `validate()`
- L53: `execute()`
- L114: `statsQueryPattern()`
- L123: `scanProject()`
- L194: `countLines()`
- L218: `estimatePhpStats()`
- L242: `estimatePhpFunctions()`
- L308: `formatMessage()`
- L354: `relativePath()`
- L366: `isExcludedPath()`
### `engine_modules/tools/CustomerTool.php`
**Classes / Interfaces / Traits**
- L18: `CustomerTool`
**Functions / Methods**
- L20: `name()`
- L24: `description()`
- L29: `intents()`
- L34: `validate()`
- L44: `execute()`
- L228: `isCustomerAuditRequest()`
- L250: `looksLikeGenericCustomerQuery()`
- L256: `extractCustomerName()`
- L303: `isGenericCustomerToken()`
- L333: `listCustomerAuditTargets()`
- L495: `buildCustomerAuditMessage()`
- L653: `customerAuditExampleName()`
- L665: `resolvePdo()`
- L688: `detectCustomerAuditTable()`
- L837: `isNameOnlyCustomerRow()`
- L884: `isCustomerFieldUpdateRequest()`
- L909: `handleCustomerFieldUpdate()`
- L1034: `hasCustomerUpdateApproval()`
- L1039: `parseCustomerUpdateFields()`
- L1075: `extractCustomerNameForUpdate()`
- L1094: `cleanUpdateTextValue()`
- L1103: `findCustomerRowForUpdate()`
- L1148: `mapCustomerUpdateColumns()`
- L1195: `saveCustomerUpdateFields()`
- L1249: `isCustomerDeleteRequest()`
- L1267: `handleCustomerDeleteRequest()`
- L1373: `hasCustomerDeleteApproval()`
- L1385: `extractCustomerNameForDelete()`
- L1415: `cleanCustomerDeleteName()`
- L1430: `extractCustomerDeleteReason()`
- L1463: `findDeletedCustomerExportHintV1()`
- L1529: `findCustomerRowForDelete()`
- L1586: `deleteCustomerRow()`
- L1623: `pickColumn()`
- L1634: `pickColumns()`
- L1647: `cleanValue()`
- L1660: `shorten()`
- L1674: `quoteIdent()`
### `engine_modules/tools/DataCatalogTool.php`
**Classes / Interfaces / Traits**
- L8: `DataCatalogTool`
**Functions / Methods**
- L11: `name()`
- L15: `description()`
- L20: `intents()`
- L29: `validate()`
- L42: `execute()`
- L76: `buildCatalog()`
- L187: `enrichCatalog()`
- L230: `buildMessage()`
- L274: `countLines()`
- L300: `safeDirSize()`
- L335: `formatBytes()`
### `engine_modules/tools/DataLookupTool.php`
**Classes / Interfaces / Traits**
- L15: `DataLookupTool`
**Functions / Methods**
- L18: `name()`
- L22: `description()`
- L27: `intents()`
- L39: `validate()`
- L75: `execute()`
- L220: `extractKeyword()`
- L261: `isCustomerListQuery()`
- L266: `isProjectListQuery()`
- L271: `isQuotationListQuery()`
- L276: `isIncomeListQuery()`
- L281: `isExpenseListQuery()`
- L286: `isReceivableSummaryQuery()`
- L291: `formatEvidencePack()`
- L374: `formatCustomerList()`
- L428: `formatProjectList()`
- L483: `formatQuotationList()`
- L528: `formatIncomeList()`
- L575: `formatExpenseList()`
- L620: `formatReceivableSummary()`
- L648: `money()`
### `engine_modules/tools/DataSourceMapTool.php`
**Classes / Interfaces / Traits**
- L19: `DataSourceMapTool`
**Functions / Methods**
- L22: `name()`
- L26: `description()`
- L31: `intents()`
- L42: `validate()`
- L56: `execute()`
- L130: `getQuery()`
- L135: `inferTargetQueryFromDomainKeyword()`
- L160: `detectOperation()`
- L181: `isPureMetaSourceQuery()`
- L201: `extractTargetQuery()`
- L264: `isJunkTarget()`
- L275: `buildMetaFlowMessage()`
- L326: `buildUnknownDomainMessage()`
### `engine_modules/tools/ExpenseTool.php`
**Classes / Interfaces / Traits**
- L22: `ExpenseTool`
**Functions / Methods**
- L25: `name()`
- L29: `description()`
- L34: `intents()`
- L39: `validate()`
- L55: `execute()`
- L147: `fetchRows()`
- L241: `extractExpenseFilters()`
- L252: `extractCategoryFilter()`
- L277: `extractExpenseKeyword()`
- L350: `buildDisplayLabel()`
- L369: `formatEmptyMessage()`
- L395: `buildSummary()`
- L430: `formatSummary()`
- L468: `formatFullList()`
- L484: `formatCompactRow()`
- L494: `formatFullRow()`
- L511: `compactTitle()`
- L531: `shorten()`
- L542: `categoryLabel()`
- L559: `formatMonth()`
- L575: `formatShortDate()`
- L587: `isCreateRequest()`
- L596: `createExpense()`
- L710: `parseExpenseDate()`
- L734: `parseAmount()`
- L743: `detectExpenseCategory()`
- L768: `detectExpenseSite()`
- L781: `parseRange()`
### `engine_modules/tools/FlowDiagnosticTool.php`
**Classes / Interfaces / Traits**
- L659: `FlowDiagnosticTool`
**Functions / Methods**
- L23: `gpt_code_diag_self_suspicion_is_query_v1()`
- L39: `gpt_code_diag_self_suspicion_file_v1()`
- L171: `gpt_code_diag_self_suspicion_report_v1()`
- L302: `gpt_code_diag_self_suspicion_evidence_v2()`
- L341: `gpt_code_diag_self_suspicion_fixplan_v3()`
- L424: `gpt_code_diag_self_suspicion_evidence_quality_v4()`
- L499: `gpt_code_diag_context_compare_v5()`
- L587: `gpt_flow_diag_candidate_tier_v2()`
- L663: `name()`
- L667: `description()`
- L672: `intents()`
- L685: `validate()`
- L699: `execute()`
- L749: `queryFromParams()`
- L760: `success()`
### `engine_modules/tools/HistoryMemoTool.php`
**Classes / Interfaces / Traits**
- L14: `HistoryMemoTool`
**Functions / Methods**
- L17: `name()`
- L21: `description()`
- L26: `intents()`
- L37: `validate()`
- L48: `execute()`
- L59: `executeList()`
- L131: `executeCreate()`
- L192: `isCreateQuery()`
- L197: `isListQuery()`
- L204: `parseWorkDate()`
- L257: `cleanContent()`
- L281: `extractLookupKeyword()`
- L292: `parseLimit()`
- L303: `formatList()`
- L343: `cleanListContent()`
- L354: `dateKorean()`
- L363: `pdo()`
### `engine_modules/tools/HistorySearchTool.php`
**Classes / Interfaces / Traits**
- L17: `HistorySearchTool`
**Functions / Methods**
- L20: `name()`
- L25: `description()`
- L30: `intents()`
- L40: `validate()`
- L89: `execute()`
- L342: `addLocalTrace()`
- L354: `query()`
- L360: `historyFile()`
- L365: `looksLikeWriteRequest()`
- L371: `looksLikeHistorySearch()`
- L384: `extractKeyword()`
- L408: `extractTokens()`
- L458: `stripKoreanParticle()`
- L469: `searchHistoryFile()`
- L517: `searchDbTurns()`
- L625: `pdo()`
- L662: `looksLikeHistoryPeriodList()`
- L673: `resolveHistoryPeriodRange()`
- L712: `searchHistoryPeriodList()`
- L755: `searchHistoryPeriodJsonl()`
- L803: `searchHistoryPeriodDb()`
- L862: `formatPeriodListMessage()`
- L893: `scoreRow()`
- L1059: `matchedTokens()`
- L1073: `mergeAndRank()`
- L1094: `compareRows()`
- L1104: `formatMessage()`
- L1351: `cleanText()`
- L1357: `normalizeNoSpace()`
- L1364: `shorten()`
- L1377: `hpListExtractRawQuery()`
- L1400: `hpListLooksLikePeriodList()`
- L1421: `hpListResolveRange()`
- L1481: `hpListResolveLimit()`
- L1492: `hpListSearchPeriodItems()`
- L1541: `hpListSearchUiHistory()`
- L1600: `hpListSearchDbTurns()`
- L1679: `hpListPdo()`
- L1738: `hpListDbColumns()`
- L1756: `hpListPickColumn()`
- L1774: `hpListPickDate()`
- L1788: `hpListNormalizeDate()`
- L1819: `hpListPickText()`
- L1835: `hpListFormatMessage()`
- L2126: `hpListSourceLabel()`
- L2139: `hpListLooksNoisyAnswer()`
- L2171: `hpListPreview()`
- L2186: `hpListNormalizeText()`
- L2198: `hpListMergePeriodRows()`
- L2242: `hpListNormalizePeriodRow()`
- L2304: `hpSummaryLooksLikePeriodSummary()`
- L2325: `hpSummaryGroupItems()`
- L2407: `hpSummaryFormatMessage()`
- L2460: `hpSummaryTopKeywords()`
- L2524: `hpSummaryExampleQuestions()`
- L2551: `hpSummaryFlowSentence()`
- L2588: `hsValidateLooksLikeQuestionHistorySummaryV3()`
- L2629: `hsValidatePickQuerySafeV4()`
- L2653: `hsValidateLooksLikeQuestionHistorySummarySafeV4()`
- L2695: `hpSummaryPrepareItemsV6()`
- L2751: `hpSummaryNormalizeDedupeKeyV6()`
- L2770: `hpSummaryRefineGroupsV7()`
- L2801: `hpSummarySplitInternalGptGroupV7()`
### `engine_modules/tools/MemoryTool.php`
**Classes / Interfaces / Traits**
- L8: `MemoryTool`
**Functions / Methods**
- L10: `name()`
- L14: `description()`
- L19: `intents()`
- L24: `validate()`
- L29: `execute()`
- L74: `save()`
- L133: `list()`
- L177: `detectMode()`
- L201: `isReservedModeParam()`
- L221: `isListIntent()`
- L235: `hasCreateCommand()`
- L260: `cleanCreateCommand()`
- L315: `enrichRelativeDateMemory()`
- L355: `buildMemoryMetaJsonV1()`
- L450: `savePreferredMemo()`
- L490: `insertMemoIfTableFits()`
- L655: `lookupMemoryByQuery()`
- L1093: `isTodaySpecialDayMemoryQuery()`
- L1120: `extractMemoryLookupKeyword()`
- L1156: `memoryTableExists()`
- L1171: `appendMemoRows()`
- L1209: `fetchMemoRows()`
- L1273: `firstExistingColumn()`
- L1286: `extractMonthDay()`
### `engine_modules/tools/NewsReviewTool.php`
**Classes / Interfaces / Traits**
- L13: `NewsReviewTool`
**Functions / Methods**
- L15: `name()`
- L19: `description()`
- L24: `intents()`
- L35: `validate()`
- L73: `execute()`
- L180: `buildReviewMessage()`
- L208: `splitTrailingJson()`
- L226: `argInt()`
- L247: `normalize()`
### `engine_modules/tools/NewsTool.php`
**Classes / Interfaces / Traits**
- L20: `NewsTool`
**Functions / Methods**
- L23: `name()`
- L27: `description()`
- L32: `intents()`
- L37: `validate()`
- L65: `execute()`
- L218: `pdo()`
- L228: `cleanNewsKeywordForLocalIssue()`
- L263: `buildNewsFallbackKeywords()`
### `engine_modules/tools/PaymentTool.php`
**Classes / Interfaces / Traits**
- L14: `PaymentTool`
**Functions / Methods**
- L16: `name()`
- L20: `description()`
- L25: `intents()`
- L30: `validate()`
- L47: `execute()`
- L155: `isReceivableReadQuery()`
- L174: `receivableRead()`
- L252: `extractReceivableSourceLines()`
- L267: `formatReceivableAnswerForUser()`
- L352: `isTransactionLookupQuery()`
- L357: `report()`
- L443: `hasExplicitDateScope()`
- L448: `extractLookupKeyword()`
- L500: `filterRowsByKeyword()`
- L522: `rowToSearchText()`
- L546: `normalizeSearchText()`
- L553: `fetchReportRows()`
- L588: `parseAmount()`
- L619: `parseDate()`
- L642: `parseRate()`
- L651: `parseType()`
- L668: `parseNames()`
- L771: `cleanRecordMemo()`
- L784: `saveToDatabase()`
- L830: `saveToSchedule()`
### `engine_modules/tools/PersonContextTool.php`
**Classes / Interfaces / Traits**
- L15: `PersonContextTool`
**Functions / Methods**
- L18: `name()`
- L22: `description()`
- L27: `intents()`
- L36: `validate()`
- L51: `execute()`
- L194: `extractName()`
- L210: `aliases()`
- L225: `canonicalName()`
- L238: `findCustomers()`
- L271: `findCustomerRowsFromDbV3()`
- L301: `findMemos()`
- L342: `findDomainRows()`
- L383: `searchTable()`
- L429: `appendCustomerSection()`
- L466: `appendMemorySection()`
- L496: `appendDomainSection()`
- L528: `rowTitle()`
- L545: `rowDate()`
- L558: `rowAmount()`
- L574: `naturalPersonSummaryV3()`
- L829: `memoryHumanTextV31()`
- L853: `filterRealMemoryRowsV3()`
- L887: `findRecordEnrichmentTextV1()`
- L997: `normForCompareV42()`
- L1005: `pdo()`
- L1029: `tables()`
- L1046: `columns()`
- L1063: `dedupeRows()`
- L1090: `dedupeMemos()`
- L1137: `pick()`
- L1150: `moneyish()`
- L1172: `dateLabel()`
- L1187: `clean()`
### `engine_modules/tools/PlannerTool.php`
**Classes / Interfaces / Traits**
- L22: `PlannerTool`
**Functions / Methods**
- L26: `name()`
- L31: `description()`
- L36: `intents()`
- L41: `validate()`
- L46: `execute()`
- L101: `extractSharedToolContext()`
- L124: `firstMessage()`
- L139: `countScheduleItems()`
- L162: `detectMode()`
- L175: `buildTaskPlan()`
- L219: `buildPlayPlan()`
- L271: `summarizeWeather()`
- L300: `getTasks()`
- L329: `extractPeriodLabel()`
- L370: `normalize()`
### `engine_modules/tools/QuotationQuickCreateSupport.php`
**Classes / Interfaces / Traits**
- L12: `QuotationQuickCreateSupport`
**Functions / Methods**
- L17: `tryHandle()`
- L187: `isCancel()`
- L192: `activateQuickMode()`
- L210: `isQuickModeActive()`
- L233: `clearQuickMode()`
- L240: `parseCreateQuery()`
- L282: `extractAmount()`
- L312: `findProject()`
- L370: `createQuotation()`
- L434: `quotationCreateUrl()`
- L450: `encodePath()`
- L468: `postJson()`
- L543: `result()`
### `engine_modules/tools/QuotationTool.php`
**Classes / Interfaces / Traits**
- L21: `QuotationTool`
**Functions / Methods**
- L24: `name()`
- L28: `description()`
- L33: `intents()`
- L44: `approvalCommandHint()`
- L54: `validate()`
- L120: `execute()`
### `engine_modules/tools/RecordContextNoteTool.php`
**Classes / Interfaces / Traits**
- L15: `RecordContextNoteTool`
**Functions / Methods**
- L18: `name()`
- L22: `description()`
- L27: `intents()`
- L36: `validate()`
- L47: `execute()`
- L122: `parse()`
- L160: `pdo()`
### `engine_modules/tools/SafetyBlockTool.php`
**Classes / Interfaces / Traits**
- L54: `SafetyBlockTool`
**Functions / Methods**
- L15: `safety_block_tool_result_v1()`
- L57: `name()`
- L61: `description()`
- L66: `intents()`
- L76: `validate()`
- L91: `execute()`
### `engine_modules/tools/SalesTool.php`
**Classes / Interfaces / Traits**
- L8: `SalesTool`
**Functions / Methods**
- L10: `name()`
- L14: `description()`
- L19: `intents()`
- L24: `validate()`
- L29: `execute()`
- L99: `parsePeriod()`
### `engine_modules/tools/ScheduleTool.php`
**Classes / Interfaces / Traits**
- L216: `ScheduleTool`
**Functions / Methods**
- L6: `gpt_schedule_explicit_day_range_fix_v1()`
- L51: `gpt_schedule_single_day_range_fix_v1()`
- L115: `gpt_schedule_year_range_fix_v1()`
- L218: `name()`
- L224: `description()`
- L229: `intents()`
- L234: `validate()`
- L315: `execute()`
- L399: `isApprovedScheduleCreateRequest()`
- L407: `createScheduleFromApprovedText()`
- L416: `parseApprovedScheduleCreateText()`
- L424: `list()`
- L558: `handleMultiDateQuery()`
- L608: `create()`
- L618: `isScheduleSummaryRequest()`
### `engine_modules/tools/StockTool.php`
**Classes / Interfaces / Traits**
- L66: `StockTool`
**Functions / Methods**
- L70: `name()`
- L75: `description()`
- L80: `intents()`
- L85: `validate()`
- L104: `execute()`
- L194: `listStock()`
- L244: `searchStock()`
- L356: `buildPurchaseAdvice()`
- L400: `summarizeQuantity()`
- L436: `isPurchaseDecisionRequest()`
- L445: `pickDecisionQuery()`
- L469: `isUpdateRequest()`
- L474: `updateStock()`
- L556: `fallbackStockRows()`
- L623: `stockFallbackKeywords()`
- L681: `rowSearchText()`
- L694: `isStockListRequest()`
- L709: `extractCoreStockKeyword()`
- L791: `cleanSearchKeyword()`
- L834: `dedupeRows()`
- L859: `formatStockRow()`
- L917: `formatNumber()`
### `engine_modules/tools/SynologyFileReadTool.php`
**Classes / Interfaces / Traits**
- L34: `SynologyFileReadTool`
**Functions / Methods**
- L18: `gpt_flow_catalog_query_guard_v1()`
- L41: `name()`
- L46: `description()`
- L51: `intents()`
- L62: `validate()`
- L78: `execute()`
- L115: `resolvePath()`
- L168: `isRecentLogQuery()`
- L180: `findLatestLogFile()`
- L281: `extractPath()`
- L293: `extractKeyword()`
- L347: `guessScope()`
- L359: `searchCatalog()`
- L413: `sortTop()`
- L426: `scopeMatches()`
- L460: `validatePath()`
- L504: `readFilePreview()`
- L583: `readPdfText()`
- L604: `readZipDocumentPreview()`
- L660: `xlsxPreview()`
- L686: `xmlText()`
- L693: `isImageExt()`
- L698: `isTextLikeExt()`
- L706: `normalizeText()`
- L714: `clipText()`
- L724: `cleanSynologyDirectReadPath()`
### `engine_modules/tools/SynologySearchTool.php`
**Classes / Interfaces / Traits**
- L13: `SynologySearchTool`
**Functions / Methods**
- L16: `name()`
- L20: `description()`
- L25: `intents()`
- L38: `validate()`
- L47: `execute()`
- L115: `isRecentLogQuery()`
- L123: `findRecentLogFiles()`
- L205: `sortRecentLogRows()`
- L219: `extractKeyword()`
- L286: `guessScope()`
- L299: `searchFiles()`
- L400: `scopeMatches()`
- L438: `searchDbSchema()`
- L481: `formatResult()`
### `engine_modules/tools/SystemStatusTool.php`
**Classes / Interfaces / Traits**
- L19: `SystemStatusTool`
**Functions / Methods**
- L21: `name()`
- L25: `description()`
- L30: `intents()`
- L40: `validate()`
- L93: `execute()`
- L161: `getDiskInfo()`
- L196: `getMemoryInfo()`
- L249: `getCpuInfo()`
- L276: `getPhpInfo()`
- L288: `getRagInfo()`
- L329: `checkLmStudio()`
- L372: `judgeBottlenecks()`
- L504: `buildMessage()`
- L589: `httpGet()`
- L626: `getCpuCoreCount()`
- L638: `duHuman()`
- L650: `humanBytes()`
- L664: `humanSeconds()`
- L686: `normalize()`
### `engine_modules/tools/Tool.php`
**Classes / Interfaces / Traits**
- L8: `Tool`
**Functions / Methods**
- L41: `addTrace()`
- L49: `getTrace()`
- L57: `setMetadata()`
- L65: `getMetadata()`
### `engine_modules/tools/ToolExecutor.php`
**Classes / Interfaces / Traits**
- L69: `ToolExecutor`
**Functions / Methods**
- L13: `gpt_today_deep_rewrite_array_v5()`
- L74: `__construct()`
- L83: `execute()`
- L159: `executeMultiple()`
- L185: `addTrace()`
- L193: `getTrace()`
### `engine_modules/tools/ToolFeedbackAnalyzer.php`
**Classes / Interfaces / Traits**
- L8: `ToolFeedbackAnalyzer`
**Functions / Methods**
- L10: `__construct()`
- L19: `analyze()`
- L38: `calculateConfidence()`
- L60: `needsFollowUp()`
- L83: `suggestNextTools()`
- L123: `identifyIssues()`
- L157: `extractLearning()`
- L182: `refineQuery()`
### `engine_modules/tools/ToolRegistry.php`
**Classes / Interfaces / Traits**
- L8: `ToolRegistry`
**Functions / Methods**
- L16: `register()`
- L26: `get()`
- L34: `all()`
- L42: `findByIntent()`
- L53: `has()`
- L61: `getToolDescriptions()`
### `engine_modules/tools/ToolResult.php`
**Classes / Interfaces / Traits**
- L8: `ToolResult`
**Functions / Methods**
- L10: `__construct()`
- L23: `toArray()`
- L38: `success()`
- L56: `failure()`
### `engine_modules/tools/ToolSelector.php`
**Classes / Interfaces / Traits**
- L88: `ToolSelector`
**Functions / Methods**
- L31: `gpt_today_deep_selector_specs_v1()`
- L93: `__construct()`
- L98: `selectTools()`
- L1717: `applyRouteDecisionObserverV3()`
- L1755: `applyRouteDecisionControlledV1()`
- L1802: `applyRouteDecisionCompareTraceV6()`
- L1844: `matchHistoryPeriodSummaryRouteSafeV2()`
- L1889: `matchWorklogPeriodListRouteV1()`
- L1930: `matchHistoryRecentListDefaultRouteV2()`
- L1985: `matchHistoryMemoRoutesV1()`
- L2042: `matchRecordContextNoteRouteV1()`
- L2075: `matchEarlyLogCodeGuardV2()`
- L2133: `matchPersonContextRoutesV2()`
- L2184: `matchPersonCustomerMemoryRoutesV1()`
- L2255: `matchMemoryHistoryLookupEarlyV2()`
- L2285: `selectByRules()`
- L3125: `normalizeQuery()`
- L3130: `registryToolNames()`
- L3145: `firstRegisteredTool()`
- L3156: `makeToolPayload()`
- L3175: `matchRule()`
- L3185: `ruleDecisionIfRegistered()`
- L3212: `ruleDecision()`
- L3242: `matchedTerms()`
- L3262: `getToolDescriptions()`
- L3276: `askLLMToSelect()`
- L3295: `createPrompt()`
- L3342: `callLLM()`
- L3415: `parseResponse()`
- L3481: `canonicalToolName()`
- L3500: `correctMisroutedTool()`
- L3579: `isMemoryListIntent()`
- L3593: `isMemoryCreateIntent()`
- L3607: `hasWorklogStrongSignal()`
- L3621: `hasPaymentSignal()`
- L3632: `hasExpenseSignal()`
- L3649: `tsLooksLikeHistoryPeriodSummarySafeV2()`
- L3690: `tsRouteDecisionObserverV2()`
- L3732: `tsRouteDecisionTraceV2()`
- L3763: `tsRouteDecisionObserverLinesV3()`
- L3803: `tsRouteDecisionCompareLinesV5()`
- L3864: `tsRouteDecisionEmitLineV5()`
- L3889: `tsScheduleWorklogComboSpecsV1()`
- L3976: `tsScheduleQueryFromWorklogComboV1()`
- L3993: `tsWorklogReadQueryFromComboV1()`
- L4016: `tsRouteDecisionControlledSpecV1()`
- L4051: `tsRouteDecisionNormalizeScheduleDateQueryV4()`
- L4102: `scheduleEntryGuardV1()`
### `engine_modules/tools/TransactionSearchTool.php`
**Classes / Interfaces / Traits**
- L20: `TransactionSearchTool`
**Functions / Methods**
- L23: `name()`
- L27: `description()`
- L32: `intents()`
- L41: `validate()`
- L52: `execute()`
### `engine_modules/tools/WeatherTool.php`
**Classes / Interfaces / Traits**
- L8: `WeatherTool`
**Functions / Methods**
- L10: `name()`
- L14: `description()`
- L19: `intents()`
- L24: `validate()`
- L29: `execute()`
### `engine_modules/tools/WorkDoneListTool.php`
**Classes / Interfaces / Traits**
- L21: `WorkDoneListTool`
**Functions / Methods**
- L24: `name()`
- L28: `description()`
- L33: `intents()`
- L43: `validate()`
- L59: `execute()`
- L118: `pdo()`
### `engine_modules/tools/WorklogChoiceTool.php`
**Classes / Interfaces / Traits**
- L12: `WorklogChoiceTool`
**Functions / Methods**
- L15: `name()`
- L19: `description()`
- L24: `intents()`
- L33: `validate()`
- L48: `execute()`
- L89: `gptWorklogChoice1HydrateLatestOpenPendingV1()`
- L152: `gptWorklogChoice1ExtractChoiceV1()`
- L181: `gptWorklogChoice1LatestOpenPendingV1()`
- L254: `gptWorklogChoice1ExtractExistingLogIdV1()`
### `engine_modules/tools/WorklogTool.php`
**Classes / Interfaces / Traits**
- L26: `WorklogTool`
**Functions / Methods**
- L29: `name()`
- L33: `description()`
- L38: `intents()`
- L43: `validate()`
- L49: `execute()`
- L1458: `isWorklogReadListQuery()`
- L1464: `handleWorklogReadList()`
- L1469: `worklogReadListDisplayLimit()`
- L1474: `normalizeWorklogListRecords()`
- L1479: `makeWorklogDedupeKey()`
- L1484: `cleanWorklogDisplayPlace()`
- L1489: `detectWorklogDateRange()`
- L1494: `loadWorklogRecords()`
- L1505: `loadWorklogRecordsFromDb()`
- L1516: `loadWorklogRecordsFromFiles()`
- L1521: `normalizeDbWorklogRecord()`
- L1526: `firstNonEmptyWorklogValue()`
- L1531: `firstWorklogDateValue()`
- L1536: `worklogDateColumns()`
- L1541: `worklogSortKey()`
- L1546: `dedupeWorklogRecordsById()`
- L1551: `worklogTableColumnsIfExists()`
- L1556: `worklogReadListColumns()`
- L1561: `decodeWorklogFile()`
- L1566: `extractWorklogDate()`
- L1571: `compactJsonForWorklog()`
- L1576: `inspectWorklogSaveQuality()`
- L1618: `isBadWorklogContent()`
- L1652: `isBadWorklogTargetName()`
- L1682: `buildWorklogSaveQualityMessage()`
- L1700: `isAmbiguousCustomer()`
- L1731: `parseWorklogQuery()`
- L1817: `normalizeNameHint()`
- L1827: `normalizeWorkContent()`
- L1840: `hasFieldSignal()`
- L1857: `cleanForMemoEcho()`
- L1874: `normalizeWorklogPersonProjectKeyV1()`
- L1902: `findTodayExistingWorklogCandidates()`
- L1998: `buildExistingTodayWorklogMessage()`
- L2035: `buildWorklogDryRunMessage()`
- L2058: `saveExistingTodayPendingChoice()`
- L2102: `gptWorklogExistingCheckerMatchedV1()`
- L2134: `gptWorklogDirectPendingServiceBridgeV2()`
- L2174: `gptWorklogBridgeExtractQueryV2()`
- L2197: `gptWorklogBridgeIsWriteIntentV2()`
- L2219: `gptWorklogBridgeMatchedV2()`
- L2244: `gptWorklogBridgeCheckExistingTodayV2()`
- L2290: `gptWorklogBridgeSavePendingChoiceV2()`
- L2404: `gptWorklogBridgeResultOkV2()`
- L2429: `gptWorklogBridgeInstantiateV2()`
- L2464: `gptWorklogBridgeBuildArgsV2()`
- L2494: `gptWorklogBridgeMakeToolResultV2()`
### `engine_modules/tools/WorksiteDetailSupport.php`
**Classes / Interfaces / Traits**
- L12: `WorksiteDetailSupport`
**Functions / Methods**
- L16: `tryHandle()`
- L147: `findProject()`
- L229: `fetchLinkedQuotations()`
- L287: `normalizeQuotation()`
- L330: `buildAppUrl()`
- L351: `getJson()`
- L410: `extractRows()`
- L450: `encodePath()`
- L468: `norm()`
- L477: `result()`
### `engine_modules/tools/WorksiteListSupport.php`
**Classes / Interfaces / Traits**
- L11: `WorksiteListSupport`
**Functions / Methods**
- L15: `tryHandle()`
- L169: `extractLimit()`
- L178: `fetchList()`
- L240: `extractRows()`
- L280: `extractTotal()`
- L297: `deepPick()`
- L306: `findByKey()`
- L325: `guessName()`
- L353: `flattenScalars()`
- L372: `flatKeys()`
- L390: `getJson()`
- L446: `encodePath()`
- L463: `result()`
### `engine_modules/tools/WorksiteTool.php`
**Classes / Interfaces / Traits**
- L11: `WorksiteTool`
**Functions / Methods**
- L14: `name()`
- L18: `description()`
- L23: `intents()`
- L37: `validate()`
- L76: `execute()`
- L129: `makeResult()`
### `engine_modules/tools/WorksiteWorklogSupport.php`
**Classes / Interfaces / Traits**
- L11: `WorksiteWorklogSupport`
**Functions / Methods**
- L15: `tryHandle()`
- L30: `isWorklogSaveIntent()`
- L64: `isWorklogReadIntent()`
- L75: `handleSave()`
- L134: `handleRead()`
- L221: `extractKeyword()`
- L245: `parseSave()`
- L309: `cleanWorklogField()`
- L338: `cleanWorklogStatus()`
- L357: `matchField()`
- L374: `getQuery()`
- L385: `normalize()`
- L390: `makeResult()`
### `engine_modules/tools/bootstrap.php`
**Functions / Methods**
- L60: `create_tool_registry()`
- L114: `create_tool_executor()`
- L120: `create_agent()`
### `engine_modules/tools/business_modules/BusinessModuleMap.php`
**Classes / Interfaces / Traits**
- L8: `BusinessModuleMap`
**Functions / Methods**
- L10: `modules()`
- L108: `moduleOrder()`
### `engine_modules/tools/code_patch_planner/CodePatchPlannerAnalysisSanitizer.php`
**Classes / Interfaces / Traits**
- L3: `CodePatchPlannerAnalysisSanitizer`
**Functions / Methods**
- L14: `sanitize()`
- L43: `fallbackAnalysis()`
### `engine_modules/tools/code_patch_planner/CodePatchPlannerEvidenceCollector.php`
**Classes / Interfaces / Traits**
- L3: `CodePatchPlannerEvidenceCollector`
**Functions / Methods**
- L8: `__construct()`
- L13: `collect()`
- L63: `isScannableFile()`
- L68: `scoreFile()`
- L115: `extractSnippets()`
- L155: `extractFunctionList()`
- L189: `trace()`
### `engine_modules/tools/code_patch_planner/CodePatchPlannerFormatter.php`
**Classes / Interfaces / Traits**
- L3: `CodePatchPlannerFormatter`
**Functions / Methods**
- L6: `format()`
### `engine_modules/tools/code_patch_planner/CodePatchPlannerKeywordExtractor.php`
**Classes / Interfaces / Traits**
- L3: `CodePatchPlannerKeywordExtractor`
**Functions / Methods**
- L24: `extract()`
- L63: `narrowEvidenceForExplicitFile()`
- L85: `shouldSkipPart()`
### `engine_modules/tools/code_patch_planner/CodePatchPlannerLLMClient.php`
**Classes / Interfaces / Traits**
- L3: `CodePatchPlannerLLMClient`
**Functions / Methods**
- L6: `analyze()`
### `engine_modules/tools/code_patch_planner/CodePatchPlannerPromptBuilder.php`
**Classes / Interfaces / Traits**
- L3: `CodePatchPlannerPromptBuilder`
**Functions / Methods**
- L6: `build()`
### `engine_modules/tools/formatters/ScheduleFormatter.php`
**Classes / Interfaces / Traits**
- L15: `ScheduleFormatter`
**Functions / Methods**
- L19: `formatList()`
- L93: `normalizeRow()`
- L125: `cleanText()`
- L133: `cleanTitle()`
- L170: `makeDetail()`
- L198: `isDuplicateText()`
- L215: `compact()`
- L223: `classify()`
- L246: `categoryBadge()`
- L257: `dateHeader()`
- L271: `shorten()`
- L282: `extractMoney()`
- L297: `summaryByCategory()`
### `engine_modules/tools/formatters/StockFormatter.php`
**Classes / Interfaces / Traits**
- L13: `StockFormatter`
**Functions / Methods**
- L17: `formatSearchResult()`
- L63: `formatListResult()`
- L98: `summarize()`
- L131: `basicRow()`
- L176: `firstText()`
- L193: `extractQty()`
- L220: `extractUnit()`
- L237: `extractPrice()`
- L260: `formatNumber()`
### `engine_modules/tools/payment/PaymentQueryClassifier.php`
**Classes / Interfaces / Traits**
- L12: `PaymentQueryClassifier`
**Functions / Methods**
- L16: `isReportQuery()`
- L36: `parseRange()`
- L112: `reportKind()`
### `engine_modules/tools/payment/PaymentReportFormatter.php`
**Classes / Interfaces / Traits**
- L16: `PaymentReportFormatter`
**Functions / Methods**
- L20: `formatReport()`
- L85: `normalizeRows()`
- L137: `extractAmount()`
- L154: `pickName()`
- L176: `cleanName()`
- L198: `normalizeTypeKey()`
- L214: `typeLabel()`
- L228: `isNonSalesType()`
- L233: `sumByMonth()`
- L254: `shortDate()`
- L265: `shorten()`
- L276: `cleanText()`
### `engine_modules/tools/routing/CodeRoute.php`
**Classes / Interfaces / Traits**
- L17: `CodeRoute`
**Functions / Methods**
- L20: `match()`
- L80: `normalize()`
- L85: `isCodeMap()`
- L90: `isAutoModularize()`
- L96: `isPatchPlan()`
- L102: `isCodeSearch()`
- L116: `hasCodeContext()`
- L121: `isBusinessBlocked()`
### `engine_modules/tools/routing/CustomerRoute.php`
**Classes / Interfaces / Traits**
- L15: `CustomerRoute`
**Functions / Methods**
- L18: `matchLookup()`
- L55: `normalize()`
- L60: `hasCustomerLookupSignal()`
- L86: `isBlocked()`
### `engine_modules/tools/routing/MoneyRoute.php`
**Classes / Interfaces / Traits**
- L16: `MoneyRoute`
**Functions / Methods**
- L19: `match()`
- L96: `decision()`
- L118: `firstRegistered()`
- L133: `normalize()`
- L138: `isTransactionSearch()`
- L145: `isPayment()`
- L159: `isExpense()`
- L169: `hasScheduleSignal()`
### `engine_modules/tools/routing/MultiIntentRule.php`
**Classes / Interfaces / Traits**
- L20: `MultiIntentRule`
**Functions / Methods**
- L24: `select()`
### `engine_modules/tools/routing/NewsRoute.php`
**Classes / Interfaces / Traits**
- L3: `NewsRoute`
**Functions / Methods**
- L6: `match()`
### `engine_modules/tools/routing/PlannerRoute.php`
**Classes / Interfaces / Traits**
- L14: `PlannerRoute`
**Functions / Methods**
- L17: `match()`
- L54: `normalize()`
- L59: `hasPlannerSignal()`
- L71: `isBlocked()`
### `engine_modules/tools/routing/QuotationRoute.php`
**Classes / Interfaces / Traits**
- L13: `QuotationRoute`
**Functions / Methods**
- L16: `matchQuickCreate()`
- L59: `normalize()`
- L64: `isQuickCode()`
- L69: `isSiteAmountInput()`
- L95: `isBlocked()`
### `engine_modules/tools/routing/RouteGuards.php`
**Classes / Interfaces / Traits**
- L15: `RouteGuards`
**Functions / Methods**
- L19: `normalize()`
- L24: `hasWorklogSignal()`
- L46: `hasMoneySignal()`
- L64: `hasScheduleSignal()`
- L76: `hasStockSignal()`
- L90: `hasCustomerSignal()`
- L101: `hasQuotationSignal()`
- L112: `isBusinessDataSignal()`
### `engine_modules/tools/routing/RoutePipeline.php`
**Classes / Interfaces / Traits**
- L14: `RoutePipeline`
**Functions / Methods**
- L17: `match()`
- L81: `routeClassToCategory()`
- L101: `loadCategoryMapMeta()`
- L125: `loadRoutes()`
### `engine_modules/tools/routing/ScheduleRoute.php`
**Classes / Interfaces / Traits**
- L15: `ScheduleRoute`
**Functions / Methods**
- L18: `match()`
- L147: `normalize()`
- L152: `hasScheduleSignal()`
- L178: `isBlocked()`
### `engine_modules/tools/routing/StockRoute.php`
**Classes / Interfaces / Traits**
- L14: `StockRoute`
**Functions / Methods**
- L17: `matchMutationPriority()`
- L56: `normalize()`
- L61: `hasStockItemSignal()`
- L74: `hasMutationSignal()`
- L86: `isBlocked()`
### `engine_modules/tools/routing/StockRule.php`
**Classes / Interfaces / Traits**
- L17: `StockRule`
**Functions / Methods**
- L21: `select()`
### `engine_modules/tools/routing/ToolParameterExtractor.php`
**Classes / Interfaces / Traits**
- L18: `ToolParameterExtractor`
**Functions / Methods**
- L22: `forTool()`
- L48: `extractDateText()`
- L91: `forWeather()`
- L98: `forSchedule()`
- L105: `forPlanner()`
### `engine_modules/tools/routing/ToolPayloadFactory.php`
**Classes / Interfaces / Traits**
- L12: `ToolPayloadFactory`
**Functions / Methods**
- L15: `make()`
### `engine_modules/tools/routing/ToolQueryNormalizer.php`
**Classes / Interfaces / Traits**
- L14: `ToolQueryNormalizer`
**Functions / Methods**
- L18: `normalize()`
### `engine_modules/tools/routing/WeatherRoute.php`
**Classes / Interfaces / Traits**
- L15: `WeatherRoute`
**Functions / Methods**
- L18: `match()`
- L55: `normalize()`
- L60: `hasWeatherSignal()`
- L74: `isBlocked()`
### `engine_modules/tools/routing/WorksiteRoute.php`
**Classes / Interfaces / Traits**
- L11: `WorksiteRoute`
**Functions / Methods**
- L14: `matchWorklogStorage()`
- L34: `matchWorklogQuery()`
- L53: `decisionTool()`
- L76: `decision()`
- L98: `normalize()`
- L103: `hasStrongWorklogSaveSignal()`
- L139: `hasWorklogReadSignal()`
- L149: `isMoneyOrQuoteLike()`
### `engine_modules/tools/selector_routes/BusinessModuleDiagnosticRoute.php`
**Classes / Interfaces / Traits**
- L8: `BusinessModuleDiagnosticRoute`
**Functions / Methods**
- L10: `match()`
- L50: `isBusinessModuleDiagnosticQuery()`
- L85: `isGenuineStockLookup()`
- L99: `isExplicitWorklogSave()`
- L113: `normalize()`
- L118: `hasTool()`
### `engine_modules/tools/selector_routes/CapabilityHelpRoute.php`
**Classes / Interfaces / Traits**
- L8: `CapabilityHelpRoute`
**Functions / Methods**
- L10: `match()`
- L52: `isCapabilityHelpQuery()`
- L79: `normalize()`
- L84: `hasTool()`
### `engine_modules/tools/selector_routes/CodeStatsRoute.php`
**Classes / Interfaces / Traits**
- L8: `CodeStatsRoute`
**Functions / Methods**
- L10: `match()`
- L38: `hasTool()`
### `engine_modules/tools/selector_routes/SelectorEarlyRoutePipeline.php`
**Classes / Interfaces / Traits**
- L15: `SelectorEarlyRoutePipeline`
**Functions / Methods**
- L18: `match()`
### `engine_modules/tools/selector_routes/SelectorRouteResult.php`
**Classes / Interfaces / Traits**
- L8: `SelectorRouteResult`
**Functions / Methods**
- L10: `hit()`
- L18: `miss()`
- L27: `isHit()`
- L32: `toolSpec()`
- L38: `traceLines()`
### `engine_modules/tools/selector_routes/WorkDoneListRoute.php`
**Classes / Interfaces / Traits**
- L8: `WorkDoneListRoute`
**Functions / Methods**
- L10: `match()`
- L54: `hasTool()`
### `engine_modules/tools/selector_routes/WorklogCreateTakeoverRoute.php`
**Classes / Interfaces / Traits**
- L8: `WorklogCreateTakeoverRoute`
**Functions / Methods**
- L10: `match()`
- L63: `hasTool()`
### `engine_modules/tools/selector_routes/WorklogTodayDoneListRoute.php`
**Classes / Interfaces / Traits**
- L8: `WorklogTodayDoneListRoute`
**Functions / Methods**
- L10: `match()`
### `engine_modules/tools/stock/StockExecuteContextFlow.php`
**Classes / Interfaces / Traits**
- L14: `StockExecuteContextFlow`
**Functions / Methods**
- L17: `build()`
### `engine_modules/tools/stock/StockLegacyUpdateFlow.php`
**Classes / Interfaces / Traits**
- L10: `StockLegacyUpdateFlow`
**Functions / Methods**
- L17: `handle()`
### `engine_modules/tools/stock/StockMutationFlow.php`
**Classes / Interfaces / Traits**
- L10: `StockMutationFlow`
**Functions / Methods**
- L17: `handle()`
### `engine_modules/tools/stock/StockMutationParser.php`
**Classes / Interfaces / Traits**
- L13: `StockMutationParser`
**Functions / Methods**
- L17: `shouldHandle()`
- L40: `parse()`
- L106: `isConfirmed()`
- L111: `stripConfirmation()`
- L131: `formatPreview()`
- L186: `buildConfirmCommand()`
- L219: `detectAction()`
- L249: `extractQty()`
- L273: `extractPurchaseAmount()`
- L279: `extractExplicitSalePrice()`
- L294: `extractSaleMultiplier()`
- L320: `extractDate()`
- L337: `parseMoney()`
- L360: `extractItem()`
- L412: `extractFreeItem()`
- L432: `extractVendor()`
- L457: `removeMoney()`
- L467: `normalize()`
- L475: `actionLabel()`
- L487: `formatNumber()`
### `engine_modules/tools/stock/StockMutationPending.php`
**Classes / Interfaces / Traits**
- L13: `StockMutationPending`
**Functions / Methods**
- L17: `save()`
- L40: `load()`
- L65: `clear()`
- L74: `has()`
- L79: `isConfirmOnly()`
- L86: `isCancel()`
- L93: `path()`
- L98: `normalize()`
### `engine_modules/tools/stock/StockMutationRepository.php`
**Classes / Interfaces / Traits**
- L14: `StockMutationRepository`
**Functions / Methods**
- L18: `apply()`
- L34: `pdo()`
- L45: `columns()`
- L66: `create()`
- L201: `updateExistingFromCreate()`
- L295: `update()`
- L379: `delete()`
- L427: `findRows()`
- L438: `findOne()`
- L471: `formatMultipleMatches()`
- L497: `formatCreated()`
- L531: `formatUpdated()`
- L551: `appendPurchaseLogIfNeeded()`
- L674: `key()`
- L683: `num()`
### `engine_modules/tools/stock/StockPendingFlow.php`
**Classes / Interfaces / Traits**
- L10: `StockPendingFlow`
**Functions / Methods**
- L17: `handle()`
### `engine_modules/tools/stock/StockPurchaseLog.php`
**Classes / Interfaces / Traits**
- L17: `StockPurchaseLog`
**Functions / Methods**
- L21: `shouldHandle()`
- L40: `handle()`
- L91: `parse()`
- L134: `save()`
- L159: `list()`
- L208: `loadRecords()`
- L235: `formatSaved()`
- L261: `formatMissing()`
- L276: `formatList()`
- L332: `isListQuery()`
- L337: `extractDate()`
- L358: `parseRange()`
- L384: `extractQty()`
- L396: `extractAmount()`
- L411: `extractItem()`
- L436: `extractVendor()`
- L460: `logPath()`
- L465: `relativeLogPath()`
- L470: `normalize()`
- L478: `formatNumber()`
### `engine_modules/tools/stock/StockPurchaseLogFlow.php`
**Classes / Interfaces / Traits**
- L10: `StockPurchaseLogFlow`
**Functions / Methods**
- L17: `handle()`
### `engine_modules/tools/stock/StockRequestContextFactory.php`
**Classes / Interfaces / Traits**
- L3: `StockRequestContextFactory`
**Functions / Methods**
- L6: `fromParams()`
### `engine_modules/tools/stock/StockSearchFlow.php`
**Classes / Interfaces / Traits**
- L10: `StockSearchFlow`
**Functions / Methods**
- L18: `handle()`
### `engine_modules/tools/work_done_list/WorkDoneListClassifier.php`
**Classes / Interfaces / Traits**
- L8: `WorkDoneListClassifier`
**Functions / Methods**
- L10: `__construct()`
- L16: `parseListModeV4()`
- L27: `shouldSkipWorkItem()`
- L100: `classifyHumanReportItemsV6()`
- L150: `bucketWorkItemV6()`
### `engine_modules/tools/work_done_list/WorkDoneListCollector.php`
**Classes / Interfaces / Traits**
- L8: `WorkDoneListCollector`
**Functions / Methods**
- L11: `__construct()`
- L19: `collectMemoRows()`
- L62: `collectLikelyBusinessRows()`
- L119: `getTrace()`
- L124: `addTrace()`
### `engine_modules/tools/work_done_list/WorkDoneListDedupe.php`
**Classes / Interfaces / Traits**
- L8: `WorkDoneListDedupe`
**Functions / Methods**
- L10: `__construct()`
- L14: `dedupeAndSort()`
- L39: `dedupeKeyV3()`
### `engine_modules/tools/work_done_list/WorkDoneListFormatter.php`
**Classes / Interfaces / Traits**
- L8: `WorkDoneListFormatter`
**Functions / Methods**
- L10: `__construct()`
- L15: `formatAnswer()`
- L119: `formatOneWorkItemV6()`
- L138: `compactQuoteItemsV7()`
- L164: `workDoneDisplayLimit()`
### `engine_modules/tools/work_done_list/WorkDoneListNormalizer.php`
**Classes / Interfaces / Traits**
- L8: `WorkDoneListNormalizer`
**Functions / Methods**
- L10: `cleanText()`
- L22: `normV3()`
- L32: `humanTitleV5()`
- L45: `humanDetailV5()`
- L67: `formatMoneyLike()`
- L89: `pickTitle()`
- L126: `pickDetail()`
- L142: `sourceLabel()`
- L163: `looksLikeCommand()`
### `engine_modules/tools/work_done_list/WorkDoneListRange.php`
**Classes / Interfaces / Traits**
- L8: `WorkDoneListRange`
**Functions / Methods**
- L10: `parseRange()`
### `engine_modules/tools/work_done_list/WorkDoneListTableInspector.php`
**Classes / Interfaces / Traits**
- L8: `WorkDoneListTableInspector`
**Functions / Methods**
- L10: `tables()`
- L18: `columns()`
- L37: `isLikelyWorkTable()`
- L56: `pickDateColumn()`
- L78: `qi()`
### `engine_modules/tools/worklog/WorklogAmountExtractor.php`
**Classes / Interfaces / Traits**
- L15: `WorklogAmountExtractor`
**Functions / Methods**
- L22: `extract()`
- L72: `decideAmountHint()`
- L97: `normalize()`
- L109: `extractMoneyItems()`
- L171: `extractExplicitTotal()`
- L192: `amountFromNumberAndUnit()`
- L201: `detectIncomeReceived()`
- L211: `dedupeItems()`
- L229: `toPositiveInt()`
- L243: `formatWon()`
### `engine_modules/tools/worklog/WorklogChoiceAppendStore.php`
**Classes / Interfaces / Traits**
- L9: `WorklogChoiceAppendStore`
**Functions / Methods**
- L12: `ensureTable()`
- L33: `save()`
- L98: `deleteById()`
### `engine_modules/tools/worklog/WorklogChoiceHandler.php`
**Classes / Interfaces / Traits**
- L19: `WorklogChoiceHandler`
**Functions / Methods**
- L23: `__construct()`
- L28: `handle()`
- L161: `appendToExistingWorklog()`
- L175: `saveAsNewWorklog()`
- L229: `insertProjectLog()`
- L280: `tableColumns()`
- L296: `pdo()`
- L319: `buildCancelMessage()`
- L347: `buildAppendExistingMessage()`
- L382: `buildSaveNewMessage()`
- L414: `gptWorklogChoice1ExistingIdInsertFallbackV1()`
- L573: `gptWorklogChoice1FallbackExtractChoiceV1()`
- L592: `gptWorklogChoice1FallbackExtractPendingV1()`
- L624: `gptWorklogChoice1FallbackExtractExistingIdV1()`
- L655: `gptWorklogChoice1FallbackExtractQueryV1()`
- L671: `gptWorklogChoice1FallbackPdoV1()`
- L705: `gptWorklogChoice1FallbackClosePendingV1()`
- L726: `gptWorklogChoice1FallbackMakeReturnV1()`
### `engine_modules/tools/worklog/WorklogChoicePendingStore.php`
**Classes / Interfaces / Traits**
- L18: `WorklogChoicePendingStore`
**Functions / Methods**
- L23: `__construct()`
- L34: `save()`
- L87: `load()`
- L108: `latestOpen()`
- L142: `markResolved()`
- L184: `markCancelled()`
- L189: `detectChoice()`
- L213: `listRecent()`
- L231: `makeId()`
- L244: `pathForId()`
- L250: `isExpired()`
### `engine_modules/tools/worklog/WorklogDateRangeParser.php`
**Classes / Interfaces / Traits**
- L7: `WorklogDateRangeParser`
**Functions / Methods**
- L9: `detect()`
### `engine_modules/tools/worklog/WorklogExistingTodayChecker.php`
**Classes / Interfaces / Traits**
- L15: `WorklogExistingTodayChecker`
**Functions / Methods**
- L23: `check()`
- L158: `result()`
- L172: `columns()`
- L195: `pick()`
- L204: `positiveInt()`
- L214: `clean()`
- L226: `keywords()`
- L259: `score()`
- L274: `gptExistingTodayPublicAdapterV1()`
- L513: `find()`
- L520: `findExisting()`
- L527: `findToday()`
- L534: `findExistingToday()`
- L541: `run()`
- L548: `__call()`
### `engine_modules/tools/worklog/WorklogFormatHelper.php`
**Classes / Interfaces / Traits**
- L7: `WorklogFormatHelper`
**Functions / Methods**
- L9: `readListDisplayLimit()`
- L25: `cleanDisplayPlace()`
- L46: `compactJson()`
### `engine_modules/tools/worklog/WorklogPendingChoiceService.php`
**Classes / Interfaces / Traits**
- L15: `WorklogPendingChoiceService`
**Functions / Methods**
- L24: `save()`
- L91: `root()`
- L102: `createPendingChoiceBridgeV1()`
### `engine_modules/tools/worklog/WorklogReadListService.php`
**Classes / Interfaces / Traits**
- L11: `WorklogReadListService`
**Functions / Methods**
- L13: `isReadListQuery()`
- L23: `handle()`
- L111: `normalizeRecords()`
- L134: `makeDedupeKey()`
### `engine_modules/tools/worklog/WorklogRecordLoader.php`
**Classes / Interfaces / Traits**
- L7: `WorklogRecordLoader`
**Functions / Methods**
- L9: `load()`
- L31: `loadFromDb()`
- L181: `loadFromFiles()`
- L253: `normalizeDbRecord()`
- L317: `firstNonEmptyValue()`
- L329: `firstDateValue()`
- L341: `dateColumns()`
- L354: `sortKey()`
- L366: `dedupeById()`
- L391: `tableColumnsIfExists()`
- L411: `readListColumns()`
- L434: `decodeFile()`
- L473: `extractDate()`
### `engine_modules/tools/worklog/WorklogStructureExtractor.php`
**Classes / Interfaces / Traits**
- L3: `WorklogStructureExtractor`
**Functions / Methods**
- L6: `extract()`
- L45: `extractVisitReason()`
- L60: `extractWorkItems()`
- L85: `extractMoneyItems()`
- L107: `extractTotalAmount()`
- L126: `isIncomeReceived()`
- L132: `buildMissingQuestions()`
- L173: `toWon()`
- L180: `uniqueItems()`
### `engine_modules/tools/worklog/WorklogStructuredMetaStore.php`
**Classes / Interfaces / Traits**
- L3: `WorklogStructuredMetaStore`
**Functions / Methods**
- L6: `ensureTable()`
- L33: `save()`
### `engine_modules/tools/worklog/WorklogVisitRequestParser.php`
**Classes / Interfaces / Traits**
- L16: `WorklogVisitRequestParser`
**Functions / Methods**
- L25: `parse()`
- L114: `parseVisitText()`
- L155: `normalize()`
- L162: `stripTimePrefix()`
- L167: `stripCommandWords()`
- L185: `normalizeCustomerName()`
- L194: `normalizeProjectName()`
- L209: `normalizeReason()`
- L237: `normalizeWorkText()`
- L249: `setIfBetter()`
- L267: `result()`
### `engine_modules/transactions/TransactionFormatter.php`
**Classes / Interfaces / Traits**
- L13: `TransactionFormatter`
**Functions / Methods**
- L16: `format()`
- L120: `eventTypeLabel()`
- L132: `cleanDetail()`
- L140: `shorten()`
### `engine_modules/transactions/TransactionNormalizer.php`
**Classes / Interfaces / Traits**
- L13: `TransactionNormalizer`
**Functions / Methods**
- L16: `buildProfile()`
- L32: `normalizeFinancialEvents()`
- L88: `dedupeEvents()`
- L112: `parseAmount()`
- L119: `cleanField()`
- L126: `cleanMemo()`
- L134: `extractDetail()`
- L145: `cleanDetail()`
- L157: `extractSite()`
- L168: `extractMethod()`
- L179: `extractPayer()`
- L190: `normalizeSearchText()`
### `engine_modules/transactions/TransactionQueryParser.php`
**Classes / Interfaces / Traits**
- L14: `TransactionQueryParser`
**Functions / Methods**
- L18: `parse()`
- L49: `extractLookupKeyword()`
### `engine_modules/transactions/TransactionRecordReader.php`
**Classes / Interfaces / Traits**
- L13: `TransactionRecordReader`
**Functions / Methods**
- L18: `__construct()`
- L23: `searchBundle()`
- L36: `getTrace()`
- L41: `searchRecords()`
- L74: `readMarkdownRecords()`
- L109: `parseRecord()`
- L128: `containsKeyword()`
- L136: `normalizeSearchText()`
- L144: `extractRecordDate()`
### `engine_modules/transactions/TransactionSummary.php`
**Classes / Interfaces / Traits**
- L12: `TransactionSummary`
**Functions / Methods**
- L15: `summarizeEvents()`
- L35: `summarizeByMonth()`
### `engine_modules/utils/AmountParser.php`
**Classes / Interfaces / Traits**
- L3: `AmountParser`
**Functions / Methods**
- L6: `parse()`
### `engine_modules/utils/DateCalendarHelper.php`
**Functions / Methods**
- L12: `gpt_date_today()`
- L19: `gpt_date_range_forward()`
- L33: `gpt_date_resolve_relative_text()`
- L59: `gpt_calendar_fixed_holidays()`
- L76: `gpt_calendar_virtual_holiday_rows()`
### `engine_modules/utils/ScheduleTextClassifier.php`
**Functions / Methods**
- L17: `gpt_schedule_normalize_text()`
- L49: `gpt_schedule_extract_date()`
- L77: `gpt_schedule_extract_time()`
- L103: `gpt_schedule_extract_amount()`
- L118: `gpt_schedule_classify_category()`
- L170: `gpt_schedule_source_type_from_category()`
- L185: `gpt_schedule_clean_title()`
### `index.php`
- 함수/클래스 없음 또는 엔트리 파일
### `work_state.php`
**Functions / Methods**
- L204: `copyState()`
- L207: `copyHandoff()`