# คำสั่งยาวและไฟล์ใหญ่ — JUJU 0.4.3

JUJU 0.4.3 รองรับการสร้างเว็บและไฟล์โค้ดขนาดใหญ่ โดยยกเลิกเพดานเดิม
8,192 ตัวอักษรของ `run_command` แล้วใช้ขนาด UTF-8 ที่เจ้าของตั้งได้แทน
ยังมีเพดานต่อครั้งเพื่อควบคุมการใช้หน่วยความจำ ไม่ใช่โหมด unlimited

## ตั้งครั้งเดียว

```bash
juju limits --profile large
```

รันจากโฟลเดอร์ไหนก็ได้ แล้วหยุด JUJU ตัวเดิมด้วย `Ctrl+C` ที่ terminal
ซึ่งกำลังรันอยู่ จากนั้นเข้าโฟลเดอร์โปรเจกต์แล้วพิมพ์ `juju` อีกครั้ง
สำหรับ STDIO ให้แอปที่ใช้ MCP เริ่ม subprocess ใหม่
คำสั่งนี้ไม่หยุดเซิร์ฟเวอร์เอง ไม่เปลี่ยน OAuth, public URL, trust,
sandbox, สิทธิ์ Desktop, จำนวนงานพร้อมกัน หรือขนาด log/output

ดูค่าที่บันทึกไว้หรือกลับไปใช้ค่ามาตรฐาน:

```bash
juju limits
juju limits --json
juju limits --profile standard
```

`juju limits` แสดงค่าบนดิสก์ ซึ่งอาจต่างจากเซิร์ฟเวอร์ที่เปิดค้างอยู่
ให้ AI เรียก `project_overview` หลัง restart เพื่อรับ epoch และค่าที่ใช้จริง
ใน `policy.limits` หากแอปเก็บ catalog เก่าไว้ ต้องให้แอปโหลด tools ใหม่
การเพิ่มขนาดข้อมูลไม่ได้เพิ่มสิทธิ์อ่าน/เขียน/รันให้ client

## ขนาดที่รองรับ

| ข้อมูลต่อครั้ง | standard | large |
|---|---:|---:|
| Shell source ใน `run_command` / แต่ละรายการของ `run_commands` | 1 MiB | 8 MiB |
| ไฟล์ข้อความปลายทางของเครื่องมือแก้ไฟล์ (`readFileBytes`) | 8 MiB | 16 MiB |
| ผลรวมเนื้อหาไฟล์หลังแก้ในหนึ่งแผน (`previewAggregateBytes`) | 8 MiB | 32 MiB |
| MCP request รวม JSON และ escaping (`requestBodyBytes`) | 16 MiB | 32 MiB |

1 MiB = 1,048,576 bytes ไม่ใช่จำนวนตัวอักษร ภาษาไทย/emoji
และ JSON escaping ใช้พื้นที่มากกว่าข้อความ ASCII จึงต้องเผื่อ request envelope
ด้วย ค่าทุกชั้นใช้ร่วมกัน เช่นไฟล์อาจยังไม่เกินขนาด แต่ request รวมเกินได้

Config เดิมจะเก็บตัวเลขเดิมที่เจ้าของบันทึกไว้ จึงควรใช้ `--profile large`
เมื่อต้องการเพิ่มเพดานหลังอัปเกรด ไม่ย้ายค่าที่เจ้าของตั้งไว้อัตโนมัติ
ปรับตัวเลขเองได้ผ่าน global `config.json` ตาม schema:
`commandBytes` สูงสุด 8 MiB, `readFileBytes` สูงสุด 16 MiB,
`requestBodyBytes` สูงสุด 32 MiB, `previewAggregateBytes` สูงสุด 64 MiB
เพดานอื่นยังมีผลตามเดิม ห้ามตั้งผ่าน `.juju.json` หรือ AGENTS.md

## วิธีให้ AI เขียนเว็บ

1. เรียก `project_overview` เพื่อดู workspace, epoch, สิทธิ์ และขนาดข้อมูล
2. ใช้ `write_file` สร้าง `index.html`, `style.css`, `app.js` แยกกัน
3. ใช้ `read_files` รับ hash แล้ว `edit_file` แก้ส่วนที่ต้องการด้วย expectedHash
4. ใช้คำสั่งสั้น เช่น `npm run dev`, `npm test`, `npm run build`
   หากเป็น dev server ให้ใช้ `background: true` และติดตามด้วย job tools
5. งานเกินขนาดต่อไฟล์ให้แบ่งเป็น modules/assets ไม่ต้องตัดฟีเจอร์ของเว็บ

ข้อความสำหรับส่งให้ AI:

> สร้างไฟล์ด้วย write_file และแก้ด้วย edit_file อ่าน policy.limits จาก
> project_overview ก่อนส่งข้อมูลใหญ่ ใช้ run_command สำหรับ build/test/dev server
> หากเครื่องมือปฏิเสธ ให้แสดงชื่อเครื่องมือและ error code/message จริง
> แยกข้อผิดพลาดเรื่องขนาดออกจากสิทธิ์ และอย่าลดฟีเจอร์เว็บโดยไม่จำเป็น

## คำสั่งยาวทำงานอย่างไร

Shell source เกิน 16 KiB จะถูกบันทึกเป็น `command.sh` แบบ 0600 ในโฟลเดอร์งาน
ส่วนตัวของ JUJU แบบ 0700 แล้วส่งเพียงพาธสั้นให้ shell ระบบปฏิบัติการจึงไม่ต้อง
รับ source ทั้งก้อนใน argv โดย stdin ยังใช้กับ `job_input` ได้ตามเดิม
สคริปต์ถูกสร้างหลังผ่านสิทธิ์เท่านั้น ไม่ถูกเขียนลง repository
JUJU ลบสคริปต์เมื่องานปิด รวมถึง cancel และ spawn failure
หาก process ถูก SIGKILL/เครื่องดับก่อน cleanup ไฟล์ส่วนตัวอาจตกค้างอยู่
JUJU ไม่ execute ไฟล์ตกค้างและไม่รันงานที่สถานะไม่แน่นอนซ้ำตอน restart

คำสั่งยาวใช้ semantics ของ `bash script-file` (`$0` เป็นพาธสคริปต์)
ส่วนคำสั่งสั้นยังใช้ `bash -c` หากโค้ดต้องอาศัย `$0`/`BASH_SOURCE`
ให้สร้างไฟล์สคริปต์ใน workspace แล้วเรียกพาธนั้นอย่างชัดเจน
ข้อจำกัด argv ของโปรแกรมที่สคริปต์เรียกต่อยังเป็นของระบบปฏิบัติการ
การใส่ข้อมูลก้อนใหญ่ใน `node -e`, `python -c` หรือ external-command argument
จึงควรเปลี่ยนเป็นไฟล์ แม้ shell source จะส่งผ่านไฟล์แล้วก็ตาม

`exec_command` ซึ่งส่ง argv โดยตรงรองรับ 64 KiB ต่อ argument และ 128 KiB
รวมชื่อโปรแกรมกับ arguments; อาจถูก OS ปฏิเสธเพิ่มเติมตามขนาด environment
`job_input` ยังส่งเป็น chunk ไม่เกิน 64 KiB ต่อครั้ง

## เมื่อข้อมูลเกินหรือไม่มีสิทธิ์

| ผลตอบกลับ | ความหมายและวิธีแก้ |
|---|---|
| `RESOURCE_LIMIT` พร้อม command/request budget | แบ่ง call หรือให้เจ้าของเลือก profile แล้ว restart |
| `FILE_TOO_LARGE` | ไฟล์ผลลัพธ์เกินขนาด; แบ่งไฟล์/ปรับ profile |
| HTTP `413` | request รวมเกินเพดาน; แบ่งข้อมูล ลดขนาด JSON |
| STDIO buffer error | ข้อความเกินเพดาน transport; เริ่ม client ใหม่และลดขนาด call |
| `APPROVAL_REQUIRED` / `FORBIDDEN` | เกี่ยวกับสิทธิ์ ต้องจัดการสิทธิ์ตาม error; เพิ่มขนาดไม่ช่วย |
| `FILE_CHANGED` | hash เก่า อ่านไฟล์ใหม่ก่อนแก้ ไม่เขียนทับงานที่เปลี่ยนไป |

Diff ที่เนื้อหารวมก่อน/หลังเกิน 2 MiB จะคืนข้อความบอกว่าไม่แสดง diff
พร้อม `diffTruncated`/`truncated` สำหรับเครื่องมือที่คืน diff
Diff ขนาดเล็กยังมีงบคำนวณ 250 ms / 10,000 edits
hash, เนื้อหาแผน, backup และ rollback ยังใช้ข้อมูลเต็ม
การแทนที่ข้อความตรวจขนาดผลลัพธ์ก่อนประกอบ string เพื่อไม่ให้ replaceAll
ขยายข้อมูลจนหน่วยความจำหมด ทั้ง batch command summaries และ job arguments
ที่ส่งกลับมีการตัดข้อความอย่างชัดเจน โดยคำสั่งจริงไม่ถูกตัด

แอป AI, model และ reverse proxy อาจกำหนดเพดานของตัวเอง
การเพิ่มค่า JUJU ไม่ได้ยกเลิกข้อจำกัดของระบบเหล่านั้น
ผลทดสอบจริงดู [TEST_REPORT](TEST_REPORT.md); การส่งข้อมูลใหญ่ผ่านบัญชี
ChatGPT/Claude และ tunnel จริงยังเป็น `MANUAL_NOT_RUN`
