diff --git a/.mam.env.example b/.mam.env.example index 543ccdb..d1d346e 100644 --- a/.mam.env.example +++ b/.mam.env.example @@ -80,6 +80,10 @@ #default: hermes # MQTT_CLIENT_ID_PREFIX=hermes +# MQTT keepalive interval (seconds). Used by paho-mqtt client connections. +#default: 60 +# MQTT_KEEPALIVE=60 + # Log level for MAM runtime components (DEBUG, INFO, WARN, ERROR). #default: INFO # MAM_LOG_LEVEL=INFO @@ -112,6 +116,32 @@ #default: /.mam/delegate_job_logs # DELEGATE_JOB_LOGS_DIR=/path/to/workspace/.mam/delegate_job_logs +# Max attempts to poll for pane renderer quiescence in send_keys_safe. +#default: 20 +# SKS_QUIESCENT_TRIES=20 + +# Interval (seconds) between pane quiescence capture polls. +#default: 0.5 +# SKS_QUIESCENT_INTERVAL=0.5 + +# Consecutive empty captures to conclude unobservable/headless mode early. +#default: 3 +# SKS_EMPTY_GIVEUP=3 + +# Minimum columns a pane must retain after a vertical split (2xK layout engine). +#default: 60 +# MAM_MIN_PANE_COLS=60 + +# Minimum rows a pane must retain after a horizontal split (2xK layout engine). +#default: 20 +# MAM_MIN_PANE_ROWS=20 + +# Maximum number of columns a workspace may grow to before the engine reports +# 'overflow' (which makes lib.sh create a fresh workspace instead of splitting). +# Applies to both measured (GUI) and headless 0x0 layouts. +#default: (unset -> no column cap) +# MAM_MAX_PANE_COLS=3 + # ============================================================================== # deploy / distribution source (for forks/mirrors) # ============================================================================== diff --git a/AGENTS.md b/AGENTS.md index 399ab64..2f7881f 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -68,7 +68,9 @@ Strong success criteria let you loop independently. Weak criteria ("make it work **These guidelines are working if:** fewer unnecessary changes in diffs, fewer rewrites due to overcomplication, and clarifying questions come before implementation rather than after mistakes. Read [MULTI_AGENT_RULES.md](.agents/MULTI_AGENT_RULES.md) (or [Korean version](.agents/MULTI_AGENT_RULES.ko.md)) and [multi-agent-mux-loop/SKILL.md](.agents/skills/multi-agent-mux-loop/SKILL.md) first before working and follow the instructions for orchestration and collaboration. - -# ๐Ÿค– Multi-Agent Orchestration Guidelines -Please refer to [.agents/MULTI_AGENT_RULES.md](file://./.agents/MULTI_AGENT_RULES.md) for detailed collaborative rules and state flow constraints. - + +## 5. Orchestrator Scope Guard (O-3) + +**Normal vs. Orchestration Modes** +- **Normal Mode**: The orchestrator acts as Main Creator and may edit files directly. +- **Loop Active Mode (`/multi-agent-mux-loop`)**: Direct file mutation is intercepted by `.agents/hooks.json`. Do not seek workarounds when a tool call is denied โ€” delegate the task immediately via `run_loop.sh`. \ No newline at end of file diff --git a/refer_landing_page/app/globals.css b/refer_landing_page/app/globals.css index 402aea8..883b3fe 100644 --- a/refer_landing_page/app/globals.css +++ b/refer_landing_page/app/globals.css @@ -31,7 +31,7 @@ :root { color-scheme: light; - /* Offline System & CSS Font Variables */ + /* Offline System & CSS Font Variables */ --font-geist: 'Geist', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; --font-geist-mono: 'Geist Mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; --font-display: 'Fraunces', Georgia, Cambria, 'Times New Roman', Times, serif; diff --git a/refer_landing_page/app/lectures/page.tsx b/refer_landing_page/app/lectures/page.tsx index 728b178..8498c4a 100644 --- a/refer_landing_page/app/lectures/page.tsx +++ b/refer_landing_page/app/lectures/page.tsx @@ -6,56 +6,45 @@ export default function LecturesPage() { const olderSemesters = semesters.slice(3); return ( -
- {/* Header */} -
-
- - - Academic Courses - -
-

- ๊ฐ•์˜ ์ด๋ ฅ +
+ {/* Page Header */} +
+

+ LECTURES

-

- 2016๋…„ ๊ฐ€์„ํ•™๊ธฐ๋ถ€ํ„ฐ 2026๋…„ ๋ด„ํ•™๊ธฐ๊นŒ์ง€ ๊ฐœ์„ค๋œ ๋„คํŠธ์›Œํฌ ๋ฐ ์†Œํ”„ํŠธ์›จ์–ด ๋ถ„์•ผ ์•ฝ 20๊ฐœ ํ•™๊ธฐ์˜ ํ•™๋ถ€/๋Œ€ํ•™์› ๊ฐ•์˜ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค. -

{/* Recent 3 Semesters */} -
-
-
-
- Recent Courses ({recentSemesters.length} Semesters) -
-

- ์ตœ๊ทผ ๊ฐœ์„ค ๊ฐ•์˜ -

-
+
+
+

+ Recent Courses +

+ + Latest 3 Semesters +
-
+
{recentSemesters.map((sem, idx) => (
-
- +
+ {sem.term} {sem.year} - + Latest
-
    +
      {sem.courses.map((c, cIdx) => (
    • -
      +
      {c.en}
      @@ -66,8 +55,9 @@ export default function LecturesPage() {
-
- Course Count: {sem.courses.length} +
+ Total Offerings + {sem.courses.length} Courses
))} @@ -75,30 +65,30 @@ export default function LecturesPage() {
{/* Older Semesters (Native
/ progressive disclosure) */} -
-
+
+
- - ์ด์ „ ์ „์ฒด ๊ฐ•์˜ ์ด๋ ฅ ({olderSemesters.length}๊ฐœ ํ•™๊ธฐ) ์—ด๋žŒํ•˜๊ธฐ + + Browse all semesters

- 2016 Fall ~ 2024 Spring ํ•™๊ธฐ๋ณ„ ๊ฐœ์„ค ๊ต๊ณผ๋ชฉ ์ด๋ ฅ + Course history from 2016 Fall to 2024 Spring

- - ์ „์ฒด ๋ณด๊ธฐ โ–พ - ์ ‘๊ธฐ โ–ด + + Open โ–พ + Close โ–ด
-
+
{olderSemesters.map((sem, idx) => (
-
+
{sem.term} {sem.year} @@ -110,7 +100,7 @@ export default function LecturesPage() {
    {sem.courses.map((c, cIdx) => (
  • -
    +
    {c.en}
    diff --git a/refer_landing_page/app/page.tsx b/refer_landing_page/app/page.tsx index 72650b7..3b15a36 100644 --- a/refer_landing_page/app/page.tsx +++ b/refer_landing_page/app/page.tsx @@ -86,7 +86,7 @@ export default function HomePage() {
    Patent
    - + (IoT Architecture & Protocols)
    diff --git a/refer_landing_page/app/publications/[category]/page.tsx b/refer_landing_page/app/publications/[category]/page.tsx index 4223c7f..d477189 100644 --- a/refer_landing_page/app/publications/[category]/page.tsx +++ b/refer_landing_page/app/publications/[category]/page.tsx @@ -55,34 +55,29 @@ export default function PublicationCategoryPage({ params }: PageProps) { } return ( -
    - {/* Header */} -
    -
    - - - Publications Category - -
    -

    +
    + {/* Page Header */} +
    +

    {currentCat.label}

    -

    - {currentCat.desc} โ€” ์ด {records.length}๊ฑด์˜ ์‹ค๋ฐ์ดํ„ฐ ์นดํƒˆ๋กœ๊ทธ์ž…๋‹ˆ๋‹ค. -

    + {currentCat.subtitle && ( +

    + {currentCat.subtitle} +

    + )}
    - {/* Category Nav */} - + {/* Category Nav Cards */} +
    + +
    {/* Record List Section */} -
    +
    - Showing {records.length} Pre-rendered Records - - - SSG โ— Static HTML + {records.length} Records
    @@ -116,13 +111,13 @@ export default function PublicationCategoryPage({ params }: PageProps) { {rec.isPatent ? (
    -

    ๋ฐœ๋ช…์ž: {rec.inventors}

    +

    Inventors: {rec.inventors}

    - ์ถœ์›๋ฒˆํ˜ธ: {rec.appNo} ({rec.country}, {rec.appDate}) + App No: {rec.appNo} ({rec.country}, {rec.appDate})

    {rec.regNo && (

    - ๋“ฑ๋ก๋ฒˆํ˜ธ: {rec.regNo} ({rec.regDate}) + Reg No: {rec.regNo} ({rec.regDate})

    )}
    @@ -133,7 +128,7 @@ export default function PublicationCategoryPage({ params }: PageProps) { {rec.volume} {rec.kci && ( - KCI ๋“ฑ์žฌ + KCI Indexed )}
    diff --git a/refer_landing_page/app/publications/_components/CategoryNav.tsx b/refer_landing_page/app/publications/_components/CategoryNav.tsx index 43e063d..c62e320 100644 --- a/refer_landing_page/app/publications/_components/CategoryNav.tsx +++ b/refer_landing_page/app/publications/_components/CategoryNav.tsx @@ -1,6 +1,7 @@ import React from "react"; import Link from "next/link"; import { PUB_CATEGORIES } from "../../../content/categories"; +import { publications, patents } from "../../../content/publications"; import { PubCategory } from "../../../content/types"; interface CategoryNavProps { @@ -8,23 +9,93 @@ interface CategoryNavProps { } export function CategoryNav({ currentCategory }: CategoryNavProps) { + const getCount = (slug: string) => { + if (slug === "patent") return patents.length; + return publications.filter((p) => p.category === slug).length; + }; + return (
    -
    +
    +

    + Categories +

    + {currentCategory && ( + + ← Overview + + )} +
    + +
    {PUB_CATEGORIES.map((cat) => { + const count = getCount(cat.slug); const isActive = currentCategory === cat.slug; + return ( - - {cat.label} - +
    +
    + + Category + + {isActive && ( + + Current + + )} +
    + +

    + {cat.label} + {cat.subtitle && ( + + {cat.subtitle} + + )} +

    +
    + +
    + + {count} + + {cat.slug === "patent" ? "Patents" : "Papers"} + + + + {isActive ? ( + + Active View โ— + + ) : ( + + View All → + + )} +
    +
    ); })}
    diff --git a/refer_landing_page/app/publications/page.tsx b/refer_landing_page/app/publications/page.tsx index 75232ef..3d80757 100644 --- a/refer_landing_page/app/publications/page.tsx +++ b/refer_landing_page/app/publications/page.tsx @@ -1,100 +1,52 @@ -import Link from "next/link"; import { CategoryNav } from "./_components/CategoryNav"; -import { PUB_CATEGORIES } from "../../content/categories"; -import { publications, patents } from "../../content/publications"; +import { publications } from "../../content/publications"; export const metadata = { - title: "Publications Overview | ANL", - description: "AI ์—์ด์ „ํŠธ ๋„คํŠธ์›Œํฌ ์—ฐ๊ตฌ์‹ค(ANL) ์—ฐ๊ตฌ ์‹ค์  ๊ฐœ์š” ๋ฐ ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ์ง‘๊ณ„", + title: "Publications | ANL", + description: "AI Agent Networking Lab (ANL) research publications and patents overview", }; +const REPRESENTATIVE_HIGHLIGHT_TITLES = [ + "Globally Integrated Trust Authority (GITA) for Resource-Constrained Edge Devices in IoT and 6G", + "Application Level Trust Authority (APPLETA) for Resource-Constrained Edge Devices in IoT and 6G", + "mQUIC: Use of QUIC for Handover Support with Connection Migration in Wireless/Mobile Networks", + "Use of QUIC for CoAP Transport in IoT Networks", + "Use of QUIC for Mobile-Oriented Future Internet (Q-MOFI)", +]; + export default function PublicationsIndexPage() { - const totalPubCount = publications.length + patents.length; - - // Sort publication records by publishedAt descending to select top 10 highlights - const top10Highlights = [...publications] - .sort((a, b) => (b.publishedAt || "").localeCompare(a.publishedAt || "")) - .slice(0, 10); - - const getCount = (slug: string) => { - if (slug === "patent") return patents.length; - return publications.filter((p) => p.category === slug).length; - }; + // Selected 5 representative publications + const highlights = REPRESENTATIVE_HIGHLIGHT_TITLES.map((title) => + publications.find( + (p) => p.title.trim().toLowerCase() === title.trim().toLowerCase() + ) + ).filter((p): p is (typeof publications)[0] => Boolean(p)); return ( -
    - {/* Header section */} -
    -
    - - - BIBLIOGRAPHY & INTELLECTUAL PROPERTY - -
    -

    - ์—ฐ๊ตฌ ์‹ค์  ๊ฐœ์š” +
    + {/* Page Header */} +
    +

    + PUBLICATIONS

    -

    - AI ์—์ด์ „ํŠธ ๋„คํŠธ์›Œํฌ ์—ฐ๊ตฌ์‹ค(ANL)์˜ ํ•™์ˆ  ๋…ผ๋ฌธ({publications.length}๊ฑด)๊ณผ ํŠนํ—ˆ({patents.length}๊ฑด)๋ฅผ ํฌํ•จํ•œ ์ด {totalPubCount}๊ฑด์˜ ์—ฐ๊ตฌ ์„ฑ๊ณผ ์ง‘๊ณ„ ๋ฐ ๋Œ€ํ‘œ ์‹ค์  ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค. -

    - {/* Category Navigation */} - - {/* Category Summary Cards */} -
    - {PUB_CATEGORIES.map((cat) => { - const count = getCount(cat.slug); - return ( -
    -
    - - Category - -

    - {cat.label} -

    -

    - {cat.desc} -

    -
    -
    - - {count} - ๊ฑด - - - ์ „์ฒด ๋ณด๊ธฐ → - -
    -
    - ); - })} +
    +
    - {/* Top 10 Highlights Section */} -
    -
    -

    - ์ตœ์‹  ๋Œ€ํ‘œ ์‹ค์  (Top 10 Highlights) -

    - - RECENT HIGHLIGHTS - -
    + {/* Highlights Section */} +
    +

    + Highlights +

    -
    - {top10Highlights.map((pub, idx) => ( -
    +
    + {highlights.map((pub, idx) => ( +
    - + {pub.publishedAt?.substring(0, 7) || "Recent"} ยท @@ -102,11 +54,11 @@ export default function PublicationsIndexPage() { {pub.doi && ( <> ยท - DOI: {pub.doi} + DOI: {pub.doi} )}
    -

    +

    {pub.title}

    {pub.authors && ( @@ -115,7 +67,7 @@ export default function PublicationsIndexPage() {

    )} {pub.venue && ( -

    +

    {pub.venue}

    )} diff --git a/refer_landing_page/app/standardization/page.tsx b/refer_landing_page/app/standardization/page.tsx index e31a3b0..6e5c762 100644 --- a/refer_landing_page/app/standardization/page.tsx +++ b/refer_landing_page/app/standardization/page.tsx @@ -2,34 +2,19 @@ import React from "react"; import { standardsBodies } from "../../content/standards"; export default function StandardizationPage() { - const totalDocs = standardsBodies.reduce( - (acc, body) => - acc + body.projects.reduce((pAcc, proj) => pAcc + proj.documents.length, 0), - 0 - ); - return ( -
    - {/* Header */} -
    -
    - - - Open Standards & Contributions - -
    -

    - ํ‘œ์ค€ํ™” ์—ฐ๊ตฌ ๋ฐ ๊ธฐ์—ฌ +
    + {/* Page Header */} +
    +

    + International Standardization

    -

    - IEC TC100, ISO/IEC JTC1, ITU-T, TTA ๋“ฑ ๊ตญ์ œ/๊ตญ๋‚ด ํ‘œ์ค€ํ™” ๊ธฐ๊ตฌ๋ฅผ ํ†ตํ•ด ์ œ์ • ๋ฐ ์ง„ํ–‰ ์ค‘์ธ {standardsBodies.length}๊ฐœ ๊ธฐ๊ตฌ {totalDocs}๊ฑด์˜ ํ‘œ์ค€ ๊ทœ๊ฒฉ ๋ฌธ์„œ ๊ณ„์ธต ์ธ๋ฒคํ† ๋ฆฌ์ž…๋‹ˆ๋‹ค. -

    {/* Standards Bodies Section */} -
    +
    {standardsBodies.map((body, idx) => ( -
    +
    @@ -103,7 +88,7 @@ export default function StandardizationPage() {
    ) : (
    - ์ง„ํ–‰ ์ค‘์ธ ์ฃผ ํ”„๋กœ์ ํŠธ ๊ทœ๊ฒฉ์„œ + Project specification in progress
    )}
    diff --git a/refer_landing_page/components/Footer.tsx b/refer_landing_page/components/Footer.tsx index 8e2b8e0..023f57b 100644 --- a/refer_landing_page/components/Footer.tsx +++ b/refer_landing_page/components/Footer.tsx @@ -101,7 +101,7 @@ export default function Footer() { rel="noopener noreferrer" className="inline-flex items-center gap-1 px-2.5 py-1 rounded bg-ivory border border-line text-ink-soft hover:text-cobalt-dark hover:border-cobalt/40 transition-colors" > - College of IT Engineering + CITE โ†—
    diff --git a/refer_landing_page/components/Header.tsx b/refer_landing_page/components/Header.tsx index 3290aaa..5e0e7c4 100644 --- a/refer_landing_page/components/Header.tsx +++ b/refer_landing_page/components/Header.tsx @@ -130,7 +130,7 @@ export default function Header() { {/* Brand logo */} setOpen(false)} >
    @@ -158,11 +158,11 @@ export default function Header() {
    -
    +
    ANL - + AI Agent Networking LAB
    diff --git a/refer_landing_page/content/categories.ts b/refer_landing_page/content/categories.ts index 4dd7af3..fa85f2f 100644 --- a/refer_landing_page/content/categories.ts +++ b/refer_landing_page/content/categories.ts @@ -3,6 +3,7 @@ import { PubCategory } from "./types"; export interface CategoryInfo { slug: PubCategory; label: string; + subtitle?: string; desc: string; } @@ -21,6 +22,7 @@ export const PUB_CATEGORIES: CategoryInfo[] = [ { slug: "patent", label: "Patent", + subtitle: "(IoT Architecture & Protocols, etc ...)", desc: "๊ตญ๋‚ด์™ธ ์ง€์‹์žฌ์‚ฐ๊ถŒ ์ถœ์› ๋ฐ ๋“ฑ๋ก ์‹ค์ ", }, ]; diff --git a/scripts/generate-env.sh b/scripts/generate-env.sh index 5cc7a70..4ecfaa6 100755 --- a/scripts/generate-env.sh +++ b/scripts/generate-env.sh @@ -7,10 +7,10 @@ # - .mam.env present --force โ†’ overwrite .mam.env from .mam.env.example (backs up to .mam.env.bak). # - --migrate-legacy โ†’ explicitly rename existing .env to .mam.env if absent. # -# Paths are resolved relative to this script (repo root = parent of scripts/), +# Paths are resolved relative to this script (repo root = parent of deploy/), # so it works regardless of the caller's cwd. # -# Usage: scripts/generate-env.sh [--force] [--migrate-legacy] [-h|--help] +# Usage: deploy/generate-env.sh [--force] [--migrate-legacy] [-h|--help] set -euo pipefail REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"