cli-jaw 0.1.6 → 0.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ko.md +68 -71
- package/README.md +123 -92
- package/README.zh-CN.md +68 -73
- package/dist/bin/cli-claw.js +96 -0
- package/dist/bin/cli-claw.js.map +1 -0
- package/dist/bin/cli-jaw.js +0 -0
- package/dist/bin/commands/doctor.js +3 -0
- package/dist/bin/commands/doctor.js.map +1 -1
- package/dist/bin/commands/init.js +36 -19
- package/dist/bin/commands/init.js.map +1 -1
- package/dist/bin/postinstall.js +175 -104
- package/dist/bin/postinstall.js.map +1 -1
- package/dist/lib/mcp-sync.js +43 -4
- package/dist/lib/mcp-sync.js.map +1 -1
- package/dist/server.js +22 -103
- package/dist/server.js.map +1 -1
- package/dist/src/cli/acp-client.js +1 -1
- package/dist/src/cli/command-context.js +73 -0
- package/dist/src/cli/command-context.js.map +1 -0
- package/dist/src/core/db.js +1 -1
- package/dist/src/memory/heartbeat.js +2 -1
- package/dist/src/memory/heartbeat.js.map +1 -1
- package/dist/src/orchestrator/collect.js +53 -0
- package/dist/src/orchestrator/collect.js.map +1 -0
- package/dist/src/orchestrator/gateway.js +49 -0
- package/dist/src/orchestrator/gateway.js.map +1 -0
- package/dist/src/telegram/bot.js +32 -119
- package/dist/src/telegram/bot.js.map +1 -1
- package/package.json +7 -7
- package/public/css/sidebar.css +14 -0
- package/public/dist/bundle.js +21 -21
- package/public/dist/bundle.js.map +3 -3
- package/public/index.html +2 -2
- package/public/js/features/settings.js +1 -2
- package/public/js/main.js +0 -1
- package/scripts/check-copilot-gap.js +57 -0
- package/scripts/check-deps-offline.mjs +75 -0
- package/scripts/check-deps-online.sh +26 -0
- package/scripts/i18n-registry.py +208 -0
- package/scripts/postinstall-guard.cjs +63 -0
- package/scripts/release.sh +30 -0
- package/skills_ref/1password/SKILL.md +0 -70
- package/skills_ref/agents-sdk/SKILL.md +0 -155
- package/skills_ref/agents-sdk/references/callable.md +0 -92
- package/skills_ref/agents-sdk/references/codemode.md +0 -207
- package/skills_ref/agents-sdk/references/email.md +0 -146
- package/skills_ref/agents-sdk/references/mcp.md +0 -154
- package/skills_ref/agents-sdk/references/state-scheduling.md +0 -164
- package/skills_ref/agents-sdk/references/streaming-chat.md +0 -178
- package/skills_ref/agents-sdk/references/workflows.md +0 -132
- package/skills_ref/algorithmic-art/LICENSE.txt +0 -202
- package/skills_ref/algorithmic-art/SKILL.md +0 -405
- package/skills_ref/algorithmic-art/templates/generator_template.js +0 -223
- package/skills_ref/algorithmic-art/templates/viewer.html +0 -599
- package/skills_ref/apple-notes/SKILL.md +0 -77
- package/skills_ref/apple-reminders/SKILL.md +0 -118
- package/skills_ref/atlas/SKILL.md +0 -99
- package/skills_ref/brainstorming/SKILL.md +0 -96
- package/skills_ref/browser/SKILL.md +0 -179
- package/skills_ref/canvas-design/LICENSE.txt +0 -202
- package/skills_ref/canvas-design/SKILL.md +0 -130
- package/skills_ref/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +0 -93
- package/skills_ref/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/BigShoulders-OFL.txt +0 -93
- package/skills_ref/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/Boldonse-OFL.txt +0 -93
- package/skills_ref/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +0 -93
- package/skills_ref/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +0 -93
- package/skills_ref/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/DMMono-OFL.txt +0 -93
- package/skills_ref/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/EricaOne-OFL.txt +0 -94
- package/skills_ref/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/GeistMono-OFL.txt +0 -93
- package/skills_ref/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/Gloock-OFL.txt +0 -93
- package/skills_ref/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +0 -93
- package/skills_ref/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +0 -93
- package/skills_ref/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/Italiana-OFL.txt +0 -93
- package/skills_ref/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +0 -93
- package/skills_ref/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/Jura-OFL.txt +0 -93
- package/skills_ref/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +0 -93
- package/skills_ref/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/Lora-OFL.txt +0 -93
- package/skills_ref/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/NationalPark-OFL.txt +0 -93
- package/skills_ref/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +0 -93
- package/skills_ref/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/Outfit-OFL.txt +0 -93
- package/skills_ref/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/PixelifySans-OFL.txt +0 -93
- package/skills_ref/canvas-design/canvas-fonts/PoiretOne-OFL.txt +0 -93
- package/skills_ref/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/RedHatMono-OFL.txt +0 -93
- package/skills_ref/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/Silkscreen-OFL.txt +0 -93
- package/skills_ref/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/SmoochSans-OFL.txt +0 -93
- package/skills_ref/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/Tektur-OFL.txt +0 -93
- package/skills_ref/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/WorkSans-OFL.txt +0 -93
- package/skills_ref/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/skills_ref/canvas-design/canvas-fonts/YoungSerif-OFL.txt +0 -93
- package/skills_ref/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- package/skills_ref/changelog-generator/SKILL.md +0 -104
- package/skills_ref/cloudflare-deploy/SKILL.md +0 -207
- package/skills_ref/codebase-orientation/SKILL.md +0 -29
- package/skills_ref/config-file-explainer/SKILL.md +0 -26
- package/skills_ref/context-compression/SKILL.md +0 -265
- package/skills_ref/context-compression/references/evaluation-framework.md +0 -213
- package/skills_ref/context-compression/scripts/compression_evaluator.py +0 -658
- package/skills_ref/data-structure-chooser/SKILL.md +0 -26
- package/skills_ref/debugging-checklist/SKILL.md +0 -26
- package/skills_ref/debugging-helpers/CREATION-LOG.md +0 -119
- package/skills_ref/debugging-helpers/SKILL.md +0 -296
- package/skills_ref/debugging-helpers/condition-based-waiting-example.ts +0 -158
- package/skills_ref/debugging-helpers/condition-based-waiting.md +0 -115
- package/skills_ref/debugging-helpers/defense-in-depth.md +0 -122
- package/skills_ref/debugging-helpers/find-polluter.sh +0 -63
- package/skills_ref/debugging-helpers/root-cause-tracing.md +0 -169
- package/skills_ref/debugging-helpers/test-academic.md +0 -14
- package/skills_ref/debugging-helpers/test-pressure-1.md +0 -58
- package/skills_ref/debugging-helpers/test-pressure-2.md +0 -68
- package/skills_ref/debugging-helpers/test-pressure-3.md +0 -69
- package/skills_ref/deep-research/.env.example +0 -7
- package/skills_ref/deep-research/README.md +0 -246
- package/skills_ref/deep-research/SKILL.md +0 -106
- package/skills_ref/deep-research/requirements.txt +0 -2
- package/skills_ref/deep-research/scripts/research.py +0 -692
- package/skills_ref/dependency-install-helper/SKILL.md +0 -26
- package/skills_ref/dev/SKILL.md +0 -65
- package/skills_ref/dev-backend/SKILL.md +0 -61
- package/skills_ref/dev-data/SKILL.md +0 -76
- package/skills_ref/dev-frontend/LICENSE.txt +0 -177
- package/skills_ref/dev-frontend/SKILL.md +0 -42
- package/skills_ref/dev-testing/LICENSE.txt +0 -202
- package/skills_ref/dev-testing/SKILL.md +0 -96
- package/skills_ref/dev-testing/examples/console_logging.py +0 -35
- package/skills_ref/dev-testing/examples/element_discovery.py +0 -40
- package/skills_ref/dev-testing/examples/static_html_automation.py +0 -33
- package/skills_ref/dev-testing/scripts/with_server.py +0 -106
- package/skills_ref/develop-web-game/SKILL.md +0 -149
- package/skills_ref/differential-review/.claude-plugin/plugin.json +0 -10
- package/skills_ref/differential-review/README.md +0 -109
- package/skills_ref/differential-review/commands/diff-review.md +0 -21
- package/skills_ref/differential-review/skills/differential-review/SKILL.md +0 -220
- package/skills_ref/differential-review/skills/differential-review/adversarial.md +0 -203
- package/skills_ref/differential-review/skills/differential-review/methodology.md +0 -234
- package/skills_ref/differential-review/skills/differential-review/patterns.md +0 -300
- package/skills_ref/differential-review/skills/differential-review/reporting.md +0 -369
- package/skills_ref/dispatching-parallel-agents/SKILL.md +0 -180
- package/skills_ref/doc-coauthoring/SKILL.md +0 -375
- package/skills_ref/docx/LICENSE.txt +0 -30
- package/skills_ref/docx/SKILL.md +0 -481
- package/skills_ref/docx/scripts/__init__.py +0 -1
- package/skills_ref/docx/scripts/accept_changes.py +0 -135
- package/skills_ref/docx/scripts/comment.py +0 -318
- package/skills_ref/docx/scripts/office/helpers/__init__.py +0 -0
- package/skills_ref/docx/scripts/office/helpers/merge_runs.py +0 -199
- package/skills_ref/docx/scripts/office/helpers/simplify_redlines.py +0 -197
- package/skills_ref/docx/scripts/office/pack.py +0 -159
- package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
- package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
- package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
- package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
- package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
- package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
- package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
- package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
- package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
- package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
- package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
- package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
- package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
- package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
- package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
- package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
- package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
- package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
- package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
- package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
- package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
- package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
- package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
- package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
- package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
- package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
- package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
- package/skills_ref/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
- package/skills_ref/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
- package/skills_ref/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
- package/skills_ref/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
- package/skills_ref/docx/scripts/office/schemas/mce/mc.xsd +0 -75
- package/skills_ref/docx/scripts/office/schemas/microsoft/wml-2010.xsd +0 -560
- package/skills_ref/docx/scripts/office/schemas/microsoft/wml-2012.xsd +0 -67
- package/skills_ref/docx/scripts/office/schemas/microsoft/wml-2018.xsd +0 -14
- package/skills_ref/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -20
- package/skills_ref/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -13
- package/skills_ref/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
- package/skills_ref/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -8
- package/skills_ref/docx/scripts/office/soffice.py +0 -183
- package/skills_ref/docx/scripts/office/unpack.py +0 -132
- package/skills_ref/docx/scripts/office/validate.py +0 -111
- package/skills_ref/docx/scripts/office/validators/__init__.py +0 -15
- package/skills_ref/docx/scripts/office/validators/base.py +0 -847
- package/skills_ref/docx/scripts/office/validators/docx.py +0 -446
- package/skills_ref/docx/scripts/office/validators/pptx.py +0 -275
- package/skills_ref/docx/scripts/office/validators/redlining.py +0 -247
- package/skills_ref/docx/scripts/templates/comments.xml +0 -3
- package/skills_ref/docx/scripts/templates/commentsExtended.xml +0 -3
- package/skills_ref/docx/scripts/templates/commentsExtensible.xml +0 -3
- package/skills_ref/docx/scripts/templates/commentsIds.xml +0 -3
- package/skills_ref/docx/scripts/templates/people.xml +0 -3
- package/skills_ref/durable-objects/SKILL.md +0 -186
- package/skills_ref/durable-objects/references/rules.md +0 -286
- package/skills_ref/durable-objects/references/testing.md +0 -264
- package/skills_ref/durable-objects/references/workers.md +0 -346
- package/skills_ref/email-draft-polish/SKILL.md +0 -24
- package/skills_ref/error-message-explainer/SKILL.md +0 -27
- package/skills_ref/fal-image-edit/SKILL.md +0 -249
- package/skills_ref/fal-image-edit/scripts/edit-image.sh +0 -199
- package/skills_ref/figma-implement-design/SKILL.md +0 -264
- package/skills_ref/git-worktrees/SKILL.md +0 -218
- package/skills_ref/github/SKILL.md +0 -210
- package/skills_ref/gog/SKILL.md +0 -116
- package/skills_ref/goplaces/SKILL.md +0 -52
- package/skills_ref/himalaya/SKILL.md +0 -257
- package/skills_ref/hugging-face-cli/SKILL.md +0 -186
- package/skills_ref/hugging-face-cli/references/commands.md +0 -954
- package/skills_ref/hugging-face-cli/references/examples.md +0 -374
- package/skills_ref/hugging-face-evaluation/SKILL.md +0 -651
- package/skills_ref/hugging-face-evaluation/examples/.env.example +0 -7
- package/skills_ref/hugging-face-evaluation/examples/USAGE_EXAMPLES.md +0 -382
- package/skills_ref/hugging-face-evaluation/examples/artificial_analysis_to_hub.py +0 -141
- package/skills_ref/hugging-face-evaluation/examples/example_readme_tables.md +0 -135
- package/skills_ref/hugging-face-evaluation/examples/metric_mapping.json +0 -50
- package/skills_ref/hugging-face-evaluation/requirements.txt +0 -20
- package/skills_ref/hugging-face-evaluation/scripts/evaluation_manager.py +0 -1374
- package/skills_ref/hugging-face-evaluation/scripts/inspect_eval_uv.py +0 -104
- package/skills_ref/hugging-face-evaluation/scripts/inspect_vllm_uv.py +0 -317
- package/skills_ref/hugging-face-evaluation/scripts/lighteval_vllm_uv.py +0 -303
- package/skills_ref/hugging-face-evaluation/scripts/run_eval_job.py +0 -98
- package/skills_ref/hugging-face-evaluation/scripts/run_vllm_eval_job.py +0 -331
- package/skills_ref/hugging-face-evaluation/scripts/test_extraction.py +0 -206
- package/skills_ref/hugging-face-model-trainer/SKILL.md +0 -718
- package/skills_ref/hugging-face-model-trainer/references/gguf_conversion.md +0 -296
- package/skills_ref/hugging-face-model-trainer/references/hardware_guide.md +0 -283
- package/skills_ref/hugging-face-model-trainer/references/hub_saving.md +0 -364
- package/skills_ref/hugging-face-model-trainer/references/reliability_principles.md +0 -371
- package/skills_ref/hugging-face-model-trainer/references/trackio_guide.md +0 -189
- package/skills_ref/hugging-face-model-trainer/references/training_methods.md +0 -150
- package/skills_ref/hugging-face-model-trainer/references/training_patterns.md +0 -203
- package/skills_ref/hugging-face-model-trainer/references/troubleshooting.md +0 -282
- package/skills_ref/hugging-face-model-trainer/references/unsloth.md +0 -313
- package/skills_ref/hugging-face-model-trainer/scripts/convert_to_gguf.py +0 -424
- package/skills_ref/hugging-face-model-trainer/scripts/dataset_inspector.py +0 -417
- package/skills_ref/hugging-face-model-trainer/scripts/estimate_cost.py +0 -150
- package/skills_ref/hugging-face-model-trainer/scripts/train_dpo_example.py +0 -106
- package/skills_ref/hugging-face-model-trainer/scripts/train_grpo_example.py +0 -89
- package/skills_ref/hugging-face-model-trainer/scripts/train_sft_example.py +0 -122
- package/skills_ref/hugging-face-model-trainer/scripts/unsloth_sft_example.py +0 -512
- package/skills_ref/imagegen/SKILL.md +0 -174
- package/skills_ref/insecure-defaults/.claude-plugin/plugin.json +0 -10
- package/skills_ref/insecure-defaults/README.md +0 -45
- package/skills_ref/insecure-defaults/skills/insecure-defaults/SKILL.md +0 -117
- package/skills_ref/insecure-defaults/skills/insecure-defaults/references/examples.md +0 -409
- package/skills_ref/jupyter-notebook/SKILL.md +0 -107
- package/skills_ref/linear/SKILL.md +0 -87
- package/skills_ref/linter-fix-guide/SKILL.md +0 -27
- package/skills_ref/log-summarizer/SKILL.md +0 -27
- package/skills_ref/mcp-builder/LICENSE.txt +0 -202
- package/skills_ref/mcp-builder/SKILL.md +0 -236
- package/skills_ref/mcp-builder/reference/evaluation.md +0 -602
- package/skills_ref/mcp-builder/reference/mcp_best_practices.md +0 -249
- package/skills_ref/mcp-builder/reference/node_mcp_server.md +0 -970
- package/skills_ref/mcp-builder/reference/python_mcp_server.md +0 -719
- package/skills_ref/mcp-builder/scripts/connections.py +0 -151
- package/skills_ref/mcp-builder/scripts/evaluation.py +0 -373
- package/skills_ref/mcp-builder/scripts/example_evaluation.xml +0 -22
- package/skills_ref/mcp-builder/scripts/requirements.txt +0 -2
- package/skills_ref/memory/SKILL.md +0 -129
- package/skills_ref/modern-python/.claude-plugin/plugin.json +0 -10
- package/skills_ref/modern-python/README.md +0 -66
- package/skills_ref/modern-python/hooks/hooks.json +0 -16
- package/skills_ref/modern-python/hooks/setup-shims.bats +0 -70
- package/skills_ref/modern-python/hooks/setup-shims.sh +0 -24
- package/skills_ref/modern-python/hooks/shims/pip +0 -27
- package/skills_ref/modern-python/hooks/shims/pip-shim.bats +0 -45
- package/skills_ref/modern-python/hooks/shims/pip3 +0 -27
- package/skills_ref/modern-python/hooks/shims/pipx +0 -41
- package/skills_ref/modern-python/hooks/shims/pipx-shim.bats +0 -64
- package/skills_ref/modern-python/hooks/shims/python +0 -26
- package/skills_ref/modern-python/hooks/shims/python-shim.bats +0 -53
- package/skills_ref/modern-python/hooks/shims/python3 +0 -26
- package/skills_ref/modern-python/hooks/shims/uv +0 -27
- package/skills_ref/modern-python/hooks/shims/uv-shim.bats +0 -47
- package/skills_ref/modern-python/skills/modern-python/SKILL.md +0 -333
- package/skills_ref/modern-python/skills/modern-python/references/dependabot.md +0 -43
- package/skills_ref/modern-python/skills/modern-python/references/migration-checklist.md +0 -141
- package/skills_ref/modern-python/skills/modern-python/references/pep723-scripts.md +0 -259
- package/skills_ref/modern-python/skills/modern-python/references/prek.md +0 -211
- package/skills_ref/modern-python/skills/modern-python/references/pyproject.md +0 -254
- package/skills_ref/modern-python/skills/modern-python/references/ruff-config.md +0 -240
- package/skills_ref/modern-python/skills/modern-python/references/security-setup.md +0 -255
- package/skills_ref/modern-python/skills/modern-python/references/testing.md +0 -284
- package/skills_ref/modern-python/skills/modern-python/references/uv-commands.md +0 -200
- package/skills_ref/modern-python/skills/modern-python/templates/dependabot.yml +0 -36
- package/skills_ref/modern-python/skills/modern-python/templates/pre-commit-config.yaml +0 -66
- package/skills_ref/nano-banana-pro/SKILL.md +0 -58
- package/skills_ref/netlify-deploy/SKILL.md +0 -233
- package/skills_ref/notion/SKILL.md +0 -304
- package/skills_ref/notion-knowledge-capture/SKILL.md +0 -56
- package/skills_ref/notion-meeting-intelligence/SKILL.md +0 -60
- package/skills_ref/notion-research-documentation/SKILL.md +0 -59
- package/skills_ref/notion-spec-to-implementation/SKILL.md +0 -58
- package/skills_ref/obsidian/SKILL.md +0 -81
- package/skills_ref/openai-docs/SKILL.md +0 -56
- package/skills_ref/openhue/SKILL.md +0 -112
- package/skills_ref/pdf/SKILL.md +0 -69
- package/skills_ref/postgres/README.md +0 -77
- package/skills_ref/postgres/SKILL.md +0 -129
- package/skills_ref/postgres/connections.example.json +0 -34
- package/skills_ref/postgres/requirements.txt +0 -1
- package/skills_ref/postgres/scripts/query.py +0 -262
- package/skills_ref/pptx/LICENSE.txt +0 -30
- package/skills_ref/pptx/SKILL.md +0 -232
- package/skills_ref/pptx/editing.md +0 -205
- package/skills_ref/pptx/pptxgenjs.md +0 -420
- package/skills_ref/pptx/scripts/__init__.py +0 -0
- package/skills_ref/pptx/scripts/add_slide.py +0 -195
- package/skills_ref/pptx/scripts/clean.py +0 -286
- package/skills_ref/pptx/scripts/office/helpers/__init__.py +0 -0
- package/skills_ref/pptx/scripts/office/helpers/merge_runs.py +0 -199
- package/skills_ref/pptx/scripts/office/helpers/simplify_redlines.py +0 -197
- package/skills_ref/pptx/scripts/office/pack.py +0 -159
- package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
- package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
- package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
- package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
- package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
- package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
- package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
- package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
- package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
- package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
- package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
- package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
- package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
- package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
- package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
- package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
- package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
- package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
- package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
- package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
- package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
- package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
- package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
- package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
- package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
- package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
- package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
- package/skills_ref/pptx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
- package/skills_ref/pptx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
- package/skills_ref/pptx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
- package/skills_ref/pptx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
- package/skills_ref/pptx/scripts/office/schemas/mce/mc.xsd +0 -75
- package/skills_ref/pptx/scripts/office/schemas/microsoft/wml-2010.xsd +0 -560
- package/skills_ref/pptx/scripts/office/schemas/microsoft/wml-2012.xsd +0 -67
- package/skills_ref/pptx/scripts/office/schemas/microsoft/wml-2018.xsd +0 -14
- package/skills_ref/pptx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -20
- package/skills_ref/pptx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -13
- package/skills_ref/pptx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
- package/skills_ref/pptx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -8
- package/skills_ref/pptx/scripts/office/soffice.py +0 -183
- package/skills_ref/pptx/scripts/office/unpack.py +0 -132
- package/skills_ref/pptx/scripts/office/validate.py +0 -111
- package/skills_ref/pptx/scripts/office/validators/__init__.py +0 -15
- package/skills_ref/pptx/scripts/office/validators/base.py +0 -847
- package/skills_ref/pptx/scripts/office/validators/docx.py +0 -446
- package/skills_ref/pptx/scripts/office/validators/pptx.py +0 -275
- package/skills_ref/pptx/scripts/office/validators/redlining.py +0 -247
- package/skills_ref/pptx/scripts/thumbnail.py +0 -289
- package/skills_ref/property-based-testing/.claude-plugin/plugin.json +0 -9
- package/skills_ref/property-based-testing/README.md +0 -47
- package/skills_ref/property-based-testing/skills/property-based-testing/README.md +0 -88
- package/skills_ref/property-based-testing/skills/property-based-testing/SKILL.md +0 -123
- package/skills_ref/property-based-testing/skills/property-based-testing/references/design.md +0 -191
- package/skills_ref/property-based-testing/skills/property-based-testing/references/generating.md +0 -204
- package/skills_ref/property-based-testing/skills/property-based-testing/references/interpreting-failures.md +0 -239
- package/skills_ref/property-based-testing/skills/property-based-testing/references/libraries.md +0 -130
- package/skills_ref/property-based-testing/skills/property-based-testing/references/refactoring.md +0 -181
- package/skills_ref/property-based-testing/skills/property-based-testing/references/reviewing.md +0 -209
- package/skills_ref/property-based-testing/skills/property-based-testing/references/strategies.md +0 -124
- package/skills_ref/react-best-practices/AGENTS.md +0 -2934
- package/skills_ref/react-best-practices/README.md +0 -123
- package/skills_ref/react-best-practices/SKILL.md +0 -136
- package/skills_ref/react-best-practices/metadata.json +0 -15
- package/skills_ref/react-best-practices/rules/_sections.md +0 -46
- package/skills_ref/react-best-practices/rules/_template.md +0 -28
- package/skills_ref/react-best-practices/rules/advanced-event-handler-refs.md +0 -55
- package/skills_ref/react-best-practices/rules/advanced-init-once.md +0 -42
- package/skills_ref/react-best-practices/rules/advanced-use-latest.md +0 -39
- package/skills_ref/react-best-practices/rules/async-api-routes.md +0 -38
- package/skills_ref/react-best-practices/rules/async-defer-await.md +0 -80
- package/skills_ref/react-best-practices/rules/async-dependencies.md +0 -51
- package/skills_ref/react-best-practices/rules/async-parallel.md +0 -28
- package/skills_ref/react-best-practices/rules/async-suspense-boundaries.md +0 -99
- package/skills_ref/react-best-practices/rules/bundle-barrel-imports.md +0 -59
- package/skills_ref/react-best-practices/rules/bundle-conditional.md +0 -31
- package/skills_ref/react-best-practices/rules/bundle-defer-third-party.md +0 -49
- package/skills_ref/react-best-practices/rules/bundle-dynamic-imports.md +0 -35
- package/skills_ref/react-best-practices/rules/bundle-preload.md +0 -50
- package/skills_ref/react-best-practices/rules/client-event-listeners.md +0 -74
- package/skills_ref/react-best-practices/rules/client-localstorage-schema.md +0 -71
- package/skills_ref/react-best-practices/rules/client-passive-event-listeners.md +0 -48
- package/skills_ref/react-best-practices/rules/client-swr-dedup.md +0 -56
- package/skills_ref/react-best-practices/rules/js-batch-dom-css.md +0 -107
- package/skills_ref/react-best-practices/rules/js-cache-function-results.md +0 -80
- package/skills_ref/react-best-practices/rules/js-cache-property-access.md +0 -28
- package/skills_ref/react-best-practices/rules/js-cache-storage.md +0 -70
- package/skills_ref/react-best-practices/rules/js-combine-iterations.md +0 -32
- package/skills_ref/react-best-practices/rules/js-early-exit.md +0 -50
- package/skills_ref/react-best-practices/rules/js-hoist-regexp.md +0 -45
- package/skills_ref/react-best-practices/rules/js-index-maps.md +0 -37
- package/skills_ref/react-best-practices/rules/js-length-check-first.md +0 -49
- package/skills_ref/react-best-practices/rules/js-min-max-loop.md +0 -82
- package/skills_ref/react-best-practices/rules/js-set-map-lookups.md +0 -24
- package/skills_ref/react-best-practices/rules/js-tosorted-immutable.md +0 -57
- package/skills_ref/react-best-practices/rules/rendering-activity.md +0 -26
- package/skills_ref/react-best-practices/rules/rendering-animate-svg-wrapper.md +0 -47
- package/skills_ref/react-best-practices/rules/rendering-conditional-render.md +0 -40
- package/skills_ref/react-best-practices/rules/rendering-content-visibility.md +0 -38
- package/skills_ref/react-best-practices/rules/rendering-hoist-jsx.md +0 -46
- package/skills_ref/react-best-practices/rules/rendering-hydration-no-flicker.md +0 -82
- package/skills_ref/react-best-practices/rules/rendering-hydration-suppress-warning.md +0 -30
- package/skills_ref/react-best-practices/rules/rendering-svg-precision.md +0 -28
- package/skills_ref/react-best-practices/rules/rendering-usetransition-loading.md +0 -75
- package/skills_ref/react-best-practices/rules/rerender-defer-reads.md +0 -39
- package/skills_ref/react-best-practices/rules/rerender-dependencies.md +0 -45
- package/skills_ref/react-best-practices/rules/rerender-derived-state-no-effect.md +0 -40
- package/skills_ref/react-best-practices/rules/rerender-derived-state.md +0 -29
- package/skills_ref/react-best-practices/rules/rerender-functional-setstate.md +0 -74
- package/skills_ref/react-best-practices/rules/rerender-lazy-state-init.md +0 -58
- package/skills_ref/react-best-practices/rules/rerender-memo-with-default-value.md +0 -38
- package/skills_ref/react-best-practices/rules/rerender-memo.md +0 -44
- package/skills_ref/react-best-practices/rules/rerender-move-effect-to-event.md +0 -45
- package/skills_ref/react-best-practices/rules/rerender-simple-expression-in-memo.md +0 -35
- package/skills_ref/react-best-practices/rules/rerender-transitions.md +0 -40
- package/skills_ref/react-best-practices/rules/rerender-use-ref-transient-values.md +0 -73
- package/skills_ref/react-best-practices/rules/server-after-nonblocking.md +0 -73
- package/skills_ref/react-best-practices/rules/server-auth-actions.md +0 -96
- package/skills_ref/react-best-practices/rules/server-cache-lru.md +0 -41
- package/skills_ref/react-best-practices/rules/server-cache-react.md +0 -76
- package/skills_ref/react-best-practices/rules/server-dedup-props.md +0 -65
- package/skills_ref/react-best-practices/rules/server-parallel-fetching.md +0 -83
- package/skills_ref/react-best-practices/rules/server-serialization.md +0 -38
- package/skills_ref/receiving-code-review/SKILL.md +0 -213
- package/skills_ref/registry.json +0 -1493
- package/skills_ref/render-deploy/SKILL.md +0 -462
- package/skills_ref/requesting-code-review/SKILL.md +0 -105
- package/skills_ref/requesting-code-review/code-reviewer.md +0 -146
- package/skills_ref/screen-capture/SKILL.md +0 -162
- package/skills_ref/security-best-practices/LICENSE.txt +0 -201
- package/skills_ref/security-best-practices/SKILL.md +0 -86
- package/skills_ref/security-best-practices/agents/openai.yaml +0 -4
- package/skills_ref/security-best-practices/references/golang-general-backend-security.md +0 -826
- package/skills_ref/security-best-practices/references/javascript-express-web-server-security.md +0 -1158
- package/skills_ref/security-best-practices/references/javascript-general-web-frontend-security.md +0 -747
- package/skills_ref/security-best-practices/references/javascript-jquery-web-frontend-security.md +0 -678
- package/skills_ref/security-best-practices/references/javascript-typescript-nextjs-web-server-security.md +0 -1144
- package/skills_ref/security-best-practices/references/javascript-typescript-react-web-frontend-security.md +0 -990
- package/skills_ref/security-best-practices/references/javascript-typescript-vue-web-frontend-security.md +0 -791
- package/skills_ref/security-best-practices/references/python-django-web-server-security.md +0 -882
- package/skills_ref/security-best-practices/references/python-fastapi-web-server-security.md +0 -1036
- package/skills_ref/security-best-practices/references/python-flask-web-server-security.md +0 -705
- package/skills_ref/security-ownership-map/LICENSE.txt +0 -201
- package/skills_ref/security-ownership-map/SKILL.md +0 -206
- package/skills_ref/security-ownership-map/agents/openai.yaml +0 -4
- package/skills_ref/security-ownership-map/references/neo4j-import.md +0 -60
- package/skills_ref/security-ownership-map/scripts/build_ownership_map.py +0 -956
- package/skills_ref/security-ownership-map/scripts/community_maintainers.py +0 -544
- package/skills_ref/security-ownership-map/scripts/query_ownership.py +0 -483
- package/skills_ref/security-ownership-map/scripts/run_ownership_map.py +0 -200
- package/skills_ref/security-threat-model/LICENSE.txt +0 -201
- package/skills_ref/security-threat-model/SKILL.md +0 -81
- package/skills_ref/security-threat-model/agents/openai.yaml +0 -4
- package/skills_ref/security-threat-model/references/prompt-template.md +0 -255
- package/skills_ref/security-threat-model/references/security-controls-and-assets.md +0 -32
- package/skills_ref/sentry/SKILL.md +0 -123
- package/skills_ref/skill-creator/SKILL.md +0 -372
- package/skills_ref/sora/SKILL.md +0 -153
- package/skills_ref/speech/SKILL.md +0 -144
- package/skills_ref/spotify-player/SKILL.md +0 -64
- package/skills_ref/static-analysis/.claude-plugin/plugin.json +0 -8
- package/skills_ref/static-analysis/README.md +0 -65
- package/skills_ref/static-analysis/agents/semgrep-scanner.md +0 -71
- package/skills_ref/static-analysis/agents/semgrep-triager.md +0 -107
- package/skills_ref/static-analysis/skills/codeql/SKILL.md +0 -119
- package/skills_ref/static-analysis/skills/codeql/references/diagnostic-query-templates.md +0 -339
- package/skills_ref/static-analysis/skills/codeql/references/language-details.md +0 -207
- package/skills_ref/static-analysis/skills/codeql/references/performance-tuning.md +0 -111
- package/skills_ref/static-analysis/skills/codeql/references/ruleset-catalog.md +0 -63
- package/skills_ref/static-analysis/skills/codeql/references/threat-models.md +0 -44
- package/skills_ref/static-analysis/skills/codeql/workflows/build-database.md +0 -669
- package/skills_ref/static-analysis/skills/codeql/workflows/create-data-extensions.md +0 -536
- package/skills_ref/static-analysis/skills/codeql/workflows/run-analysis.md +0 -436
- package/skills_ref/static-analysis/skills/sarif-parsing/SKILL.md +0 -479
- package/skills_ref/static-analysis/skills/sarif-parsing/resources/jq-queries.md +0 -162
- package/skills_ref/static-analysis/skills/sarif-parsing/resources/sarif_helpers.py +0 -331
- package/skills_ref/static-analysis/skills/semgrep/SKILL.md +0 -431
- package/skills_ref/static-analysis/skills/semgrep/references/rulesets.md +0 -162
- package/skills_ref/static-analysis/skills/semgrep/references/scanner-task-prompt.md +0 -102
- package/skills_ref/static-analysis/skills/semgrep/references/triage-task-prompt.md +0 -122
- package/skills_ref/static-analysis/skills/semgrep/scripts/merge_triaged_sarif.py +0 -252
- package/skills_ref/summarize/SKILL.md +0 -87
- package/skills_ref/tdd/SKILL.md +0 -371
- package/skills_ref/tdd/testing-anti-patterns.md +0 -299
- package/skills_ref/telegram-send/SKILL.md +0 -99
- package/skills_ref/terraform/README.md +0 -105
- package/skills_ref/terraform/code-generation/.claude-plugin/plugin.json +0 -30
- package/skills_ref/terraform/code-generation/skills/azure-verified-modules/SKILL.md +0 -613
- package/skills_ref/terraform/code-generation/skills/terraform-style-guide/SKILL.md +0 -353
- package/skills_ref/terraform/code-generation/skills/terraform-test/SKILL.md +0 -1669
- package/skills_ref/terraform/module-generation/.claude-plugin/plugin.json +0 -30
- package/skills_ref/terraform/module-generation/skills/refactor-module/SKILL.md +0 -538
- package/skills_ref/terraform/module-generation/skills/terraform-stacks/SKILL.md +0 -468
- package/skills_ref/terraform/module-generation/skills/terraform-stacks/references/api-monitoring.md +0 -543
- package/skills_ref/terraform/module-generation/skills/terraform-stacks/references/component-blocks.md +0 -476
- package/skills_ref/terraform/module-generation/skills/terraform-stacks/references/deployment-blocks.md +0 -391
- package/skills_ref/terraform/module-generation/skills/terraform-stacks/references/examples.md +0 -1529
- package/skills_ref/terraform/module-generation/skills/terraform-stacks/references/linked-stacks.md +0 -187
- package/skills_ref/terraform/module-generation/skills/terraform-stacks/references/troubleshooting.md +0 -671
- package/skills_ref/terraform/provider-development/.claude-plugin/plugin.json +0 -13
- package/skills_ref/terraform/provider-development/skills/new-terraform-provider/SKILL.md +0 -25
- package/skills_ref/terraform/provider-development/skills/new-terraform-provider/assets/main.go +0 -40
- package/skills_ref/terraform/provider-development/skills/provider-actions/SKILL.md +0 -478
- package/skills_ref/terraform/provider-development/skills/provider-resources/SKILL.md +0 -599
- package/skills_ref/terraform/provider-development/skills/run-acceptance-tests/SKILL.md +0 -41
- package/skills_ref/theme-factory/LICENSE.txt +0 -202
- package/skills_ref/theme-factory/SKILL.md +0 -59
- package/skills_ref/theme-factory/theme-showcase.pdf +0 -0
- package/skills_ref/theme-factory/themes/arctic-frost.md +0 -19
- package/skills_ref/theme-factory/themes/botanical-garden.md +0 -19
- package/skills_ref/theme-factory/themes/desert-rose.md +0 -19
- package/skills_ref/theme-factory/themes/forest-canopy.md +0 -19
- package/skills_ref/theme-factory/themes/golden-hour.md +0 -19
- package/skills_ref/theme-factory/themes/midnight-galaxy.md +0 -19
- package/skills_ref/theme-factory/themes/modern-minimalist.md +0 -19
- package/skills_ref/theme-factory/themes/ocean-depths.md +0 -19
- package/skills_ref/theme-factory/themes/sunset-boulevard.md +0 -19
- package/skills_ref/theme-factory/themes/tech-innovation.md +0 -19
- package/skills_ref/things-mac/SKILL.md +0 -86
- package/skills_ref/tmux/SKILL.md +0 -153
- package/skills_ref/transcribe/SKILL.md +0 -81
- package/skills_ref/trello/SKILL.md +0 -95
- package/skills_ref/tts/SKILL.md +0 -99
- package/skills_ref/vercel-deploy/SKILL.md +0 -115
- package/skills_ref/video-downloader/SKILL.md +0 -99
- package/skills_ref/video-downloader/scripts/download_video.py +0 -145
- package/skills_ref/video-frames/SKILL.md +0 -46
- package/skills_ref/vision-click/SKILL.md +0 -128
- package/skills_ref/weather/SKILL.md +0 -112
- package/skills_ref/web-artifacts-builder/LICENSE.txt +0 -202
- package/skills_ref/web-artifacts-builder/SKILL.md +0 -74
- package/skills_ref/web-artifacts-builder/scripts/bundle-artifact.sh +0 -54
- package/skills_ref/web-artifacts-builder/scripts/init-artifact.sh +0 -322
- package/skills_ref/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
- package/skills_ref/web-perf/SKILL.md +0 -193
- package/skills_ref/web-routing/SKILL.md +0 -26
- package/skills_ref/whatsapp/SKILL.md +0 -255
- package/skills_ref/whatsapp/assets/agent-app-integration-example.json +0 -35
- package/skills_ref/whatsapp/assets/databases-example.json +0 -11
- package/skills_ref/whatsapp/assets/function-decide-route-interactive-buttons.json +0 -6
- package/skills_ref/whatsapp/assets/functions-example.json +0 -5
- package/skills_ref/whatsapp/assets/workflow-agent-simple.json +0 -31
- package/skills_ref/whatsapp/assets/workflow-api-template-wait-agent.json +0 -59
- package/skills_ref/whatsapp/assets/workflow-customer-support-intake-agent.json +0 -56
- package/skills_ref/whatsapp/assets/workflow-decision.json +0 -83
- package/skills_ref/whatsapp/assets/workflow-interactive-buttons-decide-ai.json +0 -89
- package/skills_ref/whatsapp/assets/workflow-interactive-buttons-decide-function.json +0 -88
- package/skills_ref/whatsapp/assets/workflow-linear.json +0 -53
- package/skills_ref/whatsapp/package.json +0 -10
- package/skills_ref/whatsapp/references/app-integrations.md +0 -89
- package/skills_ref/whatsapp/references/databases-reference.md +0 -21
- package/skills_ref/whatsapp/references/execution-context.md +0 -42
- package/skills_ref/whatsapp/references/function-contracts.md +0 -55
- package/skills_ref/whatsapp/references/functions-payloads.md +0 -87
- package/skills_ref/whatsapp/references/functions-reference.md +0 -133
- package/skills_ref/whatsapp/references/graph-contract.md +0 -145
- package/skills_ref/whatsapp/references/node-types.md +0 -430
- package/skills_ref/whatsapp/references/triggers.md +0 -20
- package/skills_ref/whatsapp/references/workflow-overview.md +0 -22
- package/skills_ref/whatsapp/references/workflow-reference.md +0 -123
- package/skills_ref/whatsapp/scripts/configure-prop.js +0 -113
- package/skills_ref/whatsapp/scripts/create-connect-token.js +0 -38
- package/skills_ref/whatsapp/scripts/create-function.js +0 -64
- package/skills_ref/whatsapp/scripts/create-integration.js +0 -137
- package/skills_ref/whatsapp/scripts/create-row.js +0 -47
- package/skills_ref/whatsapp/scripts/create-trigger.js +0 -88
- package/skills_ref/whatsapp/scripts/create-workflow.js +0 -85
- package/skills_ref/whatsapp/scripts/delete-integration.js +0 -44
- package/skills_ref/whatsapp/scripts/delete-row.js +0 -49
- package/skills_ref/whatsapp/scripts/delete-trigger.js +0 -44
- package/skills_ref/whatsapp/scripts/deploy-function.js +0 -47
- package/skills_ref/whatsapp/scripts/edit-graph.js +0 -289
- package/skills_ref/whatsapp/scripts/get-action-schema.js +0 -44
- package/skills_ref/whatsapp/scripts/get-context-value.js +0 -80
- package/skills_ref/whatsapp/scripts/get-execution-event.js +0 -55
- package/skills_ref/whatsapp/scripts/get-execution.js +0 -44
- package/skills_ref/whatsapp/scripts/get-function.js +0 -43
- package/skills_ref/whatsapp/scripts/get-graph.js +0 -85
- package/skills_ref/whatsapp/scripts/get-table.js +0 -45
- package/skills_ref/whatsapp/scripts/get-workflow.js +0 -44
- package/skills_ref/whatsapp/scripts/invoke-function.js +0 -60
- package/skills_ref/whatsapp/scripts/lib/databases/args.js +0 -87
- package/skills_ref/whatsapp/scripts/lib/databases/filters.js +0 -30
- package/skills_ref/whatsapp/scripts/lib/databases/kapso-api.js +0 -70
- package/skills_ref/whatsapp/scripts/lib/functions/args.js +0 -55
- package/skills_ref/whatsapp/scripts/lib/functions/kapso-api.js +0 -70
- package/skills_ref/whatsapp/scripts/lib/workflows/args.js +0 -53
- package/skills_ref/whatsapp/scripts/lib/workflows/kapso-api.js +0 -123
- package/skills_ref/whatsapp/scripts/lib/workflows/result.js +0 -16
- package/skills_ref/whatsapp/scripts/list-accounts.js +0 -62
- package/skills_ref/whatsapp/scripts/list-apps.js +0 -42
- package/skills_ref/whatsapp/scripts/list-execution-events.js +0 -61
- package/skills_ref/whatsapp/scripts/list-executions.js +0 -53
- package/skills_ref/whatsapp/scripts/list-function-invocations.js +0 -53
- package/skills_ref/whatsapp/scripts/list-functions.js +0 -41
- package/skills_ref/whatsapp/scripts/list-integrations.js +0 -41
- package/skills_ref/whatsapp/scripts/list-provider-models.js +0 -48
- package/skills_ref/whatsapp/scripts/list-tables.js +0 -41
- package/skills_ref/whatsapp/scripts/list-triggers.js +0 -44
- package/skills_ref/whatsapp/scripts/list-whatsapp-phone-numbers.js +0 -56
- package/skills_ref/whatsapp/scripts/list-workflows.js +0 -44
- package/skills_ref/whatsapp/scripts/openapi-explore.mjs +0 -1273
- package/skills_ref/whatsapp/scripts/query-rows.js +0 -71
- package/skills_ref/whatsapp/scripts/reload-props.js +0 -110
- package/skills_ref/whatsapp/scripts/resume-execution.js +0 -75
- package/skills_ref/whatsapp/scripts/search-actions.js +0 -64
- package/skills_ref/whatsapp/scripts/update-execution-status.js +0 -51
- package/skills_ref/whatsapp/scripts/update-function.js +0 -65
- package/skills_ref/whatsapp/scripts/update-graph.js +0 -154
- package/skills_ref/whatsapp/scripts/update-integration.js +0 -82
- package/skills_ref/whatsapp/scripts/update-row.js +0 -51
- package/skills_ref/whatsapp/scripts/update-trigger.js +0 -60
- package/skills_ref/whatsapp/scripts/update-workflow-settings.js +0 -67
- package/skills_ref/whatsapp/scripts/upsert-row.js +0 -64
- package/skills_ref/whatsapp/scripts/validate-graph.js +0 -293
- package/skills_ref/whatsapp/scripts/variables-delete.js +0 -37
- package/skills_ref/whatsapp/scripts/variables-list.js +0 -55
- package/skills_ref/whatsapp/scripts/variables-set.js +0 -39
- package/skills_ref/writing-plans/SKILL.md +0 -116
- package/skills_ref/xlsx/LICENSE.txt +0 -30
- package/skills_ref/xlsx/SKILL.md +0 -292
- package/skills_ref/xlsx/scripts/office/helpers/__init__.py +0 -0
- package/skills_ref/xlsx/scripts/office/helpers/merge_runs.py +0 -199
- package/skills_ref/xlsx/scripts/office/helpers/simplify_redlines.py +0 -197
- package/skills_ref/xlsx/scripts/office/pack.py +0 -159
- package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
- package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
- package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
- package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
- package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
- package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
- package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
- package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
- package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
- package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
- package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
- package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
- package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
- package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
- package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
- package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
- package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
- package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
- package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
- package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
- package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
- package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
- package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
- package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
- package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
- package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
- package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
- package/skills_ref/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
- package/skills_ref/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
- package/skills_ref/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
- package/skills_ref/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
- package/skills_ref/xlsx/scripts/office/schemas/mce/mc.xsd +0 -75
- package/skills_ref/xlsx/scripts/office/schemas/microsoft/wml-2010.xsd +0 -560
- package/skills_ref/xlsx/scripts/office/schemas/microsoft/wml-2012.xsd +0 -67
- package/skills_ref/xlsx/scripts/office/schemas/microsoft/wml-2018.xsd +0 -14
- package/skills_ref/xlsx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -20
- package/skills_ref/xlsx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -13
- package/skills_ref/xlsx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
- package/skills_ref/xlsx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -8
- package/skills_ref/xlsx/scripts/office/soffice.py +0 -183
- package/skills_ref/xlsx/scripts/office/unpack.py +0 -132
- package/skills_ref/xlsx/scripts/office/validate.py +0 -111
- package/skills_ref/xlsx/scripts/office/validators/__init__.py +0 -15
- package/skills_ref/xlsx/scripts/office/validators/base.py +0 -847
- package/skills_ref/xlsx/scripts/office/validators/docx.py +0 -446
- package/skills_ref/xlsx/scripts/office/validators/pptx.py +0 -275
- package/skills_ref/xlsx/scripts/office/validators/redlining.py +0 -247
- package/skills_ref/xlsx/scripts/recalc.py +0 -184
- package/skills_ref/xurl/SKILL.md +0 -461
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../js/state.js", "../js/api.js", "../js/constants.js", "../js/features/employees.js", "../js/features/skills.js", "../js/locale.js", "../js/features/slash-commands.js", "../js/features/settings.js", "../js/features/i18n.js", "../js/render.js", "../js/features/appname.js", "../js/ui.js", "../js/ws.js", "../js/main.js", "../js/features/chat.js", "../js/features/heartbeat.js", "../js/features/memory.js", "../js/features/sidebar.js", "../js/features/theme.js"],
|
|
4
|
-
"sourcesContent": ["// \u2500\u2500 Shared State Module \u2500\u2500\n// All modules import this to access/modify shared state.\n// Object reference ensures mutations are seen across modules.\n\nexport const state = {\n ws: null,\n agentBusy: false,\n employees: [],\n allSkills: [],\n currentSkillFilter: 'all',\n currentAgentDiv: null,\n attachedFiles: [],\n heartbeatJobs: [],\n cliStatusCache: null,\n cliStatusTs: 0,\n};\n", "// \u2500\u2500 API Fetch Wrapper \u2500\u2500\n// All API calls centralized for error handling + ok/data unwrapping\n\n/**\n * @param {string} path - API path (e.g. '/api/settings')\n * @param {RequestInit} opts - fetch options\n * @returns {Promise<any|null>} - data on success, null on failure\n */\nexport async function api(path, opts = {}) {\n try {\n const res = await fetch(path, opts);\n if (!res.ok) {\n console.warn(`[api] ${opts.method || 'GET'} ${path} \u2192 ${res.status}`);\n return null;\n }\n const contentType = res.headers.get('content-type') || '';\n if (!contentType.includes('json')) return null;\n const json = await res.json();\n // Phase 9.2 dual-response compat: { ok, data } or bare response\n if (json && typeof json === 'object' && 'ok' in json && 'data' in json) {\n if (!json.ok) {\n console.warn(`[api] ${path} \u2192 ok:false`, json.error || '');\n return null;\n }\n return json.data;\n }\n return json;\n } catch (e) {\n console.warn(`[api] ${path} failed:`, e.message);\n return null;\n }\n}\n\n/**\n * POST/PUT/DELETE JSON request\n */\nexport async function apiJson(path, method, body) {\n return api(path, {\n method,\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n}\n\n/**\n * fire-and-forget: ignores result\n */\nexport function apiFire(path, method = 'POST', body) {\n const opts = { method };\n if (body) {\n opts.headers = { 'Content-Type': 'application/json' };\n opts.body = JSON.stringify(body);\n }\n fetch(path, opts).catch(() => { });\n}\n", "// \u2500\u2500 Shared constants (frontend) \u2500\u2500\nimport { api } from './api.js';\n\nconst FALLBACK_CLI_REGISTRY = {\n claude: {\n label: 'Claude',\n efforts: ['low', 'medium', 'high'],\n models: ['claude-sonnet-4-6', 'claude-opus-4-6', 'claude-sonnet-4-6[1m]', 'claude-opus-4-6[1m]', 'claude-haiku-4-5-20251001'],\n },\n codex: {\n label: 'Codex',\n efforts: ['low', 'medium', 'high', 'xhigh'],\n models: ['gpt-5.3-codex', 'gpt-5.3-codex-spark', 'gpt-5.2-codex', 'gpt-5.1-codex-max', 'gpt-5.1-codex-mini'],\n },\n gemini: {\n label: 'Gemini',\n efforts: [],\n models: ['gemini-3.0-pro-preview', 'gemini-3.1-pro-preview', 'gemini-2.5-pro', 'gemini-3-flash-preview', 'gemini-2.5-flash'],\n },\n opencode: {\n label: 'OpenCode',\n efforts: ['minimal', 'low', 'high', 'max'],\n models: [\n 'anthropic/claude-opus-4-6-thinking',\n 'anthropic/claude-sonnet-4-6-thinking',\n 'anthropic/claude-sonnet-4-6',\n 'openai/gpt-5.3-codex-xhigh',\n 'openai/gpt-5.3-codex-high',\n 'opencode/big-pickle',\n 'opencode/GLM-5 Free',\n 'opencode/MiniMax M2.5 Free',\n 'opencode/Kimi K2.5 Free',\n 'opencode/GPT 5 Nano Free',\n 'opencode/Grok Code Fast 1 Free',\n ],\n },\n copilot: {\n label: 'Copilot',\n efforts: ['low', 'medium', 'high'],\n effortNote: '\u2192 ~/.copilot/config.json',\n models: [\n 'claude-sonnet-4.6',\n 'claude-opus-4.6',\n 'claude-opus-4.6-fast',\n 'claude-haiku-4.5',\n 'gpt-5.3-codex',\n 'gpt-5.2-codex',\n 'gpt-5.1-codex',\n 'gpt-4.1',\n 'gpt-5-mini',\n 'gemini-3-pro-preview',\n ],\n },\n};\n\nfunction toModelMap(registry) {\n const out = {};\n for (const [key, value] of Object.entries(registry || {})) {\n out[key] = Array.isArray(value?.models) ? [...value.models] : [];\n }\n return out;\n}\n\nfunction normalizeRegistry(input) {\n const out = {};\n for (const [key, value] of Object.entries(input || {})) {\n if (!value || typeof value !== 'object') continue;\n const normalized = {\n label: value.label || key,\n efforts: Array.isArray(value.efforts) ? [...value.efforts] : [],\n models: Array.isArray(value.models) ? [...value.models] : [],\n };\n if (typeof value.effortNote === 'string' && value.effortNote.trim()) {\n normalized.effortNote = value.effortNote;\n }\n out[key] = normalized;\n }\n return out;\n}\n\nexport let CLI_REGISTRY = normalizeRegistry(FALLBACK_CLI_REGISTRY);\nexport let CLI_KEYS = Object.keys(CLI_REGISTRY);\nexport let MODEL_MAP = toModelMap(CLI_REGISTRY);\n\nfunction applyRegistry(registry) {\n const normalized = normalizeRegistry(registry);\n if (!Object.keys(normalized).length) return false;\n CLI_REGISTRY = normalized;\n CLI_KEYS = Object.keys(normalized);\n MODEL_MAP = toModelMap(normalized);\n return true;\n}\n\nexport async function loadCliRegistry() {\n try {\n const data = await api('/api/cli-registry');\n if (!data || !applyRegistry(data)) throw new Error('invalid registry');\n } catch (e) {\n console.warn('[cli-registry] fallback:', e.message);\n applyRegistry(FALLBACK_CLI_REGISTRY);\n }\n return CLI_REGISTRY;\n}\n\nexport function getCliKeys() {\n return CLI_KEYS;\n}\n\nexport function getCliMeta(cli) {\n return CLI_REGISTRY[cli] || null;\n}\n\nexport const ROLE_PRESETS = [\n { value: 'frontend', labelKey: 'role.label.frontend', label: 'Frontend', prompt: 'UI/UX, CSS, components', skill: 'dev-frontend' },\n { value: 'backend', labelKey: 'role.label.backend', label: 'Backend', prompt: 'API, DB, server logic', skill: 'dev-backend' },\n { value: 'data', labelKey: 'role.label.data', label: 'Data', prompt: 'Data pipeline, analysis, ML', skill: 'dev-data' },\n { value: 'docs', labelKey: 'role.label.docs', label: 'Docs', prompt: 'Documentation, README, API docs', skill: 'documentation' },\n { value: 'custom', labelKey: 'role.label.custom', label: 'Custom...', prompt: '', skill: null },\n];\n", "// \u2500\u2500 Employees Feature \u2500\u2500\nimport { state } from '../state.js';\nimport { MODEL_MAP, ROLE_PRESETS, getCliKeys } from '../constants.js';\nimport { escapeHtml } from '../render.js';\nimport { getAgentPhase } from '../ws.js';\nimport { t } from './i18n.js';\nimport { api, apiJson, apiFire } from '../api.js';\n\nexport async function loadEmployees() {\n const data = await api('/api/employees');\n state.employees = data || [];\n renderEmployees();\n}\n\nexport function renderEmployees() {\n const el = document.getElementById('employeesList');\n if (state.employees.length === 0) {\n el.innerHTML = `<div style=\"color:var(--text-dim);font-size:11px;padding:4px 0\">${t('emp.addPrompt')}</div>`;\n return;\n }\n const cliKeys = getCliKeys();\n el.innerHTML = state.employees.map(a => {\n const models = MODEL_MAP[a.cli] || [];\n // Legacy role prompt \u2192 new preset migration\n const LEGACY_MAP = {\n // Legacy Korean roles (backward compat with old DB data)\n 'React/Vue \uAE30\uBC18 UI \uCEF4\uD3EC\uB10C\uD2B8 \uAC1C\uBC1C, \uC2A4\uD0C0\uC77C\uB9C1': 'frontend',\n 'API \uC11C\uBC84, DB \uC2A4\uD0A4\uB9C8, \uBE44\uC988\uB2C8\uC2A4 \uB85C\uC9C1 \uAD6C\uD604': 'backend',\n '\uD504\uB860\uD2B8\uC5D4\uB4DC\uC640 \uBC31\uC5D4\uB4DC \uBAA8\uB450 \uB2F4\uB2F9': 'frontend',\n 'CI/CD, Docker, \uC778\uD504\uB77C \uC790\uB3D9\uD654': 'backend',\n '\uD14C\uC2A4\uD2B8 \uC791\uC131, \uBC84\uADF8 \uC7AC\uD604, \uD488\uC9C8 \uAD00\uB9AC': 'custom',\n '\uB370\uC774\uD130 \uD30C\uC774\uD504\uB77C\uC778, ETL, \uBD84\uC11D \uCFFC\uB9AC': 'data',\n 'API \uBB38\uC11C\uD654, README, \uAC00\uC774\uB4DC \uC791\uC131': 'docs',\n // Previous default Korean preset prompts\n 'UI/UX \uAD6C\uD604, CSS, \uCEF4\uD3EC\uB10C\uD2B8 \uAC1C\uBC1C': 'frontend',\n 'API, DB, \uC11C\uBC84 \uB85C\uC9C1 \uAD6C\uD604': 'backend',\n '\uB370\uC774\uD130 \uD30C\uC774\uD504\uB77C\uC778, \uBD84\uC11D, ML': 'data',\n '\uBB38\uC11C\uD654, README, API docs': 'docs',\n // Phase 6.9: new English preset prompts\n 'UI/UX, CSS, components': 'frontend',\n 'API, DB, server logic': 'backend',\n 'Data pipeline, analysis, ML': 'data',\n 'Documentation, README, API docs': 'docs',\n };\n const legacyVal = LEGACY_MAP[a.role];\n const matched = legacyVal ? ROLE_PRESETS.find(r => r.value === legacyVal) : ROLE_PRESETS.find(r => r.prompt === a.role);\n const presetVal = matched ? matched.value : (a.role ? 'custom' : 'frontend');\n const isCustom = presetVal === 'custom';\n\n return `\n <div class=\"settings-group\" style=\"margin-bottom:8px;padding:8px 10px\">\n <div style=\"display:flex;align-items:center;gap:6px;margin-bottom:6px\">\n <span style=\"width:8px;height:8px;border-radius:50%;background:var(--accent);display:inline-block;flex-shrink:0\"></span>\n <input style=\"flex:1;background:none;border:none;color:var(--text);font-size:12px;font-weight:600;font-family:inherit;outline:none\"\n value=\"${escapeHtml(a.name || 'Agent')}\"\n data-emp-name=\"${a.id}\">\n <button style=\"background:none;border:none;color:var(--text-dim);cursor:pointer;font-size:12px\" data-emp-delete=\"${a.id}\" title=\"${t('emp.delete')}\">\u2715</button>\n </div>\n <div style=\"display:grid;grid-template-columns:1fr 1fr;gap:4px;margin-bottom:4px\">\n <div>\n <label>CLI</label>\n <select data-emp-cli=\"${a.id}\">\n ${cliKeys.map(c => `<option${a.cli === c ? ' selected' : ''}>${c}</option>`).join('')}\n </select>\n </div>\n <div>\n <label>Model</label>\n <select data-emp-model=\"${a.id}\">\n <option value=\"default\"${(!a.model || a.model === 'default') ? ' selected' : ''}>default</option>\n ${models.map(m => `<option${a.model === m ? ' selected' : ''}>${m}</option>`).join('')}\n </select>\n </div>\n </div>\n <div>\n <label>Role</label>\n <select data-emp-role=\"${a.id}\">\n ${ROLE_PRESETS.map(r => `<option value=\"${r.value}\"${presetVal === r.value ? ' selected' : ''}>${r.label}</option>`).join('')}\n </select>\n <textarea data-emp-custom=\"${a.id}\" style=\"display:${isCustom ? 'block' : 'none'};margin-top:4px;width:100%;height:40px;background:var(--bg);border:1px solid var(--border);color:var(--text);padding:4px 6px;border-radius:4px;font-size:10px;font-family:inherit;resize:vertical\"\n placeholder=\"${t('emp.customRole')}\">${isCustom ? escapeHtml(a.role) : ''}</textarea>\n </div>\n <div style=\"margin-top:4px;font-size:10px;display:flex;align-items:center;gap:6px\">\n <span style=\"color:${a.status === 'running' ? '#fbbf24' : 'var(--green)'}\">\u25CF ${a.status || 'idle'}</span>\n ${(() => { const ps = getAgentPhase(a.id); const p = ps?.phase || a.phase; const pl = ps?.phaseLabel || a.phaseLabel; return p ? `<span style=\"background:${({ 1: '#60a5fa', 2: '#a78bfa', 3: '#34d399', 4: '#fbbf24', 5: '#f472b6' })[p] || '#888'};color:#000;padding:1px 6px;border-radius:9px;font-size:9px\">${pl || 'P' + p}</span>` : ''; })()}\n </div>\n </div>`;\n }).join('');\n}\n\nexport async function addEmployee() {\n await apiJson('/api/employees', 'POST', {});\n}\n\nexport async function updateEmployee(id, data) {\n await apiJson(`/api/employees/${id}`, 'PUT', data);\n}\n\nexport async function deleteEmployee(id) {\n apiFire(`/api/employees/${id}`, 'DELETE');\n}\n\nexport function onEmpCliChange(id, cli) {\n const models = MODEL_MAP[cli] || [];\n const sel = document.querySelector(`[data-emp-model=\"${id}\"]`);\n sel.innerHTML = `<option value=\"default\" selected>default</option>` + models.map(m => `<option>${escapeHtml(m)}</option>`).join('') + `<option value=\"__custom__\">${t('emp.customModel')}</option>`;\n updateEmployee(id, { cli, model: 'default' });\n}\n\nexport function onEmpRoleChange(id, presetVal) {\n const preset = ROLE_PRESETS.find(r => r.value === presetVal);\n const customEl = document.querySelector(`[data-emp-custom=\"${id}\"]`);\n if (presetVal === 'custom') {\n customEl.style.display = 'block';\n customEl.focus();\n } else {\n customEl.style.display = 'none';\n customEl.value = '';\n updateEmployee(id, { role: preset?.prompt || '' });\n }\n}\n", "// \u2500\u2500 Skills Feature \u2500\u2500\nimport { state } from '../state.js';\nimport { t, fetchWithLocale } from './i18n.js';\nimport { apiJson } from '../api.js';\nimport { escapeHtml } from '../render.js';\n\nexport async function loadSkills() {\n try {\n const res = await fetchWithLocale('/api/skills');\n state.allSkills = await res.json();\n renderSkills();\n } catch (e) {\n document.getElementById('skillsList').innerHTML =\n `<div style=\"color:var(--text-dim);font-size:11px\">${t('skill.loadFail')}</div>`;\n }\n}\n\nconst KNOWN_CATS = ['productivity', 'communication', 'devtools', 'ai-media', 'utility', 'smarthome', 'automation'];\n\nexport function renderSkills() {\n const list = document.getElementById('skillsList');\n const count = document.getElementById('skillsCount');\n let filtered = state.allSkills;\n if (state.currentSkillFilter === 'installed') {\n filtered = state.allSkills.filter(s => s.enabled);\n } else if (state.currentSkillFilter === 'other') {\n filtered = state.allSkills.filter(s => !KNOWN_CATS.includes(s.category));\n } else if (state.currentSkillFilter !== 'all') {\n filtered = state.allSkills.filter(s => s.category === state.currentSkillFilter);\n }\n const enabledCount = state.allSkills.filter(s => s.enabled).length;\n count.textContent = t('skill.count', { active: enabledCount, total: state.allSkills.length });\n\n list.innerHTML = filtered.map(s => {\n const reqParts = [];\n if (s.requires?.env) reqParts.push('\uD83D\uDD11 ' + s.requires.env.join(', '));\n if (s.requires?.bins) reqParts.push('\u2699\uFE0F ' + s.requires.bins.join(', '));\n if (s.install) reqParts.push(s.install);\n return `\n <div class=\"skill-card ${s.enabled ? 'enabled' : ''}\">\n <div class=\"skill-card-header\">\n <span class=\"skill-emoji\">${escapeHtml(s.emoji || '\uD83D\uDD27')}</span>\n <span class=\"skill-name\">${escapeHtml(s.name || s.id)}</span>\n <button class=\"skill-toggle ${s.enabled ? 'on' : 'off'}\"\n data-skill-id=\"${escapeHtml(s.id)}\" data-skill-enabled=\"${s.enabled}\"></button>\n </div>\n <div class=\"skill-desc\">${escapeHtml(s.description || '')}</div>\n ${reqParts.length ? `<div class=\"skill-req\">${reqParts.join(' \u00B7 ')}</div>` : ''}\n </div>`;\n }).join('');\n}\n\nexport async function toggleSkill(id, currentlyEnabled) {\n const endpoint = currentlyEnabled ? '/api/skills/disable' : '/api/skills/enable';\n try {\n await apiJson(endpoint, 'POST', { id });\n await loadSkills();\n } catch (e) {\n console.error('toggleSkill error:', e);\n }\n}\n\nexport function filterSkills(cat, btn) {\n state.currentSkillFilter = cat;\n document.querySelectorAll('.skill-filter').forEach(b => b.classList.remove('active'));\n if (btn) btn.classList.add('active');\n renderSkills();\n}\n", "// \u2500\u2500 Web Locale Helpers \u2500\u2500\n\nconst LOCALE_KEYS = ['claw_locale', 'claw.locale'];\n\nexport function getPreferredLocale() {\n try {\n for (const key of LOCALE_KEYS) {\n const saved = localStorage.getItem(key);\n if (saved) return saved;\n }\n } catch { }\n return navigator.language || 'ko';\n}\n\nexport function syncStoredLocale(locale) {\n const value = String(locale || '').trim();\n if (!value) return;\n try {\n for (const key of LOCALE_KEYS) {\n localStorage.setItem(key, value);\n }\n } catch { }\n}\n", "// \u2500\u2500 Slash Command Dropdown \u2500\u2500\nimport { getPreferredLocale } from '../locale.js';\nimport { t } from './i18n.js';\nimport { api } from '../api.js';\n\nlet cmdList = []; // { name, desc, args, category }[]\nlet filtered = []; // currently filtered list\nlet selectedIdx = -1; // -1 = none\nlet isOpen = false;\nlet closeTimer = null;\n\n// File paths like /Users/junny/... or /tmp/foo \u2014 not commands\nfunction looksLikeFilePath(text) {\n const after = String(text || '').slice(1).trim();\n const tok = after.split(/\\s+/)[0] || '';\n return tok.includes('/') || tok.includes('\\\\');\n}\n\nconst dropdown = () => document.getElementById('cmdDropdown');\nconst input = () => document.getElementById('chatInput');\n\nfunction escapeHtml(str) {\n return String(str || '')\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"');\n}\n\nfunction filterCommands(partial) {\n const prefix = String(partial || '').toLowerCase();\n return cmdList.filter(c => (`/${c.name}`).startsWith(prefix));\n}\n\nfunction showDropdown() {\n const el = dropdown();\n const inp = input();\n if (!el || !inp) return;\n\n if (closeTimer) {\n clearTimeout(closeTimer);\n closeTimer = null;\n }\n\n el.style.display = 'block';\n requestAnimationFrame(() => el.classList.add('visible'));\n isOpen = true;\n\n inp.setAttribute('aria-expanded', 'true');\n}\n\nfunction render() {\n const el = dropdown();\n const inp = input();\n if (!el || !inp) return;\n\n if (!filtered.length) {\n if (!inp.value.startsWith('/') || looksLikeFilePath(inp.value)) { close(); return; }\n\n el.innerHTML = `\n <div class=\"cmd-item cmd-empty\" role=\"option\" aria-disabled=\"true\">\n ${t('cmd.noMatch')}\n </div>\n `;\n showDropdown();\n inp.setAttribute('aria-activedescendant', '');\n return;\n }\n\n el.innerHTML = filtered.map((cmd, i) => {\n const selected = i === selectedIdx;\n return `<div class=\"cmd-item${selected ? ' selected' : ''}\"\n role=\"option\"\n id=\"cmd-item-${i}\"\n aria-selected=\"${selected}\"\n data-index=\"${i}\">\n <span class=\"cmd-name\">/${escapeHtml(cmd.name)}</span>\n <span class=\"cmd-desc\">${escapeHtml(cmd.desc)}</span>\n ${cmd.args ? `<span class=\"cmd-args\">${escapeHtml(cmd.args)}</span>` : ''}\n </div>`;\n }).join('');\n\n showDropdown();\n inp.setAttribute('aria-activedescendant', selectedIdx >= 0 ? `cmd-item-${selectedIdx}` : '');\n\n const selected = el.querySelector('.selected');\n if (selected) selected.scrollIntoView({ block: 'nearest' });\n}\n\nfunction applySelection(execute) {\n const cmd = filtered[selectedIdx];\n const inp = input();\n if (!cmd || !inp) { close(); return; }\n\n close();\n if (cmd.args || !execute) {\n inp.value = `/${cmd.name} `;\n inp.focus();\n inp.selectionStart = inp.selectionEnd = inp.value.length;\n return;\n }\n\n inp.value = `/${cmd.name}`;\n inp.dispatchEvent(new Event('cmd-execute', { bubbles: true }));\n}\n\nexport async function loadCommands() {\n try {\n const locale = getPreferredLocale();\n const url = `/api/commands?interface=web&locale=${encodeURIComponent(locale)}`;\n const data = await api(url, { headers: { 'Accept-Language': locale } });\n cmdList = data || [];\n } catch (err) {\n console.warn('[slash-commands] loadCommands failed:', err.message);\n cmdList = [];\n }\n}\n\nexport function close() {\n const el = dropdown();\n\n if (closeTimer) {\n clearTimeout(closeTimer);\n closeTimer = null;\n }\n if (el) {\n el.classList.remove('visible');\n closeTimer = setTimeout(() => {\n if (el.classList.contains('visible')) return;\n el.style.display = 'none';\n el.innerHTML = '';\n }, 150);\n }\n\n isOpen = false;\n selectedIdx = -1;\n filtered = [];\n\n const inp = input();\n if (inp) {\n inp.setAttribute('aria-expanded', 'false');\n inp.setAttribute('aria-activedescendant', '');\n }\n}\n\nexport function update(text) {\n const raw = String(text || '');\n if (!raw.startsWith('/') || raw.includes(' ') || raw.includes('\\n') || looksLikeFilePath(raw)) {\n close();\n return;\n }\n\n filtered = filterCommands(raw);\n selectedIdx = filtered.length ? 0 : -1;\n render();\n}\n\nexport function handleKeydown(e) {\n if (!isOpen) {\n if ((e.key === 'ArrowDown' || e.key === 'ArrowUp') && !e.isComposing) {\n update(input()?.value || '');\n if (!isOpen) return false;\n selectedIdx = e.key === 'ArrowUp' ? filtered.length - 1 : 0;\n render();\n e.preventDefault();\n return true;\n }\n return false;\n }\n\n if (!filtered.length) {\n if (e.key === 'Escape') {\n e.preventDefault();\n close();\n return true;\n }\n return false;\n }\n\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n selectedIdx = Math.min(filtered.length - 1, selectedIdx + 1);\n render();\n return true;\n }\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n selectedIdx = Math.max(0, selectedIdx - 1);\n render();\n return true;\n }\n if (e.key === 'Tab') {\n e.preventDefault();\n applySelection(false);\n return true;\n }\n if (e.key === 'Enter' && !e.shiftKey && !e.isComposing) {\n e.preventDefault();\n applySelection(true);\n return true;\n }\n if (e.key === 'Escape') {\n e.preventDefault();\n close();\n return true;\n }\n return false;\n}\n\nexport function handleClick(e) {\n const item = e.target.closest('.cmd-item');\n if (!item) return;\n const idx = parseInt(item.dataset.index || '-1', 10);\n if (Number.isNaN(idx) || idx < 0) return;\n selectedIdx = Math.min(idx, filtered.length - 1);\n applySelection(true);\n}\n\nexport function handleOutsideClick(e) {\n if (!isOpen) return;\n const el = dropdown();\n const inp = input();\n if (!el || !inp) return;\n if (!el.contains(e.target) && e.target !== inp) {\n close();\n }\n}\n\nexport function isDropdownOpen() {\n return isOpen;\n}\n", "// \u2500\u2500 Settings Feature \u2500\u2500\nimport { MODEL_MAP, loadCliRegistry, getCliKeys, getCliMeta } from '../constants.js';\nimport { escapeHtml } from '../render.js';\nimport { syncStoredLocale } from '../locale.js';\nimport { t } from './i18n.js';\nimport { api, apiJson, apiFire } from '../api.js';\n\nfunction toCap(cli) {\n return cli.charAt(0).toUpperCase() + cli.slice(1);\n}\n\nfunction getModelSelect(cli) {\n return document.getElementById('model' + toCap(cli));\n}\n\nfunction getCustomModelInput(cli) {\n return document.getElementById('customModel' + toCap(cli));\n}\n\nfunction getEffortSelect(cli) {\n return document.getElementById('effort' + toCap(cli));\n}\n\nfunction setSelectOptions(selectEl, values, { includeCustom = false, includeDefault = false, selected = '' } = {}) {\n if (!selectEl) return;\n const defaultHtml = includeDefault ? '<option value=\"default\">default</option>' : '';\n const customHtml = includeCustom ? `<option value=\"__custom__\">${t('model.customOption')}</option>` : '';\n const opts = (values || []).map(v => `<option value=\"${escapeHtml(v)}\">${escapeHtml(v)}</option>`).join('');\n selectEl.innerHTML = defaultHtml + opts + customHtml;\n\n if (selected && Array.from(selectEl.options).some(o => o.value === selected)) {\n selectEl.value = selected;\n }\n}\n\nfunction appendCustomOption(selectEl, value) {\n if (!selectEl || !value) return;\n if (Array.from(selectEl.options).some(o => o.value === value)) return;\n const opt = document.createElement('option');\n opt.value = value;\n opt.textContent = value;\n const customOpt = selectEl.querySelector('option[value=\"__custom__\"]');\n if (customOpt) selectEl.insertBefore(opt, customOpt);\n else selectEl.appendChild(opt);\n}\n\nfunction syncCliOptionSelects(settings = null) {\n const cliKeys = getCliKeys();\n\n const selCli = document.getElementById('selCli');\n if (selCli) {\n const current = settings?.cli || selCli.value || cliKeys[0] || 'claude';\n selCli.innerHTML = cliKeys.map(cli => {\n const label = getCliMeta(cli)?.label || cli;\n return `<option value=\"${escapeHtml(cli)}\">${escapeHtml(label)}</option>`;\n }).join('');\n if (Array.from(selCli.options).some(o => o.value === current)) selCli.value = current;\n }\n\n const memCli = document.getElementById('memCli');\n if (memCli) {\n const current = settings?.memory?.cli || memCli.value || '';\n memCli.innerHTML = '<option value=\"\">(active CLI)</option>' +\n cliKeys.map(cli => `<option value=\"${escapeHtml(cli)}\">${escapeHtml(cli)}</option>`).join('');\n if (Array.from(memCli.options).some(o => o.value === current)) memCli.value = current;\n }\n}\n\nfunction syncPerCliModelAndEffortControls(settings = null) {\n for (const cli of getCliKeys()) {\n const modelSel = getModelSelect(cli);\n if (modelSel) {\n const selected = settings?.perCli?.[cli]?.model || modelSel.value || '';\n setSelectOptions(modelSel, MODEL_MAP[cli] || [], { includeCustom: true, selected });\n if (selected && !Array.from(modelSel.options).some(o => o.value === selected)) {\n appendCustomOption(modelSel, selected);\n modelSel.value = selected;\n }\n }\n\n const effortSel = getEffortSelect(cli);\n if (effortSel) {\n const meta = getCliMeta(cli);\n const options = [''].concat(meta?.efforts || []);\n const selected = settings?.perCli?.[cli]?.effort || effortSel.value || '';\n const unique = [...new Set(options)];\n const noneLabel = (meta?.efforts?.length === 0 && meta?.effortNote) ? meta.effortNote : '\u2014 none';\n effortSel.innerHTML = unique.map(v => {\n if (!v) return `<option value=\"\">${escapeHtml(noneLabel)}</option>`;\n return `<option value=\"${escapeHtml(v)}\">${escapeHtml(v)}</option>`;\n }).join('');\n if (meta?.effortNote) effortSel.title = meta.effortNote;\n effortSel.disabled = (meta?.efforts?.length === 0 && !!meta?.effortNote);\n if (Array.from(effortSel.options).some(o => o.value === selected)) effortSel.value = selected;\n }\n }\n}\n\nfunction syncActiveEffortOptions(cli, selected = '') {\n const selEffort = document.getElementById('selEffort');\n if (!selEffort) return;\n const meta = getCliMeta(cli);\n if (meta?.effortNote) {\n // Effort managed externally (e.g. Copilot config.json) \u2014 show hint, disable\n selEffort.innerHTML = `<option value=\"\">${escapeHtml(meta.effortNote)}</option>`;\n selEffort.title = meta.effortNote;\n selEffort.disabled = true;\n return;\n }\n const efforts = [''].concat(meta?.efforts || []);\n const unique = [...new Set(efforts)];\n selEffort.innerHTML = unique.map(v => {\n if (!v) return '<option value=\"\">\u2014 none</option>';\n return `<option value=\"${escapeHtml(v)}\">${escapeHtml(v)}</option>`;\n }).join('');\n selEffort.disabled = false;\n selEffort.title = '';\n if (Array.from(selEffort.options).some(o => o.value === selected)) selEffort.value = selected;\n}\n\nexport async function loadSettings() {\n await loadCliRegistry();\n const s = await api('/api/settings');\n if (!s) return;\n syncStoredLocale(s.locale);\n syncCliOptionSelects(s);\n syncPerCliModelAndEffortControls(s);\n\n const selCli = document.getElementById('selCli');\n if (Array.from(selCli.options).some(o => o.value === s.cli)) {\n selCli.value = s.cli;\n }\n document.getElementById('inpCwd').value = s.workingDir;\n document.getElementById('headerCli').textContent = s.cli;\n setPerm(s.permissions, false);\n\n if (s.perCli) {\n for (const [cli, cfg] of Object.entries(s.perCli)) {\n const modelEl = getModelSelect(cli);\n const effortEl = getEffortSelect(cli);\n if (modelEl && cfg.model) {\n appendCustomOption(modelEl, cfg.model);\n modelEl.value = cfg.model;\n }\n if (effortEl) effortEl.value = cfg.effort || '';\n }\n }\n\n onCliChange(false);\n const ao = s.activeOverrides?.[s.cli] || {};\n const pc = s.perCli?.[s.cli] || {};\n const activeModel = ao.model || pc.model;\n const activeEffort = ao.effort || pc.effort || '';\n if (activeModel) document.getElementById('selModel').value = activeModel;\n syncActiveEffortOptions(s.cli, activeEffort);\n\n loadTelegramSettings(s);\n loadFallbackOrder(s);\n loadMcpServers();\n}\n\nexport async function loadMcpServers() {\n try {\n const d = await api('/api/mcp');\n if (!d) return;\n const el = document.getElementById('mcpServerList');\n const names = Object.entries(d.servers || {});\n if (!names.length) { el.textContent = t('mcp.noServers'); return; }\n el.innerHTML = names.map(([n, s]) =>\n `<div style=\"padding:2px 0\">\u2022 <b>${n}</b> <span style=\"opacity:.6\">${s.command} ${(s.args || []).slice(0, 2).join(' ')}</span></div>`\n ).join('');\n } catch { }\n}\n\nexport async function syncMcpServers() {\n const resultEl = document.getElementById('mcpSyncResult');\n resultEl.style.display = 'block';\n resultEl.textContent = t('mcp.syncing');\n try {\n const d = await apiJson('/api/mcp/sync', 'POST', {});\n if (!d) { resultEl.textContent = '\u274C sync failed'; return; }\n const r = d.results || {};\n resultEl.innerHTML = Object.entries(r).map(([k, v]) =>\n `${v ? '\u2705' : '\u23ED\uFE0F'} ${k}`\n ).join(' ');\n } catch (e) { resultEl.textContent = '\u274C ' + e.message; }\n}\n\nexport async function installMcpGlobal() {\n const resultEl = document.getElementById('mcpSyncResult');\n resultEl.style.display = 'block';\n resultEl.textContent = t('mcp.installing');\n try {\n const d = await apiJson('/api/mcp/install', 'POST', {});\n if (!d) { resultEl.textContent = '\u274C install failed'; return; }\n resultEl.innerHTML = Object.entries(d.results || {}).map(([k, v]) => {\n const icon = v.status === 'installed' ? '\u2705' : v.status === 'skip' ? '\u23ED\uFE0F' : '\u274C';\n return `${icon} <b>${k}</b>: ${v.status}${v.bin ? ' \u2192 ' + v.bin : ''}`;\n }).join('<br>');\n loadMcpServers();\n } catch (e) { resultEl.textContent = '\u274C ' + e.message; }\n}\n\nexport async function updateSettings() {\n const s = {\n cli: document.getElementById('selCli').value,\n workingDir: document.getElementById('inpCwd').value,\n };\n document.getElementById('headerCli').textContent = s.cli;\n await apiJson('/api/settings', 'PUT', s);\n}\n\nexport function setPerm(p, save = true) {\n // Auto-fixed since Phase 3.1 \u2014 no UI toggle, just persist\n if (save) apiFire('/api/settings', 'PUT', { permissions: 'auto' });\n}\n\nexport function getModelValue(cli) {\n const sel = getModelSelect(cli);\n if (!sel) return 'default';\n if (sel.value === '__custom__') {\n const inp = getCustomModelInput(cli);\n return inp?.value?.trim() || sel.options[0]?.value || 'default';\n }\n return sel.value;\n}\n\nexport function handleModelSelect(cli, selectEl) {\n const customInput = getCustomModelInput(cli);\n if (!customInput) return;\n if (selectEl.value === '__custom__') {\n customInput.style.display = 'block';\n customInput.focus();\n } else {\n customInput.style.display = 'none';\n savePerCli();\n }\n}\n\nexport function applyCustomModel(cli, inputEl) {\n const val = inputEl.value.trim();\n if (!val) return;\n const select = getModelSelect(cli);\n if (!select) return;\n appendCustomOption(select, val);\n select.value = val;\n inputEl.style.display = 'none';\n savePerCli();\n}\n\nexport async function savePerCli() {\n const perCli = {};\n for (const cli of getCliKeys()) {\n const modelEl = getModelSelect(cli);\n if (!modelEl) continue;\n const effortEl = getEffortSelect(cli);\n perCli[cli] = {\n model: getModelValue(cli),\n effort: effortEl ? effortEl.value : '',\n };\n }\n await apiJson('/api/settings', 'PUT', { perCli });\n}\n\nexport function onCliChange(save = true) {\n const cli = document.getElementById('selCli').value;\n const models = MODEL_MAP[cli] || [];\n const modelSel = document.getElementById('selModel');\n setSelectOptions(modelSel, models, { includeCustom: true, includeDefault: true });\n document.getElementById('headerCli').textContent = cli;\n syncActiveEffortOptions(cli);\n\n const oldInput = document.getElementById('selModelCustom');\n if (oldInput) oldInput.remove();\n const inp = document.createElement('input');\n inp.type = 'text'; inp.id = 'selModelCustom';\n inp.className = 'custom-model-input';\n inp.placeholder = t('model.placeholder');\n inp.style.display = 'none';\n inp.onchange = function () {\n const val = this.value.trim();\n if (!val) return;\n appendCustomOption(modelSel, val);\n modelSel.value = val;\n this.style.display = 'none';\n saveActiveCliSettings();\n };\n modelSel.parentElement.appendChild(inp);\n modelSel.onchange = function () {\n if (this.value === '__custom__') {\n inp.style.display = 'block';\n inp.focus();\n } else {\n inp.style.display = 'none';\n saveActiveCliSettings();\n }\n };\n\n api('/api/settings').then(s => {\n if (!s) return;\n const ao = s.activeOverrides?.[cli] || {};\n const pc = s.perCli?.[cli] || {};\n const model = ao.model || pc.model;\n const effort = ao.effort || pc.effort || '';\n if (model) {\n appendCustomOption(modelSel, model);\n modelSel.value = model;\n }\n syncActiveEffortOptions(cli, effort);\n });\n\n if (save) updateSettings();\n}\n\nexport async function saveActiveCliSettings() {\n const cli = document.getElementById('selCli').value;\n const modelSel = document.getElementById('selModel');\n let model = modelSel?.value || 'default';\n if (model === '__custom__') {\n model = document.getElementById('selModelCustom')?.value?.trim() || 'default';\n }\n const effortEl = document.getElementById('selEffort');\n const overrides = {};\n overrides[cli] = { model };\n if (!effortEl?.disabled) overrides[cli].effort = effortEl?.value || '';\n await apiJson('/api/settings', 'PUT', { activeOverrides: overrides });\n}\n\n// \u2500\u2500 Telegram \u2500\u2500\nexport async function saveTelegramSettings() {\n const token = document.getElementById('tgToken').value.trim();\n const chatIdsRaw = document.getElementById('tgChatIds').value.trim();\n const allowedChatIds = chatIdsRaw\n ? chatIdsRaw.split(',').map(s => parseInt(s.trim(), 10)).filter(n => !isNaN(n))\n : [];\n await apiJson('/api/settings', 'PUT', { telegram: { token, allowedChatIds } });\n}\n\nexport async function setTelegram(enabled) {\n document.getElementById('tgOn').classList.toggle('active', enabled);\n document.getElementById('tgOff').classList.toggle('active', !enabled);\n await apiJson('/api/settings', 'PUT', { telegram: { enabled } });\n}\n\nfunction loadTelegramSettings(s) {\n if (!s.telegram) return;\n const tg = s.telegram;\n document.getElementById('tgOn').classList.toggle('active', !!tg.enabled);\n document.getElementById('tgOff').classList.toggle('active', !tg.enabled);\n if (tg.token) document.getElementById('tgToken').value = tg.token;\n if (tg.allowedChatIds?.length) {\n document.getElementById('tgChatIds').value = tg.allowedChatIds.join(', ');\n }\n}\n\n// \u2500\u2500 Fallback Order \u2500\u2500\nexport function loadFallbackOrder(s) {\n const container = document.getElementById('fallbackOrderList');\n if (!container) return;\n const allClis = Object.keys(s.perCli || {});\n const active = s.fallbackOrder || [];\n const slotCount = Math.min(allClis.length - 1, 3);\n\n let html = '';\n for (let i = 0; i < slotCount; i++) {\n const current = active[i] || '';\n const opts = allClis.map(cli =>\n `<option value=\"${cli}\" ${cli === current ? 'selected' : ''}>${cli}</option>`\n ).join('');\n html += `\n <div class=\"settings-row sub-row\">\n <label style=\"min-width:60px\">Fallback ${i + 1}</label>\n <select id=\"fallback${i}\"\n style=\"font-size:11px;padding:4px;background:var(--surface);color:var(--text);border:1px solid var(--border);border-radius:4px;flex:1\">\n <option value=\"\">${t('settings.none')}</option>\n ${opts}\n </select>\n </div>`;\n }\n container.innerHTML = html;\n}\n\nexport async function saveFallbackOrder() {\n const selects = document.querySelectorAll('#fallbackOrderList select');\n const fallbackOrder = [...selects].map(s => s.value).filter(Boolean);\n await apiJson('/api/settings', 'PUT', { fallbackOrder });\n}\n\n// \u2500\u2500 CLI Status \u2500\u2500\nimport { state } from '../state.js';\n\nexport async function loadCliStatus(force = false) {\n const interval = Number(localStorage.getItem('cliStatusInterval') || 300);\n if (!force && state.cliStatusCache && interval > 0 && (Date.now() - state.cliStatusTs) < interval * 1000) {\n renderCliStatus(state.cliStatusCache);\n return;\n }\n\n const el = document.getElementById('cliStatusList');\n if (el) el.innerHTML = '<div style=\"color:var(--text-dim);font-size:11px\">Loading...</div>';\n\n const [cliStatus, quota] = await Promise.all([\n api('/api/cli-status'),\n api('/api/quota'),\n ]);\n\n state.cliStatusCache = { cliStatus, quota };\n state.cliStatusTs = Date.now();\n renderCliStatus(state.cliStatusCache);\n}\n\nfunction renderCliStatus(data) {\n const { cliStatus, quota } = data;\n const el = document.getElementById('cliStatusList');\n\n const AUTH_HINTS = {\n claude: { install: 'npm i -g @anthropic-ai/claude-code', auth: 'claude auth' },\n codex: { install: 'npm i -g @openai/codex', auth: 'codex login' },\n gemini: { install: 'npm i -g @google/gemini-cli', auth: `gemini (${t('cli.gemini.auth')})` },\n opencode: { install: 'npm i -g opencode-ai', auth: 'opencode auth' },\n copilot: { install: 'gh copilot --help', auth: '1) gh auth login \u2192 2) gh copilot --help \u2192 3) copilot login' },\n };\n\n let html = '';\n\n if (!cliStatus || typeof cliStatus !== 'object') {\n if (el) el.innerHTML = '<div style=\"color:var(--text-dim);font-size:11px\">Failed to load CLI status</div>';\n return;\n }\n\n for (const [name, info] of Object.entries(cliStatus)) {\n const q = quota[name];\n const dotClass = info.available ? 'ok' : 'missing';\n\n let accountLine = '';\n if (q?.account) {\n const parts = [];\n if (q.account.email) parts.push(q.account.email);\n if (q.account.type) parts.push(q.account.type);\n if (q.account.plan) parts.push(q.account.plan);\n if (q.account.tier) parts.push(q.account.tier);\n if (parts.length) accountLine = `<div style=\"font-size:10px;color:var(--text-dim);margin:2px 0 4px 16px\">${escapeHtml(parts.join(' \u00B7 '))}</div>`;\n }\n\n // Auth hint when CLI is not available\n let authHint = '';\n if (!info.available) {\n const hint = AUTH_HINTS[name];\n if (hint) {\n authHint = `\n <div style=\"font-size:10px;margin:4px 0 2px 16px;padding:6px 8px;background:var(--bg-dim, #1e1e2e);border-radius:4px;border-left:2px solid #fbbf24\">\n <div style=\"color:#fbbf24;margin-bottom:3px\">${t('cli.authRequired')}</div>\n <div style=\"color:var(--text-dim)\"><code style=\"font-size:10px;background:var(--border);padding:1px 4px;border-radius:2px\">${escapeHtml(hint.install)}</code></div>\n <div style=\"color:var(--text-dim);margin-top:2px\"><code style=\"font-size:10px;background:var(--border);padding:1px 4px;border-radius:2px\">${escapeHtml(hint.auth)}</code></div>\n </div>\n `;\n }\n }\n\n let windowsHtml = '';\n if (q?.windows?.length) {\n windowsHtml = q.windows.map(w => {\n const pct = Math.round(w.percent);\n const barColor = pct > 80 ? '#ef4444' : pct > 50 ? '#fbbf24' : '#38bdf8';\n return `\n <div style=\"display:flex;align-items:center;gap:6px;margin-left:16px;font-size:10px;color:var(--text-dim)\">\n <span style=\"width:42px\">${w.label}</span>\n <div style=\"flex:1;height:4px;background:var(--border);border-radius:2px;overflow:hidden\">\n <div style=\"width:${pct}%;height:100%;background:${barColor};border-radius:2px\"></div>\n </div>\n <span style=\"width:28px;text-align:right\">${pct}%</span>\n </div>\n `;\n }).join('');\n }\n\n html += `\n <div class=\"settings-group\" style=\"margin-bottom:6px;padding:8px 10px\">\n <div class=\"cli-status-row\">\n <span class=\"cli-dot ${dotClass}\"></span>\n <span class=\"cli-name\" style=\"font-weight:600\">${name}</span>\n </div>\n ${accountLine}\n ${authHint}\n ${windowsHtml}\n </div>\n `;\n }\n\n el.innerHTML = html;\n}\n\n// \u2500\u2500 Prompt Modal \u2500\u2500\nexport function openPromptModal() {\n api('/api/prompt').then(data => {\n if (!data) return;\n document.getElementById('modalPromptEditor').value = data.content || '';\n document.getElementById('promptModal').classList.add('open');\n });\n}\n\nexport function closePromptModal(e) {\n if (e && e.target !== e.currentTarget) return;\n document.getElementById('promptModal').classList.remove('open');\n}\n\nexport async function savePromptFromModal() {\n const content = document.getElementById('modalPromptEditor').value;\n await apiJson('/api/prompt', 'PUT', { content });\n document.getElementById('promptModal').classList.remove('open');\n}\n", "// \u2500\u2500 Frontend i18n module \u2500\u2500\n// Phase 7: client-side translation with lazy-loaded locale JSON\n\nlet currentLocale = 'ko';\nlet dict = {}; // current locale dictionary\nlet fallbackDict = {}; // ko fallback\n\n/**\n * Initialize i18n: restore from localStorage, detect from browser, load locale\n */\nexport async function initI18n() {\n let saved = null;\n try { saved = localStorage.getItem('claw_locale'); } catch { /* Safari private */ }\n\n if (!saved) {\n // Detect from browser language\n const browserLang = (navigator.language || 'ko').split(/[-_]/)[0].toLowerCase();\n saved = ['en', 'ko'].includes(browserLang) ? browserLang : 'ko';\n }\n\n // Always load ko as fallback\n fallbackDict = await fetchLocale('ko');\n if (saved === 'ko') {\n dict = fallbackDict;\n } else {\n dict = await fetchLocale(saved);\n }\n currentLocale = saved;\n applyI18n();\n}\n\n/**\n * Fetch a locale JSON from the server\n */\nasync function fetchLocale(lang) {\n try {\n const { api } = await import('../api.js');\n return await api(`/api/i18n/${lang}`) || {};\n } catch { return {}; }\n}\n\n/**\n * Translate a key with optional parameter interpolation\n * Falls back: dict[key] \u2192 fallbackDict[key] \u2192 key itself\n */\nexport function t(key, params = {}) {\n let val = dict[key] ?? fallbackDict[key] ?? key;\n for (const [k, v] of Object.entries(params)) {\n val = val.replaceAll(`{${k}}`, String(v));\n }\n return val;\n}\n\n/**\n * Apply translations to all elements with data-i18n attributes\n */\nexport function applyI18n() {\n document.querySelectorAll('[data-i18n]').forEach(el => {\n const key = el.getAttribute('data-i18n');\n if (key) el.textContent = t(key);\n });\n document.querySelectorAll('[data-i18n-placeholder]').forEach(el => {\n const key = el.getAttribute('data-i18n-placeholder');\n if (key) el.placeholder = t(key);\n });\n document.querySelectorAll('[data-i18n-title]').forEach(el => {\n const key = el.getAttribute('data-i18n-title');\n if (key) el.title = t(key);\n });\n document.querySelectorAll('[data-i18n-aria]').forEach(el => {\n const key = el.getAttribute('data-i18n-aria');\n if (key) el.setAttribute('aria-label', t(key));\n });\n}\n\n/**\n * Switch language, reload locale, rebind all UI\n */\nexport async function setLang(lang) {\n if (lang === currentLocale) return;\n if (lang === 'ko') {\n dict = fallbackDict;\n } else {\n dict = await fetchLocale(lang);\n }\n currentLocale = lang;\n try { localStorage.setItem('claw_locale', lang); } catch { /* Safari private */ }\n applyI18n();\n\n // Reload dynamic content that uses t()\n try {\n const { loadEmployees } = await import('./employees.js');\n loadEmployees();\n } catch { }\n try {\n const { loadSkills } = await import('./skills.js');\n loadSkills();\n } catch { }\n try {\n const { loadCommands } = await import('./slash-commands.js');\n loadCommands();\n } catch { }\n try {\n const { loadSettings } = await import('./settings.js');\n loadSettings();\n } catch { }\n}\n\n/**\n * Get current locale code\n */\nexport function getLang() {\n return currentLocale;\n}\n\n/**\n * fetchWithLocale \u2014 wrapper that appends ?locale= to requests\n */\nexport function fetchWithLocale(url, init = {}) {\n const u = new URL(url, location.origin);\n if (!u.searchParams.has('locale')) {\n u.searchParams.set('locale', currentLocale);\n }\n return fetch(u.toString(), init);\n}\n", "// \u2500\u2500 Render Helpers \u2500\u2500\n// Modular markdown rendering: marked.js + highlight.js + KaTeX + Mermaid\n// All libs loaded via CDN (defer), graceful fallback if unavailable\nimport { t } from './features/i18n.js';\n\nexport function escapeHtml(str) {\n return str.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>')\n .replace(/\"/g, '"').replace(/'/g, ''');\n}\n\n// \u2500\u2500 XSS sanitization \u2500\u2500\nexport function sanitizeHtml(html) {\n if (typeof DOMPurify !== 'undefined') {\n return DOMPurify.sanitize(html, {\n USE_PROFILES: { html: true },\n FORBID_TAGS: ['script', 'style', 'iframe', 'object', 'embed', 'form'],\n FORBID_ATTR: ['onerror', 'onclick', 'onload', 'onmouseover', 'onfocus', 'onblur'],\n ADD_TAGS: ['use'], // Mermaid SVG compatibility\n });\n }\n // CDN fallback: regex-based stripping\n return html\n .replace(/<script[\\s\\S]*?>[\\s\\S]*?<\\/script>/gi, '')\n .replace(/\\bon\\w+\\s*=/gi, 'data-removed=')\n .replace(/javascript\\s*:/gi, 'about:blank');\n}\n\n// \u2500\u2500 Orchestration JSON stripping \u2500\u2500\nfunction stripOrchestration(text) {\n let cleaned = text.replace(/```json\\n[\\s\\S]*?\\n```/g, '');\n cleaned = cleaned.replace(/\\{[\\s\\S]*\"subtasks\"\\s*:\\s*\\[[\\s\\S]*?\\]\\s*\\}/g, '').trim();\n return cleaned;\n}\n\n// \u2500\u2500 KaTeX inline/block math \u2500\u2500\nfunction renderMath(html) {\n if (typeof katex === 'undefined') return html;\n // Block math: $$...$$\n html = html.replace(/\\$\\$([\\s\\S]+?)\\$\\$/g, (_, tex) => {\n try {\n return katex.renderToString(tex.trim(), { displayMode: true, throwOnError: false });\n } catch { return `<code>${escapeHtml(tex)}</code>`; }\n });\n // Inline math: $...$ (avoid matching currency like $10)\n html = html.replace(/(?<!\\$)\\$(?!\\$)([^\\n$]+?)\\$(?!\\$)/g, (_, tex) => {\n try {\n return katex.renderToString(tex.trim(), { displayMode: false, throwOnError: false });\n } catch { return `<code>${escapeHtml(tex)}</code>`; }\n });\n return html;\n}\n\n// \u2500\u2500 Mermaid deferred rendering \u2500\u2500\n// NOTE: No DOMPurify on mermaid SVG \u2014 mermaid.render() with securityLevel:'loose'\n// handles its own sanitization. DOMPurify strips foreignObject/style tags needed for text.\nlet mermaidId = 0;\n\nfunction renderMermaidBlocks() {\n if (typeof mermaid === 'undefined') return;\n document.querySelectorAll('.mermaid-pending').forEach(async (el) => {\n el.classList.remove('mermaid-pending');\n const code = el.textContent;\n const id = `mermaid-${++mermaidId}`;\n try {\n const { svg } = await mermaid.render(id, code);\n el.innerHTML = svg;\n el.classList.add('mermaid-rendered');\n // Store raw SVG for overlay (before zoom button is appended)\n const rawSvg = el.innerHTML;\n // Add zoom button\n const zoomBtn = document.createElement('button');\n zoomBtn.className = 'mermaid-zoom-btn';\n zoomBtn.textContent = '\u26F6';\n zoomBtn.title = 'Expand diagram';\n zoomBtn.addEventListener('click', () => openMermaidOverlay(rawSvg));\n el.appendChild(zoomBtn);\n } catch (err) {\n const errMsg = err?.message || err?.str || 'Unknown error';\n el.innerHTML = `\n <div style=\"border:1px solid #ef4444;border-radius:6px;padding:8px;margin:4px 0\">\n <div style=\"color:#ef4444;font-size:11px;margin-bottom:4px\">\u26A0\uFE0F Mermaid \uB80C\uB354\uB9C1 \uC2E4\uD328</div>\n <div style=\"color:#fbbf24;font-size:10px;margin-bottom:6px\">${escapeHtml(errMsg.slice(0, 200))}</div>\n <pre style=\"margin:0;font-size:11px;overflow-x:auto\"><code>${escapeHtml(code)}</code></pre>\n </div>`;\n }\n });\n}\n// \u2500\u2500 Mermaid popup overlay \u2500\u2500\nfunction openMermaidOverlay(svgHtml) {\n // Remove existing overlay if any\n document.getElementById('mermaidOverlay')?.remove();\n\n const overlay = document.createElement('div');\n overlay.id = 'mermaidOverlay';\n overlay.className = 'mermaid-overlay';\n overlay.innerHTML = `\n <div class=\"mermaid-overlay-backdrop\"></div>\n <div class=\"mermaid-overlay-content\">\n <button class=\"mermaid-overlay-close\">\u2715</button>\n <div class=\"mermaid-overlay-svg\">${svgHtml}</div>\n </div>`;\n document.body.appendChild(overlay);\n\n // Make SVG fill the popup\n const svgEl = overlay.querySelector('svg');\n if (svgEl) {\n svgEl.removeAttribute('width');\n svgEl.removeAttribute('height');\n svgEl.style.width = '100%';\n svgEl.style.height = 'auto';\n svgEl.style.maxHeight = '85vh';\n }\n\n const close = () => overlay.remove();\n overlay.querySelector('.mermaid-overlay-backdrop').addEventListener('click', close);\n overlay.querySelector('.mermaid-overlay-close').addEventListener('click', (e) => {\n e.stopPropagation();\n e.preventDefault();\n close();\n });\n document.addEventListener('keydown', function handler(e) {\n if (e.key === 'Escape') { close(); document.removeEventListener('keydown', handler); }\n });\n}\n\n// \u2500\u2500 marked.js configuration \u2500\u2500\nlet markedReady = false;\n\nfunction ensureMarked() {\n if (markedReady) return true;\n if (typeof marked === 'undefined') return false;\n\n const renderer = new marked.Renderer();\n\n // Code blocks: highlight.js + mermaid detection\n renderer.code = function ({ text, lang }) {\n // Mermaid\n if (lang === 'mermaid') {\n return `<div class=\"mermaid-container mermaid-pending\">${escapeHtml(text)}</div>`;\n }\n // Highlight.js\n let highlighted = escapeHtml(text);\n if (typeof hljs !== 'undefined' && lang && hljs.getLanguage(lang)) {\n try {\n highlighted = hljs.highlight(text, { language: lang }).value;\n } catch { /* fallback to escaped */ }\n } else if (typeof hljs !== 'undefined') {\n try {\n highlighted = hljs.highlightAuto(text).value;\n } catch { /* fallback */ }\n }\n const labelText = lang ? escapeHtml(lang) : t('code.copy');\n const label = `<span class=\"code-lang-label\" data-lang=\"${lang ? escapeHtml(lang) : ''}\">${labelText}</span>`;\n return `<div class=\"code-block-wrapper\">${label}<pre><code class=\"hljs${lang ? ` language-${escapeHtml(lang)}` : ''}\">${highlighted}</code></pre></div>`;\n };\n\n marked.setOptions({\n renderer,\n gfm: true,\n breaks: true,\n });\n\n // Init mermaid\n if (typeof window.mermaid !== 'undefined') {\n window.mermaid.initialize({\n startOnLoad: false,\n theme: 'base',\n securityLevel: 'loose',\n themeVariables: {\n darkMode: true,\n background: '#0f172a',\n primaryColor: '#1e3a5f',\n primaryTextColor: '#e2e8f0',\n primaryBorderColor: '#38bdf8',\n lineColor: '#94a3b8',\n secondaryColor: '#1e293b',\n tertiaryColor: '#0f172a',\n textColor: '#e2e8f0',\n mainBkg: '#1e293b',\n nodeBorder: '#38bdf8',\n clusterBkg: '#1e293b',\n titleColor: '#e2e8f0',\n edgeLabelBackground: '#1e293b',\n nodeTextColor: '#e2e8f0',\n },\n });\n }\n\n markedReady = true;\n return true;\n}\n\n// \u2500\u2500 Fallback regex renderer (CDN \uC2E4\uD328 \uC2DC) \u2500\u2500\nfunction renderFallback(text) {\n return escapeHtml(text)\n .replace(/`{3,}(\\w*)\\n([\\s\\S]*?)`{3,}/g, '<pre><code>$2</code></pre>')\n .replace(/`([^`]+)`/g, '<code>$1</code>')\n .replace(/\\*\\*(.+?)\\*\\*/g, '<strong>$1</strong>')\n .replace(/^### (.+)$/gm, '<div style=\"font-weight:700;margin:8px 0 4px\">$1</div>')\n .replace(/^## (.+)$/gm, '<div style=\"font-weight:700;font-size:14px;margin:10px 0 4px\">$1</div>')\n .replace(/^# (.+)$/gm, '<div style=\"font-weight:700;font-size:16px;margin:12px 0 4px\">$1</div>')\n .replace(/\\n/g, '<br>');\n}\n\n// \u2500\u2500 Rehighlight all code blocks (call after hljs loads) \u2500\u2500\nexport function rehighlightAll() {\n if (typeof hljs === 'undefined') return;\n document.querySelectorAll('.code-block-wrapper pre code').forEach(el => {\n if (el.dataset.highlighted === 'yes') return;\n const lang = [...el.classList].find(c => c.startsWith('language-'))?.replace('language-', '');\n const raw = el.textContent;\n try {\n if (lang && hljs.getLanguage(lang)) {\n el.innerHTML = hljs.highlight(raw, { language: lang }).value;\n } else {\n el.innerHTML = hljs.highlightAuto(raw).value;\n }\n el.dataset.highlighted = 'yes';\n } catch { /* ignore */ }\n });\n}\n\n// Poll for hljs load and auto-rehighlight\n(function waitForHljs() {\n if (typeof hljs !== 'undefined') { rehighlightAll(); return; }\n setTimeout(waitForHljs, 200);\n})();\n\n// Poll for mermaid load and render pending blocks\n(function waitForMermaid() {\n if (typeof mermaid !== 'undefined') {\n ensureMarked(); // ensure mermaid.initialize() runs\n renderMermaidBlocks();\n return;\n }\n setTimeout(waitForMermaid, 300);\n})();\n\n// \u2500\u2500 Copy button event delegation (one-time setup) \u2500\u2500\nlet copyDelegationReady = false;\n\nfunction ensureCopyDelegation() {\n if (copyDelegationReady) return;\n copyDelegationReady = true;\n document.addEventListener('click', (e) => {\n const label = e.target.closest('.code-lang-label');\n if (!label) return;\n const wrapper = label.closest('.code-block-wrapper');\n if (!wrapper) return;\n const codeEl = wrapper.querySelector('pre code');\n if (!codeEl) return;\n navigator.clipboard.writeText(codeEl.textContent).then(() => {\n const orig = label.textContent;\n label.textContent = t('code.copied');\n label.classList.add('copied');\n setTimeout(() => {\n label.textContent = orig;\n label.classList.remove('copied');\n }, 1500);\n }).catch(() => { /* clipboard API fail silently */ });\n });\n}\n\n// \u2500\u2500 Main export \u2500\u2500\nexport function renderMarkdown(text) {\n const cleaned = stripOrchestration(text);\n if (!cleaned) return `<em style=\"color:var(--text-dim)\">${t('orchestrator.dispatching')}</em>`;\n\n let html;\n if (ensureMarked()) {\n html = marked.parse(cleaned);\n // Wrap tables for horizontal scrolling\n html = html.replace(/<table/g, '<div class=\"table-wrapper\"><table').replace(/<\\/table>/g, '</table></div>');\n } else {\n html = renderFallback(cleaned);\n }\n\n // KaTeX math\n html = renderMath(html);\n\n // XSS sanitization\n html = sanitizeHtml(html);\n\n // Schedule mermaid rendering (needs DOM)\n requestAnimationFrame(() => {\n renderMermaidBlocks();\n rehighlightAll();\n });\n\n // Ensure copy delegation is set up\n ensureCopyDelegation();\n\n return html;\n}\n", "// \u2500\u2500 Agent Name Customization \u2500\u2500\n// localStorage-based agent display name (message label only)\n// Logo, header, title remain \"CLI-JAW\" (immutable)\n\nconst STORAGE_KEY = 'agentName';\nconst DEFAULT_NAME = 'CLI-JAW';\n\nlet currentName = DEFAULT_NAME;\n\nexport function getAppName() {\n return currentName;\n}\n\nexport function setAppName(name) {\n currentName = (name || '').trim() || DEFAULT_NAME;\n localStorage.setItem(STORAGE_KEY, currentName);\n // Update input field\n const input = document.getElementById('appNameInput');\n if (input) input.value = currentName;\n}\n\nexport function initAppName() {\n currentName = localStorage.getItem(STORAGE_KEY) || DEFAULT_NAME;\n\n // Sync input\n const input = document.getElementById('appNameInput');\n if (input) input.value = currentName;\n\n // Save button\n document.getElementById('appNameSave')?.addEventListener('click', () => {\n const inp = document.getElementById('appNameInput');\n if (inp) setAppName(inp.value);\n });\n\n // Enter key\n document.getElementById('appNameInput')?.addEventListener('keydown', (e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n setAppName(e.target.value);\n e.target.blur();\n }\n });\n}\n", "// \u2500\u2500 UI Utilities \u2500\u2500\nimport { state } from './state.js';\nimport { renderMarkdown, escapeHtml } from './render.js';\nimport { getAppName } from './features/appname.js';\nimport { t } from './features/i18n.js';\nimport { api } from './api.js';\n\nexport function setStatus(s) {\n const badge = document.getElementById('statusBadge');\n const btn = document.getElementById('btnSend');\n state.agentBusy = s === 'running';\n document.getElementById('typingIndicator').classList.toggle('active', state.agentBusy);\n if (s === 'running') {\n badge.className = 'status-badge status-running';\n badge.textContent = '\u23F3 running';\n btn.textContent = '\u25A0';\n btn.title = t('btn.stop');\n btn.classList.add('stop-mode');\n } else {\n badge.className = 'status-badge status-idle';\n badge.textContent = '\u26A1 idle';\n btn.textContent = '\u27A4';\n btn.title = 'Send';\n btn.classList.remove('stop-mode');\n updateQueueBadge(0);\n }\n}\n\nexport function updateQueueBadge(count) {\n let el = document.getElementById('queueBadge');\n if (!el) {\n el = document.createElement('span');\n el.id = 'queueBadge';\n el.style.cssText = 'position:absolute;top:-6px;right:-6px;background:#f80;color:#fff;border-radius:50%;font-size:11px;min-width:18px;height:18px;display:flex;align-items:center;justify-content:center;font-weight:bold';\n document.getElementById('btnSend').parentElement.style.position = 'relative';\n document.getElementById('btnSend').style.position = 'relative';\n document.getElementById('btnSend').appendChild(el);\n }\n el.textContent = count > 0 ? count : '';\n el.style.display = count > 0 ? 'flex' : 'none';\n}\n\nexport function addSystemMsg(text, extraClass, type) {\n const container = document.getElementById('chatMessages');\n const div = document.createElement('div');\n const typeClass = type ? ` msg-type-${type}` : '';\n div.className = 'msg msg-system' + typeClass + (extraClass ? ' ' + extraClass : '');\n div.textContent = text;\n container.appendChild(div);\n container.scrollTop = container.scrollHeight;\n}\n\nexport function appendAgentText(text) {\n if (!text) return;\n if (!state.currentAgentDiv) {\n state.currentAgentDiv = addMessage('agent', '');\n }\n const content = state.currentAgentDiv.querySelector('.msg-content');\n content.textContent += text;\n scrollToBottom();\n}\n\nlet lastFinalizeTs = 0;\n\nexport function finalizeAgent(text, toolLog) {\n // Guard: prevent double-render when both agent_done + orchestrate_done fire\n const now = Date.now();\n if (!state.currentAgentDiv && now - lastFinalizeTs < 500) return;\n\n document.querySelectorAll('.msg-system.tool-activity').forEach(el => el.remove());\n if (text) {\n if (!state.currentAgentDiv) {\n state.currentAgentDiv = addMessage('agent', '');\n }\n const content = state.currentAgentDiv.querySelector('.msg-content');\n state.currentAgentDiv.dataset.rawText = text;\n let toolHtml = '';\n if (toolLog && toolLog.length > 0) {\n const counts = {};\n toolLog.forEach(t => { counts[t.icon] = (counts[t.icon] || 0) + 1; });\n const summaryParts = Object.entries(counts).map(([icon, n]) => `${icon}\u00D7${n}`).join(' ');\n const logLines = toolLog.map(t => `${t.icon} ${escapeHtml(t.label)}`).join('\\n');\n toolHtml = `<details class=\"tool-summary\"><summary>${summaryParts}</summary><div class=\"tool-log\">${logLines}</div></details>`;\n }\n content.innerHTML = toolHtml + renderMarkdown(text);\n }\n state.currentAgentDiv = null;\n lastFinalizeTs = Date.now();\n setStatus('idle');\n loadStats();\n}\n\nexport function addMessage(role, text) {\n const container = document.getElementById('chatMessages');\n const div = document.createElement('div');\n div.className = `msg msg-${role}`;\n div.dataset.rawText = text;\n const rendered = renderMarkdown(text);\n const copyBtn = '<span class=\"msg-copy\" title=\"Copy raw text\"></span>';\n div.innerHTML = `<div class=\"msg-label\">${role === 'user' ? t('msg.you') : getAppName()}</div><div class=\"msg-content\">${rendered}</div>${copyBtn}`;\n container.appendChild(div);\n scrollToBottom();\n return div;\n}\n\nexport function scrollToBottom() {\n const c = document.getElementById('chatMessages');\n c.scrollTop = c.scrollHeight;\n}\n\nexport function switchTab(name, targetBtn) {\n document.querySelectorAll('.tab-btn').forEach(b => b.classList.remove('active'));\n document.querySelectorAll('.tab-content').forEach(c => c.classList.remove('active'));\n const tabMap = { agents: 'tabAgents', settings: 'tabSettings', skills: 'tabSkills' };\n document.getElementById(tabMap[name]).classList.add('active');\n if (targetBtn) targetBtn.classList.add('active');\n // Lazy-load tab content\n if (name === 'settings') { import('./features/settings.js').then(m => m.loadSettings()); }\n if (name === 'agents') { import('./features/employees.js').then(m => m.loadEmployees()); }\n if (name === 'skills') { import('./features/skills.js').then(m => m.loadSkills()); }\n}\n\nexport function handleSave() {\n const isSettings = document.getElementById('tabSettings').classList.contains('active');\n if (isSettings) {\n import('./features/settings.js').then(m => m.savePerCli());\n } else {\n import('./features/settings.js').then(m => m.updateSettings());\n }\n}\n\nexport async function loadStats() {\n const msgs = await api('/api/messages');\n if (!msgs) return;\n document.getElementById('statMsgs').textContent = t('stat.messages', { count: msgs.length });\n}\n\nexport async function loadMessages() {\n const msgs = await api('/api/messages');\n if (!msgs) return;\n msgs.forEach(m => addMessage(m.role === 'assistant' ? 'agent' : m.role, m.content));\n}\n\n// \u2500\u2500 Copy button delegation \u2500\u2500\nexport function initMsgCopy() {\n document.getElementById('chatMessages').addEventListener('click', async (e) => {\n const btn = e.target.closest('.msg-copy');\n if (!btn) return;\n const msg = btn.closest('.msg');\n const raw = msg?.dataset?.rawText || msg?.querySelector('.msg-content')?.innerText || '';\n try {\n await navigator.clipboard.writeText(raw);\n btn.classList.add('copied');\n setTimeout(() => { btn.classList.remove('copied'); }, 1500);\n } catch { setTimeout(() => { }, 1500); }\n });\n}\n\nexport async function loadMemory() {\n try {\n const items = await api('/api/memory');\n const list = document.getElementById('memoryList');\n if (!list) return;\n if (items.length === 0) {\n list.innerHTML = `<li style=\"color:var(--text-dim)\">${t('mem.empty')}</li>`;\n return;\n }\n list.innerHTML = items.map(m =>\n `<li><span class=\"memory-key\">${escapeHtml(m.key)}</span>: ${escapeHtml(m.value)}</li>`\n ).join('');\n } catch { }\n}\n", "// \u2500\u2500 WebSocket Connection \u2500\u2500\nimport { state } from './state.js';\nimport { setStatus, updateQueueBadge, addSystemMsg, appendAgentText, finalizeAgent, addMessage } from './ui.js';\nimport { t, getLang } from './features/i18n.js';\n\n// Agent phase state (populated by agent_status events from orchestrator)\nconst agentPhaseState = {};\n\nexport function connect() {\n state.ws = new WebSocket(`ws://${location.host}?lang=${getLang()}`);\n state.ws.onmessage = (e) => {\n const msg = JSON.parse(e.data);\n if (msg.type === 'agent_status') {\n if (msg.running !== undefined) {\n setStatus(msg.running ? 'running' : 'idle');\n } else {\n setStatus(msg.status);\n }\n // Track per-agent phase for badge rendering\n if (msg.agentId && msg.phase) {\n agentPhaseState[msg.agentId] = { phase: msg.phase, phaseLabel: msg.phaseLabel || '' };\n import('./features/employees.js').then(m => m.loadEmployees());\n }\n } else if (msg.type === 'queue_update') {\n updateQueueBadge(msg.pending || 0);\n } else if (msg.type === 'worklog_created') {\n addSystemMsg(`\uD83D\uDCCB Worklog: ${msg.path}`);\n } else if (msg.type === 'round_start') {\n const agents = (msg.agentPhases || msg.subtasks || []);\n const names = agents.map(a => a.agent || a.name).join(', ');\n addSystemMsg(t('ws.roundStart', { round: msg.round, count: agents.length, names }));\n } else if (msg.type === 'round_done') {\n if (msg.action === 'complete') {\n addSystemMsg(t('ws.roundDone', { round: msg.round }));\n } else if (msg.action === 'next') {\n addSystemMsg(t('ws.roundNext', { round: msg.round }));\n } else {\n addSystemMsg(t('ws.roundRetry', { round: msg.round }));\n }\n } else if (msg.type === 'agent_tool') {\n addSystemMsg(`${msg.icon} ${msg.label}`, 'tool-activity');\n } else if (msg.type === 'agent_output') {\n appendAgentText(msg.text);\n } else if (msg.type === 'agent_fallback') {\n addSystemMsg(t('ws.fallback', { from: msg.from, to: msg.to }), 'tool-activity');\n } else if (msg.type === 'agent_done') {\n finalizeAgent(msg.text, msg.toolLog);\n } else if (msg.type === 'orchestrate_done') {\n finalizeAgent(msg.text);\n } else if (msg.type === 'clear') {\n document.getElementById('chatMessages').innerHTML = '';\n } else if (msg.type === 'agent_added' || msg.type === 'agent_updated' || msg.type === 'agent_deleted') {\n import('./features/employees.js').then(m => m.loadEmployees());\n } else if (msg.type === 'new_message' && msg.source === 'telegram') {\n addMessage(msg.role === 'assistant' ? 'agent' : msg.role, msg.content);\n }\n };\n state.ws.onopen = () => {\n console.log('[ws] connected');\n // Restore state: reload messages to stay in sync after reconnect\n import('./ui.js').then(m => {\n document.getElementById('chatMessages').innerHTML = '';\n m.loadMessages();\n m.setStatus('idle');\n });\n };\n state.ws.onclose = () => {\n console.log('[ws] disconnected, reconnecting in 2s...');\n setStatus('idle');\n setTimeout(connect, 2000);\n };\n}\n\nexport function getAgentPhase(agentId) {\n return agentPhaseState[agentId] || null;\n}\n", "// \u2500\u2500 App Entry Point \u2500\u2500\n// All event bindings happen here (no inline onclick in HTML)\n\n// \u2500\u2500 Global Error Boundary \u2500\u2500\nwindow.addEventListener('unhandledrejection', (e) => {\n console.error('[unhandled]', e.reason);\n e.preventDefault();\n});\nwindow.addEventListener('error', (e) => {\n console.error('[error]', e.message, e.filename, e.lineno);\n});\n\nimport { connect } from './ws.js';\nimport { switchTab, handleSave, loadStats, loadMessages, loadMemory, initMsgCopy } from './ui.js';\nimport { sendMessage, handleKey, clearAttachedFiles, removeAttachedFile, clearChat, initDragDrop, initAutoResize } from './features/chat.js';\nimport {\n loadCommands, update as updateSlashDropdown, handleKeydown as handleSlashKeydown,\n handleClick as handleSlashClick, handleOutsideClick as handleSlashOutsideClick,\n} from './features/slash-commands.js';\nimport { loadSkills, toggleSkill, filterSkills } from './features/skills.js';\nimport {\n loadSettings, setPerm, handleModelSelect, applyCustomModel, onCliChange,\n saveActiveCliSettings, savePerCli, updateSettings, openPromptModal,\n closePromptModal, savePromptFromModal, syncMcpServers, installMcpGlobal,\n loadCliStatus, setTelegram, saveTelegramSettings, saveFallbackOrder\n} from './features/settings.js';\nimport {\n loadEmployees, addEmployee, deleteEmployee, updateEmployee,\n onEmpCliChange, onEmpRoleChange\n} from './features/employees.js';\nimport {\n openHeartbeatModal, closeHeartbeatModal, addHeartbeatJob,\n removeHeartbeatJob, toggleHeartbeatJob, saveHeartbeatJobs,\n initHeartbeatBadge\n} from './features/heartbeat.js';\nimport {\n openMemoryModal, closeMemoryModal, switchMemTab, setMemEnabled,\n saveMemSettings, deleteMemFile, viewMemFile\n} from './features/memory.js';\nimport { state } from './state.js';\nimport { loadCliRegistry, getCliKeys } from './constants.js';\nimport { initAppName } from './features/appname.js';\nimport { initSidebar, toggleLeft, toggleRight } from './features/sidebar.js';\nimport { initTheme } from './features/theme.js';\nimport { initI18n, setLang, getLang, t } from './features/i18n.js';\n\n// \u2500\u2500 Chat Actions \u2500\u2500\ndocument.getElementById('btnSend').addEventListener('click', sendMessage);\nconst chatInput = document.getElementById('chatInput');\nchatInput.addEventListener('keydown', (e) => {\n if (handleSlashKeydown(e)) return;\n handleKey(e);\n});\nlet slashInputRaf = 0;\nchatInput.addEventListener('input', (e) => {\n if (e.isComposing) return;\n if (slashInputRaf) cancelAnimationFrame(slashInputRaf);\n slashInputRaf = requestAnimationFrame(() => {\n updateSlashDropdown(e.target.value);\n slashInputRaf = 0;\n });\n});\nchatInput.addEventListener('cmd-execute', () => {\n void sendMessage();\n});\ndocument.getElementById('cmdDropdown')?.addEventListener('click', handleSlashClick);\ndocument.addEventListener('click', handleSlashOutsideClick);\ndocument.getElementById('filePreviewClear').addEventListener('click', clearAttachedFiles);\ndocument.getElementById('filePreviewList').addEventListener('click', (e) => {\n const btn = e.target.closest('[data-file-idx]');\n if (btn) removeAttachedFile(+btn.dataset.fileIdx);\n});\ndocument.querySelector('.btn-attach').addEventListener('click', () => {\n document.getElementById('fileInput').click();\n});\n\n// \u2500\u2500 Left Sidebar \u2500\u2500\ndocument.getElementById('memorySidebarBtn').addEventListener('click', openMemoryModal);\ndocument.getElementById('btnClearChat').addEventListener('click', clearChat);\ndocument.getElementById('hbSidebarBtn').addEventListener('click', openHeartbeatModal);\n\n// Language toggle\ndocument.getElementById('langToggle')?.addEventListener('click', async () => {\n const next = getLang() === 'ko' ? 'en' : 'ko';\n await setLang(next);\n const btn = document.getElementById('langToggle');\n if (btn) btn.textContent = `\uD83C\uDF10 ${t('lang.' + next)}`;\n // Reconnect WS with new locale\n if (state.ws) { state.ws.close(); }\n});\n\n// \u2500\u2500 Tab Bar (event delegation) \u2500\u2500\ndocument.querySelector('.tab-bar').addEventListener('click', (e) => {\n const btn = e.target.closest('.tab-btn');\n if (!btn) return;\n const tabs = [...btn.parentElement.children].filter(c => c.classList.contains('tab-btn'));\n const idx = tabs.indexOf(btn);\n const names = ['agents', 'skills', 'settings'];\n if (names[idx]) switchTab(names[idx], btn);\n});\n\n// \u2500\u2500 Save Button \u2500\u2500\ndocument.querySelector('.sidebar-save-bar .btn-save').addEventListener('click', handleSave);\n\n// \u2500\u2500 Agents Tab \u2500\u2500\ndocument.getElementById('selCli').addEventListener('change', () => onCliChange());\ndocument.getElementById('selModel').addEventListener('change', () => saveActiveCliSettings());\ndocument.getElementById('selEffort').addEventListener('change', () => saveActiveCliSettings());\ndocument.getElementById('inpCwd').addEventListener('change', updateSettings);\ndocument.querySelector('[data-action=\"addEmployee\"]').addEventListener('click', addEmployee);\n\n// \u2500\u2500 Employees (Event Delegation) \u2500\u2500\ndocument.getElementById('employeesList').addEventListener('click', (e) => {\n const del = e.target.closest('[data-emp-delete]');\n if (del) { deleteEmployee(del.dataset.empDelete); return; }\n});\ndocument.getElementById('employeesList').addEventListener('change', (e) => {\n const name = e.target.closest('[data-emp-name]');\n if (name) { updateEmployee(name.dataset.empName, { name: e.target.value }); return; }\n const cli = e.target.closest('[data-emp-cli]');\n if (cli) { onEmpCliChange(cli.dataset.empCli, e.target.value); return; }\n const model = e.target.closest('[data-emp-model]');\n if (model) {\n if (e.target.value === '__custom__') {\n const val = prompt(t('model.promptInput'));\n if (val?.trim()) {\n const opt = document.createElement('option');\n opt.value = val.trim(); opt.textContent = val.trim();\n const customOpt = e.target.querySelector('option[value=\"__custom__\"]');\n e.target.insertBefore(opt, customOpt);\n e.target.value = val.trim();\n updateEmployee(model.dataset.empModel, { model: val.trim() });\n } else { e.target.value = 'default'; }\n } else { updateEmployee(model.dataset.empModel, { model: e.target.value }); }\n return;\n }\n const role = e.target.closest('[data-emp-role]');\n if (role) { onEmpRoleChange(role.dataset.empRole, e.target.value); return; }\n const custom = e.target.closest('[data-emp-custom]');\n if (custom) { updateEmployee(custom.dataset.empCustom, { role: e.target.value }); return; }\n});\n\n// \u2500\u2500 Skills Tab (Event Delegation) \u2500\u2500\ndocument.getElementById('skillsList').addEventListener('click', (e) => {\n const toggle = e.target.closest('[data-skill-id]');\n if (toggle) {\n toggleSkill(toggle.dataset.skillId, toggle.dataset.skillEnabled === 'true');\n }\n});\n// Skill filter buttons (event delegation)\ndocument.querySelector('#tabSkills').addEventListener('click', (e) => {\n const filterBtn = e.target.closest('.skill-filter');\n if (filterBtn) {\n const cat = filterBtn.dataset.filter;\n filterSkills(cat, filterBtn);\n }\n});\n\n// \u2500\u2500 Settings Tab \u2500\u2500\ndocument.querySelector('[data-action=\"openPrompt\"]').addEventListener('click', openPromptModal);\ndocument.getElementById('tgOff').addEventListener('click', () => setTelegram(false));\ndocument.getElementById('tgOn').addEventListener('click', () => setTelegram(true));\ndocument.getElementById('tgToken').addEventListener('change', saveTelegramSettings);\ndocument.getElementById('tgChatIds').addEventListener('change', saveTelegramSettings);\ndocument.getElementById('fallbackOrderList').addEventListener('change', saveFallbackOrder);\n\n// Per-CLI model selects\nfunction bindPerCliControlEvents() {\n for (const cli of getCliKeys()) {\n const cap = cli.charAt(0).toUpperCase() + cli.slice(1);\n const sel = document.getElementById('model' + cap);\n if (sel) sel.addEventListener('change', function () { handleModelSelect(cli, this); });\n const custom = document.getElementById('customModel' + cap);\n if (custom) custom.addEventListener('change', function () { applyCustomModel(cli, this); });\n const effort = document.getElementById('effort' + cap);\n if (effort) effort.addEventListener('change', savePerCli);\n }\n}\n\n// MCP\ndocument.querySelector('[data-action=\"syncMcp\"]').addEventListener('click', syncMcpServers);\ndocument.querySelector('[data-action=\"installMcp\"]').addEventListener('click', installMcpGlobal);\ndocument.querySelector('[data-action=\"refreshCli\"]').addEventListener('click', () => loadCliStatus(true));\ndocument.getElementById('cliStatusInterval').addEventListener('change', function () {\n localStorage.setItem('cliStatusInterval', this.value);\n});\n\n// \u2500\u2500 Prompt Modal \u2500\u2500\ndocument.getElementById('promptModal').addEventListener('click', (e) => closePromptModal(e));\ndocument.querySelector('#promptModal .modal-box').addEventListener('click', (e) => e.stopPropagation());\ndocument.querySelector('[data-action=\"closePrompt\"]').addEventListener('click', () => closePromptModal());\ndocument.querySelector('[data-action=\"cancelPrompt\"]').addEventListener('click', () => closePromptModal());\ndocument.querySelector('[data-action=\"savePrompt\"]').addEventListener('click', savePromptFromModal);\ndocument.addEventListener('keydown', (e) => { if (e.key === 'Escape') closePromptModal(); });\n\n// \u2500\u2500 Heartbeat Modal \u2500\u2500\ndocument.getElementById('heartbeatModal').addEventListener('click', (e) => closeHeartbeatModal(e));\ndocument.querySelector('#heartbeatModal .modal-box').addEventListener('click', (e) => e.stopPropagation());\ndocument.querySelector('[data-action=\"closeHeartbeat\"]').addEventListener('click', () => closeHeartbeatModal());\ndocument.querySelector('[data-action=\"addHeartbeat\"]').addEventListener('click', addHeartbeatJob);\n\n// Heartbeat jobs (event delegation)\ndocument.getElementById('hbJobsList').addEventListener('click', (e) => {\n const toggle = e.target.closest('[data-hb-toggle]');\n if (toggle) { toggleHeartbeatJob(+toggle.dataset.hbToggle); return; }\n const remove = e.target.closest('[data-hb-remove]');\n if (remove) { removeHeartbeatJob(+remove.dataset.hbRemove); return; }\n});\ndocument.getElementById('hbJobsList').addEventListener('change', (e) => {\n const name = e.target.closest('[data-hb-name]');\n if (name) { state.heartbeatJobs[+name.dataset.hbName].name = e.target.value; saveHeartbeatJobs(); return; }\n const min = e.target.closest('[data-hb-minutes]');\n if (min) { state.heartbeatJobs[+min.dataset.hbMinutes].schedule = { kind: 'every', minutes: +e.target.value }; saveHeartbeatJobs(); return; }\n const prompt = e.target.closest('[data-hb-prompt]');\n if (prompt) { state.heartbeatJobs[+prompt.dataset.hbPrompt].prompt = e.target.value; saveHeartbeatJobs(); return; }\n});\n\n// \u2500\u2500 Memory Modal \u2500\u2500\ndocument.getElementById('memoryModal').addEventListener('click', (e) => closeMemoryModal(e));\ndocument.querySelector('#memoryModal .modal-box').addEventListener('click', (e) => e.stopPropagation());\ndocument.querySelector('[data-action=\"closeMemory\"]').addEventListener('click', () => closeMemoryModal());\ndocument.getElementById('memTabBtnSettings').addEventListener('click', () => switchMemTab('settings'));\ndocument.getElementById('memTabBtnFiles').addEventListener('click', () => switchMemTab('files'));\ndocument.getElementById('memOn').addEventListener('click', () => setMemEnabled(true));\ndocument.getElementById('memOff').addEventListener('click', () => setMemEnabled(false));\ndocument.getElementById('memFlushEvery').addEventListener('change', saveMemSettings);\ndocument.getElementById('memCli').addEventListener('change', saveMemSettings);\ndocument.getElementById('memModel').addEventListener('change', saveMemSettings);\ndocument.getElementById('memRetention').addEventListener('change', saveMemSettings);\n\n// Memory files (event delegation)\ndocument.getElementById('memFilesList').addEventListener('click', (e) => {\n const del = e.target.closest('[data-mem-delete]');\n if (del) { e.stopPropagation(); deleteMemFile(del.dataset.memDelete); return; }\n const view = e.target.closest('[data-mem-view]');\n if (view) { viewMemFile(view.dataset.memView); return; }\n const back = e.target.closest('[data-mem-back]');\n if (back) { openMemoryModal(); return; }\n});\n\n// \u2500\u2500 Init \u2500\u2500\nasync function bootstrap() {\n await initI18n();\n const langBtn = document.getElementById('langToggle');\n if (langBtn) langBtn.textContent = `\uD83C\uDF10 ${t('lang.' + getLang())}`;\n await loadCliRegistry();\n bindPerCliControlEvents();\n connect();\n initDragDrop();\n initAutoResize();\n await loadCommands();\n await loadSettings();\n loadCliStatus();\n loadMemory();\n // loadMessages() is handled by ws.js onopen (clear + reload)\n loadEmployees();\n initHeartbeatBadge();\n initAppName();\n initSidebar();\n initTheme();\n initMsgCopy();\n}\n\nvoid bootstrap().catch((err) => {\n console.error('[bootstrap]', err);\n});\n\n// \u2500\u2500 Keyboard: Escape closes modals \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\ndocument.addEventListener('keydown', (e) => {\n if (e.key === 'Escape') {\n document.querySelectorAll('.modal-overlay.open').forEach(m => {\n m.classList.remove('open');\n });\n }\n});\n\n// \u2500\u2500 Mobile sidebar toggle (sidebar.js functions reuse) \u2500\u2500\ndocument.getElementById('mobileMenuLeft')?.addEventListener('click', toggleLeft);\ndocument.getElementById('mobileMenuRight')?.addEventListener('click', toggleRight);\n", "// \u2500\u2500 Chat Feature \u2500\u2500\nimport { state } from '../state.js';\nimport { addMessage, addSystemMsg, scrollToBottom } from '../ui.js';\nimport { getPreferredLocale } from '../locale.js';\nimport { t } from './i18n.js';\nimport * as slashCmd from './slash-commands.js';\nimport { api, apiJson, apiFire } from '../api.js';\n\nexport async function sendMessage() {\n const input = document.getElementById('chatInput');\n const btn = document.getElementById('btnSend');\n\n // Stop mode: clicking \u25A0 stops the agent\n if (btn.classList.contains('stop-mode') && !input.value.trim() && !state.attachedFiles.length) {\n apiFire('/api/stop', 'POST');\n return;\n }\n\n const text = input.value.trim();\n if (!text && !state.attachedFiles.length) return;\n\n // File paths like /Users/junny/... or /tmp/foo \u2014 not commands\n const afterSlash = text.slice(1).trim();\n const firstToken = afterSlash.split(/\\s+/)[0] || '';\n const isFilePath = firstToken.includes('/') || firstToken.includes('\\\\');\n\n if (text.startsWith('/') && !state.attachedFiles.length && !isFilePath) {\n input.value = '';\n resetInputHeight();\n slashCmd.close();\n try {\n let signal, timer;\n if (typeof AbortSignal?.timeout === 'function') {\n signal = AbortSignal.timeout(10000);\n } else {\n const ac = new AbortController();\n signal = ac.signal;\n timer = setTimeout(() => ac.abort(), 10000);\n }\n const locale = getPreferredLocale();\n const res = await fetch('/api/command', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept-Language': locale,\n },\n body: JSON.stringify({ text, locale }),\n signal,\n });\n if (timer) clearTimeout(timer);\n const result = await res.json().catch(() => ({}));\n // not_command \u2192 fall through to normal chat\n if (result?.code === 'not_command') {\n addMessage('user', text);\n await apiJson('/api/message', 'POST', { prompt: text });\n return;\n }\n if (!res.ok && !result?.text) throw new Error(`HTTP ${res.status}`);\n if (result?.code === 'clear_screen') {\n document.getElementById('chatMessages').innerHTML = '';\n }\n if (result?.text) addSystemMsg(result.text, '', result.type);\n } catch (err) {\n addSystemMsg(t('chat.cmd.fail', { msg: err.message }), '', 'error');\n }\n return;\n }\n\n if (state.attachedFiles.length) {\n const names = state.attachedFiles.map(f => f.name).join(', ');\n const displayMsg = `[\uD83D\uDCCE ${names}] ${text}`;\n addMessage('user', displayMsg);\n input.value = '';\n resetInputHeight();\n try {\n // Upload all files in parallel\n const paths = await Promise.all(state.attachedFiles.map(f => uploadFile(f)));\n let prompt = paths.map(p => t('chat.file.sent', { path: p })).join('\\n');\n if (text) prompt += t('chat.file.sentWithMsg', { text });\n clearAttachedFiles();\n await apiJson('/api/message', 'POST', { prompt });\n } catch (err) {\n addSystemMsg(t('chat.file.uploadFail', { msg: err.message }));\n clearAttachedFiles();\n }\n } else {\n addMessage('user', text);\n input.value = '';\n resetInputHeight();\n const res = await fetch('/api/message', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ prompt: text }),\n });\n const data = await res.json().catch(() => ({}));\n if (!res.ok) {\n addSystemMsg(`\u274C ${data.error || t('chat.requestFail', { status: res.status })}`, '', 'error');\n return;\n }\n if (data.queued) {\n const { updateQueueBadge } = await import('../ui.js');\n updateQueueBadge(data.pending || 1);\n } else if (data.continued) {\n addSystemMsg(t('chat.continue'));\n }\n }\n}\n\nexport function handleKey(e) {\n if (e.key === 'Enter' && !e.shiftKey && !e.isComposing) { e.preventDefault(); sendMessage(); }\n}\n\nasync function uploadFile(file) {\n const res = await fetch('/api/upload', {\n method: 'POST',\n headers: { 'X-Filename': encodeURIComponent(file.name) },\n body: file,\n });\n if (!res.ok) throw new Error('upload failed');\n const data = await res.json();\n return data.path;\n}\n\nexport function attachFiles(files) {\n for (const file of files) {\n // Skip duplicates by name\n if (state.attachedFiles.some(f => f.name === file.name)) continue;\n state.attachedFiles.push(file);\n }\n renderFilePreview();\n document.getElementById('chatInput').focus();\n}\n\nexport function removeAttachedFile(index) {\n state.attachedFiles.splice(index, 1);\n renderFilePreview();\n}\n\nexport function clearAttachedFiles() {\n state.attachedFiles = [];\n renderFilePreview();\n document.getElementById('fileInput').value = '';\n}\n\nfunction renderFilePreview() {\n const preview = document.getElementById('filePreview');\n const listEl = document.getElementById('filePreviewList');\n if (!state.attachedFiles.length) {\n preview.classList.remove('visible');\n if (listEl) listEl.innerHTML = '';\n return;\n }\n preview.classList.add('visible');\n if (!listEl) return;\n listEl.innerHTML = state.attachedFiles.map((f, i) => {\n const size = (f.size / 1024).toFixed(1);\n const isImg = f.type.startsWith('image/');\n const thumb = isImg ? `<img src=\"${URL.createObjectURL(f)}\" class=\"file-chip-thumb\" alt=\"\">` : '';\n return `<div class=\"file-chip\">\n ${thumb}\n <span class=\"file-chip-name\">\uD83D\uDCCE ${f.name} (${size}KB)</span>\n <button class=\"file-chip-remove\" data-file-idx=\"${i}\" title=\"Remove\">\u2715</button>\n </div>`;\n }).join('');\n}\n\nexport async function clearChat() {\n apiFire('/api/clear', 'POST');\n document.getElementById('chatMessages').innerHTML = '';\n}\n\n// \u2500\u2500 Auto-resize textarea \u2500\u2500\nfunction autoResize(el) {\n el.style.height = 'auto';\n el.style.height = el.scrollHeight + 'px';\n}\n\nexport function initAutoResize() {\n const el = document.getElementById('chatInput');\n el.addEventListener('input', () => autoResize(el));\n}\n\nexport function resetInputHeight() {\n const el = document.getElementById('chatInput');\n el.style.height = 'auto';\n}\n\nexport function initDragDrop() {\n const chatArea = document.querySelector('.chat-area');\n const overlay = document.getElementById('dragOverlay');\n let dragCounter = 0;\n\n chatArea.addEventListener('dragenter', (e) => {\n e.preventDefault();\n dragCounter++;\n overlay.classList.add('visible');\n });\n chatArea.addEventListener('dragleave', (e) => {\n e.preventDefault();\n dragCounter--;\n if (dragCounter <= 0) { dragCounter = 0; overlay.classList.remove('visible'); }\n });\n chatArea.addEventListener('dragover', (e) => e.preventDefault());\n chatArea.addEventListener('drop', (e) => {\n e.preventDefault();\n dragCounter = 0;\n overlay.classList.remove('visible');\n const files = [...e.dataTransfer.files];\n if (files.length) attachFiles(files);\n });\n\n document.getElementById('fileInput').addEventListener('change', (e) => {\n const files = [...e.target.files];\n if (files.length) attachFiles(files);\n e.target.value = ''; // allow re-selecting same file\n });\n\n // \u2500\u2500 Clipboard paste (Cmd+V) \u2500\u2500\n document.addEventListener('paste', (e) => {\n const items = e.clipboardData?.items;\n if (!items) return;\n const files = [];\n for (const item of items) {\n if (item.kind !== 'file') continue;\n const blob = item.getAsFile();\n if (!blob) continue;\n // Pasted images often have no useful name; generate one\n if (!blob.name || blob.name === 'image.png') {\n const ts = new Date().toISOString().replace(/[:.]/g, '-');\n const ext = blob.type.split('/')[1] || 'png';\n const named = new File([blob], `pasted-${ts}.${ext}`, { type: blob.type });\n files.push(named);\n } else {\n files.push(blob);\n }\n }\n if (files.length) {\n e.preventDefault();\n attachFiles(files);\n }\n });\n}\n", "// \u2500\u2500 Heartbeat Feature \u2500\u2500\nimport { state } from '../state.js';\nimport { t } from './i18n.js';\nimport { api, apiJson } from '../api.js';\nimport { escapeHtml } from '../render.js';\n\nexport async function openHeartbeatModal() {\n const data = await api('/api/heartbeat');\n state.heartbeatJobs = data?.jobs || [];\n renderHeartbeatJobs();\n document.getElementById('heartbeatModal').classList.add('open');\n}\n\nexport function closeHeartbeatModal(e) {\n if (e && e.target !== e.currentTarget) return;\n document.getElementById('heartbeatModal').classList.remove('open');\n}\n\nexport function renderHeartbeatJobs() {\n const container = document.getElementById('hbJobsList');\n if (state.heartbeatJobs.length === 0) {\n container.innerHTML = `<p style=\"color:var(--text-dim);font-size:12px;text-align:center\">${t('hb.empty')}</p>`;\n } else {\n container.innerHTML = state.heartbeatJobs.map((job, i) => `\n <div class=\"hb-job-card\">\n <div class=\"hb-job-header\">\n <input type=\"text\" value=\"${escapeHtml(job.name || '')}\" placeholder=\"${t('hb.name')}\"\n data-hb-name=\"${i}\">\n <span style=\"font-size:11px;color:var(--text-dim)\">every</span>\n <input type=\"number\" value=\"${job.schedule?.minutes || 5}\" min=\"1\"\n data-hb-minutes=\"${i}\">\n <span style=\"font-size:11px;color:var(--text-dim)\">min</span>\n <button class=\"hb-toggle ${job.enabled ? 'on' : 'off'}\"\n data-hb-toggle=\"${i}\"></button>\n <button class=\"hb-del\" data-hb-remove=\"${i}\">\u2715</button>\n </div>\n <textarea class=\"hb-prompt\" rows=\"2\" placeholder=\"${t('hb.prompt')}\"\n data-hb-prompt=\"${i}\">${escapeHtml(job.prompt || '')}</textarea>\n </div>\n `).join('');\n }\n const active = state.heartbeatJobs.filter(j => j.enabled).length;\n document.getElementById('hbSidebarBtn').textContent = `\uD83D\uDC93 Heartbeat (${active})`;\n}\n\nexport function addHeartbeatJob() {\n state.heartbeatJobs.push({\n id: 'hb_' + Date.now(),\n name: '',\n enabled: true,\n schedule: { kind: 'every', minutes: 5 },\n prompt: ''\n });\n renderHeartbeatJobs();\n saveHeartbeatJobs();\n}\n\nexport function removeHeartbeatJob(i) {\n state.heartbeatJobs.splice(i, 1);\n renderHeartbeatJobs();\n saveHeartbeatJobs();\n}\n\nexport function toggleHeartbeatJob(i) {\n state.heartbeatJobs[i].enabled = !state.heartbeatJobs[i].enabled;\n renderHeartbeatJobs();\n saveHeartbeatJobs();\n}\n\nexport async function saveHeartbeatJobs() {\n await apiJson('/api/heartbeat', 'PUT', { jobs: state.heartbeatJobs });\n}\n\nexport async function initHeartbeatBadge() {\n try {\n const d = await api('/api/heartbeat');\n const active = (d?.jobs || []).filter(j => j.enabled).length;\n document.getElementById('hbSidebarBtn').textContent = `\uD83D\uDC93 Heartbeat (${active})`;\n } catch { }\n}\n", "// \u2500\u2500 Memory Feature \u2500\u2500\nimport { escapeHtml } from '../render.js';\nimport { api, apiJson, apiFire } from '../api.js';\n\nexport async function openMemoryModal() {\n const data = await api('/api/memory-files');\n if (!data) return;\n document.getElementById('memOn').classList.toggle('active', data.enabled);\n document.getElementById('memOff').classList.toggle('active', !data.enabled);\n document.getElementById('memFlushEvery').value = data.flushEvery;\n document.getElementById('memCli').value = data.cli || '';\n document.getElementById('memModel').value = data.model || '';\n document.getElementById('memRetention').value = data.retentionDays;\n document.getElementById('memPath').textContent = data.path;\n document.getElementById('memCounter').textContent = data.counter;\n document.getElementById('memThreshold').textContent = data.flushEvery;\n renderMemFiles(data.files);\n document.getElementById('memorySidebarBtn').textContent = `\uD83E\uDDE0 Memory (${data.files.length})`;\n document.getElementById('memoryModal').classList.add('open');\n}\n\nexport function closeMemoryModal(e) {\n if (e && e.target !== e.currentTarget) return;\n document.getElementById('memoryModal').classList.remove('open');\n}\n\nexport function switchMemTab(tab) {\n document.getElementById('memTabSettings').style.display = tab === 'settings' ? '' : 'none';\n document.getElementById('memTabFiles').style.display = tab === 'files' ? '' : 'none';\n document.getElementById('memTabBtnSettings').classList.toggle('active', tab === 'settings');\n document.getElementById('memTabBtnFiles').classList.toggle('active', tab === 'files');\n}\n\nexport async function setMemEnabled(v) {\n document.getElementById('memOn').classList.toggle('active', v);\n document.getElementById('memOff').classList.toggle('active', !v);\n await apiJson('/api/memory-files/settings', 'PUT', { enabled: v });\n}\n\nexport async function saveMemSettings() {\n await apiJson('/api/memory-files/settings', 'PUT', {\n flushEvery: +document.getElementById('memFlushEvery').value,\n cli: document.getElementById('memCli').value,\n model: document.getElementById('memModel').value,\n retentionDays: +document.getElementById('memRetention').value,\n });\n document.getElementById('memThreshold').textContent = document.getElementById('memFlushEvery').value;\n}\n\nfunction renderMemFiles(files) {\n const container = document.getElementById('memFilesList');\n if (!files || files.length === 0) {\n container.innerHTML = '<p style=\"color:var(--text-dim);font-size:12px;text-align:center\">No memory files yet</p>';\n return;\n }\n container.innerHTML = files.map(f => `\n <div style=\"display:flex;align-items:center;justify-content:space-between;padding:6px 8px;border:1px solid var(--border);border-radius:4px;margin-bottom:4px;cursor:pointer\"\n data-mem-view=\"${escapeHtml(f.name)}\">\n <div>\n <span style=\"font-size:12px;font-family:monospace\">${escapeHtml(f.name)}</span>\n <span style=\"font-size:10px;color:var(--accent);margin-left:6px\">${f.entries} entries</span>\n </div>\n <button data-mem-delete=\"${escapeHtml(f.name)}\" style=\"background:none;border:none;color:#f55;cursor:pointer;font-size:14px\">\uD83D\uDDD1\uFE0F</button>\n </div>\n `).join('');\n}\n\nexport async function deleteMemFile(name) {\n if (!confirm('Delete ' + name + '?')) return;\n await apiJson('/api/memory-files/' + name, 'DELETE');\n openMemoryModal();\n}\n\nexport async function viewMemFile(name) {\n const data = await api('/api/memory-files/' + name);\n if (!data) return;\n const container = document.getElementById('memFilesList');\n container.innerHTML = `\n <div style=\"margin-bottom:8px;display:flex;justify-content:space-between;align-items:center\">\n <span style=\"font-size:12px;font-weight:600\">${data.name}</span>\n <button data-mem-back style=\"background:none;border:none;color:var(--accent);cursor:pointer;font-size:11px\">\u2190 back</button>\n </div>\n <pre style=\"background:var(--bg);padding:8px;border-radius:4px;font-size:11px;white-space:pre-wrap;max-height:50vh;overflow-y:auto;color:var(--text)\">${escapeHtml(data.content)}</pre>\n `;\n}\n", "// \u2500\u2500 Sidebar Collapse \u2500\u2500\n// Toggle left/right sidebars. Responsive-aware:\n// - Wide viewport (>900px): toggle *-collapsed classes\n// - Narrow viewport (\u2264900px): CSS auto-collapses, toggle *-expanded to override\n\nconst STORAGE_KEY = 'sidebarState';\nconst BREAKPOINT = 900;\n\nexport function initSidebar() {\n const saved = JSON.parse(localStorage.getItem(STORAGE_KEY) || '{}');\n if (saved.left) document.body.classList.add('left-collapsed');\n if (saved.right) document.body.classList.add('right-collapsed');\n\n document.getElementById('toggleLeft')?.addEventListener('click', toggleLeft);\n document.getElementById('toggleRight')?.addEventListener('click', toggleRight);\n\n // On resize: sync classes with viewport mode\n window.addEventListener('resize', () => {\n if (window.innerWidth > BREAKPOINT) {\n // Wide: remove expanded, restore collapsed from storage\n document.body.classList.remove('left-expanded', 'right-expanded');\n const s = JSON.parse(localStorage.getItem(STORAGE_KEY) || '{}');\n document.body.classList.toggle('left-collapsed', !!s.left);\n document.body.classList.toggle('right-collapsed', !!s.right);\n } else {\n // Narrow: suspend collapsed (CSS media query handles auto-collapse)\n document.body.classList.remove('left-collapsed', 'right-collapsed');\n }\n syncIcons();\n });\n\n // If starting narrow, suspend collapsed\n if (window.innerWidth <= BREAKPOINT) {\n document.body.classList.remove('left-collapsed', 'right-collapsed');\n }\n\n syncIcons();\n}\n\nfunction isNarrow() {\n return window.innerWidth <= BREAKPOINT;\n}\n\nexport function toggleLeft() {\n if (isNarrow()) {\n // Narrow mode: toggle expanded override\n document.body.classList.toggle('left-expanded');\n } else {\n // Wide mode: toggle collapsed\n document.body.classList.toggle('left-collapsed');\n }\n save();\n syncIcons();\n}\n\nexport function toggleRight() {\n if (isNarrow()) {\n document.body.classList.toggle('right-expanded');\n } else {\n document.body.classList.toggle('right-collapsed');\n }\n save();\n syncIcons();\n}\n\nfunction isLeftOpen() {\n if (isNarrow()) return document.body.classList.contains('left-expanded');\n return !document.body.classList.contains('left-collapsed');\n}\n\nfunction isRightOpen() {\n if (isNarrow()) return document.body.classList.contains('right-expanded');\n return !document.body.classList.contains('right-collapsed');\n}\n\nfunction syncIcons() {\n const leftBtn = document.getElementById('toggleLeft');\n const rightBtn = document.getElementById('toggleRight');\n if (leftBtn) leftBtn.textContent = isLeftOpen() ? '\u25C0' : '\u25B6';\n if (rightBtn) rightBtn.textContent = isRightOpen() ? '\u25B6' : '\u25C0';\n}\n\nfunction save() {\n localStorage.setItem(STORAGE_KEY, JSON.stringify({\n left: document.body.classList.contains('left-collapsed'),\n right: document.body.classList.contains('right-collapsed'),\n }));\n}\n", "// \u2500\u2500 Theme Toggle \u2500\u2500\n// Dark/Light theme switching with localStorage persistence\n// Swaps CSS data-theme attribute + highlight.js stylesheet\n\nconst STORAGE_KEY = 'theme';\nconst HLJS_DARK = 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/styles/github-dark.min.css';\nconst HLJS_LIGHT = 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/styles/github.min.css';\n\nexport function initTheme() {\n // Detect: localStorage \u2192 OS preference \u2192 default dark\n const saved = localStorage.getItem(STORAGE_KEY);\n const prefer = window.matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark';\n const theme = saved || prefer;\n applyTheme(theme);\n\n document.getElementById('toggleTheme')?.addEventListener('click', toggleTheme);\n}\n\nfunction toggleTheme() {\n const current = document.documentElement.getAttribute('data-theme') || 'dark';\n const next = current === 'dark' ? 'light' : 'dark';\n applyTheme(next);\n localStorage.setItem(STORAGE_KEY, next);\n}\n\nfunction applyTheme(theme) {\n document.documentElement.setAttribute('data-theme', theme);\n\n // Update button icon (SVG sun/moon swap)\n const btn = document.getElementById('toggleTheme');\n if (btn) {\n btn.classList.toggle('is-light', theme === 'light');\n }\n\n // Swap highlight.js theme\n const hljsLink = document.getElementById('hljsTheme');\n if (hljsLink) {\n hljsLink.href = theme === 'dark' ? HLJS_DARK : HLJS_LIGHT;\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["state", "init_state", "__esmMin", "api_exports", "__export", "api", "apiFire", "apiJson", "path", "opts", "res", "json", "e", "method", "body", "init_api", "__esmMin", "toModelMap", "registry", "out", "key", "value", "normalizeRegistry", "input", "normalized", "applyRegistry", "CLI_REGISTRY", "CLI_KEYS", "MODEL_MAP", "loadCliRegistry", "data", "api", "FALLBACK_CLI_REGISTRY", "getCliKeys", "getCliMeta", "cli", "ROLE_PRESETS", "init_constants", "__esmMin", "init_api", "employees_exports", "__export", "addEmployee", "deleteEmployee", "loadEmployees", "onEmpCliChange", "onEmpRoleChange", "renderEmployees", "updateEmployee", "data", "api", "state", "el", "t", "cliKeys", "getCliKeys", "a", "models", "MODEL_MAP", "legacyVal", "matched", "ROLE_PRESETS", "r", "presetVal", "isCustom", "escapeHtml", "c", "ps", "getAgentPhase", "p", "pl", "apiJson", "id", "apiFire", "cli", "sel", "m", "preset", "customEl", "init_employees", "__esmMin", "init_state", "init_constants", "init_render", "init_ws", "init_i18n", "init_api", "skills_exports", "__export", "filterSkills", "loadSkills", "renderSkills", "toggleSkill", "res", "fetchWithLocale", "state", "t", "list", "count", "filtered", "s", "KNOWN_CATS", "enabledCount", "reqParts", "escapeHtml", "id", "currentlyEnabled", "endpoint", "apiJson", "e", "cat", "btn", "b", "init_skills", "__esmMin", "init_state", "init_i18n", "init_api", "init_render", "getPreferredLocale", "key", "LOCALE_KEYS", "saved", "syncStoredLocale", "locale", "value", "init_locale", "__esmMin", "slash_commands_exports", "__export", "close", "handleClick", "handleKeydown", "handleOutsideClick", "isDropdownOpen", "loadCommands", "update", "looksLikeFilePath", "text", "tok", "escapeHtml", "str", "filterCommands", "partial", "prefix", "cmdList", "c", "showDropdown", "el", "dropdown", "inp", "input", "closeTimer", "isOpen", "render", "filtered", "t", "cmd", "i", "selected", "selectedIdx", "applySelection", "execute", "locale", "getPreferredLocale", "url", "api", "err", "raw", "item", "idx", "init_slash_commands", "__esmMin", "init_locale", "init_i18n", "init_api", "settings_exports", "__export", "applyCustomModel", "closePromptModal", "getModelValue", "handleModelSelect", "installMcpGlobal", "loadCliStatus", "loadFallbackOrder", "loadMcpServers", "loadSettings", "onCliChange", "openPromptModal", "saveActiveCliSettings", "saveFallbackOrder", "savePerCli", "savePromptFromModal", "saveTelegramSettings", "setPerm", "setTelegram", "syncMcpServers", "updateSettings", "toCap", "cli", "getModelSelect", "getCustomModelInput", "getEffortSelect", "setSelectOptions", "selectEl", "values", "includeCustom", "includeDefault", "selected", "defaultHtml", "customHtml", "t", "opts", "v", "escapeHtml", "o", "appendCustomOption", "value", "opt", "customOpt", "syncCliOptionSelects", "settings", "cliKeys", "getCliKeys", "selCli", "current", "label", "getCliMeta", "memCli", "syncPerCliModelAndEffortControls", "modelSel", "MODEL_MAP", "effortSel", "meta", "options", "unique", "noneLabel", "syncActiveEffortOptions", "selEffort", "efforts", "loadCliRegistry", "s", "api", "syncStoredLocale", "cfg", "modelEl", "effortEl", "ao", "pc", "activeModel", "activeEffort", "loadTelegramSettings", "d", "el", "names", "n", "resultEl", "apiJson", "r", "k", "e", "p", "save", "apiFire", "sel", "customInput", "inputEl", "val", "select", "perCli", "models", "oldInput", "inp", "model", "effort", "overrides", "token", "chatIdsRaw", "allowedChatIds", "enabled", "tg", "container", "allClis", "active", "slotCount", "html", "i", "fallbackOrder", "force", "interval", "state", "renderCliStatus", "cliStatus", "quota", "data", "AUTH_HINTS", "name", "info", "q", "dotClass", "accountLine", "parts", "authHint", "hint", "windowsHtml", "w", "pct", "barColor", "content", "init_settings", "__esmMin", "init_constants", "init_render", "init_locale", "init_i18n", "init_api", "init_state", "initI18n", "saved", "browserLang", "fallbackDict", "fetchLocale", "dict", "currentLocale", "applyI18n", "lang", "api", "t", "key", "params", "val", "k", "v", "el", "setLang", "loadEmployees", "loadSkills", "loadCommands", "loadSettings", "getLang", "fetchWithLocale", "url", "init", "u", "init_i18n", "__esmMin", "escapeHtml", "str", "sanitizeHtml", "html", "stripOrchestration", "text", "cleaned", "renderMath", "_", "tex", "renderMermaidBlocks", "el", "code", "id", "mermaidId", "svg", "rawSvg", "zoomBtn", "openMermaidOverlay", "err", "errMsg", "svgHtml", "overlay", "svgEl", "close", "e", "handler", "ensureMarked", "markedReady", "renderer", "lang", "highlighted", "labelText", "t", "renderFallback", "rehighlightAll", "c", "raw", "ensureCopyDelegation", "copyDelegationReady", "label", "wrapper", "codeEl", "orig", "renderMarkdown", "init_render", "__esmMin", "init_i18n", "waitForHljs", "waitForMermaid", "getAppName", "currentName", "setAppName", "name", "DEFAULT_NAME", "STORAGE_KEY", "input", "initAppName", "inp", "e", "init_appname", "__esmMin", "ui_exports", "__export", "addMessage", "addSystemMsg", "appendAgentText", "finalizeAgent", "handleSave", "initMsgCopy", "loadMemory", "loadMessages", "loadStats", "scrollToBottom", "setStatus", "switchTab", "updateQueueBadge", "s", "badge", "btn", "state", "t", "count", "el", "text", "extraClass", "type", "container", "div", "typeClass", "content", "toolLog", "now", "lastFinalizeTs", "toolHtml", "counts", "summaryParts", "icon", "n", "logLines", "escapeHtml", "renderMarkdown", "role", "rendered", "copyBtn", "getAppName", "c", "name", "targetBtn", "b", "tabMap", "m", "msgs", "api", "msg", "raw", "items", "list", "init_ui", "__esmMin", "init_state", "init_render", "init_appname", "init_i18n", "init_api", "connect", "state", "getLang", "msg", "setStatus", "agentPhaseState", "m", "updateQueueBadge", "addSystemMsg", "agents", "names", "t", "appendAgentText", "finalizeAgent", "addMessage", "getAgentPhase", "agentId", "init_ws", "__esmMin", "init_state", "init_ui", "init_i18n", "init_ws", "init_ui", "init_state", "init_ui", "init_locale", "init_i18n", "init_slash_commands", "init_api", "sendMessage", "input", "state", "apiFire", "text", "firstToken", "isFilePath", "resetInputHeight", "close", "signal", "timer", "ac", "locale", "getPreferredLocale", "res", "result", "addMessage", "apiJson", "addSystemMsg", "err", "t", "displayMsg", "f", "prompt", "uploadFile", "p", "clearAttachedFiles", "data", "updateQueueBadge", "handleKey", "file", "attachFiles", "files", "renderFilePreview", "removeAttachedFile", "index", "preview", "listEl", "i", "size", "clearChat", "autoResize", "el", "initAutoResize", "initDragDrop", "chatArea", "overlay", "dragCounter", "e", "items", "item", "blob", "ts", "ext", "named", "init_slash_commands", "init_skills", "init_settings", "init_employees", "init_state", "init_i18n", "init_api", "init_render", "openHeartbeatModal", "data", "api", "state", "renderHeartbeatJobs", "closeHeartbeatModal", "container", "t", "job", "i", "escapeHtml", "active", "j", "addHeartbeatJob", "saveHeartbeatJobs", "removeHeartbeatJob", "toggleHeartbeatJob", "apiJson", "initHeartbeatBadge", "init_render", "init_api", "openMemoryModal", "data", "api", "renderMemFiles", "closeMemoryModal", "switchMemTab", "tab", "setMemEnabled", "v", "apiJson", "saveMemSettings", "files", "container", "f", "escapeHtml", "deleteMemFile", "name", "viewMemFile", "init_state", "init_constants", "init_appname", "STORAGE_KEY", "initSidebar", "saved", "STORAGE_KEY", "toggleLeft", "toggleRight", "s", "syncIcons", "isNarrow", "save", "isLeftOpen", "isRightOpen", "leftBtn", "rightBtn", "STORAGE_KEY", "HLJS_DARK", "HLJS_LIGHT", "initTheme", "saved", "prefer", "applyTheme", "toggleTheme", "next", "theme", "btn", "hljsLink", "init_i18n", "sendMessage", "chatInput", "handleKeydown", "handleKey", "slashInputRaf", "update", "handleClick", "handleOutsideClick", "clearAttachedFiles", "btn", "removeAttachedFile", "openMemoryModal", "clearChat", "openHeartbeatModal", "next", "getLang", "setLang", "t", "state", "idx", "c", "names", "switchTab", "handleSave", "onCliChange", "saveActiveCliSettings", "
|
|
4
|
+
"sourcesContent": ["// \u2500\u2500 Shared State Module \u2500\u2500\n// All modules import this to access/modify shared state.\n// Object reference ensures mutations are seen across modules.\n\nexport const state = {\n ws: null,\n agentBusy: false,\n employees: [],\n allSkills: [],\n currentSkillFilter: 'all',\n currentAgentDiv: null,\n attachedFiles: [],\n heartbeatJobs: [],\n cliStatusCache: null,\n cliStatusTs: 0,\n};\n", "// \u2500\u2500 API Fetch Wrapper \u2500\u2500\n// All API calls centralized for error handling + ok/data unwrapping\n\n/**\n * @param {string} path - API path (e.g. '/api/settings')\n * @param {RequestInit} opts - fetch options\n * @returns {Promise<any|null>} - data on success, null on failure\n */\nexport async function api(path, opts = {}) {\n try {\n const res = await fetch(path, opts);\n if (!res.ok) {\n console.warn(`[api] ${opts.method || 'GET'} ${path} \u2192 ${res.status}`);\n return null;\n }\n const contentType = res.headers.get('content-type') || '';\n if (!contentType.includes('json')) return null;\n const json = await res.json();\n // Phase 9.2 dual-response compat: { ok, data } or bare response\n if (json && typeof json === 'object' && 'ok' in json && 'data' in json) {\n if (!json.ok) {\n console.warn(`[api] ${path} \u2192 ok:false`, json.error || '');\n return null;\n }\n return json.data;\n }\n return json;\n } catch (e) {\n console.warn(`[api] ${path} failed:`, e.message);\n return null;\n }\n}\n\n/**\n * POST/PUT/DELETE JSON request\n */\nexport async function apiJson(path, method, body) {\n return api(path, {\n method,\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n}\n\n/**\n * fire-and-forget: ignores result\n */\nexport function apiFire(path, method = 'POST', body) {\n const opts = { method };\n if (body) {\n opts.headers = { 'Content-Type': 'application/json' };\n opts.body = JSON.stringify(body);\n }\n fetch(path, opts).catch(() => { });\n}\n", "// \u2500\u2500 Shared constants (frontend) \u2500\u2500\nimport { api } from './api.js';\n\nconst FALLBACK_CLI_REGISTRY = {\n claude: {\n label: 'Claude',\n efforts: ['low', 'medium', 'high'],\n models: ['claude-sonnet-4-6', 'claude-opus-4-6', 'claude-sonnet-4-6[1m]', 'claude-opus-4-6[1m]', 'claude-haiku-4-5-20251001'],\n },\n codex: {\n label: 'Codex',\n efforts: ['low', 'medium', 'high', 'xhigh'],\n models: ['gpt-5.3-codex', 'gpt-5.3-codex-spark', 'gpt-5.2-codex', 'gpt-5.1-codex-max', 'gpt-5.1-codex-mini'],\n },\n gemini: {\n label: 'Gemini',\n efforts: [],\n models: ['gemini-3.0-pro-preview', 'gemini-3.1-pro-preview', 'gemini-2.5-pro', 'gemini-3-flash-preview', 'gemini-2.5-flash'],\n },\n opencode: {\n label: 'OpenCode',\n efforts: ['minimal', 'low', 'high', 'max'],\n models: [\n 'anthropic/claude-opus-4-6-thinking',\n 'anthropic/claude-sonnet-4-6-thinking',\n 'anthropic/claude-sonnet-4-6',\n 'openai/gpt-5.3-codex-xhigh',\n 'openai/gpt-5.3-codex-high',\n 'opencode/big-pickle',\n 'opencode/GLM-5 Free',\n 'opencode/MiniMax M2.5 Free',\n 'opencode/Kimi K2.5 Free',\n 'opencode/GPT 5 Nano Free',\n 'opencode/Grok Code Fast 1 Free',\n ],\n },\n copilot: {\n label: 'Copilot',\n efforts: ['low', 'medium', 'high'],\n effortNote: '\u2192 ~/.copilot/config.json',\n models: [\n 'claude-sonnet-4.6',\n 'claude-opus-4.6',\n 'claude-opus-4.6-fast',\n 'claude-haiku-4.5',\n 'gpt-5.3-codex',\n 'gpt-5.2-codex',\n 'gpt-5.1-codex',\n 'gpt-4.1',\n 'gpt-5-mini',\n 'gemini-3-pro-preview',\n ],\n },\n};\n\nfunction toModelMap(registry) {\n const out = {};\n for (const [key, value] of Object.entries(registry || {})) {\n out[key] = Array.isArray(value?.models) ? [...value.models] : [];\n }\n return out;\n}\n\nfunction normalizeRegistry(input) {\n const out = {};\n for (const [key, value] of Object.entries(input || {})) {\n if (!value || typeof value !== 'object') continue;\n const normalized = {\n label: value.label || key,\n efforts: Array.isArray(value.efforts) ? [...value.efforts] : [],\n models: Array.isArray(value.models) ? [...value.models] : [],\n };\n if (typeof value.effortNote === 'string' && value.effortNote.trim()) {\n normalized.effortNote = value.effortNote;\n }\n out[key] = normalized;\n }\n return out;\n}\n\nexport let CLI_REGISTRY = normalizeRegistry(FALLBACK_CLI_REGISTRY);\nexport let CLI_KEYS = Object.keys(CLI_REGISTRY);\nexport let MODEL_MAP = toModelMap(CLI_REGISTRY);\n\nfunction applyRegistry(registry) {\n const normalized = normalizeRegistry(registry);\n if (!Object.keys(normalized).length) return false;\n CLI_REGISTRY = normalized;\n CLI_KEYS = Object.keys(normalized);\n MODEL_MAP = toModelMap(normalized);\n return true;\n}\n\nexport async function loadCliRegistry() {\n try {\n const data = await api('/api/cli-registry');\n if (!data || !applyRegistry(data)) throw new Error('invalid registry');\n } catch (e) {\n console.warn('[cli-registry] fallback:', e.message);\n applyRegistry(FALLBACK_CLI_REGISTRY);\n }\n return CLI_REGISTRY;\n}\n\nexport function getCliKeys() {\n return CLI_KEYS;\n}\n\nexport function getCliMeta(cli) {\n return CLI_REGISTRY[cli] || null;\n}\n\nexport const ROLE_PRESETS = [\n { value: 'frontend', labelKey: 'role.label.frontend', label: 'Frontend', prompt: 'UI/UX, CSS, components', skill: 'dev-frontend' },\n { value: 'backend', labelKey: 'role.label.backend', label: 'Backend', prompt: 'API, DB, server logic', skill: 'dev-backend' },\n { value: 'data', labelKey: 'role.label.data', label: 'Data', prompt: 'Data pipeline, analysis, ML', skill: 'dev-data' },\n { value: 'docs', labelKey: 'role.label.docs', label: 'Docs', prompt: 'Documentation, README, API docs', skill: 'documentation' },\n { value: 'custom', labelKey: 'role.label.custom', label: 'Custom...', prompt: '', skill: null },\n];\n", "// \u2500\u2500 Employees Feature \u2500\u2500\nimport { state } from '../state.js';\nimport { MODEL_MAP, ROLE_PRESETS, getCliKeys } from '../constants.js';\nimport { escapeHtml } from '../render.js';\nimport { getAgentPhase } from '../ws.js';\nimport { t } from './i18n.js';\nimport { api, apiJson, apiFire } from '../api.js';\n\nexport async function loadEmployees() {\n const data = await api('/api/employees');\n state.employees = data || [];\n renderEmployees();\n}\n\nexport function renderEmployees() {\n const el = document.getElementById('employeesList');\n if (state.employees.length === 0) {\n el.innerHTML = `<div style=\"color:var(--text-dim);font-size:11px;padding:4px 0\">${t('emp.addPrompt')}</div>`;\n return;\n }\n const cliKeys = getCliKeys();\n el.innerHTML = state.employees.map(a => {\n const models = MODEL_MAP[a.cli] || [];\n // Legacy role prompt \u2192 new preset migration\n const LEGACY_MAP = {\n // Legacy Korean roles (backward compat with old DB data)\n 'React/Vue \uAE30\uBC18 UI \uCEF4\uD3EC\uB10C\uD2B8 \uAC1C\uBC1C, \uC2A4\uD0C0\uC77C\uB9C1': 'frontend',\n 'API \uC11C\uBC84, DB \uC2A4\uD0A4\uB9C8, \uBE44\uC988\uB2C8\uC2A4 \uB85C\uC9C1 \uAD6C\uD604': 'backend',\n '\uD504\uB860\uD2B8\uC5D4\uB4DC\uC640 \uBC31\uC5D4\uB4DC \uBAA8\uB450 \uB2F4\uB2F9': 'frontend',\n 'CI/CD, Docker, \uC778\uD504\uB77C \uC790\uB3D9\uD654': 'backend',\n '\uD14C\uC2A4\uD2B8 \uC791\uC131, \uBC84\uADF8 \uC7AC\uD604, \uD488\uC9C8 \uAD00\uB9AC': 'custom',\n '\uB370\uC774\uD130 \uD30C\uC774\uD504\uB77C\uC778, ETL, \uBD84\uC11D \uCFFC\uB9AC': 'data',\n 'API \uBB38\uC11C\uD654, README, \uAC00\uC774\uB4DC \uC791\uC131': 'docs',\n // Previous default Korean preset prompts\n 'UI/UX \uAD6C\uD604, CSS, \uCEF4\uD3EC\uB10C\uD2B8 \uAC1C\uBC1C': 'frontend',\n 'API, DB, \uC11C\uBC84 \uB85C\uC9C1 \uAD6C\uD604': 'backend',\n '\uB370\uC774\uD130 \uD30C\uC774\uD504\uB77C\uC778, \uBD84\uC11D, ML': 'data',\n '\uBB38\uC11C\uD654, README, API docs': 'docs',\n // Phase 6.9: new English preset prompts\n 'UI/UX, CSS, components': 'frontend',\n 'API, DB, server logic': 'backend',\n 'Data pipeline, analysis, ML': 'data',\n 'Documentation, README, API docs': 'docs',\n };\n const legacyVal = LEGACY_MAP[a.role];\n const matched = legacyVal ? ROLE_PRESETS.find(r => r.value === legacyVal) : ROLE_PRESETS.find(r => r.prompt === a.role);\n const presetVal = matched ? matched.value : (a.role ? 'custom' : 'frontend');\n const isCustom = presetVal === 'custom';\n\n return `\n <div class=\"settings-group\" style=\"margin-bottom:8px;padding:8px 10px\">\n <div style=\"display:flex;align-items:center;gap:6px;margin-bottom:6px\">\n <span style=\"width:8px;height:8px;border-radius:50%;background:var(--accent);display:inline-block;flex-shrink:0\"></span>\n <input style=\"flex:1;background:none;border:none;color:var(--text);font-size:12px;font-weight:600;font-family:inherit;outline:none\"\n value=\"${escapeHtml(a.name || 'Agent')}\"\n data-emp-name=\"${a.id}\">\n <button style=\"background:none;border:none;color:var(--text-dim);cursor:pointer;font-size:12px\" data-emp-delete=\"${a.id}\" title=\"${t('emp.delete')}\">\u2715</button>\n </div>\n <div style=\"display:grid;grid-template-columns:1fr 1fr;gap:4px;margin-bottom:4px\">\n <div>\n <label>CLI</label>\n <select data-emp-cli=\"${a.id}\">\n ${cliKeys.map(c => `<option${a.cli === c ? ' selected' : ''}>${c}</option>`).join('')}\n </select>\n </div>\n <div>\n <label>Model</label>\n <select data-emp-model=\"${a.id}\">\n <option value=\"default\"${(!a.model || a.model === 'default') ? ' selected' : ''}>default</option>\n ${models.map(m => `<option${a.model === m ? ' selected' : ''}>${m}</option>`).join('')}\n </select>\n </div>\n </div>\n <div>\n <label>Role</label>\n <select data-emp-role=\"${a.id}\">\n ${ROLE_PRESETS.map(r => `<option value=\"${r.value}\"${presetVal === r.value ? ' selected' : ''}>${r.label}</option>`).join('')}\n </select>\n <textarea data-emp-custom=\"${a.id}\" style=\"display:${isCustom ? 'block' : 'none'};margin-top:4px;width:100%;height:40px;background:var(--bg);border:1px solid var(--border);color:var(--text);padding:4px 6px;border-radius:4px;font-size:10px;font-family:inherit;resize:vertical\"\n placeholder=\"${t('emp.customRole')}\">${isCustom ? escapeHtml(a.role) : ''}</textarea>\n </div>\n <div style=\"margin-top:4px;font-size:10px;display:flex;align-items:center;gap:6px\">\n <span style=\"color:${a.status === 'running' ? '#fbbf24' : 'var(--green)'}\">\u25CF ${a.status || 'idle'}</span>\n ${(() => { const ps = getAgentPhase(a.id); const p = ps?.phase || a.phase; const pl = ps?.phaseLabel || a.phaseLabel; return p ? `<span style=\"background:${({ 1: '#60a5fa', 2: '#a78bfa', 3: '#34d399', 4: '#fbbf24', 5: '#f472b6' })[p] || '#888'};color:#000;padding:1px 6px;border-radius:9px;font-size:9px\">${pl || 'P' + p}</span>` : ''; })()}\n </div>\n </div>`;\n }).join('');\n}\n\nexport async function addEmployee() {\n await apiJson('/api/employees', 'POST', {});\n}\n\nexport async function updateEmployee(id, data) {\n await apiJson(`/api/employees/${id}`, 'PUT', data);\n}\n\nexport async function deleteEmployee(id) {\n apiFire(`/api/employees/${id}`, 'DELETE');\n}\n\nexport function onEmpCliChange(id, cli) {\n const models = MODEL_MAP[cli] || [];\n const sel = document.querySelector(`[data-emp-model=\"${id}\"]`);\n sel.innerHTML = `<option value=\"default\" selected>default</option>` + models.map(m => `<option>${escapeHtml(m)}</option>`).join('') + `<option value=\"__custom__\">${t('emp.customModel')}</option>`;\n updateEmployee(id, { cli, model: 'default' });\n}\n\nexport function onEmpRoleChange(id, presetVal) {\n const preset = ROLE_PRESETS.find(r => r.value === presetVal);\n const customEl = document.querySelector(`[data-emp-custom=\"${id}\"]`);\n if (presetVal === 'custom') {\n customEl.style.display = 'block';\n customEl.focus();\n } else {\n customEl.style.display = 'none';\n customEl.value = '';\n updateEmployee(id, { role: preset?.prompt || '' });\n }\n}\n", "// \u2500\u2500 Skills Feature \u2500\u2500\nimport { state } from '../state.js';\nimport { t, fetchWithLocale } from './i18n.js';\nimport { apiJson } from '../api.js';\nimport { escapeHtml } from '../render.js';\n\nexport async function loadSkills() {\n try {\n const res = await fetchWithLocale('/api/skills');\n state.allSkills = await res.json();\n renderSkills();\n } catch (e) {\n document.getElementById('skillsList').innerHTML =\n `<div style=\"color:var(--text-dim);font-size:11px\">${t('skill.loadFail')}</div>`;\n }\n}\n\nconst KNOWN_CATS = ['productivity', 'communication', 'devtools', 'ai-media', 'utility', 'smarthome', 'automation'];\n\nexport function renderSkills() {\n const list = document.getElementById('skillsList');\n const count = document.getElementById('skillsCount');\n let filtered = state.allSkills;\n if (state.currentSkillFilter === 'installed') {\n filtered = state.allSkills.filter(s => s.enabled);\n } else if (state.currentSkillFilter === 'other') {\n filtered = state.allSkills.filter(s => !KNOWN_CATS.includes(s.category));\n } else if (state.currentSkillFilter !== 'all') {\n filtered = state.allSkills.filter(s => s.category === state.currentSkillFilter);\n }\n const enabledCount = state.allSkills.filter(s => s.enabled).length;\n count.textContent = t('skill.count', { active: enabledCount, total: state.allSkills.length });\n\n list.innerHTML = filtered.map(s => {\n const reqParts = [];\n if (s.requires?.env) reqParts.push('\uD83D\uDD11 ' + s.requires.env.join(', '));\n if (s.requires?.bins) reqParts.push('\u2699\uFE0F ' + s.requires.bins.join(', '));\n if (s.install) reqParts.push(s.install);\n return `\n <div class=\"skill-card ${s.enabled ? 'enabled' : ''}\">\n <div class=\"skill-card-header\">\n <span class=\"skill-emoji\">${escapeHtml(s.emoji || '\uD83D\uDD27')}</span>\n <span class=\"skill-name\">${escapeHtml(s.name || s.id)}</span>\n <button class=\"skill-toggle ${s.enabled ? 'on' : 'off'}\"\n data-skill-id=\"${escapeHtml(s.id)}\" data-skill-enabled=\"${s.enabled}\"></button>\n </div>\n <div class=\"skill-desc\">${escapeHtml(s.description || '')}</div>\n ${reqParts.length ? `<div class=\"skill-req\">${reqParts.join(' \u00B7 ')}</div>` : ''}\n </div>`;\n }).join('');\n}\n\nexport async function toggleSkill(id, currentlyEnabled) {\n const endpoint = currentlyEnabled ? '/api/skills/disable' : '/api/skills/enable';\n try {\n await apiJson(endpoint, 'POST', { id });\n await loadSkills();\n } catch (e) {\n console.error('toggleSkill error:', e);\n }\n}\n\nexport function filterSkills(cat, btn) {\n state.currentSkillFilter = cat;\n document.querySelectorAll('.skill-filter').forEach(b => b.classList.remove('active'));\n if (btn) btn.classList.add('active');\n renderSkills();\n}\n", "// \u2500\u2500 Web Locale Helpers \u2500\u2500\n\nconst LOCALE_KEYS = ['claw_locale', 'claw.locale'];\n\nexport function getPreferredLocale() {\n try {\n for (const key of LOCALE_KEYS) {\n const saved = localStorage.getItem(key);\n if (saved) return saved;\n }\n } catch { }\n return navigator.language || 'ko';\n}\n\nexport function syncStoredLocale(locale) {\n const value = String(locale || '').trim();\n if (!value) return;\n try {\n for (const key of LOCALE_KEYS) {\n localStorage.setItem(key, value);\n }\n } catch { }\n}\n", "// \u2500\u2500 Slash Command Dropdown \u2500\u2500\nimport { getPreferredLocale } from '../locale.js';\nimport { t } from './i18n.js';\nimport { api } from '../api.js';\n\nlet cmdList = []; // { name, desc, args, category }[]\nlet filtered = []; // currently filtered list\nlet selectedIdx = -1; // -1 = none\nlet isOpen = false;\nlet closeTimer = null;\n\n// File paths like /Users/junny/... or /tmp/foo \u2014 not commands\nfunction looksLikeFilePath(text) {\n const after = String(text || '').slice(1).trim();\n const tok = after.split(/\\s+/)[0] || '';\n return tok.includes('/') || tok.includes('\\\\');\n}\n\nconst dropdown = () => document.getElementById('cmdDropdown');\nconst input = () => document.getElementById('chatInput');\n\nfunction escapeHtml(str) {\n return String(str || '')\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"');\n}\n\nfunction filterCommands(partial) {\n const prefix = String(partial || '').toLowerCase();\n return cmdList.filter(c => (`/${c.name}`).startsWith(prefix));\n}\n\nfunction showDropdown() {\n const el = dropdown();\n const inp = input();\n if (!el || !inp) return;\n\n if (closeTimer) {\n clearTimeout(closeTimer);\n closeTimer = null;\n }\n\n el.style.display = 'block';\n requestAnimationFrame(() => el.classList.add('visible'));\n isOpen = true;\n\n inp.setAttribute('aria-expanded', 'true');\n}\n\nfunction render() {\n const el = dropdown();\n const inp = input();\n if (!el || !inp) return;\n\n if (!filtered.length) {\n if (!inp.value.startsWith('/') || looksLikeFilePath(inp.value)) { close(); return; }\n\n el.innerHTML = `\n <div class=\"cmd-item cmd-empty\" role=\"option\" aria-disabled=\"true\">\n ${t('cmd.noMatch')}\n </div>\n `;\n showDropdown();\n inp.setAttribute('aria-activedescendant', '');\n return;\n }\n\n el.innerHTML = filtered.map((cmd, i) => {\n const selected = i === selectedIdx;\n return `<div class=\"cmd-item${selected ? ' selected' : ''}\"\n role=\"option\"\n id=\"cmd-item-${i}\"\n aria-selected=\"${selected}\"\n data-index=\"${i}\">\n <span class=\"cmd-name\">/${escapeHtml(cmd.name)}</span>\n <span class=\"cmd-desc\">${escapeHtml(cmd.desc)}</span>\n ${cmd.args ? `<span class=\"cmd-args\">${escapeHtml(cmd.args)}</span>` : ''}\n </div>`;\n }).join('');\n\n showDropdown();\n inp.setAttribute('aria-activedescendant', selectedIdx >= 0 ? `cmd-item-${selectedIdx}` : '');\n\n const selected = el.querySelector('.selected');\n if (selected) selected.scrollIntoView({ block: 'nearest' });\n}\n\nfunction applySelection(execute) {\n const cmd = filtered[selectedIdx];\n const inp = input();\n if (!cmd || !inp) { close(); return; }\n\n close();\n if (cmd.args || !execute) {\n inp.value = `/${cmd.name} `;\n inp.focus();\n inp.selectionStart = inp.selectionEnd = inp.value.length;\n return;\n }\n\n inp.value = `/${cmd.name}`;\n inp.dispatchEvent(new Event('cmd-execute', { bubbles: true }));\n}\n\nexport async function loadCommands() {\n try {\n const locale = getPreferredLocale();\n const url = `/api/commands?interface=web&locale=${encodeURIComponent(locale)}`;\n const data = await api(url, { headers: { 'Accept-Language': locale } });\n cmdList = data || [];\n } catch (err) {\n console.warn('[slash-commands] loadCommands failed:', err.message);\n cmdList = [];\n }\n}\n\nexport function close() {\n const el = dropdown();\n\n if (closeTimer) {\n clearTimeout(closeTimer);\n closeTimer = null;\n }\n if (el) {\n el.classList.remove('visible');\n closeTimer = setTimeout(() => {\n if (el.classList.contains('visible')) return;\n el.style.display = 'none';\n el.innerHTML = '';\n }, 150);\n }\n\n isOpen = false;\n selectedIdx = -1;\n filtered = [];\n\n const inp = input();\n if (inp) {\n inp.setAttribute('aria-expanded', 'false');\n inp.setAttribute('aria-activedescendant', '');\n }\n}\n\nexport function update(text) {\n const raw = String(text || '');\n if (!raw.startsWith('/') || raw.includes(' ') || raw.includes('\\n') || looksLikeFilePath(raw)) {\n close();\n return;\n }\n\n filtered = filterCommands(raw);\n selectedIdx = filtered.length ? 0 : -1;\n render();\n}\n\nexport function handleKeydown(e) {\n if (!isOpen) {\n if ((e.key === 'ArrowDown' || e.key === 'ArrowUp') && !e.isComposing) {\n update(input()?.value || '');\n if (!isOpen) return false;\n selectedIdx = e.key === 'ArrowUp' ? filtered.length - 1 : 0;\n render();\n e.preventDefault();\n return true;\n }\n return false;\n }\n\n if (!filtered.length) {\n if (e.key === 'Escape') {\n e.preventDefault();\n close();\n return true;\n }\n return false;\n }\n\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n selectedIdx = Math.min(filtered.length - 1, selectedIdx + 1);\n render();\n return true;\n }\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n selectedIdx = Math.max(0, selectedIdx - 1);\n render();\n return true;\n }\n if (e.key === 'Tab') {\n e.preventDefault();\n applySelection(false);\n return true;\n }\n if (e.key === 'Enter' && !e.shiftKey && !e.isComposing) {\n e.preventDefault();\n applySelection(true);\n return true;\n }\n if (e.key === 'Escape') {\n e.preventDefault();\n close();\n return true;\n }\n return false;\n}\n\nexport function handleClick(e) {\n const item = e.target.closest('.cmd-item');\n if (!item) return;\n const idx = parseInt(item.dataset.index || '-1', 10);\n if (Number.isNaN(idx) || idx < 0) return;\n selectedIdx = Math.min(idx, filtered.length - 1);\n applySelection(true);\n}\n\nexport function handleOutsideClick(e) {\n if (!isOpen) return;\n const el = dropdown();\n const inp = input();\n if (!el || !inp) return;\n if (!el.contains(e.target) && e.target !== inp) {\n close();\n }\n}\n\nexport function isDropdownOpen() {\n return isOpen;\n}\n", "// \u2500\u2500 Settings Feature \u2500\u2500\nimport { MODEL_MAP, loadCliRegistry, getCliKeys, getCliMeta } from '../constants.js';\nimport { escapeHtml } from '../render.js';\nimport { syncStoredLocale } from '../locale.js';\nimport { t } from './i18n.js';\nimport { api, apiJson, apiFire } from '../api.js';\n\nfunction toCap(cli) {\n return cli.charAt(0).toUpperCase() + cli.slice(1);\n}\n\nfunction getModelSelect(cli) {\n return document.getElementById('model' + toCap(cli));\n}\n\nfunction getCustomModelInput(cli) {\n return document.getElementById('customModel' + toCap(cli));\n}\n\nfunction getEffortSelect(cli) {\n return document.getElementById('effort' + toCap(cli));\n}\n\nfunction setSelectOptions(selectEl, values, { includeCustom = false, includeDefault = false, selected = '' } = {}) {\n if (!selectEl) return;\n const defaultHtml = includeDefault ? '<option value=\"default\">default</option>' : '';\n const customHtml = includeCustom ? `<option value=\"__custom__\">${t('model.customOption')}</option>` : '';\n const opts = (values || []).map(v => `<option value=\"${escapeHtml(v)}\">${escapeHtml(v)}</option>`).join('');\n selectEl.innerHTML = defaultHtml + opts + customHtml;\n\n if (selected && Array.from(selectEl.options).some(o => o.value === selected)) {\n selectEl.value = selected;\n }\n}\n\nfunction appendCustomOption(selectEl, value) {\n if (!selectEl || !value) return;\n if (Array.from(selectEl.options).some(o => o.value === value)) return;\n const opt = document.createElement('option');\n opt.value = value;\n opt.textContent = value;\n const customOpt = selectEl.querySelector('option[value=\"__custom__\"]');\n if (customOpt) selectEl.insertBefore(opt, customOpt);\n else selectEl.appendChild(opt);\n}\n\nfunction syncCliOptionSelects(settings = null) {\n const cliKeys = getCliKeys();\n\n const selCli = document.getElementById('selCli');\n if (selCli) {\n const current = settings?.cli || selCli.value || cliKeys[0] || 'claude';\n selCli.innerHTML = cliKeys.map(cli => {\n const label = getCliMeta(cli)?.label || cli;\n return `<option value=\"${escapeHtml(cli)}\">${escapeHtml(label)}</option>`;\n }).join('');\n if (Array.from(selCli.options).some(o => o.value === current)) selCli.value = current;\n }\n\n const memCli = document.getElementById('memCli');\n if (memCli) {\n const current = settings?.memory?.cli || memCli.value || '';\n memCli.innerHTML = '<option value=\"\">(active CLI)</option>' +\n cliKeys.map(cli => `<option value=\"${escapeHtml(cli)}\">${escapeHtml(cli)}</option>`).join('');\n if (Array.from(memCli.options).some(o => o.value === current)) memCli.value = current;\n }\n}\n\nfunction syncPerCliModelAndEffortControls(settings = null) {\n for (const cli of getCliKeys()) {\n const modelSel = getModelSelect(cli);\n if (modelSel) {\n const selected = settings?.perCli?.[cli]?.model || modelSel.value || '';\n setSelectOptions(modelSel, MODEL_MAP[cli] || [], { includeCustom: true, selected });\n if (selected && !Array.from(modelSel.options).some(o => o.value === selected)) {\n appendCustomOption(modelSel, selected);\n modelSel.value = selected;\n }\n }\n\n const effortSel = getEffortSelect(cli);\n if (effortSel) {\n const meta = getCliMeta(cli);\n const options = [''].concat(meta?.efforts || []);\n const selected = settings?.perCli?.[cli]?.effort || effortSel.value || '';\n const unique = [...new Set(options)];\n const noneLabel = (meta?.efforts?.length === 0 && meta?.effortNote) ? meta.effortNote : '\u2014 none';\n effortSel.innerHTML = unique.map(v => {\n if (!v) return `<option value=\"\">${escapeHtml(noneLabel)}</option>`;\n return `<option value=\"${escapeHtml(v)}\">${escapeHtml(v)}</option>`;\n }).join('');\n if (meta?.effortNote) effortSel.title = meta.effortNote;\n effortSel.disabled = (meta?.efforts?.length === 0 && !!meta?.effortNote);\n if (Array.from(effortSel.options).some(o => o.value === selected)) effortSel.value = selected;\n }\n }\n}\n\nfunction syncActiveEffortOptions(cli, selected = '') {\n const selEffort = document.getElementById('selEffort');\n if (!selEffort) return;\n const meta = getCliMeta(cli);\n if (meta?.effortNote) {\n // Effort managed externally (e.g. Copilot config.json) \u2014 show hint, disable\n selEffort.innerHTML = `<option value=\"\">${escapeHtml(meta.effortNote)}</option>`;\n selEffort.title = meta.effortNote;\n selEffort.disabled = true;\n return;\n }\n const efforts = [''].concat(meta?.efforts || []);\n const unique = [...new Set(efforts)];\n selEffort.innerHTML = unique.map(v => {\n if (!v) return '<option value=\"\">\u2014 none</option>';\n return `<option value=\"${escapeHtml(v)}\">${escapeHtml(v)}</option>`;\n }).join('');\n selEffort.disabled = false;\n selEffort.title = '';\n if (Array.from(selEffort.options).some(o => o.value === selected)) selEffort.value = selected;\n}\n\nexport async function loadSettings() {\n await loadCliRegistry();\n const s = await api('/api/settings');\n if (!s) return;\n syncStoredLocale(s.locale);\n syncCliOptionSelects(s);\n syncPerCliModelAndEffortControls(s);\n\n const selCli = document.getElementById('selCli');\n if (Array.from(selCli.options).some(o => o.value === s.cli)) {\n selCli.value = s.cli;\n }\n document.getElementById('inpCwd').textContent = s.workingDir;\n document.getElementById('headerCli').textContent = s.cli;\n setPerm(s.permissions, false);\n\n if (s.perCli) {\n for (const [cli, cfg] of Object.entries(s.perCli)) {\n const modelEl = getModelSelect(cli);\n const effortEl = getEffortSelect(cli);\n if (modelEl && cfg.model) {\n appendCustomOption(modelEl, cfg.model);\n modelEl.value = cfg.model;\n }\n if (effortEl) effortEl.value = cfg.effort || '';\n }\n }\n\n onCliChange(false);\n const ao = s.activeOverrides?.[s.cli] || {};\n const pc = s.perCli?.[s.cli] || {};\n const activeModel = ao.model || pc.model;\n const activeEffort = ao.effort || pc.effort || '';\n if (activeModel) document.getElementById('selModel').value = activeModel;\n syncActiveEffortOptions(s.cli, activeEffort);\n\n loadTelegramSettings(s);\n loadFallbackOrder(s);\n loadMcpServers();\n}\n\nexport async function loadMcpServers() {\n try {\n const d = await api('/api/mcp');\n if (!d) return;\n const el = document.getElementById('mcpServerList');\n const names = Object.entries(d.servers || {});\n if (!names.length) { el.textContent = t('mcp.noServers'); return; }\n el.innerHTML = names.map(([n, s]) =>\n `<div style=\"padding:2px 0\">\u2022 <b>${n}</b> <span style=\"opacity:.6\">${s.command} ${(s.args || []).slice(0, 2).join(' ')}</span></div>`\n ).join('');\n } catch { }\n}\n\nexport async function syncMcpServers() {\n const resultEl = document.getElementById('mcpSyncResult');\n resultEl.style.display = 'block';\n resultEl.textContent = t('mcp.syncing');\n try {\n const d = await apiJson('/api/mcp/sync', 'POST', {});\n if (!d) { resultEl.textContent = '\u274C sync failed'; return; }\n const r = d.results || {};\n resultEl.innerHTML = Object.entries(r).map(([k, v]) =>\n `${v ? '\u2705' : '\u23ED\uFE0F'} ${k}`\n ).join(' ');\n } catch (e) { resultEl.textContent = '\u274C ' + e.message; }\n}\n\nexport async function installMcpGlobal() {\n const resultEl = document.getElementById('mcpSyncResult');\n resultEl.style.display = 'block';\n resultEl.textContent = t('mcp.installing');\n try {\n const d = await apiJson('/api/mcp/install', 'POST', {});\n if (!d) { resultEl.textContent = '\u274C install failed'; return; }\n resultEl.innerHTML = Object.entries(d.results || {}).map(([k, v]) => {\n const icon = v.status === 'installed' ? '\u2705' : v.status === 'skip' ? '\u23ED\uFE0F' : '\u274C';\n return `${icon} <b>${k}</b>: ${v.status}${v.bin ? ' \u2192 ' + v.bin : ''}`;\n }).join('<br>');\n loadMcpServers();\n } catch (e) { resultEl.textContent = '\u274C ' + e.message; }\n}\n\nexport async function updateSettings() {\n const s = {\n cli: document.getElementById('selCli').value,\n };\n document.getElementById('headerCli').textContent = s.cli;\n await apiJson('/api/settings', 'PUT', s);\n}\n\nexport function setPerm(p, save = true) {\n // Auto-fixed since Phase 3.1 \u2014 no UI toggle, just persist\n if (save) apiFire('/api/settings', 'PUT', { permissions: 'auto' });\n}\n\nexport function getModelValue(cli) {\n const sel = getModelSelect(cli);\n if (!sel) return 'default';\n if (sel.value === '__custom__') {\n const inp = getCustomModelInput(cli);\n return inp?.value?.trim() || sel.options[0]?.value || 'default';\n }\n return sel.value;\n}\n\nexport function handleModelSelect(cli, selectEl) {\n const customInput = getCustomModelInput(cli);\n if (!customInput) return;\n if (selectEl.value === '__custom__') {\n customInput.style.display = 'block';\n customInput.focus();\n } else {\n customInput.style.display = 'none';\n savePerCli();\n }\n}\n\nexport function applyCustomModel(cli, inputEl) {\n const val = inputEl.value.trim();\n if (!val) return;\n const select = getModelSelect(cli);\n if (!select) return;\n appendCustomOption(select, val);\n select.value = val;\n inputEl.style.display = 'none';\n savePerCli();\n}\n\nexport async function savePerCli() {\n const perCli = {};\n for (const cli of getCliKeys()) {\n const modelEl = getModelSelect(cli);\n if (!modelEl) continue;\n const effortEl = getEffortSelect(cli);\n perCli[cli] = {\n model: getModelValue(cli),\n effort: effortEl ? effortEl.value : '',\n };\n }\n await apiJson('/api/settings', 'PUT', { perCli });\n}\n\nexport function onCliChange(save = true) {\n const cli = document.getElementById('selCli').value;\n const models = MODEL_MAP[cli] || [];\n const modelSel = document.getElementById('selModel');\n setSelectOptions(modelSel, models, { includeCustom: true, includeDefault: true });\n document.getElementById('headerCli').textContent = cli;\n syncActiveEffortOptions(cli);\n\n const oldInput = document.getElementById('selModelCustom');\n if (oldInput) oldInput.remove();\n const inp = document.createElement('input');\n inp.type = 'text'; inp.id = 'selModelCustom';\n inp.className = 'custom-model-input';\n inp.placeholder = t('model.placeholder');\n inp.style.display = 'none';\n inp.onchange = function () {\n const val = this.value.trim();\n if (!val) return;\n appendCustomOption(modelSel, val);\n modelSel.value = val;\n this.style.display = 'none';\n saveActiveCliSettings();\n };\n modelSel.parentElement.appendChild(inp);\n modelSel.onchange = function () {\n if (this.value === '__custom__') {\n inp.style.display = 'block';\n inp.focus();\n } else {\n inp.style.display = 'none';\n saveActiveCliSettings();\n }\n };\n\n api('/api/settings').then(s => {\n if (!s) return;\n const ao = s.activeOverrides?.[cli] || {};\n const pc = s.perCli?.[cli] || {};\n const model = ao.model || pc.model;\n const effort = ao.effort || pc.effort || '';\n if (model) {\n appendCustomOption(modelSel, model);\n modelSel.value = model;\n }\n syncActiveEffortOptions(cli, effort);\n });\n\n if (save) updateSettings();\n}\n\nexport async function saveActiveCliSettings() {\n const cli = document.getElementById('selCli').value;\n const modelSel = document.getElementById('selModel');\n let model = modelSel?.value || 'default';\n if (model === '__custom__') {\n model = document.getElementById('selModelCustom')?.value?.trim() || 'default';\n }\n const effortEl = document.getElementById('selEffort');\n const overrides = {};\n overrides[cli] = { model };\n if (!effortEl?.disabled) overrides[cli].effort = effortEl?.value || '';\n await apiJson('/api/settings', 'PUT', { activeOverrides: overrides });\n}\n\n// \u2500\u2500 Telegram \u2500\u2500\nexport async function saveTelegramSettings() {\n const token = document.getElementById('tgToken').value.trim();\n const chatIdsRaw = document.getElementById('tgChatIds').value.trim();\n const allowedChatIds = chatIdsRaw\n ? chatIdsRaw.split(',').map(s => parseInt(s.trim(), 10)).filter(n => !isNaN(n))\n : [];\n await apiJson('/api/settings', 'PUT', { telegram: { token, allowedChatIds } });\n}\n\nexport async function setTelegram(enabled) {\n document.getElementById('tgOn').classList.toggle('active', enabled);\n document.getElementById('tgOff').classList.toggle('active', !enabled);\n await apiJson('/api/settings', 'PUT', { telegram: { enabled } });\n}\n\nfunction loadTelegramSettings(s) {\n if (!s.telegram) return;\n const tg = s.telegram;\n document.getElementById('tgOn').classList.toggle('active', !!tg.enabled);\n document.getElementById('tgOff').classList.toggle('active', !tg.enabled);\n if (tg.token) document.getElementById('tgToken').value = tg.token;\n if (tg.allowedChatIds?.length) {\n document.getElementById('tgChatIds').value = tg.allowedChatIds.join(', ');\n }\n}\n\n// \u2500\u2500 Fallback Order \u2500\u2500\nexport function loadFallbackOrder(s) {\n const container = document.getElementById('fallbackOrderList');\n if (!container) return;\n const allClis = Object.keys(s.perCli || {});\n const active = s.fallbackOrder || [];\n const slotCount = Math.min(allClis.length - 1, 3);\n\n let html = '';\n for (let i = 0; i < slotCount; i++) {\n const current = active[i] || '';\n const opts = allClis.map(cli =>\n `<option value=\"${cli}\" ${cli === current ? 'selected' : ''}>${cli}</option>`\n ).join('');\n html += `\n <div class=\"settings-row sub-row\">\n <label style=\"min-width:60px\">Fallback ${i + 1}</label>\n <select id=\"fallback${i}\"\n style=\"font-size:11px;padding:4px;background:var(--surface);color:var(--text);border:1px solid var(--border);border-radius:4px;flex:1\">\n <option value=\"\">${t('settings.none')}</option>\n ${opts}\n </select>\n </div>`;\n }\n container.innerHTML = html;\n}\n\nexport async function saveFallbackOrder() {\n const selects = document.querySelectorAll('#fallbackOrderList select');\n const fallbackOrder = [...selects].map(s => s.value).filter(Boolean);\n await apiJson('/api/settings', 'PUT', { fallbackOrder });\n}\n\n// \u2500\u2500 CLI Status \u2500\u2500\nimport { state } from '../state.js';\n\nexport async function loadCliStatus(force = false) {\n const interval = Number(localStorage.getItem('cliStatusInterval') || 300);\n if (!force && state.cliStatusCache && interval > 0 && (Date.now() - state.cliStatusTs) < interval * 1000) {\n renderCliStatus(state.cliStatusCache);\n return;\n }\n\n const el = document.getElementById('cliStatusList');\n if (el) el.innerHTML = '<div style=\"color:var(--text-dim);font-size:11px\">Loading...</div>';\n\n const [cliStatus, quota] = await Promise.all([\n api('/api/cli-status'),\n api('/api/quota'),\n ]);\n\n state.cliStatusCache = { cliStatus, quota };\n state.cliStatusTs = Date.now();\n renderCliStatus(state.cliStatusCache);\n}\n\nfunction renderCliStatus(data) {\n const { cliStatus, quota } = data;\n const el = document.getElementById('cliStatusList');\n\n const AUTH_HINTS = {\n claude: { install: 'npm i -g @anthropic-ai/claude-code', auth: 'claude auth' },\n codex: { install: 'npm i -g @openai/codex', auth: 'codex login' },\n gemini: { install: 'npm i -g @google/gemini-cli', auth: `gemini (${t('cli.gemini.auth')})` },\n opencode: { install: 'npm i -g opencode-ai', auth: 'opencode auth' },\n copilot: { install: 'gh copilot --help', auth: '1) gh auth login \u2192 2) gh copilot --help \u2192 3) copilot login' },\n };\n\n let html = '';\n\n if (!cliStatus || typeof cliStatus !== 'object') {\n if (el) el.innerHTML = '<div style=\"color:var(--text-dim);font-size:11px\">Failed to load CLI status</div>';\n return;\n }\n\n for (const [name, info] of Object.entries(cliStatus)) {\n const q = quota[name];\n const dotClass = info.available ? 'ok' : 'missing';\n\n let accountLine = '';\n if (q?.account) {\n const parts = [];\n if (q.account.email) parts.push(q.account.email);\n if (q.account.type) parts.push(q.account.type);\n if (q.account.plan) parts.push(q.account.plan);\n if (q.account.tier) parts.push(q.account.tier);\n if (parts.length) accountLine = `<div style=\"font-size:10px;color:var(--text-dim);margin:2px 0 4px 16px\">${escapeHtml(parts.join(' \u00B7 '))}</div>`;\n }\n\n // Auth hint when CLI is not available\n let authHint = '';\n if (!info.available) {\n const hint = AUTH_HINTS[name];\n if (hint) {\n authHint = `\n <div style=\"font-size:10px;margin:4px 0 2px 16px;padding:6px 8px;background:var(--bg-dim, #1e1e2e);border-radius:4px;border-left:2px solid #fbbf24\">\n <div style=\"color:#fbbf24;margin-bottom:3px\">${t('cli.authRequired')}</div>\n <div style=\"color:var(--text-dim)\"><code style=\"font-size:10px;background:var(--border);padding:1px 4px;border-radius:2px\">${escapeHtml(hint.install)}</code></div>\n <div style=\"color:var(--text-dim);margin-top:2px\"><code style=\"font-size:10px;background:var(--border);padding:1px 4px;border-radius:2px\">${escapeHtml(hint.auth)}</code></div>\n </div>\n `;\n }\n }\n\n let windowsHtml = '';\n if (q?.windows?.length) {\n windowsHtml = q.windows.map(w => {\n const pct = Math.round(w.percent);\n const barColor = pct > 80 ? '#ef4444' : pct > 50 ? '#fbbf24' : '#38bdf8';\n return `\n <div style=\"display:flex;align-items:center;gap:6px;margin-left:16px;font-size:10px;color:var(--text-dim)\">\n <span style=\"width:42px\">${w.label}</span>\n <div style=\"flex:1;height:4px;background:var(--border);border-radius:2px;overflow:hidden\">\n <div style=\"width:${pct}%;height:100%;background:${barColor};border-radius:2px\"></div>\n </div>\n <span style=\"width:28px;text-align:right\">${pct}%</span>\n </div>\n `;\n }).join('');\n }\n\n html += `\n <div class=\"settings-group\" style=\"margin-bottom:6px;padding:8px 10px\">\n <div class=\"cli-status-row\">\n <span class=\"cli-dot ${dotClass}\"></span>\n <span class=\"cli-name\" style=\"font-weight:600\">${name}</span>\n </div>\n ${accountLine}\n ${authHint}\n ${windowsHtml}\n </div>\n `;\n }\n\n el.innerHTML = html;\n}\n\n// \u2500\u2500 Prompt Modal \u2500\u2500\nexport function openPromptModal() {\n api('/api/prompt').then(data => {\n if (!data) return;\n document.getElementById('modalPromptEditor').value = data.content || '';\n document.getElementById('promptModal').classList.add('open');\n });\n}\n\nexport function closePromptModal(e) {\n if (e && e.target !== e.currentTarget) return;\n document.getElementById('promptModal').classList.remove('open');\n}\n\nexport async function savePromptFromModal() {\n const content = document.getElementById('modalPromptEditor').value;\n await apiJson('/api/prompt', 'PUT', { content });\n document.getElementById('promptModal').classList.remove('open');\n}\n", "// \u2500\u2500 Frontend i18n module \u2500\u2500\n// Phase 7: client-side translation with lazy-loaded locale JSON\n\nlet currentLocale = 'ko';\nlet dict = {}; // current locale dictionary\nlet fallbackDict = {}; // ko fallback\n\n/**\n * Initialize i18n: restore from localStorage, detect from browser, load locale\n */\nexport async function initI18n() {\n let saved = null;\n try { saved = localStorage.getItem('claw_locale'); } catch { /* Safari private */ }\n\n if (!saved) {\n // Detect from browser language\n const browserLang = (navigator.language || 'ko').split(/[-_]/)[0].toLowerCase();\n saved = ['en', 'ko'].includes(browserLang) ? browserLang : 'ko';\n }\n\n // Always load ko as fallback\n fallbackDict = await fetchLocale('ko');\n if (saved === 'ko') {\n dict = fallbackDict;\n } else {\n dict = await fetchLocale(saved);\n }\n currentLocale = saved;\n applyI18n();\n}\n\n/**\n * Fetch a locale JSON from the server\n */\nasync function fetchLocale(lang) {\n try {\n const { api } = await import('../api.js');\n return await api(`/api/i18n/${lang}`) || {};\n } catch { return {}; }\n}\n\n/**\n * Translate a key with optional parameter interpolation\n * Falls back: dict[key] \u2192 fallbackDict[key] \u2192 key itself\n */\nexport function t(key, params = {}) {\n let val = dict[key] ?? fallbackDict[key] ?? key;\n for (const [k, v] of Object.entries(params)) {\n val = val.replaceAll(`{${k}}`, String(v));\n }\n return val;\n}\n\n/**\n * Apply translations to all elements with data-i18n attributes\n */\nexport function applyI18n() {\n document.querySelectorAll('[data-i18n]').forEach(el => {\n const key = el.getAttribute('data-i18n');\n if (key) el.textContent = t(key);\n });\n document.querySelectorAll('[data-i18n-placeholder]').forEach(el => {\n const key = el.getAttribute('data-i18n-placeholder');\n if (key) el.placeholder = t(key);\n });\n document.querySelectorAll('[data-i18n-title]').forEach(el => {\n const key = el.getAttribute('data-i18n-title');\n if (key) el.title = t(key);\n });\n document.querySelectorAll('[data-i18n-aria]').forEach(el => {\n const key = el.getAttribute('data-i18n-aria');\n if (key) el.setAttribute('aria-label', t(key));\n });\n}\n\n/**\n * Switch language, reload locale, rebind all UI\n */\nexport async function setLang(lang) {\n if (lang === currentLocale) return;\n if (lang === 'ko') {\n dict = fallbackDict;\n } else {\n dict = await fetchLocale(lang);\n }\n currentLocale = lang;\n try { localStorage.setItem('claw_locale', lang); } catch { /* Safari private */ }\n applyI18n();\n\n // Reload dynamic content that uses t()\n try {\n const { loadEmployees } = await import('./employees.js');\n loadEmployees();\n } catch { }\n try {\n const { loadSkills } = await import('./skills.js');\n loadSkills();\n } catch { }\n try {\n const { loadCommands } = await import('./slash-commands.js');\n loadCommands();\n } catch { }\n try {\n const { loadSettings } = await import('./settings.js');\n loadSettings();\n } catch { }\n}\n\n/**\n * Get current locale code\n */\nexport function getLang() {\n return currentLocale;\n}\n\n/**\n * fetchWithLocale \u2014 wrapper that appends ?locale= to requests\n */\nexport function fetchWithLocale(url, init = {}) {\n const u = new URL(url, location.origin);\n if (!u.searchParams.has('locale')) {\n u.searchParams.set('locale', currentLocale);\n }\n return fetch(u.toString(), init);\n}\n", "// \u2500\u2500 Render Helpers \u2500\u2500\n// Modular markdown rendering: marked.js + highlight.js + KaTeX + Mermaid\n// All libs loaded via CDN (defer), graceful fallback if unavailable\nimport { t } from './features/i18n.js';\n\nexport function escapeHtml(str) {\n return str.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>')\n .replace(/\"/g, '"').replace(/'/g, ''');\n}\n\n// \u2500\u2500 XSS sanitization \u2500\u2500\nexport function sanitizeHtml(html) {\n if (typeof DOMPurify !== 'undefined') {\n return DOMPurify.sanitize(html, {\n USE_PROFILES: { html: true },\n FORBID_TAGS: ['script', 'style', 'iframe', 'object', 'embed', 'form'],\n FORBID_ATTR: ['onerror', 'onclick', 'onload', 'onmouseover', 'onfocus', 'onblur'],\n ADD_TAGS: ['use'], // Mermaid SVG compatibility\n });\n }\n // CDN fallback: regex-based stripping\n return html\n .replace(/<script[\\s\\S]*?>[\\s\\S]*?<\\/script>/gi, '')\n .replace(/\\bon\\w+\\s*=/gi, 'data-removed=')\n .replace(/javascript\\s*:/gi, 'about:blank');\n}\n\n// \u2500\u2500 Orchestration JSON stripping \u2500\u2500\nfunction stripOrchestration(text) {\n let cleaned = text.replace(/```json\\n[\\s\\S]*?\\n```/g, '');\n cleaned = cleaned.replace(/\\{[\\s\\S]*\"subtasks\"\\s*:\\s*\\[[\\s\\S]*?\\]\\s*\\}/g, '').trim();\n return cleaned;\n}\n\n// \u2500\u2500 KaTeX inline/block math \u2500\u2500\nfunction renderMath(html) {\n if (typeof katex === 'undefined') return html;\n // Block math: $$...$$\n html = html.replace(/\\$\\$([\\s\\S]+?)\\$\\$/g, (_, tex) => {\n try {\n return katex.renderToString(tex.trim(), { displayMode: true, throwOnError: false });\n } catch { return `<code>${escapeHtml(tex)}</code>`; }\n });\n // Inline math: $...$ (avoid matching currency like $10)\n html = html.replace(/(?<!\\$)\\$(?!\\$)([^\\n$]+?)\\$(?!\\$)/g, (_, tex) => {\n try {\n return katex.renderToString(tex.trim(), { displayMode: false, throwOnError: false });\n } catch { return `<code>${escapeHtml(tex)}</code>`; }\n });\n return html;\n}\n\n// \u2500\u2500 Mermaid deferred rendering \u2500\u2500\n// NOTE: No DOMPurify on mermaid SVG \u2014 mermaid.render() with securityLevel:'loose'\n// handles its own sanitization. DOMPurify strips foreignObject/style tags needed for text.\nlet mermaidId = 0;\n\nfunction renderMermaidBlocks() {\n if (typeof mermaid === 'undefined') return;\n document.querySelectorAll('.mermaid-pending').forEach(async (el) => {\n el.classList.remove('mermaid-pending');\n const code = el.textContent;\n const id = `mermaid-${++mermaidId}`;\n try {\n const { svg } = await mermaid.render(id, code);\n el.innerHTML = svg;\n el.classList.add('mermaid-rendered');\n // Store raw SVG for overlay (before zoom button is appended)\n const rawSvg = el.innerHTML;\n // Add zoom button\n const zoomBtn = document.createElement('button');\n zoomBtn.className = 'mermaid-zoom-btn';\n zoomBtn.textContent = '\u26F6';\n zoomBtn.title = 'Expand diagram';\n zoomBtn.addEventListener('click', () => openMermaidOverlay(rawSvg));\n el.appendChild(zoomBtn);\n } catch (err) {\n const errMsg = err?.message || err?.str || 'Unknown error';\n el.innerHTML = `\n <div style=\"border:1px solid #ef4444;border-radius:6px;padding:8px;margin:4px 0\">\n <div style=\"color:#ef4444;font-size:11px;margin-bottom:4px\">\u26A0\uFE0F Mermaid \uB80C\uB354\uB9C1 \uC2E4\uD328</div>\n <div style=\"color:#fbbf24;font-size:10px;margin-bottom:6px\">${escapeHtml(errMsg.slice(0, 200))}</div>\n <pre style=\"margin:0;font-size:11px;overflow-x:auto\"><code>${escapeHtml(code)}</code></pre>\n </div>`;\n }\n });\n}\n// \u2500\u2500 Mermaid popup overlay \u2500\u2500\nfunction openMermaidOverlay(svgHtml) {\n // Remove existing overlay if any\n document.getElementById('mermaidOverlay')?.remove();\n\n const overlay = document.createElement('div');\n overlay.id = 'mermaidOverlay';\n overlay.className = 'mermaid-overlay';\n overlay.innerHTML = `\n <div class=\"mermaid-overlay-backdrop\"></div>\n <div class=\"mermaid-overlay-content\">\n <button class=\"mermaid-overlay-close\">\u2715</button>\n <div class=\"mermaid-overlay-svg\">${svgHtml}</div>\n </div>`;\n document.body.appendChild(overlay);\n\n // Make SVG fill the popup\n const svgEl = overlay.querySelector('svg');\n if (svgEl) {\n svgEl.removeAttribute('width');\n svgEl.removeAttribute('height');\n svgEl.style.width = '100%';\n svgEl.style.height = 'auto';\n svgEl.style.maxHeight = '85vh';\n }\n\n const close = () => overlay.remove();\n overlay.querySelector('.mermaid-overlay-backdrop').addEventListener('click', close);\n overlay.querySelector('.mermaid-overlay-close').addEventListener('click', (e) => {\n e.stopPropagation();\n e.preventDefault();\n close();\n });\n document.addEventListener('keydown', function handler(e) {\n if (e.key === 'Escape') { close(); document.removeEventListener('keydown', handler); }\n });\n}\n\n// \u2500\u2500 marked.js configuration \u2500\u2500\nlet markedReady = false;\n\nfunction ensureMarked() {\n if (markedReady) return true;\n if (typeof marked === 'undefined') return false;\n\n const renderer = new marked.Renderer();\n\n // Code blocks: highlight.js + mermaid detection\n renderer.code = function ({ text, lang }) {\n // Mermaid\n if (lang === 'mermaid') {\n return `<div class=\"mermaid-container mermaid-pending\">${escapeHtml(text)}</div>`;\n }\n // Highlight.js\n let highlighted = escapeHtml(text);\n if (typeof hljs !== 'undefined' && lang && hljs.getLanguage(lang)) {\n try {\n highlighted = hljs.highlight(text, { language: lang }).value;\n } catch { /* fallback to escaped */ }\n } else if (typeof hljs !== 'undefined') {\n try {\n highlighted = hljs.highlightAuto(text).value;\n } catch { /* fallback */ }\n }\n const labelText = lang ? escapeHtml(lang) : t('code.copy');\n const label = `<span class=\"code-lang-label\" data-lang=\"${lang ? escapeHtml(lang) : ''}\">${labelText}</span>`;\n return `<div class=\"code-block-wrapper\">${label}<pre><code class=\"hljs${lang ? ` language-${escapeHtml(lang)}` : ''}\">${highlighted}</code></pre></div>`;\n };\n\n marked.setOptions({\n renderer,\n gfm: true,\n breaks: true,\n });\n\n // Init mermaid\n if (typeof window.mermaid !== 'undefined') {\n window.mermaid.initialize({\n startOnLoad: false,\n theme: 'base',\n securityLevel: 'loose',\n themeVariables: {\n darkMode: true,\n background: '#0f172a',\n primaryColor: '#1e3a5f',\n primaryTextColor: '#e2e8f0',\n primaryBorderColor: '#38bdf8',\n lineColor: '#94a3b8',\n secondaryColor: '#1e293b',\n tertiaryColor: '#0f172a',\n textColor: '#e2e8f0',\n mainBkg: '#1e293b',\n nodeBorder: '#38bdf8',\n clusterBkg: '#1e293b',\n titleColor: '#e2e8f0',\n edgeLabelBackground: '#1e293b',\n nodeTextColor: '#e2e8f0',\n },\n });\n }\n\n markedReady = true;\n return true;\n}\n\n// \u2500\u2500 Fallback regex renderer (CDN \uC2E4\uD328 \uC2DC) \u2500\u2500\nfunction renderFallback(text) {\n return escapeHtml(text)\n .replace(/`{3,}(\\w*)\\n([\\s\\S]*?)`{3,}/g, '<pre><code>$2</code></pre>')\n .replace(/`([^`]+)`/g, '<code>$1</code>')\n .replace(/\\*\\*(.+?)\\*\\*/g, '<strong>$1</strong>')\n .replace(/^### (.+)$/gm, '<div style=\"font-weight:700;margin:8px 0 4px\">$1</div>')\n .replace(/^## (.+)$/gm, '<div style=\"font-weight:700;font-size:14px;margin:10px 0 4px\">$1</div>')\n .replace(/^# (.+)$/gm, '<div style=\"font-weight:700;font-size:16px;margin:12px 0 4px\">$1</div>')\n .replace(/\\n/g, '<br>');\n}\n\n// \u2500\u2500 Rehighlight all code blocks (call after hljs loads) \u2500\u2500\nexport function rehighlightAll() {\n if (typeof hljs === 'undefined') return;\n document.querySelectorAll('.code-block-wrapper pre code').forEach(el => {\n if (el.dataset.highlighted === 'yes') return;\n const lang = [...el.classList].find(c => c.startsWith('language-'))?.replace('language-', '');\n const raw = el.textContent;\n try {\n if (lang && hljs.getLanguage(lang)) {\n el.innerHTML = hljs.highlight(raw, { language: lang }).value;\n } else {\n el.innerHTML = hljs.highlightAuto(raw).value;\n }\n el.dataset.highlighted = 'yes';\n } catch { /* ignore */ }\n });\n}\n\n// Poll for hljs load and auto-rehighlight\n(function waitForHljs() {\n if (typeof hljs !== 'undefined') { rehighlightAll(); return; }\n setTimeout(waitForHljs, 200);\n})();\n\n// Poll for mermaid load and render pending blocks\n(function waitForMermaid() {\n if (typeof mermaid !== 'undefined') {\n ensureMarked(); // ensure mermaid.initialize() runs\n renderMermaidBlocks();\n return;\n }\n setTimeout(waitForMermaid, 300);\n})();\n\n// \u2500\u2500 Copy button event delegation (one-time setup) \u2500\u2500\nlet copyDelegationReady = false;\n\nfunction ensureCopyDelegation() {\n if (copyDelegationReady) return;\n copyDelegationReady = true;\n document.addEventListener('click', (e) => {\n const label = e.target.closest('.code-lang-label');\n if (!label) return;\n const wrapper = label.closest('.code-block-wrapper');\n if (!wrapper) return;\n const codeEl = wrapper.querySelector('pre code');\n if (!codeEl) return;\n navigator.clipboard.writeText(codeEl.textContent).then(() => {\n const orig = label.textContent;\n label.textContent = t('code.copied');\n label.classList.add('copied');\n setTimeout(() => {\n label.textContent = orig;\n label.classList.remove('copied');\n }, 1500);\n }).catch(() => { /* clipboard API fail silently */ });\n });\n}\n\n// \u2500\u2500 Main export \u2500\u2500\nexport function renderMarkdown(text) {\n const cleaned = stripOrchestration(text);\n if (!cleaned) return `<em style=\"color:var(--text-dim)\">${t('orchestrator.dispatching')}</em>`;\n\n let html;\n if (ensureMarked()) {\n html = marked.parse(cleaned);\n // Wrap tables for horizontal scrolling\n html = html.replace(/<table/g, '<div class=\"table-wrapper\"><table').replace(/<\\/table>/g, '</table></div>');\n } else {\n html = renderFallback(cleaned);\n }\n\n // KaTeX math\n html = renderMath(html);\n\n // XSS sanitization\n html = sanitizeHtml(html);\n\n // Schedule mermaid rendering (needs DOM)\n requestAnimationFrame(() => {\n renderMermaidBlocks();\n rehighlightAll();\n });\n\n // Ensure copy delegation is set up\n ensureCopyDelegation();\n\n return html;\n}\n", "// \u2500\u2500 Agent Name Customization \u2500\u2500\n// localStorage-based agent display name (message label only)\n// Logo, header, title remain \"CLI-JAW\" (immutable)\n\nconst STORAGE_KEY = 'agentName';\nconst DEFAULT_NAME = 'CLI-JAW';\n\nlet currentName = DEFAULT_NAME;\n\nexport function getAppName() {\n return currentName;\n}\n\nexport function setAppName(name) {\n currentName = (name || '').trim() || DEFAULT_NAME;\n localStorage.setItem(STORAGE_KEY, currentName);\n // Update input field\n const input = document.getElementById('appNameInput');\n if (input) input.value = currentName;\n}\n\nexport function initAppName() {\n currentName = localStorage.getItem(STORAGE_KEY) || DEFAULT_NAME;\n\n // Sync input\n const input = document.getElementById('appNameInput');\n if (input) input.value = currentName;\n\n // Save button\n document.getElementById('appNameSave')?.addEventListener('click', () => {\n const inp = document.getElementById('appNameInput');\n if (inp) setAppName(inp.value);\n });\n\n // Enter key\n document.getElementById('appNameInput')?.addEventListener('keydown', (e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n setAppName(e.target.value);\n e.target.blur();\n }\n });\n}\n", "// \u2500\u2500 UI Utilities \u2500\u2500\nimport { state } from './state.js';\nimport { renderMarkdown, escapeHtml } from './render.js';\nimport { getAppName } from './features/appname.js';\nimport { t } from './features/i18n.js';\nimport { api } from './api.js';\n\nexport function setStatus(s) {\n const badge = document.getElementById('statusBadge');\n const btn = document.getElementById('btnSend');\n state.agentBusy = s === 'running';\n document.getElementById('typingIndicator').classList.toggle('active', state.agentBusy);\n if (s === 'running') {\n badge.className = 'status-badge status-running';\n badge.textContent = '\u23F3 running';\n btn.textContent = '\u25A0';\n btn.title = t('btn.stop');\n btn.classList.add('stop-mode');\n } else {\n badge.className = 'status-badge status-idle';\n badge.textContent = '\u26A1 idle';\n btn.textContent = '\u27A4';\n btn.title = 'Send';\n btn.classList.remove('stop-mode');\n updateQueueBadge(0);\n }\n}\n\nexport function updateQueueBadge(count) {\n let el = document.getElementById('queueBadge');\n if (!el) {\n el = document.createElement('span');\n el.id = 'queueBadge';\n el.style.cssText = 'position:absolute;top:-6px;right:-6px;background:#f80;color:#fff;border-radius:50%;font-size:11px;min-width:18px;height:18px;display:flex;align-items:center;justify-content:center;font-weight:bold';\n document.getElementById('btnSend').parentElement.style.position = 'relative';\n document.getElementById('btnSend').style.position = 'relative';\n document.getElementById('btnSend').appendChild(el);\n }\n el.textContent = count > 0 ? count : '';\n el.style.display = count > 0 ? 'flex' : 'none';\n}\n\nexport function addSystemMsg(text, extraClass, type) {\n const container = document.getElementById('chatMessages');\n const div = document.createElement('div');\n const typeClass = type ? ` msg-type-${type}` : '';\n div.className = 'msg msg-system' + typeClass + (extraClass ? ' ' + extraClass : '');\n div.textContent = text;\n container.appendChild(div);\n container.scrollTop = container.scrollHeight;\n}\n\nexport function appendAgentText(text) {\n if (!text) return;\n if (!state.currentAgentDiv) {\n state.currentAgentDiv = addMessage('agent', '');\n }\n const content = state.currentAgentDiv.querySelector('.msg-content');\n content.textContent += text;\n scrollToBottom();\n}\n\nlet lastFinalizeTs = 0;\n\nexport function finalizeAgent(text, toolLog) {\n // Guard: prevent double-render when both agent_done + orchestrate_done fire\n const now = Date.now();\n if (!state.currentAgentDiv && now - lastFinalizeTs < 500) return;\n\n document.querySelectorAll('.msg-system.tool-activity').forEach(el => el.remove());\n if (text) {\n if (!state.currentAgentDiv) {\n state.currentAgentDiv = addMessage('agent', '');\n }\n const content = state.currentAgentDiv.querySelector('.msg-content');\n state.currentAgentDiv.dataset.rawText = text;\n let toolHtml = '';\n if (toolLog && toolLog.length > 0) {\n const counts = {};\n toolLog.forEach(t => { counts[t.icon] = (counts[t.icon] || 0) + 1; });\n const summaryParts = Object.entries(counts).map(([icon, n]) => `${icon}\u00D7${n}`).join(' ');\n const logLines = toolLog.map(t => `${t.icon} ${escapeHtml(t.label)}`).join('\\n');\n toolHtml = `<details class=\"tool-summary\"><summary>${summaryParts}</summary><div class=\"tool-log\">${logLines}</div></details>`;\n }\n content.innerHTML = toolHtml + renderMarkdown(text);\n }\n state.currentAgentDiv = null;\n lastFinalizeTs = Date.now();\n setStatus('idle');\n loadStats();\n}\n\nexport function addMessage(role, text) {\n const container = document.getElementById('chatMessages');\n const div = document.createElement('div');\n div.className = `msg msg-${role}`;\n div.dataset.rawText = text;\n const rendered = renderMarkdown(text);\n const copyBtn = '<span class=\"msg-copy\" title=\"Copy raw text\"></span>';\n div.innerHTML = `<div class=\"msg-label\">${role === 'user' ? t('msg.you') : getAppName()}</div><div class=\"msg-content\">${rendered}</div>${copyBtn}`;\n container.appendChild(div);\n scrollToBottom();\n return div;\n}\n\nexport function scrollToBottom() {\n const c = document.getElementById('chatMessages');\n c.scrollTop = c.scrollHeight;\n}\n\nexport function switchTab(name, targetBtn) {\n document.querySelectorAll('.tab-btn').forEach(b => b.classList.remove('active'));\n document.querySelectorAll('.tab-content').forEach(c => c.classList.remove('active'));\n const tabMap = { agents: 'tabAgents', settings: 'tabSettings', skills: 'tabSkills' };\n document.getElementById(tabMap[name]).classList.add('active');\n if (targetBtn) targetBtn.classList.add('active');\n // Lazy-load tab content\n if (name === 'settings') { import('./features/settings.js').then(m => m.loadSettings()); }\n if (name === 'agents') { import('./features/employees.js').then(m => m.loadEmployees()); }\n if (name === 'skills') { import('./features/skills.js').then(m => m.loadSkills()); }\n}\n\nexport function handleSave() {\n const isSettings = document.getElementById('tabSettings').classList.contains('active');\n if (isSettings) {\n import('./features/settings.js').then(m => m.savePerCli());\n } else {\n import('./features/settings.js').then(m => m.updateSettings());\n }\n}\n\nexport async function loadStats() {\n const msgs = await api('/api/messages');\n if (!msgs) return;\n document.getElementById('statMsgs').textContent = t('stat.messages', { count: msgs.length });\n}\n\nexport async function loadMessages() {\n const msgs = await api('/api/messages');\n if (!msgs) return;\n msgs.forEach(m => addMessage(m.role === 'assistant' ? 'agent' : m.role, m.content));\n}\n\n// \u2500\u2500 Copy button delegation \u2500\u2500\nexport function initMsgCopy() {\n document.getElementById('chatMessages').addEventListener('click', async (e) => {\n const btn = e.target.closest('.msg-copy');\n if (!btn) return;\n const msg = btn.closest('.msg');\n const raw = msg?.dataset?.rawText || msg?.querySelector('.msg-content')?.innerText || '';\n try {\n await navigator.clipboard.writeText(raw);\n btn.classList.add('copied');\n setTimeout(() => { btn.classList.remove('copied'); }, 1500);\n } catch { setTimeout(() => { }, 1500); }\n });\n}\n\nexport async function loadMemory() {\n try {\n const items = await api('/api/memory');\n const list = document.getElementById('memoryList');\n if (!list) return;\n if (items.length === 0) {\n list.innerHTML = `<li style=\"color:var(--text-dim)\">${t('mem.empty')}</li>`;\n return;\n }\n list.innerHTML = items.map(m =>\n `<li><span class=\"memory-key\">${escapeHtml(m.key)}</span>: ${escapeHtml(m.value)}</li>`\n ).join('');\n } catch { }\n}\n", "// \u2500\u2500 WebSocket Connection \u2500\u2500\nimport { state } from './state.js';\nimport { setStatus, updateQueueBadge, addSystemMsg, appendAgentText, finalizeAgent, addMessage } from './ui.js';\nimport { t, getLang } from './features/i18n.js';\n\n// Agent phase state (populated by agent_status events from orchestrator)\nconst agentPhaseState = {};\n\nexport function connect() {\n state.ws = new WebSocket(`ws://${location.host}?lang=${getLang()}`);\n state.ws.onmessage = (e) => {\n const msg = JSON.parse(e.data);\n if (msg.type === 'agent_status') {\n if (msg.running !== undefined) {\n setStatus(msg.running ? 'running' : 'idle');\n } else {\n setStatus(msg.status);\n }\n // Track per-agent phase for badge rendering\n if (msg.agentId && msg.phase) {\n agentPhaseState[msg.agentId] = { phase: msg.phase, phaseLabel: msg.phaseLabel || '' };\n import('./features/employees.js').then(m => m.loadEmployees());\n }\n } else if (msg.type === 'queue_update') {\n updateQueueBadge(msg.pending || 0);\n } else if (msg.type === 'worklog_created') {\n addSystemMsg(`\uD83D\uDCCB Worklog: ${msg.path}`);\n } else if (msg.type === 'round_start') {\n const agents = (msg.agentPhases || msg.subtasks || []);\n const names = agents.map(a => a.agent || a.name).join(', ');\n addSystemMsg(t('ws.roundStart', { round: msg.round, count: agents.length, names }));\n } else if (msg.type === 'round_done') {\n if (msg.action === 'complete') {\n addSystemMsg(t('ws.roundDone', { round: msg.round }));\n } else if (msg.action === 'next') {\n addSystemMsg(t('ws.roundNext', { round: msg.round }));\n } else {\n addSystemMsg(t('ws.roundRetry', { round: msg.round }));\n }\n } else if (msg.type === 'agent_tool') {\n addSystemMsg(`${msg.icon} ${msg.label}`, 'tool-activity');\n } else if (msg.type === 'agent_output') {\n appendAgentText(msg.text);\n } else if (msg.type === 'agent_fallback') {\n addSystemMsg(t('ws.fallback', { from: msg.from, to: msg.to }), 'tool-activity');\n } else if (msg.type === 'agent_done') {\n finalizeAgent(msg.text, msg.toolLog);\n } else if (msg.type === 'orchestrate_done') {\n finalizeAgent(msg.text);\n } else if (msg.type === 'clear') {\n document.getElementById('chatMessages').innerHTML = '';\n } else if (msg.type === 'agent_added' || msg.type === 'agent_updated' || msg.type === 'agent_deleted') {\n import('./features/employees.js').then(m => m.loadEmployees());\n } else if (msg.type === 'new_message' && msg.source === 'telegram') {\n addMessage(msg.role === 'assistant' ? 'agent' : msg.role, msg.content);\n }\n };\n state.ws.onopen = () => {\n console.log('[ws] connected');\n // Restore state: reload messages to stay in sync after reconnect\n import('./ui.js').then(m => {\n document.getElementById('chatMessages').innerHTML = '';\n m.loadMessages();\n m.setStatus('idle');\n });\n };\n state.ws.onclose = () => {\n console.log('[ws] disconnected, reconnecting in 2s...');\n setStatus('idle');\n setTimeout(connect, 2000);\n };\n}\n\nexport function getAgentPhase(agentId) {\n return agentPhaseState[agentId] || null;\n}\n", "// \u2500\u2500 App Entry Point \u2500\u2500\n// All event bindings happen here (no inline onclick in HTML)\n\n// \u2500\u2500 Global Error Boundary \u2500\u2500\nwindow.addEventListener('unhandledrejection', (e) => {\n console.error('[unhandled]', e.reason);\n e.preventDefault();\n});\nwindow.addEventListener('error', (e) => {\n console.error('[error]', e.message, e.filename, e.lineno);\n});\n\nimport { connect } from './ws.js';\nimport { switchTab, handleSave, loadStats, loadMessages, loadMemory, initMsgCopy } from './ui.js';\nimport { sendMessage, handleKey, clearAttachedFiles, removeAttachedFile, clearChat, initDragDrop, initAutoResize } from './features/chat.js';\nimport {\n loadCommands, update as updateSlashDropdown, handleKeydown as handleSlashKeydown,\n handleClick as handleSlashClick, handleOutsideClick as handleSlashOutsideClick,\n} from './features/slash-commands.js';\nimport { loadSkills, toggleSkill, filterSkills } from './features/skills.js';\nimport {\n loadSettings, setPerm, handleModelSelect, applyCustomModel, onCliChange,\n saveActiveCliSettings, savePerCli, updateSettings, openPromptModal,\n closePromptModal, savePromptFromModal, syncMcpServers, installMcpGlobal,\n loadCliStatus, setTelegram, saveTelegramSettings, saveFallbackOrder\n} from './features/settings.js';\nimport {\n loadEmployees, addEmployee, deleteEmployee, updateEmployee,\n onEmpCliChange, onEmpRoleChange\n} from './features/employees.js';\nimport {\n openHeartbeatModal, closeHeartbeatModal, addHeartbeatJob,\n removeHeartbeatJob, toggleHeartbeatJob, saveHeartbeatJobs,\n initHeartbeatBadge\n} from './features/heartbeat.js';\nimport {\n openMemoryModal, closeMemoryModal, switchMemTab, setMemEnabled,\n saveMemSettings, deleteMemFile, viewMemFile\n} from './features/memory.js';\nimport { state } from './state.js';\nimport { loadCliRegistry, getCliKeys } from './constants.js';\nimport { initAppName } from './features/appname.js';\nimport { initSidebar, toggleLeft, toggleRight } from './features/sidebar.js';\nimport { initTheme } from './features/theme.js';\nimport { initI18n, setLang, getLang, t } from './features/i18n.js';\n\n// \u2500\u2500 Chat Actions \u2500\u2500\ndocument.getElementById('btnSend').addEventListener('click', sendMessage);\nconst chatInput = document.getElementById('chatInput');\nchatInput.addEventListener('keydown', (e) => {\n if (handleSlashKeydown(e)) return;\n handleKey(e);\n});\nlet slashInputRaf = 0;\nchatInput.addEventListener('input', (e) => {\n if (e.isComposing) return;\n if (slashInputRaf) cancelAnimationFrame(slashInputRaf);\n slashInputRaf = requestAnimationFrame(() => {\n updateSlashDropdown(e.target.value);\n slashInputRaf = 0;\n });\n});\nchatInput.addEventListener('cmd-execute', () => {\n void sendMessage();\n});\ndocument.getElementById('cmdDropdown')?.addEventListener('click', handleSlashClick);\ndocument.addEventListener('click', handleSlashOutsideClick);\ndocument.getElementById('filePreviewClear').addEventListener('click', clearAttachedFiles);\ndocument.getElementById('filePreviewList').addEventListener('click', (e) => {\n const btn = e.target.closest('[data-file-idx]');\n if (btn) removeAttachedFile(+btn.dataset.fileIdx);\n});\ndocument.querySelector('.btn-attach').addEventListener('click', () => {\n document.getElementById('fileInput').click();\n});\n\n// \u2500\u2500 Left Sidebar \u2500\u2500\ndocument.getElementById('memorySidebarBtn').addEventListener('click', openMemoryModal);\ndocument.getElementById('btnClearChat').addEventListener('click', clearChat);\ndocument.getElementById('hbSidebarBtn').addEventListener('click', openHeartbeatModal);\n\n// Language toggle\ndocument.getElementById('langToggle')?.addEventListener('click', async () => {\n const next = getLang() === 'ko' ? 'en' : 'ko';\n await setLang(next);\n const btn = document.getElementById('langToggle');\n if (btn) btn.textContent = `\uD83C\uDF10 ${t('lang.' + next)}`;\n // Reconnect WS with new locale\n if (state.ws) { state.ws.close(); }\n});\n\n// \u2500\u2500 Tab Bar (event delegation) \u2500\u2500\ndocument.querySelector('.tab-bar').addEventListener('click', (e) => {\n const btn = e.target.closest('.tab-btn');\n if (!btn) return;\n const tabs = [...btn.parentElement.children].filter(c => c.classList.contains('tab-btn'));\n const idx = tabs.indexOf(btn);\n const names = ['agents', 'skills', 'settings'];\n if (names[idx]) switchTab(names[idx], btn);\n});\n\n// \u2500\u2500 Save Button \u2500\u2500\ndocument.querySelector('.sidebar-save-bar .btn-save').addEventListener('click', handleSave);\n\n// \u2500\u2500 Agents Tab \u2500\u2500\ndocument.getElementById('selCli').addEventListener('change', () => onCliChange());\ndocument.getElementById('selModel').addEventListener('change', () => saveActiveCliSettings());\ndocument.getElementById('selEffort').addEventListener('change', () => saveActiveCliSettings());\ndocument.querySelector('[data-action=\"addEmployee\"]').addEventListener('click', addEmployee);\n\n// \u2500\u2500 Employees (Event Delegation) \u2500\u2500\ndocument.getElementById('employeesList').addEventListener('click', (e) => {\n const del = e.target.closest('[data-emp-delete]');\n if (del) { deleteEmployee(del.dataset.empDelete); return; }\n});\ndocument.getElementById('employeesList').addEventListener('change', (e) => {\n const name = e.target.closest('[data-emp-name]');\n if (name) { updateEmployee(name.dataset.empName, { name: e.target.value }); return; }\n const cli = e.target.closest('[data-emp-cli]');\n if (cli) { onEmpCliChange(cli.dataset.empCli, e.target.value); return; }\n const model = e.target.closest('[data-emp-model]');\n if (model) {\n if (e.target.value === '__custom__') {\n const val = prompt(t('model.promptInput'));\n if (val?.trim()) {\n const opt = document.createElement('option');\n opt.value = val.trim(); opt.textContent = val.trim();\n const customOpt = e.target.querySelector('option[value=\"__custom__\"]');\n e.target.insertBefore(opt, customOpt);\n e.target.value = val.trim();\n updateEmployee(model.dataset.empModel, { model: val.trim() });\n } else { e.target.value = 'default'; }\n } else { updateEmployee(model.dataset.empModel, { model: e.target.value }); }\n return;\n }\n const role = e.target.closest('[data-emp-role]');\n if (role) { onEmpRoleChange(role.dataset.empRole, e.target.value); return; }\n const custom = e.target.closest('[data-emp-custom]');\n if (custom) { updateEmployee(custom.dataset.empCustom, { role: e.target.value }); return; }\n});\n\n// \u2500\u2500 Skills Tab (Event Delegation) \u2500\u2500\ndocument.getElementById('skillsList').addEventListener('click', (e) => {\n const toggle = e.target.closest('[data-skill-id]');\n if (toggle) {\n toggleSkill(toggle.dataset.skillId, toggle.dataset.skillEnabled === 'true');\n }\n});\n// Skill filter buttons (event delegation)\ndocument.querySelector('#tabSkills').addEventListener('click', (e) => {\n const filterBtn = e.target.closest('.skill-filter');\n if (filterBtn) {\n const cat = filterBtn.dataset.filter;\n filterSkills(cat, filterBtn);\n }\n});\n\n// \u2500\u2500 Settings Tab \u2500\u2500\ndocument.querySelector('[data-action=\"openPrompt\"]').addEventListener('click', openPromptModal);\ndocument.getElementById('tgOff').addEventListener('click', () => setTelegram(false));\ndocument.getElementById('tgOn').addEventListener('click', () => setTelegram(true));\ndocument.getElementById('tgToken').addEventListener('change', saveTelegramSettings);\ndocument.getElementById('tgChatIds').addEventListener('change', saveTelegramSettings);\ndocument.getElementById('fallbackOrderList').addEventListener('change', saveFallbackOrder);\n\n// Per-CLI model selects\nfunction bindPerCliControlEvents() {\n for (const cli of getCliKeys()) {\n const cap = cli.charAt(0).toUpperCase() + cli.slice(1);\n const sel = document.getElementById('model' + cap);\n if (sel) sel.addEventListener('change', function () { handleModelSelect(cli, this); });\n const custom = document.getElementById('customModel' + cap);\n if (custom) custom.addEventListener('change', function () { applyCustomModel(cli, this); });\n const effort = document.getElementById('effort' + cap);\n if (effort) effort.addEventListener('change', savePerCli);\n }\n}\n\n// MCP\ndocument.querySelector('[data-action=\"syncMcp\"]').addEventListener('click', syncMcpServers);\ndocument.querySelector('[data-action=\"installMcp\"]').addEventListener('click', installMcpGlobal);\ndocument.querySelector('[data-action=\"refreshCli\"]').addEventListener('click', () => loadCliStatus(true));\ndocument.getElementById('cliStatusInterval').addEventListener('change', function () {\n localStorage.setItem('cliStatusInterval', this.value);\n});\n\n// \u2500\u2500 Prompt Modal \u2500\u2500\ndocument.getElementById('promptModal').addEventListener('click', (e) => closePromptModal(e));\ndocument.querySelector('#promptModal .modal-box').addEventListener('click', (e) => e.stopPropagation());\ndocument.querySelector('[data-action=\"closePrompt\"]').addEventListener('click', () => closePromptModal());\ndocument.querySelector('[data-action=\"cancelPrompt\"]').addEventListener('click', () => closePromptModal());\ndocument.querySelector('[data-action=\"savePrompt\"]').addEventListener('click', savePromptFromModal);\ndocument.addEventListener('keydown', (e) => { if (e.key === 'Escape') closePromptModal(); });\n\n// \u2500\u2500 Heartbeat Modal \u2500\u2500\ndocument.getElementById('heartbeatModal').addEventListener('click', (e) => closeHeartbeatModal(e));\ndocument.querySelector('#heartbeatModal .modal-box').addEventListener('click', (e) => e.stopPropagation());\ndocument.querySelector('[data-action=\"closeHeartbeat\"]').addEventListener('click', () => closeHeartbeatModal());\ndocument.querySelector('[data-action=\"addHeartbeat\"]').addEventListener('click', addHeartbeatJob);\n\n// Heartbeat jobs (event delegation)\ndocument.getElementById('hbJobsList').addEventListener('click', (e) => {\n const toggle = e.target.closest('[data-hb-toggle]');\n if (toggle) { toggleHeartbeatJob(+toggle.dataset.hbToggle); return; }\n const remove = e.target.closest('[data-hb-remove]');\n if (remove) { removeHeartbeatJob(+remove.dataset.hbRemove); return; }\n});\ndocument.getElementById('hbJobsList').addEventListener('change', (e) => {\n const name = e.target.closest('[data-hb-name]');\n if (name) { state.heartbeatJobs[+name.dataset.hbName].name = e.target.value; saveHeartbeatJobs(); return; }\n const min = e.target.closest('[data-hb-minutes]');\n if (min) { state.heartbeatJobs[+min.dataset.hbMinutes].schedule = { kind: 'every', minutes: +e.target.value }; saveHeartbeatJobs(); return; }\n const prompt = e.target.closest('[data-hb-prompt]');\n if (prompt) { state.heartbeatJobs[+prompt.dataset.hbPrompt].prompt = e.target.value; saveHeartbeatJobs(); return; }\n});\n\n// \u2500\u2500 Memory Modal \u2500\u2500\ndocument.getElementById('memoryModal').addEventListener('click', (e) => closeMemoryModal(e));\ndocument.querySelector('#memoryModal .modal-box').addEventListener('click', (e) => e.stopPropagation());\ndocument.querySelector('[data-action=\"closeMemory\"]').addEventListener('click', () => closeMemoryModal());\ndocument.getElementById('memTabBtnSettings').addEventListener('click', () => switchMemTab('settings'));\ndocument.getElementById('memTabBtnFiles').addEventListener('click', () => switchMemTab('files'));\ndocument.getElementById('memOn').addEventListener('click', () => setMemEnabled(true));\ndocument.getElementById('memOff').addEventListener('click', () => setMemEnabled(false));\ndocument.getElementById('memFlushEvery').addEventListener('change', saveMemSettings);\ndocument.getElementById('memCli').addEventListener('change', saveMemSettings);\ndocument.getElementById('memModel').addEventListener('change', saveMemSettings);\ndocument.getElementById('memRetention').addEventListener('change', saveMemSettings);\n\n// Memory files (event delegation)\ndocument.getElementById('memFilesList').addEventListener('click', (e) => {\n const del = e.target.closest('[data-mem-delete]');\n if (del) { e.stopPropagation(); deleteMemFile(del.dataset.memDelete); return; }\n const view = e.target.closest('[data-mem-view]');\n if (view) { viewMemFile(view.dataset.memView); return; }\n const back = e.target.closest('[data-mem-back]');\n if (back) { openMemoryModal(); return; }\n});\n\n// \u2500\u2500 Init \u2500\u2500\nasync function bootstrap() {\n await initI18n();\n const langBtn = document.getElementById('langToggle');\n if (langBtn) langBtn.textContent = `\uD83C\uDF10 ${t('lang.' + getLang())}`;\n await loadCliRegistry();\n bindPerCliControlEvents();\n connect();\n initDragDrop();\n initAutoResize();\n await loadCommands();\n await loadSettings();\n loadCliStatus();\n loadMemory();\n // loadMessages() is handled by ws.js onopen (clear + reload)\n loadEmployees();\n initHeartbeatBadge();\n initAppName();\n initSidebar();\n initTheme();\n initMsgCopy();\n}\n\nvoid bootstrap().catch((err) => {\n console.error('[bootstrap]', err);\n});\n\n// \u2500\u2500 Keyboard: Escape closes modals \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\ndocument.addEventListener('keydown', (e) => {\n if (e.key === 'Escape') {\n document.querySelectorAll('.modal-overlay.open').forEach(m => {\n m.classList.remove('open');\n });\n }\n});\n\n// \u2500\u2500 Mobile sidebar toggle (sidebar.js functions reuse) \u2500\u2500\ndocument.getElementById('mobileMenuLeft')?.addEventListener('click', toggleLeft);\ndocument.getElementById('mobileMenuRight')?.addEventListener('click', toggleRight);\n", "// \u2500\u2500 Chat Feature \u2500\u2500\nimport { state } from '../state.js';\nimport { addMessage, addSystemMsg, scrollToBottom } from '../ui.js';\nimport { getPreferredLocale } from '../locale.js';\nimport { t } from './i18n.js';\nimport * as slashCmd from './slash-commands.js';\nimport { api, apiJson, apiFire } from '../api.js';\n\nexport async function sendMessage() {\n const input = document.getElementById('chatInput');\n const btn = document.getElementById('btnSend');\n\n // Stop mode: clicking \u25A0 stops the agent\n if (btn.classList.contains('stop-mode') && !input.value.trim() && !state.attachedFiles.length) {\n apiFire('/api/stop', 'POST');\n return;\n }\n\n const text = input.value.trim();\n if (!text && !state.attachedFiles.length) return;\n\n // File paths like /Users/junny/... or /tmp/foo \u2014 not commands\n const afterSlash = text.slice(1).trim();\n const firstToken = afterSlash.split(/\\s+/)[0] || '';\n const isFilePath = firstToken.includes('/') || firstToken.includes('\\\\');\n\n if (text.startsWith('/') && !state.attachedFiles.length && !isFilePath) {\n input.value = '';\n resetInputHeight();\n slashCmd.close();\n try {\n let signal, timer;\n if (typeof AbortSignal?.timeout === 'function') {\n signal = AbortSignal.timeout(10000);\n } else {\n const ac = new AbortController();\n signal = ac.signal;\n timer = setTimeout(() => ac.abort(), 10000);\n }\n const locale = getPreferredLocale();\n const res = await fetch('/api/command', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept-Language': locale,\n },\n body: JSON.stringify({ text, locale }),\n signal,\n });\n if (timer) clearTimeout(timer);\n const result = await res.json().catch(() => ({}));\n // not_command \u2192 fall through to normal chat\n if (result?.code === 'not_command') {\n addMessage('user', text);\n await apiJson('/api/message', 'POST', { prompt: text });\n return;\n }\n if (!res.ok && !result?.text) throw new Error(`HTTP ${res.status}`);\n if (result?.code === 'clear_screen') {\n document.getElementById('chatMessages').innerHTML = '';\n }\n if (result?.text) addSystemMsg(result.text, '', result.type);\n } catch (err) {\n addSystemMsg(t('chat.cmd.fail', { msg: err.message }), '', 'error');\n }\n return;\n }\n\n if (state.attachedFiles.length) {\n const names = state.attachedFiles.map(f => f.name).join(', ');\n const displayMsg = `[\uD83D\uDCCE ${names}] ${text}`;\n addMessage('user', displayMsg);\n input.value = '';\n resetInputHeight();\n try {\n // Upload all files in parallel\n const paths = await Promise.all(state.attachedFiles.map(f => uploadFile(f)));\n let prompt = paths.map(p => t('chat.file.sent', { path: p })).join('\\n');\n if (text) prompt += t('chat.file.sentWithMsg', { text });\n clearAttachedFiles();\n await apiJson('/api/message', 'POST', { prompt });\n } catch (err) {\n addSystemMsg(t('chat.file.uploadFail', { msg: err.message }));\n clearAttachedFiles();\n }\n } else {\n addMessage('user', text);\n input.value = '';\n resetInputHeight();\n const res = await fetch('/api/message', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ prompt: text }),\n });\n const data = await res.json().catch(() => ({}));\n if (!res.ok) {\n addSystemMsg(`\u274C ${data.error || t('chat.requestFail', { status: res.status })}`, '', 'error');\n return;\n }\n if (data.queued) {\n const { updateQueueBadge } = await import('../ui.js');\n updateQueueBadge(data.pending || 1);\n } else if (data.continued) {\n addSystemMsg(t('chat.continue'));\n }\n }\n}\n\nexport function handleKey(e) {\n if (e.key === 'Enter' && !e.shiftKey && !e.isComposing) { e.preventDefault(); sendMessage(); }\n}\n\nasync function uploadFile(file) {\n const res = await fetch('/api/upload', {\n method: 'POST',\n headers: { 'X-Filename': encodeURIComponent(file.name) },\n body: file,\n });\n if (!res.ok) throw new Error('upload failed');\n const data = await res.json();\n return data.path;\n}\n\nexport function attachFiles(files) {\n for (const file of files) {\n // Skip duplicates by name\n if (state.attachedFiles.some(f => f.name === file.name)) continue;\n state.attachedFiles.push(file);\n }\n renderFilePreview();\n document.getElementById('chatInput').focus();\n}\n\nexport function removeAttachedFile(index) {\n state.attachedFiles.splice(index, 1);\n renderFilePreview();\n}\n\nexport function clearAttachedFiles() {\n state.attachedFiles = [];\n renderFilePreview();\n document.getElementById('fileInput').value = '';\n}\n\nfunction renderFilePreview() {\n const preview = document.getElementById('filePreview');\n const listEl = document.getElementById('filePreviewList');\n if (!state.attachedFiles.length) {\n preview.classList.remove('visible');\n if (listEl) listEl.innerHTML = '';\n return;\n }\n preview.classList.add('visible');\n if (!listEl) return;\n listEl.innerHTML = state.attachedFiles.map((f, i) => {\n const size = (f.size / 1024).toFixed(1);\n const isImg = f.type.startsWith('image/');\n const thumb = isImg ? `<img src=\"${URL.createObjectURL(f)}\" class=\"file-chip-thumb\" alt=\"\">` : '';\n return `<div class=\"file-chip\">\n ${thumb}\n <span class=\"file-chip-name\">\uD83D\uDCCE ${f.name} (${size}KB)</span>\n <button class=\"file-chip-remove\" data-file-idx=\"${i}\" title=\"Remove\">\u2715</button>\n </div>`;\n }).join('');\n}\n\nexport async function clearChat() {\n apiFire('/api/clear', 'POST');\n document.getElementById('chatMessages').innerHTML = '';\n}\n\n// \u2500\u2500 Auto-resize textarea \u2500\u2500\nfunction autoResize(el) {\n el.style.height = 'auto';\n el.style.height = el.scrollHeight + 'px';\n}\n\nexport function initAutoResize() {\n const el = document.getElementById('chatInput');\n el.addEventListener('input', () => autoResize(el));\n}\n\nexport function resetInputHeight() {\n const el = document.getElementById('chatInput');\n el.style.height = 'auto';\n}\n\nexport function initDragDrop() {\n const chatArea = document.querySelector('.chat-area');\n const overlay = document.getElementById('dragOverlay');\n let dragCounter = 0;\n\n chatArea.addEventListener('dragenter', (e) => {\n e.preventDefault();\n dragCounter++;\n overlay.classList.add('visible');\n });\n chatArea.addEventListener('dragleave', (e) => {\n e.preventDefault();\n dragCounter--;\n if (dragCounter <= 0) { dragCounter = 0; overlay.classList.remove('visible'); }\n });\n chatArea.addEventListener('dragover', (e) => e.preventDefault());\n chatArea.addEventListener('drop', (e) => {\n e.preventDefault();\n dragCounter = 0;\n overlay.classList.remove('visible');\n const files = [...e.dataTransfer.files];\n if (files.length) attachFiles(files);\n });\n\n document.getElementById('fileInput').addEventListener('change', (e) => {\n const files = [...e.target.files];\n if (files.length) attachFiles(files);\n e.target.value = ''; // allow re-selecting same file\n });\n\n // \u2500\u2500 Clipboard paste (Cmd+V) \u2500\u2500\n document.addEventListener('paste', (e) => {\n const items = e.clipboardData?.items;\n if (!items) return;\n const files = [];\n for (const item of items) {\n if (item.kind !== 'file') continue;\n const blob = item.getAsFile();\n if (!blob) continue;\n // Pasted images often have no useful name; generate one\n if (!blob.name || blob.name === 'image.png') {\n const ts = new Date().toISOString().replace(/[:.]/g, '-');\n const ext = blob.type.split('/')[1] || 'png';\n const named = new File([blob], `pasted-${ts}.${ext}`, { type: blob.type });\n files.push(named);\n } else {\n files.push(blob);\n }\n }\n if (files.length) {\n e.preventDefault();\n attachFiles(files);\n }\n });\n}\n", "// \u2500\u2500 Heartbeat Feature \u2500\u2500\nimport { state } from '../state.js';\nimport { t } from './i18n.js';\nimport { api, apiJson } from '../api.js';\nimport { escapeHtml } from '../render.js';\n\nexport async function openHeartbeatModal() {\n const data = await api('/api/heartbeat');\n state.heartbeatJobs = data?.jobs || [];\n renderHeartbeatJobs();\n document.getElementById('heartbeatModal').classList.add('open');\n}\n\nexport function closeHeartbeatModal(e) {\n if (e && e.target !== e.currentTarget) return;\n document.getElementById('heartbeatModal').classList.remove('open');\n}\n\nexport function renderHeartbeatJobs() {\n const container = document.getElementById('hbJobsList');\n if (state.heartbeatJobs.length === 0) {\n container.innerHTML = `<p style=\"color:var(--text-dim);font-size:12px;text-align:center\">${t('hb.empty')}</p>`;\n } else {\n container.innerHTML = state.heartbeatJobs.map((job, i) => `\n <div class=\"hb-job-card\">\n <div class=\"hb-job-header\">\n <input type=\"text\" value=\"${escapeHtml(job.name || '')}\" placeholder=\"${t('hb.name')}\"\n data-hb-name=\"${i}\">\n <span style=\"font-size:11px;color:var(--text-dim)\">every</span>\n <input type=\"number\" value=\"${job.schedule?.minutes || 5}\" min=\"1\"\n data-hb-minutes=\"${i}\">\n <span style=\"font-size:11px;color:var(--text-dim)\">min</span>\n <button class=\"hb-toggle ${job.enabled ? 'on' : 'off'}\"\n data-hb-toggle=\"${i}\"></button>\n <button class=\"hb-del\" data-hb-remove=\"${i}\">\u2715</button>\n </div>\n <textarea class=\"hb-prompt\" rows=\"2\" placeholder=\"${t('hb.prompt')}\"\n data-hb-prompt=\"${i}\">${escapeHtml(job.prompt || '')}</textarea>\n </div>\n `).join('');\n }\n const active = state.heartbeatJobs.filter(j => j.enabled).length;\n document.getElementById('hbSidebarBtn').textContent = `\uD83D\uDC93 Heartbeat (${active})`;\n}\n\nexport function addHeartbeatJob() {\n state.heartbeatJobs.push({\n id: 'hb_' + Date.now(),\n name: '',\n enabled: true,\n schedule: { kind: 'every', minutes: 5 },\n prompt: ''\n });\n renderHeartbeatJobs();\n saveHeartbeatJobs();\n}\n\nexport function removeHeartbeatJob(i) {\n state.heartbeatJobs.splice(i, 1);\n renderHeartbeatJobs();\n saveHeartbeatJobs();\n}\n\nexport function toggleHeartbeatJob(i) {\n state.heartbeatJobs[i].enabled = !state.heartbeatJobs[i].enabled;\n renderHeartbeatJobs();\n saveHeartbeatJobs();\n}\n\nexport async function saveHeartbeatJobs() {\n await apiJson('/api/heartbeat', 'PUT', { jobs: state.heartbeatJobs });\n}\n\nexport async function initHeartbeatBadge() {\n try {\n const d = await api('/api/heartbeat');\n const active = (d?.jobs || []).filter(j => j.enabled).length;\n document.getElementById('hbSidebarBtn').textContent = `\uD83D\uDC93 Heartbeat (${active})`;\n } catch { }\n}\n", "// \u2500\u2500 Memory Feature \u2500\u2500\nimport { escapeHtml } from '../render.js';\nimport { api, apiJson, apiFire } from '../api.js';\n\nexport async function openMemoryModal() {\n const data = await api('/api/memory-files');\n if (!data) return;\n document.getElementById('memOn').classList.toggle('active', data.enabled);\n document.getElementById('memOff').classList.toggle('active', !data.enabled);\n document.getElementById('memFlushEvery').value = data.flushEvery;\n document.getElementById('memCli').value = data.cli || '';\n document.getElementById('memModel').value = data.model || '';\n document.getElementById('memRetention').value = data.retentionDays;\n document.getElementById('memPath').textContent = data.path;\n document.getElementById('memCounter').textContent = data.counter;\n document.getElementById('memThreshold').textContent = data.flushEvery;\n renderMemFiles(data.files);\n document.getElementById('memorySidebarBtn').textContent = `\uD83E\uDDE0 Memory (${data.files.length})`;\n document.getElementById('memoryModal').classList.add('open');\n}\n\nexport function closeMemoryModal(e) {\n if (e && e.target !== e.currentTarget) return;\n document.getElementById('memoryModal').classList.remove('open');\n}\n\nexport function switchMemTab(tab) {\n document.getElementById('memTabSettings').style.display = tab === 'settings' ? '' : 'none';\n document.getElementById('memTabFiles').style.display = tab === 'files' ? '' : 'none';\n document.getElementById('memTabBtnSettings').classList.toggle('active', tab === 'settings');\n document.getElementById('memTabBtnFiles').classList.toggle('active', tab === 'files');\n}\n\nexport async function setMemEnabled(v) {\n document.getElementById('memOn').classList.toggle('active', v);\n document.getElementById('memOff').classList.toggle('active', !v);\n await apiJson('/api/memory-files/settings', 'PUT', { enabled: v });\n}\n\nexport async function saveMemSettings() {\n await apiJson('/api/memory-files/settings', 'PUT', {\n flushEvery: +document.getElementById('memFlushEvery').value,\n cli: document.getElementById('memCli').value,\n model: document.getElementById('memModel').value,\n retentionDays: +document.getElementById('memRetention').value,\n });\n document.getElementById('memThreshold').textContent = document.getElementById('memFlushEvery').value;\n}\n\nfunction renderMemFiles(files) {\n const container = document.getElementById('memFilesList');\n if (!files || files.length === 0) {\n container.innerHTML = '<p style=\"color:var(--text-dim);font-size:12px;text-align:center\">No memory files yet</p>';\n return;\n }\n container.innerHTML = files.map(f => `\n <div style=\"display:flex;align-items:center;justify-content:space-between;padding:6px 8px;border:1px solid var(--border);border-radius:4px;margin-bottom:4px;cursor:pointer\"\n data-mem-view=\"${escapeHtml(f.name)}\">\n <div>\n <span style=\"font-size:12px;font-family:monospace\">${escapeHtml(f.name)}</span>\n <span style=\"font-size:10px;color:var(--accent);margin-left:6px\">${f.entries} entries</span>\n </div>\n <button data-mem-delete=\"${escapeHtml(f.name)}\" style=\"background:none;border:none;color:#f55;cursor:pointer;font-size:14px\">\uD83D\uDDD1\uFE0F</button>\n </div>\n `).join('');\n}\n\nexport async function deleteMemFile(name) {\n if (!confirm('Delete ' + name + '?')) return;\n await apiJson('/api/memory-files/' + name, 'DELETE');\n openMemoryModal();\n}\n\nexport async function viewMemFile(name) {\n const data = await api('/api/memory-files/' + name);\n if (!data) return;\n const container = document.getElementById('memFilesList');\n container.innerHTML = `\n <div style=\"margin-bottom:8px;display:flex;justify-content:space-between;align-items:center\">\n <span style=\"font-size:12px;font-weight:600\">${data.name}</span>\n <button data-mem-back style=\"background:none;border:none;color:var(--accent);cursor:pointer;font-size:11px\">\u2190 back</button>\n </div>\n <pre style=\"background:var(--bg);padding:8px;border-radius:4px;font-size:11px;white-space:pre-wrap;max-height:50vh;overflow-y:auto;color:var(--text)\">${escapeHtml(data.content)}</pre>\n `;\n}\n", "// \u2500\u2500 Sidebar Collapse \u2500\u2500\n// Toggle left/right sidebars. Responsive-aware:\n// - Wide viewport (>900px): toggle *-collapsed classes\n// - Narrow viewport (\u2264900px): CSS auto-collapses, toggle *-expanded to override\n\nconst STORAGE_KEY = 'sidebarState';\nconst BREAKPOINT = 900;\n\nexport function initSidebar() {\n const saved = JSON.parse(localStorage.getItem(STORAGE_KEY) || '{}');\n if (saved.left) document.body.classList.add('left-collapsed');\n if (saved.right) document.body.classList.add('right-collapsed');\n\n document.getElementById('toggleLeft')?.addEventListener('click', toggleLeft);\n document.getElementById('toggleRight')?.addEventListener('click', toggleRight);\n\n // On resize: sync classes with viewport mode\n window.addEventListener('resize', () => {\n if (window.innerWidth > BREAKPOINT) {\n // Wide: remove expanded, restore collapsed from storage\n document.body.classList.remove('left-expanded', 'right-expanded');\n const s = JSON.parse(localStorage.getItem(STORAGE_KEY) || '{}');\n document.body.classList.toggle('left-collapsed', !!s.left);\n document.body.classList.toggle('right-collapsed', !!s.right);\n } else {\n // Narrow: suspend collapsed (CSS media query handles auto-collapse)\n document.body.classList.remove('left-collapsed', 'right-collapsed');\n }\n syncIcons();\n });\n\n // If starting narrow, suspend collapsed\n if (window.innerWidth <= BREAKPOINT) {\n document.body.classList.remove('left-collapsed', 'right-collapsed');\n }\n\n syncIcons();\n}\n\nfunction isNarrow() {\n return window.innerWidth <= BREAKPOINT;\n}\n\nexport function toggleLeft() {\n if (isNarrow()) {\n // Narrow mode: toggle expanded override\n document.body.classList.toggle('left-expanded');\n } else {\n // Wide mode: toggle collapsed\n document.body.classList.toggle('left-collapsed');\n }\n save();\n syncIcons();\n}\n\nexport function toggleRight() {\n if (isNarrow()) {\n document.body.classList.toggle('right-expanded');\n } else {\n document.body.classList.toggle('right-collapsed');\n }\n save();\n syncIcons();\n}\n\nfunction isLeftOpen() {\n if (isNarrow()) return document.body.classList.contains('left-expanded');\n return !document.body.classList.contains('left-collapsed');\n}\n\nfunction isRightOpen() {\n if (isNarrow()) return document.body.classList.contains('right-expanded');\n return !document.body.classList.contains('right-collapsed');\n}\n\nfunction syncIcons() {\n const leftBtn = document.getElementById('toggleLeft');\n const rightBtn = document.getElementById('toggleRight');\n if (leftBtn) leftBtn.textContent = isLeftOpen() ? '\u25C0' : '\u25B6';\n if (rightBtn) rightBtn.textContent = isRightOpen() ? '\u25B6' : '\u25C0';\n}\n\nfunction save() {\n localStorage.setItem(STORAGE_KEY, JSON.stringify({\n left: document.body.classList.contains('left-collapsed'),\n right: document.body.classList.contains('right-collapsed'),\n }));\n}\n", "// \u2500\u2500 Theme Toggle \u2500\u2500\n// Dark/Light theme switching with localStorage persistence\n// Swaps CSS data-theme attribute + highlight.js stylesheet\n\nconst STORAGE_KEY = 'theme';\nconst HLJS_DARK = 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/styles/github-dark.min.css';\nconst HLJS_LIGHT = 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/styles/github.min.css';\n\nexport function initTheme() {\n // Detect: localStorage \u2192 OS preference \u2192 default dark\n const saved = localStorage.getItem(STORAGE_KEY);\n const prefer = window.matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark';\n const theme = saved || prefer;\n applyTheme(theme);\n\n document.getElementById('toggleTheme')?.addEventListener('click', toggleTheme);\n}\n\nfunction toggleTheme() {\n const current = document.documentElement.getAttribute('data-theme') || 'dark';\n const next = current === 'dark' ? 'light' : 'dark';\n applyTheme(next);\n localStorage.setItem(STORAGE_KEY, next);\n}\n\nfunction applyTheme(theme) {\n document.documentElement.setAttribute('data-theme', theme);\n\n // Update button icon (SVG sun/moon swap)\n const btn = document.getElementById('toggleTheme');\n if (btn) {\n btn.classList.toggle('is-light', theme === 'light');\n }\n\n // Swap highlight.js theme\n const hljsLink = document.getElementById('hljsTheme');\n if (hljsLink) {\n hljsLink.href = theme === 'dark' ? HLJS_DARK : HLJS_LIGHT;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["state", "init_state", "__esmMin", "api_exports", "__export", "api", "apiFire", "apiJson", "path", "opts", "res", "json", "e", "method", "body", "init_api", "__esmMin", "toModelMap", "registry", "out", "key", "value", "normalizeRegistry", "input", "normalized", "applyRegistry", "CLI_REGISTRY", "CLI_KEYS", "MODEL_MAP", "loadCliRegistry", "data", "api", "FALLBACK_CLI_REGISTRY", "getCliKeys", "getCliMeta", "cli", "ROLE_PRESETS", "init_constants", "__esmMin", "init_api", "employees_exports", "__export", "addEmployee", "deleteEmployee", "loadEmployees", "onEmpCliChange", "onEmpRoleChange", "renderEmployees", "updateEmployee", "data", "api", "state", "el", "t", "cliKeys", "getCliKeys", "a", "models", "MODEL_MAP", "legacyVal", "matched", "ROLE_PRESETS", "r", "presetVal", "isCustom", "escapeHtml", "c", "ps", "getAgentPhase", "p", "pl", "apiJson", "id", "apiFire", "cli", "sel", "m", "preset", "customEl", "init_employees", "__esmMin", "init_state", "init_constants", "init_render", "init_ws", "init_i18n", "init_api", "skills_exports", "__export", "filterSkills", "loadSkills", "renderSkills", "toggleSkill", "res", "fetchWithLocale", "state", "t", "list", "count", "filtered", "s", "KNOWN_CATS", "enabledCount", "reqParts", "escapeHtml", "id", "currentlyEnabled", "endpoint", "apiJson", "e", "cat", "btn", "b", "init_skills", "__esmMin", "init_state", "init_i18n", "init_api", "init_render", "getPreferredLocale", "key", "LOCALE_KEYS", "saved", "syncStoredLocale", "locale", "value", "init_locale", "__esmMin", "slash_commands_exports", "__export", "close", "handleClick", "handleKeydown", "handleOutsideClick", "isDropdownOpen", "loadCommands", "update", "looksLikeFilePath", "text", "tok", "escapeHtml", "str", "filterCommands", "partial", "prefix", "cmdList", "c", "showDropdown", "el", "dropdown", "inp", "input", "closeTimer", "isOpen", "render", "filtered", "t", "cmd", "i", "selected", "selectedIdx", "applySelection", "execute", "locale", "getPreferredLocale", "url", "api", "err", "raw", "item", "idx", "init_slash_commands", "__esmMin", "init_locale", "init_i18n", "init_api", "settings_exports", "__export", "applyCustomModel", "closePromptModal", "getModelValue", "handleModelSelect", "installMcpGlobal", "loadCliStatus", "loadFallbackOrder", "loadMcpServers", "loadSettings", "onCliChange", "openPromptModal", "saveActiveCliSettings", "saveFallbackOrder", "savePerCli", "savePromptFromModal", "saveTelegramSettings", "setPerm", "setTelegram", "syncMcpServers", "updateSettings", "toCap", "cli", "getModelSelect", "getCustomModelInput", "getEffortSelect", "setSelectOptions", "selectEl", "values", "includeCustom", "includeDefault", "selected", "defaultHtml", "customHtml", "t", "opts", "v", "escapeHtml", "o", "appendCustomOption", "value", "opt", "customOpt", "syncCliOptionSelects", "settings", "cliKeys", "getCliKeys", "selCli", "current", "label", "getCliMeta", "memCli", "syncPerCliModelAndEffortControls", "modelSel", "MODEL_MAP", "effortSel", "meta", "options", "unique", "noneLabel", "syncActiveEffortOptions", "selEffort", "efforts", "loadCliRegistry", "s", "api", "syncStoredLocale", "cfg", "modelEl", "effortEl", "ao", "pc", "activeModel", "activeEffort", "loadTelegramSettings", "d", "el", "names", "n", "resultEl", "apiJson", "r", "k", "e", "p", "save", "apiFire", "sel", "customInput", "inputEl", "val", "select", "perCli", "models", "oldInput", "inp", "model", "effort", "overrides", "token", "chatIdsRaw", "allowedChatIds", "enabled", "tg", "container", "allClis", "active", "slotCount", "html", "i", "fallbackOrder", "force", "interval", "state", "renderCliStatus", "cliStatus", "quota", "data", "AUTH_HINTS", "name", "info", "q", "dotClass", "accountLine", "parts", "authHint", "hint", "windowsHtml", "w", "pct", "barColor", "content", "init_settings", "__esmMin", "init_constants", "init_render", "init_locale", "init_i18n", "init_api", "init_state", "initI18n", "saved", "browserLang", "fallbackDict", "fetchLocale", "dict", "currentLocale", "applyI18n", "lang", "api", "t", "key", "params", "val", "k", "v", "el", "setLang", "loadEmployees", "loadSkills", "loadCommands", "loadSettings", "getLang", "fetchWithLocale", "url", "init", "u", "init_i18n", "__esmMin", "escapeHtml", "str", "sanitizeHtml", "html", "stripOrchestration", "text", "cleaned", "renderMath", "_", "tex", "renderMermaidBlocks", "el", "code", "id", "mermaidId", "svg", "rawSvg", "zoomBtn", "openMermaidOverlay", "err", "errMsg", "svgHtml", "overlay", "svgEl", "close", "e", "handler", "ensureMarked", "markedReady", "renderer", "lang", "highlighted", "labelText", "t", "renderFallback", "rehighlightAll", "c", "raw", "ensureCopyDelegation", "copyDelegationReady", "label", "wrapper", "codeEl", "orig", "renderMarkdown", "init_render", "__esmMin", "init_i18n", "waitForHljs", "waitForMermaid", "getAppName", "currentName", "setAppName", "name", "DEFAULT_NAME", "STORAGE_KEY", "input", "initAppName", "inp", "e", "init_appname", "__esmMin", "ui_exports", "__export", "addMessage", "addSystemMsg", "appendAgentText", "finalizeAgent", "handleSave", "initMsgCopy", "loadMemory", "loadMessages", "loadStats", "scrollToBottom", "setStatus", "switchTab", "updateQueueBadge", "s", "badge", "btn", "state", "t", "count", "el", "text", "extraClass", "type", "container", "div", "typeClass", "content", "toolLog", "now", "lastFinalizeTs", "toolHtml", "counts", "summaryParts", "icon", "n", "logLines", "escapeHtml", "renderMarkdown", "role", "rendered", "copyBtn", "getAppName", "c", "name", "targetBtn", "b", "tabMap", "m", "msgs", "api", "msg", "raw", "items", "list", "init_ui", "__esmMin", "init_state", "init_render", "init_appname", "init_i18n", "init_api", "connect", "state", "getLang", "msg", "setStatus", "agentPhaseState", "m", "updateQueueBadge", "addSystemMsg", "agents", "names", "t", "appendAgentText", "finalizeAgent", "addMessage", "getAgentPhase", "agentId", "init_ws", "__esmMin", "init_state", "init_ui", "init_i18n", "init_ws", "init_ui", "init_state", "init_ui", "init_locale", "init_i18n", "init_slash_commands", "init_api", "sendMessage", "input", "state", "apiFire", "text", "firstToken", "isFilePath", "resetInputHeight", "close", "signal", "timer", "ac", "locale", "getPreferredLocale", "res", "result", "addMessage", "apiJson", "addSystemMsg", "err", "t", "displayMsg", "f", "prompt", "uploadFile", "p", "clearAttachedFiles", "data", "updateQueueBadge", "handleKey", "file", "attachFiles", "files", "renderFilePreview", "removeAttachedFile", "index", "preview", "listEl", "i", "size", "clearChat", "autoResize", "el", "initAutoResize", "initDragDrop", "chatArea", "overlay", "dragCounter", "e", "items", "item", "blob", "ts", "ext", "named", "init_slash_commands", "init_skills", "init_settings", "init_employees", "init_state", "init_i18n", "init_api", "init_render", "openHeartbeatModal", "data", "api", "state", "renderHeartbeatJobs", "closeHeartbeatModal", "container", "t", "job", "i", "escapeHtml", "active", "j", "addHeartbeatJob", "saveHeartbeatJobs", "removeHeartbeatJob", "toggleHeartbeatJob", "apiJson", "initHeartbeatBadge", "init_render", "init_api", "openMemoryModal", "data", "api", "renderMemFiles", "closeMemoryModal", "switchMemTab", "tab", "setMemEnabled", "v", "apiJson", "saveMemSettings", "files", "container", "f", "escapeHtml", "deleteMemFile", "name", "viewMemFile", "init_state", "init_constants", "init_appname", "STORAGE_KEY", "initSidebar", "saved", "STORAGE_KEY", "toggleLeft", "toggleRight", "s", "syncIcons", "isNarrow", "save", "isLeftOpen", "isRightOpen", "leftBtn", "rightBtn", "STORAGE_KEY", "HLJS_DARK", "HLJS_LIGHT", "initTheme", "saved", "prefer", "applyTheme", "toggleTheme", "next", "theme", "btn", "hljsLink", "init_i18n", "sendMessage", "chatInput", "handleKeydown", "handleKey", "slashInputRaf", "update", "handleClick", "handleOutsideClick", "clearAttachedFiles", "btn", "removeAttachedFile", "openMemoryModal", "clearChat", "openHeartbeatModal", "next", "getLang", "setLang", "t", "state", "idx", "c", "names", "switchTab", "handleSave", "onCliChange", "saveActiveCliSettings", "addEmployee", "del", "deleteEmployee", "name", "updateEmployee", "cli", "onEmpCliChange", "model", "val", "opt", "customOpt", "role", "onEmpRoleChange", "custom", "toggle", "toggleSkill", "filterBtn", "cat", "filterSkills", "openPromptModal", "setTelegram", "saveTelegramSettings", "saveFallbackOrder", "bindPerCliControlEvents", "getCliKeys", "cap", "sel", "handleModelSelect", "applyCustomModel", "effort", "savePerCli", "syncMcpServers", "installMcpGlobal", "loadCliStatus", "closePromptModal", "savePromptFromModal", "closeHeartbeatModal", "addHeartbeatJob", "toggleHeartbeatJob", "remove", "removeHeartbeatJob", "saveHeartbeatJobs", "min", "prompt", "closeMemoryModal", "switchMemTab", "setMemEnabled", "saveMemSettings", "deleteMemFile", "view", "viewMemFile", "bootstrap", "initI18n", "langBtn", "loadCliRegistry", "connect", "initDragDrop", "initAutoResize", "loadCommands", "loadSettings", "loadMemory", "loadEmployees", "initHeartbeatBadge", "initAppName", "initSidebar", "initTheme", "initMsgCopy", "err", "m", "toggleLeft", "toggleRight"]
|
|
7
7
|
}
|