diff --git a/app/sidebar.tsx b/app/sidebar.tsx
index 09e23061..dab14b0e 100644
--- a/app/sidebar.tsx
+++ b/app/sidebar.tsx
@@ -194,7 +194,15 @@ export function Sidebar() {
"menu-active"
)}
>
-
⚡
+
Sandbox
{group.id === currentLang &&
From 59430ebad9d0e428dc7d1458b93c6759068decd8 Mon Sep 17 00:00:00 2001
From: na-trium-144 <100704180+na-trium-144@users.noreply.github.com>
Date: Mon, 17 Aug 2026 02:52:10 +0900
Subject: [PATCH 10/20] =?UTF-8?q?=E3=83=86=E3=82=B9=E3=83=88=E3=82=92=20/a?=
=?UTF-8?q?bout/runtime=20=E3=81=AB=E7=A7=BB=E5=8B=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/about/runtime/content.md | 19 ++--
app/about/runtime/page.tsx | 2 +
app/terminal/{page.tsx => mochaTest.tsx} | 139 +----------------------
packages/runtime/README.md | 2 +-
4 files changed, 18 insertions(+), 144 deletions(-)
rename app/terminal/{page.tsx => mochaTest.tsx} (50%)
diff --git a/app/about/runtime/content.md b/app/about/runtime/content.md
index fadafdb0..cbf1a5fa 100644
--- a/app/about/runtime/content.md
+++ b/app/about/runtime/content.md
@@ -31,23 +31,26 @@ TypeScript は [@typescript/vfs](https://www.npmjs.com/package/@typescript/vfs)
## 外部サービスを利用して実行される言語
-以下の言語は、外部のコンパイル・実行サービス([Wandbox](https://wandbox.org/))の API を通じて実行されます。
+以下の言語は、外部のコンパイル・実行サービスの API を通じて実行されます。
コードはサーバーに送信されてコンパイル・実行され、結果がブラウザに返されます。
-そのため、実行にはインターネット接続が必要です。
-また、入力したコードが Wandbox のサーバーに送信されることをご了承ください。
+
+> [!WARNING]
+> これらの言語の実行環境では、入力したコードが外部サーバーに送信されます。
+> 個人情報や機密情報を含むコードは入力しないようにしてください。
### C++
-Wandbox の g++ (GNU C++ Compiler) を使用してコンパイル・実行されます。
+[Wandbox](https://wandbox.org/) の g++ (GNU C++ Compiler) を使用してコンパイル・実行されます。
最新の安定版コンパイラが使用され、Boost ライブラリも利用可能です。
実行時にエラーが発生した場合は、スタックトレースが表示されます。
### Rust
-Wandbox の rustc (Rust コンパイラ) を使用してコンパイル・実行されます。
+[Wandbox](https://wandbox.org/) の rustc (Rust コンパイラ) を使用してコンパイル・実行されます。
最新版のコンパイラが使用されます。
----
+## 実行環境の動作テスト
+
+以下のボタンをクリックすると、各言語の実行環境がお使いのブラウザで正しく動作するかどうかがテストされます。
-外部サービスを利用して実行される言語(C++・Rust)では、入力したコードが外部サーバーに送信されます。
-個人情報や機密情報を含むコードは入力しないようにしてください。
+
diff --git a/app/about/runtime/page.tsx b/app/about/runtime/page.tsx
index 4e9f8507..f16b1a71 100644
--- a/app/about/runtime/page.tsx
+++ b/app/about/runtime/page.tsx
@@ -1,6 +1,7 @@
import { Metadata } from "next";
import { StyledMarkdown } from "@/markdown/markdown";
import content from "./content.md?raw";
+import { MochaTest } from "@/terminal/mochaTest";
export const metadata: Metadata = {
title: "コード実行環境について",
@@ -11,6 +12,7 @@ export default function RuntimePage() {
return (
+
);
}
diff --git a/app/terminal/page.tsx b/app/terminal/mochaTest.tsx
similarity index 50%
rename from app/terminal/page.tsx
rename to app/terminal/mochaTest.tsx
index 0431f410..ad5efc22 100644
--- a/app/terminal/page.tsx
+++ b/app/terminal/mochaTest.tsx
@@ -1,13 +1,8 @@
"use client";
-import { Heading } from "@/markdown/heading";
import "mocha/mocha.css";
-import { Fragment, useEffect, useRef, useState } from "react";
-import { langConstants, RuntimeLang } from "@my-code/runtime/languages";
-import { ReplTerminal } from "./repl";
-import { EditorComponent } from "./editor";
-import { ExecFile } from "./exec";
-import { useTerminal } from "./terminal";
+import { useEffect, useRef, useState } from "react";
+import { RuntimeLang } from "@my-code/runtime/languages";
import {
RUNTIME_TIMEOUTS,
waitForRuntimeReady,
@@ -15,140 +10,14 @@ import {
import { replTests } from "@my-code/runtime/tests/repl";
import { fileExecutionTests } from "@my-code/runtime/tests/fileExecution";
import { useRuntimeAll } from "@my-code/runtime/context";
-import { captureException } from "@sentry/nextjs";
-
-import { sampleConfig, SampleConfig } from "./sampleConfig";
import { DaisyInfoIcon } from "@/daisyAlertIcon";
-
-export default function RuntimeTestPage() {
- return (
-
-
Runtime Test Page
-
-
REPLとコード実行のサンプル
- {/* name of each tab group should be unique */}
-
- {Object.entries(sampleConfig).map(([lang, config]) => (
-
-
-
-
-
-
- ))}
-
-
-
Xterm.js Colors
-
-
-
-
-
自動テスト
-
-
- );
-}
-
-function RuntimeSample({
- lang,
- config,
-}: {
- lang: RuntimeLang;
- config: SampleConfig;
-}) {
- return (
-
- {config.repl && (
-
- )}
- {config.editor &&
- Object.entries(config.editor).map(([filename, initContent]) => (
-
- ))}
- {config.exec && (
-
- )}
- {config.readonlyFiles?.map((filename) => (
-
- ))}
-
- );
-}
-
-function AnsiColorSample() {
- const { terminalRef, terminalInstanceRef } = useTerminal({
- getRows: () => 6,
- onReady: () => {
- for (let i = 0; i <= 7; i++) {
- terminalInstanceRef.current!.write(`\x1b[0;${30 + i}m${30 + i}`);
- }
- terminalInstanceRef.current!.write("\x1b[0m\n");
- terminalInstanceRef.current!.write("\x1b[1m1;");
- for (let i = 0; i <= 7; i++) {
- terminalInstanceRef.current!.write(`\x1b[1;${30 + i}m${30 + i}`);
- }
- terminalInstanceRef.current!.write("\x1b[0m\n");
- for (let i = 0; i <= 7; i++) {
- terminalInstanceRef.current!.write(`\x1b[0;${90 + i}m${90 + i}`);
- }
- terminalInstanceRef.current!.write("\x1b[0m\n");
- terminalInstanceRef.current!.write("\x1b[1m1;");
- for (let i = 0; i <= 7; i++) {
- terminalInstanceRef.current!.write(`\x1b[1;${90 + i}m${90 + i}`);
- }
- terminalInstanceRef.current!.write("\x1b[0m\n");
- for (let i = 0; i <= 7; i++) {
- terminalInstanceRef.current!.write(`\x1b[0;${40 + i}m${40 + i}`);
- }
- terminalInstanceRef.current!.write("\x1b[0m\n");
- for (let i = 0; i <= 7; i++) {
- terminalInstanceRef.current!.write(`\x1b[0;${100 + i}m${100 + i}`);
- }
- },
- });
- return (
-
- );
-}
+import { captureException } from "@sentry/nextjs";
function handleRuntimeError(error: unknown) {
captureException(error);
}
-function MochaTest() {
+export function MochaTest() {
const runtimeAll = useRuntimeAll();
const runtimeRef = useRef(runtimeAll);
for (const lang of Object.keys(runtimeAll) as RuntimeLang[]) {
diff --git a/packages/runtime/README.md b/packages/runtime/README.md
index 52283d09..042981ee 100644
--- a/packages/runtime/README.md
+++ b/packages/runtime/README.md
@@ -20,7 +20,7 @@
## tests
* `pnpm run --filter @my-code/runtime test` でvitestを使ってテストを実行できます
-* my.code(); の /terminal ページでMochaを使ってテストを実行できます
+* my.code(); の /about/runtime ページでMochaを使ってテストを実行できます
* どちらからでも実行できるようテスト本体は ./tests/repl.ts, ./tests/fileExecution.ts に記述しています。
新しい言語の実行環境を追加した場合、ここにテストケースを追加してください。
From 621426008374cadc7107f8eebd340c20215a8a03 Mon Sep 17 00:00:00 2001
From: na-trium-144 <100704180+na-trium-144@users.noreply.github.com>
Date: Sun, 16 Aug 2026 18:19:53 +0000
Subject: [PATCH 11/20] =?UTF-8?q?EmbedContext=E3=81=AE=E7=AE=A1=E7=90=86?=
=?UTF-8?q?=E3=82=92URL=E4=BE=9D=E5=AD=98=E3=81=8B=E3=82=89lang/pageId?=
=?UTF-8?q?=E3=83=91=E3=83=A9=E3=83=A1=E3=83=BC=E3=82=BF=E4=BE=9D=E5=AD=98?=
=?UTF-8?q?=E3=81=AB=E5=A4=89=E6=9B=B4=E3=81=97=E5=90=84docs=E3=83=9A?=
=?UTF-8?q?=E3=83=BC=E3=82=B8=E3=81=B8=E7=A7=BB=E5=8B=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/(docs)/@docs/[lang]/[pageId]/page.tsx | 29 +++++++-------
app/(docs)/@docs/[lang]/sandbox/page.tsx | 13 ++-----
app/(docs)/useSendChat.ts | 16 ++++----
app/layout.tsx | 5 +--
app/terminal/embedContext.tsx | 47 +++++++++++++++--------
5 files changed, 59 insertions(+), 51 deletions(-)
diff --git a/app/(docs)/@docs/[lang]/[pageId]/page.tsx b/app/(docs)/@docs/[lang]/[pageId]/page.tsx
index 1e0c03c3..b0e5d67e 100644
--- a/app/(docs)/@docs/[lang]/[pageId]/page.tsx
+++ b/app/(docs)/@docs/[lang]/[pageId]/page.tsx
@@ -17,6 +17,7 @@ import {
} from "@/lib/docs";
import { DocsAutoRedirect } from "./autoRedirect";
import { TermDefinitionProvider } from "@/markdown/term";
+import { EmbedContextProvider } from "@/terminal/embedContext";
export async function generateMetadata({
params,
@@ -68,19 +69,21 @@ export default async function Page({
return (
<>
-
-
-
+
+
+
+
+
>
);
diff --git a/app/(docs)/@docs/[lang]/sandbox/page.tsx b/app/(docs)/@docs/[lang]/sandbox/page.tsx
index b213d36c..92edac88 100644
--- a/app/(docs)/@docs/[lang]/sandbox/page.tsx
+++ b/app/(docs)/@docs/[lang]/sandbox/page.tsx
@@ -2,8 +2,8 @@ import { Metadata } from "next";
import { notFound } from "next/navigation";
import { SandboxContent } from "./sandboxContent";
import { getChatFromCache, initContext } from "@/lib/chatHistory";
-import { getPagesListForLang, getTermDefinitions, LangId, PageSlug } from "@/lib/docs";
-import { TermDefinitionProvider } from "@/markdown/term";
+import { getPagesListForLang, LangId, PageSlug } from "@/lib/docs";
+import { EmbedContextProvider } from "@/terminal/embedContext";
import { DocsAutoRedirect } from "../[pageId]/autoRedirect";
export async function generateMetadata({
@@ -34,21 +34,16 @@ export default async function Page({
const path = { lang, page: "sandbox" as PageSlug };
const context = await initContext();
const chatHistories = await getChatFromCache(path, context.userId);
- const termDefinitions = await getTermDefinitions(lang);
return (
<>
-
+
-
+
>
);
diff --git a/app/(docs)/useSendChat.ts b/app/(docs)/useSendChat.ts
index 1c44cb42..4fff95a3 100644
--- a/app/(docs)/useSendChat.ts
+++ b/app/(docs)/useSendChat.ts
@@ -3,7 +3,7 @@
import { useCallback, useState } from "react";
import { useRouter } from "next/navigation";
import { captureException } from "@sentry/nextjs";
-import { useEmbedContext } from "@/terminal/embedContext";
+import { useOptionalEmbedContext } from "@/terminal/embedContext";
import { DynamicMarkdownSection, PagePath } from "@/lib/docs";
import { ChatStreamEvent } from "@/api/chat/route";
import { revalidateChatAction } from "@/actions/revalidateChat";
@@ -32,7 +32,7 @@ export function useSendChat() {
const [isLoading, setIsLoading] = useState(false);
const [errorMessage, setErrorMessage] = useState
(null);
- const { files, replOutputs, execResults } = useEmbedContext();
+ const embedContext = useOptionalEmbedContext();
const router = useRouter();
const streamingChatContext = useStreamingChatContext();
@@ -63,9 +63,9 @@ export function useSendChat() {
userQuestion,
questionScope,
sectionContent,
- replOutputs: customReplOutputs ?? replOutputs,
- files: customFiles ?? files,
- execResults: customExecResults ?? execResults,
+ replOutputs: customReplOutputs ?? embedContext?.replOutputs ?? {},
+ files: customFiles ?? embedContext?.files ?? {},
+ execResults: customExecResults ?? embedContext?.execResults ?? {},
deleteChatOnCreated,
}),
});
@@ -173,9 +173,9 @@ export function useSendChat() {
})();
},
[
- execResults,
- files,
- replOutputs,
+ embedContext?.execResults,
+ embedContext?.files,
+ embedContext?.replOutputs,
router,
streamingChatContext,
]
diff --git a/app/layout.tsx b/app/layout.tsx
index 785a0e70..b2f33601 100644
--- a/app/layout.tsx
+++ b/app/layout.tsx
@@ -8,7 +8,6 @@ import "./globals.css";
import { Navbar } from "./navbar";
import { Sidebar } from "./sidebar";
import { ReactNode } from "react";
-import { EmbedContextProvider } from "@/terminal/embedContext";
import { AutoAnonymousLogin } from "./accountMenu";
import { SidebarMdProvider } from "./sidebar";
import { RuntimeProvider } from "@my-code/runtime/context";
@@ -52,9 +51,7 @@ export default async function RootLayout({
/>
-
- {children}
-
+ {children}
{/* 1. REPL */}
- {config?.repl && (
+ {language.repl && (
{
@@ -210,90 +219,86 @@ export function SandboxContent(props: SandboxContentProps) {
)}
{/* 2. エディター (既存ファイル + 追加ファイル + 追加ボタン) */}
- {(config?.editor ||
- userFiles.length > 0 ||
- config?.supportsMultiFile) && (
- {
- sectionRefs.current.set("sandbox-editor", el);
- }}
- >
- コード
- {config?.editor &&
- Object.entries(config.editor).map(([filename, initContent]) => (
+ {
+ sectionRefs.current.set("sandbox-editor", el);
+ }}
+ >
+ コード
+ {language.sampleFiles &&
+ Object.entries(language.sampleFiles).map(
+ ([filename, initContent]) => (
- ))}
-
- {userFiles.map((filename) => (
- handleRemoveFile(filename)}
- />
- ))}
-
- {config?.supportsMultiFile && (
-
-
- {filenameError && (
-
{filenameError}
- )}
-
+ )
)}
-
- )}
- {/* 3. 実行 */}
- {config?.exec && (
- {
- sectionRefs.current.set("sandbox-exec", el);
- }}
- >
- 実行
- (
+ handleRemoveFile(filename)}
/>
-
- )}
+ ))}
+
+ {language.supportsMultiFile && (
+
+
+ {filenameError && (
+
{filenameError}
+ )}
+
+ )}
+
+
+ {/* 3. 実行 */}
+ {
+ sectionRefs.current.set("sandbox-exec", el);
+ }}
+ >
+ 実行
+
+
{/* 4. 出力ファイル */}
- {config?.readonlyFiles && config.readonlyFiles.length > 0 && (
+ {language.readonlyFiles && language.readonlyFiles.length > 0 && (
{
@@ -301,7 +306,7 @@ export function SandboxContent(props: SandboxContentProps) {
}}
>
出力ファイル
- {config.readonlyFiles.map((filename) => (
+ {language.readonlyFiles.map((filename) => (
| false;
- exec: string[] | false;
- readonlyFiles?: string[];
- supportsMultiFile?: boolean;
-}
-
-export const sampleConfig: Record = {
- python: {
- repl: true,
- replInitContent: '>>> print("Hello, World!")\nHello, World!',
- editor: {
- "main.py": main_py,
- },
- exec: ["main.py"],
- supportsMultiFile: true,
- },
- ruby: {
- repl: true,
- replInitContent: 'irb(main):001:0> puts "Hello, World!"\nHello, World!',
- editor: {
- "main.rb": main_rb,
- },
- exec: ["main.rb"],
- supportsMultiFile: true,
- },
- javascript: {
- repl: true,
- replInitContent: '> console.log("Hello, World!");\nHello, World!',
- editor: {
- "main.js": main_js,
- },
- exec: ["main.js"],
- supportsMultiFile: false,
- },
- typescript: {
- repl: false,
- editor: {
- // main.tsにすると出力ファイルがjavascriptのサンプルと被る
- "main2.ts": main2_ts,
- },
- exec: ["main2.ts"],
- readonlyFiles: ["main2.js"],
- supportsMultiFile: false,
- },
- cpp: {
- repl: false,
- editor: {
- "main.cpp": main_cpp,
- "sub.h": sub_h,
- "sub.cpp": sub_cpp,
- },
- exec: ["main.cpp", "sub.cpp"],
- supportsMultiFile: true,
- },
- rust: {
- repl: false,
- editor: {
- "main2.rs": main2_rs,
- "sub.rs": sub_rs,
- },
- exec: ["main2.rs"],
- supportsMultiFile: true,
- },
-};
diff --git a/packages/runtime/src/languages.ts b/packages/runtime/src/languages.ts
index 3c2ceb72..e9988e66 100644
--- a/packages/runtime/src/languages.ts
+++ b/packages/runtime/src/languages.ts
@@ -1,3 +1,13 @@
+import main_py from "./samples/main.py?raw";
+import main_rb from "./samples/main.rb?raw";
+import main_js from "./samples/main.js?raw";
+import main2_ts from "./samples/main2.ts?raw";
+import main_cpp from "./samples/main.cpp?raw";
+import sub_h from "./samples/sub.h?raw";
+import sub_cpp from "./samples/sub.cpp?raw";
+import main2_rs from "./samples/main2.rs?raw";
+import sub_rs from "./samples/sub.rs?raw";
+
// Markdownで指定される可能性のある言語名を列挙
export type MarkdownLang =
| "python"
@@ -73,8 +83,10 @@ export type LangConstants = {
) &
(
| {
- runtime: RuntimeLang;
// REPLが実装されている言語の場合
+ repl: true;
+ // ReplOutput[] ではない。stringのパースはruntimeが行う
+ sampleReplInit: string;
// terminal/highlight.ts でインポートするprismの言語定義と対応
prism: "python" | "ruby" | "javascript";
prompt: string;
@@ -82,12 +94,35 @@ export type LangConstants = {
returnPrefix?: string;
}
| {
- runtime?: RuntimeLang;
+ repl?: false;
+ sampleReplInit?: undefined;
prism?: undefined;
prompt?: undefined;
promptMore?: undefined;
returnPrefix?: undefined;
}
+ ) &
+ (
+ | {
+ runtime: RuntimeLang;
+ // Sandboxにデフォルトで用意するファイル
+ sampleFiles: Record;
+ // C++のように実行時に全ソースファイルを指定する必要がある言語は、
+ // 現在のファイルリストを受け取って実行すべきファイルを返す関数を定義する
+ sampleExec: (files: string[]) => string[];
+ // Sandboxの実行ボタンの下に読み取り専用で表示されるファイル
+ readonlyFiles?: string[];
+ supportsMultiFile: boolean;
+ supportsFileOutput: boolean;
+ }
+ | {
+ runtime?: undefined;
+ sampleFiles?: undefined;
+ sampleExec?: undefined;
+ readonlyFiles?: undefined;
+ supportsMultiFile?: undefined;
+ supportsFileOutput?: undefined;
+ }
);
export function langConstants(lang: MarkdownLang | undefined): LangConstants {
@@ -101,8 +136,16 @@ export function langConstants(lang: MarkdownLang | undefined): LangConstants {
tabSize: 4,
runtime: "python",
prism: "python",
+ repl: true,
+ sampleReplInit: '>>> print("Hello, World!")\nHello, World!',
prompt: ">>> ",
promptMore: "... ",
+ sampleFiles: {
+ "main.py": main_py,
+ },
+ sampleExec: () => ["main.py"],
+ supportsMultiFile: true,
+ supportsFileOutput: true,
};
case "ruby":
case "rb":
@@ -113,10 +156,18 @@ export function langConstants(lang: MarkdownLang | undefined): LangConstants {
tabSize: 2,
runtime: "ruby",
prism: "ruby",
+ repl: true,
+ sampleReplInit: 'irb(main):001:0> puts "Hello, World!"\nHello, World!',
// TODO: 実際のirbのプロンプトは静的でなく、(main)や番号などの動的な表示がある
prompt: "irb> ",
promptMore: "irb* ",
returnPrefix: "=> ",
+ sampleFiles: {
+ "main.rb": main_rb,
+ },
+ sampleExec: () => ["main.rb"],
+ supportsMultiFile: true,
+ supportsFileOutput: true,
};
case "javascript":
case "js":
@@ -127,8 +178,16 @@ export function langConstants(lang: MarkdownLang | undefined): LangConstants {
tabSize: 2,
runtime: "javascript",
prism: "javascript",
+ repl: true,
+ sampleReplInit: '> console.log("Hello, World!");\nHello, World!',
prompt: "> ",
promptMore: "... ",
+ sampleFiles: {
+ "main.js": main_js,
+ },
+ sampleExec: () => ["main.js"],
+ supportsMultiFile: false,
+ supportsFileOutput: false,
};
case "typescript":
case "ts":
@@ -138,6 +197,15 @@ export function langConstants(lang: MarkdownLang | undefined): LangConstants {
ace: "typescript",
tabSize: 2,
runtime: "typescript",
+ repl: false,
+ sampleFiles: {
+ // main.tsにすると出力ファイルがjavascriptのサンプルと被る
+ "main2.ts": main2_ts,
+ },
+ sampleExec: () => ["main2.ts"],
+ readonlyFiles: ["main2.js"],
+ supportsMultiFile: false,
+ supportsFileOutput: false,
};
case "cpp":
case "c++":
@@ -148,6 +216,18 @@ export function langConstants(lang: MarkdownLang | undefined): LangConstants {
// 2文字派と4文字派があるが、geminiが4文字で出力するので4でいいや
tabSize: 4,
runtime: "cpp",
+ repl: false,
+ sampleFiles: {
+ "main.cpp": main_cpp,
+ "sub.h": sub_h,
+ "sub.cpp": sub_cpp,
+ },
+ sampleExec: (files: string[]) =>
+ files.filter((f) =>
+ ["c", "cpp", "cc", "cxx"].includes(f.split(".").at(-1) ?? "")
+ ),
+ supportsMultiFile: true,
+ supportsFileOutput: false,
};
case "rust":
case "rs":
@@ -157,6 +237,14 @@ export function langConstants(lang: MarkdownLang | undefined): LangConstants {
ace: "rust",
tabSize: 4,
runtime: "rust",
+ repl: false,
+ sampleFiles: {
+ "main2.rs": main2_rs,
+ "sub.rs": sub_rs,
+ },
+ sampleExec: () => ["main2.rs"],
+ supportsMultiFile: true,
+ supportsFileOutput: false,
};
case "bash":
case "sh":
diff --git a/app/terminal/samples/main.cpp b/packages/runtime/src/samples/main.cpp
similarity index 100%
rename from app/terminal/samples/main.cpp
rename to packages/runtime/src/samples/main.cpp
diff --git a/app/terminal/samples/main.js b/packages/runtime/src/samples/main.js
similarity index 100%
rename from app/terminal/samples/main.js
rename to packages/runtime/src/samples/main.js
diff --git a/app/terminal/samples/main.py b/packages/runtime/src/samples/main.py
similarity index 100%
rename from app/terminal/samples/main.py
rename to packages/runtime/src/samples/main.py
diff --git a/app/terminal/samples/main.rb b/packages/runtime/src/samples/main.rb
similarity index 100%
rename from app/terminal/samples/main.rb
rename to packages/runtime/src/samples/main.rb
diff --git a/app/terminal/samples/main2.rs b/packages/runtime/src/samples/main2.rs
similarity index 100%
rename from app/terminal/samples/main2.rs
rename to packages/runtime/src/samples/main2.rs
diff --git a/app/terminal/samples/main2.ts b/packages/runtime/src/samples/main2.ts
similarity index 100%
rename from app/terminal/samples/main2.ts
rename to packages/runtime/src/samples/main2.ts
diff --git a/app/terminal/samples/sub.cpp b/packages/runtime/src/samples/sub.cpp
similarity index 100%
rename from app/terminal/samples/sub.cpp
rename to packages/runtime/src/samples/sub.cpp
diff --git a/app/terminal/samples/sub.h b/packages/runtime/src/samples/sub.h
similarity index 100%
rename from app/terminal/samples/sub.h
rename to packages/runtime/src/samples/sub.h
diff --git a/app/terminal/samples/sub.rs b/packages/runtime/src/samples/sub.rs
similarity index 100%
rename from app/terminal/samples/sub.rs
rename to packages/runtime/src/samples/sub.rs
From b2e6c064ecd8b1f029d4f6d87bc12601a3da9e60 Mon Sep 17 00:00:00 2001
From: na-trium-144 <100704180+na-trium-144@users.noreply.github.com>
Date: Mon, 17 Aug 2026 20:30:39 +0900
Subject: [PATCH 15/20] =?UTF-8?q?tooltip=E3=81=AE=E8=89=B2=E3=82=92?=
=?UTF-8?q?=E5=A4=89=E6=9B=B4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/terminal/exec.tsx | 6 +++---
app/terminal/repl.tsx | 6 +++---
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/app/terminal/exec.tsx b/app/terminal/exec.tsx
index 842b496c..d3b1e7ed 100644
--- a/app/terminal/exec.tsx
+++ b/app/terminal/exec.tsx
@@ -196,9 +196,9 @@ export function ExecFile(props: ExecProps) {
-
+
ブラウザ上で動作する
{runtimeInfo?.prettyLangName || props.language.runtime}
@@ -218,7 +218,7 @@ export function ExecFile(props: ExecProps) {