[{"data":1,"prerenderedAt":620},["ShallowReactive",2],{"navigation":3,"doc-/modules/phone":217,"docs-all-paths":565},[4,19,39,63,87,111,127,195,211],{"title":5,"path":6,"stem":7,"children":8},"Welcome","/welcome","01.welcome",[9,11,15],{"title":5,"path":6,"stem":10},"01.welcome/index",{"title":12,"path":13,"stem":14},"Astar とは（5分）","/welcome/product-in-5-min","01.welcome/01.product-in-5-min",{"title":16,"path":17,"stem":18},"事業文脈","/welcome/business-context","01.welcome/02.business-context",{"title":20,"path":21,"stem":22,"children":23},"Getting Started","/getting-started","02.getting-started",[24,27,31,35],{"title":25,"path":21,"stem":26},"はじめかた","02.getting-started/index",{"title":28,"path":29,"stem":30},"リポジトリ取得と環境構築","/getting-started/repo-setup","02.getting-started/01.repo-setup",{"title":32,"path":33,"stem":34},"日々の開発ループ","/getting-started/dev-loop","02.getting-started/02.dev-loop",{"title":36,"path":37,"stem":38},"検証の 4 層","/getting-started/verification-tiers","02.getting-started/03.verification-tiers",{"title":40,"path":41,"stem":42,"children":43},"Architecture","/architecture","03.architecture",[44,47,51,55,59],{"title":45,"path":41,"stem":46},"アーキテクチャ","03.architecture/index",{"title":48,"path":49,"stem":50},"マルチテナンシーと RLS","/architecture/multi-tenancy-rls","03.architecture/01.multi-tenancy-rls",{"title":52,"path":53,"stem":54},"認可モデル","/architecture/authorization","03.architecture/02.authorization",{"title":56,"path":57,"stem":58},"AI サブシステム","/architecture/ai-subsystem","03.architecture/03.ai-subsystem",{"title":60,"path":61,"stem":62},"データモデル","/architecture/data-model","03.architecture/04.data-model",{"title":64,"path":65,"stem":66,"children":67},"Backend","/backend","04.backend",[68,71,75,79,83],{"title":69,"path":65,"stem":70},"バックエンド","04.backend/index",{"title":72,"path":73,"stem":74},"層構造","/backend/layering","04.backend/01.layering",{"title":76,"path":77,"stem":78},"規約","/backend/conventions","04.backend/02.conventions",{"title":80,"path":81,"stem":82},"テスト","/backend/testing","04.backend/03.testing",{"title":84,"path":85,"stem":86},"マイグレーション","/backend/migrations","04.backend/04.migrations",{"title":88,"path":89,"stem":90,"children":91},"Frontend","/frontend","05.frontend",[92,95,99,103,107],{"title":93,"path":89,"stem":94},"フロントエンド","05.frontend/index",{"title":96,"path":97,"stem":98},"モジュール内部構造","/frontend/module-anatomy","05.frontend/01.module-anatomy",{"title":100,"path":101,"stem":102},"API アクセスの一本道","/frontend/api-access-chain","05.frontend/02.api-access-chain",{"title":104,"path":105,"stem":106},"i18n","/frontend/i18n","05.frontend/03.i18n",{"title":108,"path":109,"stem":110},"デザインシステム","/frontend/design-system","05.frontend/04.design-system",{"title":112,"path":113,"stem":114,"children":115},"Go Agent And Cli","/go-agent-and-cli","06.go-agent-and-cli",[116,119,123],{"title":117,"path":113,"stem":118},"Go agent と CLI","06.go-agent-and-cli/index",{"title":120,"path":121,"stem":122},"Go agent","/go-agent-and-cli/go-agent","06.go-agent-and-cli/01.go-agent",{"title":124,"path":125,"stem":126},"CLI","/go-agent-and-cli/cli","06.go-agent-and-cli/02.cli",{"title":128,"path":129,"stem":130,"children":131},"Modules","/modules","07.modules",[132,135,139,143,147,151,155,159,163,167,171,175,179,183,187,191],{"title":133,"path":129,"stem":134},"モジュール","07.modules/index",{"title":136,"path":137,"stem":138},"テーブル","/modules/table","07.modules/01.table",{"title":140,"path":141,"stem":142},"ドキュメントツリー","/modules/document","07.modules/02.document",{"title":144,"path":145,"stem":146},"AIチャット","/modules/ai","07.modules/03.ai",{"title":148,"path":149,"stem":150},"認証・権限","/modules/auth","07.modules/04.auth",{"title":152,"path":153,"stem":154},"AI取込","/modules/organize","07.modules/05.organize",{"title":156,"path":157,"stem":158},"ストレージ","/modules/storage","07.modules/06.storage",{"title":160,"path":161,"stem":162},"NAS同期","/modules/sync","07.modules/07.sync",{"title":164,"path":165,"stem":166},"ワークスペース","/modules/workspace","07.modules/08.workspace",{"title":168,"path":169,"stem":170},"テナントとメンバーシップ","/modules/tenant-membership","07.modules/09.tenant-membership",{"title":172,"path":173,"stem":174},"検索","/modules/search","07.modules/10.search",{"title":176,"path":177,"stem":178},"表示ビュー","/modules/display","07.modules/11.display",{"title":180,"path":181,"stem":182},"テンプレート","/modules/template","07.modules/12.template",{"title":184,"path":185,"stem":186},"メール","/modules/mail","07.modules/13.mail",{"title":188,"path":189,"stem":190},"電話","/modules/phone","07.modules/14.phone",{"title":192,"path":193,"stem":194},"リアルタイム","/modules/realtime","07.modules/15.realtime",{"title":196,"path":197,"stem":198,"children":199},"Infra And Deploy","/infra-and-deploy","08.infra-and-deploy",[200,203,207],{"title":201,"path":197,"stem":202},"インフラとデプロイ","08.infra-and-deploy/index",{"title":204,"path":205,"stem":206},"環境の種類","/infra-and-deploy/environments","08.infra-and-deploy/01.environments",{"title":208,"path":209,"stem":210},"セルフホスト構成","/infra-and-deploy/self-host","08.infra-and-deploy/02.self-host",{"title":212,"path":213,"stem":214,"children":215},"docs-map","/docs-map","09.docs-map/index",[216],{"title":212,"path":213,"stem":214},{"id":218,"title":188,"body":219,"description":559,"extension":560,"meta":561,"navigation":562,"path":189,"seo":563,"stem":190,"__hash__":564},"docs/07.modules/14.phone.md",{"type":220,"value":221,"toc":550},"minimark",[222,225,229,238,241,332,336,403,407,456,459,517],[223,224,188],"h1",{"id":188},[226,227,228],"h2",{"id":228},"一言でいうと",[230,231,232,233,237],"p",{},"Twilio 経由の電話応対を扱うモジュールです。着信は Twilio の Webhook で通知され、TwiML で応答を組み立て、通話中の音声は WebSocket でストリーミング受信して逐次文字起こしします。この文字起こしは ",[234,235,236],"code",{},"realtime"," モジュールの AI アシストパイプラインにそのまま流し込まれ、応対中のスタッフに示唆（4-bucket suggestions）を出す仕組みと直結しています。",[226,239,240],{"id":240},"主要ドメイン概念",[242,243,244,257],"table",{},[245,246,247],"thead",{},[248,249,250,254],"tr",{},[251,252,253],"th",{},"概念",[251,255,256],{},"役割",[258,259,260,271,281,295,309],"tbody",{},[248,261,262,268],{},[263,264,265],"td",{},[234,266,267],{},"TenantPhoneNumber",[263,269,270],{},"テナントが保有する Twilio 電話番号",[248,272,273,278],{},[263,274,275],{},[234,276,277],{},"CallLog",[263,279,280],{},"通話記録（着信/発信、担当者、文字起こし、タイムラインへの追加可否）",[248,282,283,292],{},[263,284,285,288,289],{},[234,286,287],{},"PhoneCallContext"," / ",[234,290,291],{},"PhoneCallContextRegistry",[263,293,294],{},"進行中通話のコンテキスト（callSid・テナント・担当者など）をメモリ上で保持するレジストリ",[248,296,297,302],{},[263,298,299],{},[234,300,301],{},"PhoneRealtimeSession",[263,303,304,305,308],{},"Twilio ",[234,306,307],{},"callSid"," から realtime-assist セッションIDを決定的に導出するユーティリティ（下記callout参照）",[248,310,311,314],{},[263,312,313],{},"イベント群",[263,315,316,319,320,319,323,319,326,319,329],{},[234,317,318],{},"CallReceivedEvent","/",[234,321,322],{},"CallEndedEvent",[234,324,325],{},"PhoneTranscriptPartialEvent",[234,327,328],{},"PhoneTranscriptFinalEvent",[234,330,331],{},"RecordingReadyEvent",[226,333,335],{"id":334},"backend-構造","Backend 構造",[337,338,339,354,369,387,393],"ul",{},[340,341,342,345,346,349,350,353],"li",{},[234,343,344],{},"api/controller/TwilioWebhookController.kt",": ",[234,347,348],{},"/api/v1/public/phone/twilio/**"," の Twilio Webhook 受け口（",[234,351,352],{},"permitAll"," — Twilio 自体は認証済みユーザーではないため）。着信TwiML組み立て、スタッフへのダイヤル、AI応対TwiML、録音完了・ステータスコールバックを処理",[340,355,356,288,359,288,362,288,365,368],{},[234,357,358],{},"api/controller/CallLogController.kt",[234,360,361],{},"TenantPhoneNumberController.kt",[234,363,364],{},"PhoneVoiceTokenController.kt",[234,366,367],{},"PhoneCallBriefingController.kt",": 通話ログCRUD、番号管理、ブラウザ発信用の Twilio Voice トークン発行、通話前ブリーフィングセッション作成",[340,370,371,374,375,378,379,382,383,386],{},[234,372,373],{},"infrastructure/websocket/PhoneStreamWebSocketHandler.kt",": Twilio Media Streams（mulaw音声）を受信し ",[234,376,377],{},"MulawToPcmConverter"," でPCM変換、",[234,380,381],{},"SpeechToTextOrchestrator","（",[234,384,385],{},"core/ai"," の choke point）へ渡して逐次文字起こしイベントを発行",[340,388,389,392],{},[234,390,391],{},"domain/service/CallTranscriptionService.kt",": 文字起こし結果の整形・発話者判定",[340,394,395,398,399,402],{},[234,396,397],{},"infrastructure/listener/PhoneEventListener.kt",": 着信時にスタッフへ通知を出し、",[234,400,401],{},"assistSessionId","（後述）を通知ペイロードに含める",[226,404,406],{"id":405},"frontend-構造","Frontend 構造",[337,408,409,433],{},[340,410,411,345,414,417,418,421,422,425,426,429,430],{},[234,412,413],{},"composables/",[234,415,416],{},"useSoftphone","（ブラウザ発信の Twilio Voice SDK ラッパー）、",[234,419,420],{},"useActiveCallTracker","（進行中通話の追跡）、",[234,423,424],{},"usePhoneTranscriptStream","（文字起こしSSE購読）、",[234,427,428],{},"useCallLogs","、",[234,431,432],{},"useCallRecordingSource",[340,434,435,345,438,319,441,319,444,429,447,319,450,429,453],{},[234,436,437],{},"components/",[234,439,440],{},"CallLogTable.vue",[234,442,443],{},"CallLogDetailSheet.vue",[234,445,446],{},"CallLogInboxDialog.vue",[234,448,449],{},"CallLogStatusBadge.vue",[234,451,452],{},"CallLogUrgencyBadge.vue",[234,454,455],{},"TenantPhoneSettingsCard.vue",[226,457,458],{"id":458},"他モジュールとの辺",[337,460,461,477,511],{},[340,462,463,466,467,470,471,473,474,476],{},[234,464,465],{},"ai",": 通話音声の文字起こしは ",[234,468,469],{},"core/phone"," が ",[234,472,381],{}," を直接呼ぶ（",[234,475,236],{}," を経由しない）",[340,478,479,345,481,470,484,487,488,491,492,495,496,499,500,503,504,506,507,510],{},[234,480,236],{},[234,482,483],{},"PhoneRealtimeSession.assistSessionId(callSid)",[234,485,486],{},"UUID.nameUUIDFromBytes(\"phone:$callSid\")"," で決定的なセッションIDを導出する。電話通話は ",[234,489,490],{},"realtime_sessions"," 行を作らず、この決定的IDを使って ",[234,493,494],{},"RealtimeAssistGenerator","（realtime側）が示唆を publish し、frontend は同じIDで ",[234,497,498],{},"/events/realtime-assist?sessionId=..."," を購読する。導出ロジックのSSoTは ",[234,501,502],{},"phone"," 側にあり、",[234,505,236],{}," はこの結果を ",[234,508,509],{},"RealtimeSessionId"," でラップして使う（依存方向は realtime → phone、循環回避のため）",[340,512,513,516],{},[234,514,515],{},"editor",": 通話の録音・文字起こしはドキュメントとして保存されうる",[518,519,521],"callout",{"type":520},"warning",[230,522,523,526,527,530,531,533,534,537,538,540,541,543,544,546,547,549],{},[234,524,525],{},"TwilioWebhookController"," は ",[234,528,529],{},"/api/v1/public/**"," 配下の ",[234,532,352],{}," エンドポイントです。backend の permitAll ルール（",[234,535,536],{},"TenantContextFilter"," を経由しない = 未検証ヘッダを信頼しない）に従っており、テナント識別は Twilio の署名検証済みリクエストから電話番号経由で解決しています。新しい public エンドポイントを追加する際は、ここを前例にしてよいか自問する前に security review が必須です。また ",[234,539,401],{}," の導出は ",[234,542,301],{}," の1箇所がSSoTです — 同じ ",[234,545,307],{}," から別の方法でセッションIDを作ると ",[234,548,236],{}," 側の購読と一致しなくなります。",{"title":551,"searchDepth":552,"depth":552,"links":553},"",2,[554,555,556,557,558],{"id":228,"depth":552,"text":228},{"id":240,"depth":552,"text":240},{"id":334,"depth":552,"text":335},{"id":405,"depth":552,"text":406},{"id":458,"depth":552,"text":458},"通話ログ (Twilio)、リアルタイム通話文字起こし + AI アシスト。core/phone ⇄ app/modules/phone の深掘り。realtime モジュールとの辺。","md",{},true,{"title":188,"description":559},"MajSVDEgX0Q93qUANPCAe4h8Ku2ivSfFibLFaQJW1fU",[566,568,569,571,572,573,574,575,576,577,578,579,581,582,583,584,585,587,588,589,590,591,593,595,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,615,616,617,618],{"path":13,"title":567},"Astar とは何か（5分で）",{"path":17,"title":16},{"path":6,"title":570},"ようこそ",{"path":29,"title":28},{"path":33,"title":32},{"path":37,"title":36},{"path":21,"title":25},{"path":49,"title":48},{"path":53,"title":52},{"path":57,"title":56},{"path":61,"title":60},{"path":41,"title":580},"システムアーキテクチャ",{"path":73,"title":72},{"path":77,"title":76},{"path":81,"title":80},{"path":85,"title":84},{"path":65,"title":586},"バックエンドガイド",{"path":97,"title":96},{"path":101,"title":100},{"path":105,"title":104},{"path":109,"title":108},{"path":89,"title":592},"フロントエンドガイド",{"path":121,"title":594},"Go agent — NAS 同期エージェント",{"path":125,"title":596},"astar CLI",{"path":113,"title":117},{"path":137,"title":136},{"path":141,"title":140},{"path":145,"title":144},{"path":149,"title":148},{"path":153,"title":152},{"path":157,"title":156},{"path":161,"title":160},{"path":165,"title":164},{"path":169,"title":168},{"path":173,"title":172},{"path":177,"title":176},{"path":181,"title":180},{"path":185,"title":184},{"path":189,"title":188},{"path":193,"title":192},{"path":129,"title":614},"モジュール索引",{"path":205,"title":204},{"path":209,"title":208},{"path":197,"title":201},{"path":213,"title":619},"docs/ 地図",1785452455506]