@xopcai/xopc 0.0.29 → 0.0.31
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/dist/extensions/telegram/src/adapters/config-surface.js +3 -1
- package/dist/extensions/telegram/src/adapters/config-surface.js.map +1 -1
- package/dist/extensions/telegram/src/adapters/onboard-cli.js +23 -21
- package/dist/extensions/telegram/src/adapters/onboard-cli.js.map +1 -1
- package/dist/extensions/telegram/src/adapters/setup-wizard.js +3 -4
- package/dist/extensions/telegram/src/adapters/setup-wizard.js.map +1 -1
- package/dist/extensions/telegram/src/config-schema.d.ts +0 -1
- package/dist/extensions/telegram/src/config-schema.js +17 -4
- package/dist/extensions/telegram/src/config-schema.js.map +1 -1
- package/dist/extensions/telegram/src/plugin.js +4 -17
- package/dist/extensions/telegram/src/plugin.js.map +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/extensions/weixin/src/cdn/upload.js +1 -1
- package/dist/extensions/weixin/src/media/data-url.js +1 -1
- package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
- package/dist/gateway/static/root/assets/agents-3u63Fw2Y.js +216 -0
- package/dist/gateway/static/root/assets/agents-3u63Fw2Y.js.map +1 -0
- package/dist/gateway/static/root/assets/{apps-page-Bmq19MS-.js → apps-page-CWegY6Kp.js} +2 -2
- package/dist/gateway/static/root/assets/{apps-page-Bmq19MS-.js.map → apps-page-CWegY6Kp.js.map} +1 -1
- package/dist/gateway/static/root/assets/channels-settings-CiyeXcTK.js +9 -0
- package/dist/gateway/static/root/assets/channels-settings-CiyeXcTK.js.map +1 -0
- package/dist/gateway/static/root/assets/cron-api-_j_79Zf5.js +3 -0
- package/dist/gateway/static/root/assets/cron-api-_j_79Zf5.js.map +1 -0
- package/dist/gateway/static/root/assets/cron-page-S86YNTtI.js +2 -0
- package/dist/gateway/static/root/assets/cron-page-S86YNTtI.js.map +1 -0
- package/dist/gateway/static/root/assets/dist-D0jxbvuz.js +2 -0
- package/dist/gateway/static/root/assets/{dist--p2HQ2QF.js.map → dist-D0jxbvuz.js.map} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-DwHCB_6T.js → extension-debug-page-DB630cW8.js} +2 -2
- package/dist/gateway/static/root/assets/{extension-debug-page-DwHCB_6T.js.map → extension-debug-page-DB630cW8.js.map} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-BsYwQIex.js → extension-page-CnoPUBul.js} +2 -2
- package/dist/gateway/static/root/assets/{extension-page-BsYwQIex.js.map → extension-page-CnoPUBul.js.map} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-nsisEgjB.js → extension-settings-page-BsiOkvBe.js} +2 -2
- package/dist/gateway/static/root/assets/{extension-settings-page-nsisEgjB.js.map → extension-settings-page-BsiOkvBe.js.map} +1 -1
- package/dist/gateway/static/root/assets/{index-CR8zUHGR.js → index-DHLmAIQl.js} +63 -63
- package/dist/gateway/static/root/assets/{index-CR8zUHGR.js.map → index-DHLmAIQl.js.map} +1 -1
- package/dist/gateway/static/root/assets/index-DoPwy4aU.css +1 -0
- package/dist/gateway/static/root/assets/logs-page-Bndhenn2.js +2 -0
- package/dist/gateway/static/root/assets/logs-page-Bndhenn2.js.map +1 -0
- package/dist/gateway/static/root/assets/sessions-page-Q201-_lP.js +2 -0
- package/dist/gateway/static/root/assets/{sessions-page-Be5kIGl_.js.map → sessions-page-Q201-_lP.js.map} +1 -1
- package/dist/gateway/static/root/assets/settings-page-Cw75fpc6.js +2 -0
- package/dist/gateway/static/root/assets/settings-page-Cw75fpc6.js.map +1 -0
- package/dist/gateway/static/root/assets/skills-page-CVwEzD_J.js +3 -0
- package/dist/gateway/static/root/assets/skills-page-CVwEzD_J.js.map +1 -0
- package/dist/gateway/static/root/index.html +2 -2
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.d.ts +5 -7
- package/dist/src/agent/agent-manager.js +21 -19
- package/dist/src/agent/agent-manager.js.map +1 -1
- package/dist/src/agent/ipc/inbox.js +4 -2
- package/dist/src/agent/ipc/inbox.js.map +1 -1
- package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
- package/dist/src/agent/memory/dreaming/utils.js +1 -1
- package/dist/src/agent/orchestration/agent-orchestrator.js +1 -1
- package/dist/src/agent/prompt/service-prompt-builder.js +0 -2
- package/dist/src/agent/prompt/service-prompt-builder.js.map +1 -1
- package/dist/src/agent/prompt/system-prompt.d.ts +0 -2
- package/dist/src/agent/prompt/system-prompt.js +3 -17
- package/dist/src/agent/prompt/system-prompt.js.map +1 -1
- package/dist/src/agent/service/btw-query.d.ts +16 -0
- package/dist/src/agent/service/btw-query.js +88 -0
- package/dist/src/agent/service/btw-query.js.map +1 -0
- package/dist/src/agent/service/build-direct-message-content.d.ts +30 -0
- package/dist/src/agent/service/build-direct-message-content.js +75 -0
- package/dist/src/agent/service/build-direct-message-content.js.map +1 -0
- package/dist/src/agent/service/parse-outbound-session-key.d.ts +8 -0
- package/dist/src/agent/service/parse-outbound-session-key.js +41 -0
- package/dist/src/agent/service/parse-outbound-session-key.js.map +1 -0
- package/dist/src/agent/service/process-direct-one-shot.d.ts +34 -0
- package/dist/src/agent/service/process-direct-one-shot.js +67 -0
- package/dist/src/agent/service/process-direct-one-shot.js.map +1 -0
- package/dist/src/agent/service/process-direct-streaming.js +12 -1
- package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
- package/dist/src/agent/service/reconcile-dreaming-cron.d.ts +6 -0
- package/dist/src/agent/service/reconcile-dreaming-cron.js +70 -0
- package/dist/src/agent/service/reconcile-dreaming-cron.js.map +1 -0
- package/dist/src/agent/service/session-context-report.d.ts +19 -0
- package/dist/src/agent/service/session-context-report.js +47 -0
- package/dist/src/agent/service/session-context-report.js.map +1 -0
- package/dist/src/agent/service/webchat-tts.d.ts +28 -0
- package/dist/src/agent/service/webchat-tts.js +73 -0
- package/dist/src/agent/service/webchat-tts.js.map +1 -0
- package/dist/src/agent/service.d.ts +8 -12
- package/dist/src/agent/service.js +74 -379
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/skills/config.js +4 -3
- package/dist/src/agent/skills/config.js.map +1 -1
- package/dist/src/agent/skills/format-skills-prompt.d.ts +0 -2
- package/dist/src/agent/skills/format-skills-prompt.js +3 -24
- package/dist/src/agent/skills/format-skills-prompt.js.map +1 -1
- package/dist/src/agent/skills/hub-lock.js +4 -5
- package/dist/src/agent/skills/hub-lock.js.map +1 -1
- package/dist/src/agent/skills/index.js +9 -21
- package/dist/src/agent/skills/index.js.map +1 -1
- package/dist/src/agent/skills/marketplace/adapter.types.d.ts +17 -0
- package/dist/src/agent/skills/marketplace/adapter.types.js +1 -0
- package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.d.ts +2 -0
- package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js +292 -0
- package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js.map +1 -0
- package/dist/src/agent/skills/marketplace/adapters/skillhub/ecosystem-client.d.ts +73 -0
- package/dist/src/agent/skills/marketplace/adapters/skillhub/ecosystem-client.js +200 -0
- package/dist/src/agent/skills/marketplace/adapters/skillhub/ecosystem-client.js.map +1 -0
- package/dist/src/agent/skills/marketplace/adapters/skillhub/registry-client.d.ts +137 -0
- package/dist/src/agent/skills/marketplace/adapters/skillhub/registry-client.js +217 -0
- package/dist/src/agent/skills/marketplace/adapters/skillhub/registry-client.js.map +1 -0
- package/dist/src/agent/skills/marketplace/adapters/skillhub/skillhub-fetch-cache.d.ts +12 -0
- package/dist/src/agent/skills/marketplace/adapters/skillhub/skillhub-fetch-cache.js +90 -0
- package/dist/src/agent/skills/marketplace/adapters/skillhub/skillhub-fetch-cache.js.map +1 -0
- package/dist/src/agent/skills/marketplace/adapters/store/adapter.d.ts +2 -0
- package/dist/src/agent/skills/marketplace/adapters/store/adapter.js +35 -0
- package/dist/src/agent/skills/marketplace/adapters/store/adapter.js.map +1 -0
- package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.d.ts +124 -0
- package/dist/src/agent/skills/{skills-store-client.js → marketplace/adapters/store/store-api-client.js} +4 -3
- package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js.map +1 -0
- package/dist/src/agent/skills/marketplace/resolve-adapter.d.ts +6 -0
- package/dist/src/agent/skills/marketplace/resolve-adapter.js +26 -0
- package/dist/src/agent/skills/marketplace/resolve-adapter.js.map +1 -0
- package/dist/src/agent/skills/parse-skill-metadata.d.ts +5 -0
- package/dist/src/agent/skills/parse-skill-metadata.js +27 -0
- package/dist/src/agent/skills/parse-skill-metadata.js.map +1 -0
- package/dist/src/agent/skills/skill-markdown-preview-from-raw.d.ts +6 -0
- package/dist/src/agent/skills/skill-markdown-preview-from-raw.js +64 -0
- package/dist/src/agent/skills/skill-markdown-preview-from-raw.js.map +1 -0
- package/dist/src/agent/skills/skill-view-path.d.ts +17 -1
- package/dist/src/agent/skills/skill-view-path.js +66 -3
- package/dist/src/agent/skills/skill-view-path.js.map +1 -1
- package/dist/src/agent/skills/skills-marketplace.d.ts +21 -0
- package/dist/src/agent/skills/skills-marketplace.js +18 -0
- package/dist/src/agent/skills/skills-marketplace.js.map +1 -0
- package/dist/src/agent/skills/test-framework.d.ts +0 -1
- package/dist/src/agent/skills/test-framework.js +2 -20
- package/dist/src/agent/skills/test-framework.js.map +1 -1
- package/dist/src/agent/skills/types.d.ts +12 -6
- package/dist/src/agent/tools/dreaming-tool.js +1 -1
- package/dist/src/agent/tools/image-generate-tool.js +2 -2
- package/dist/src/auth/credentials.js +8 -6
- package/dist/src/auth/credentials.js.map +1 -1
- package/dist/src/auth/profiles/store.js +5 -3
- package/dist/src/auth/profiles/store.js.map +1 -1
- package/dist/src/channels/manager.js +1 -1
- package/dist/src/channels/outbound/persist-store.js +4 -4
- package/dist/src/channels/outbound/persist-store.js.map +1 -1
- package/dist/src/cli/commands/config.js +8 -6
- package/dist/src/cli/commands/config.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/channel-config.js +3 -4
- package/dist/src/cli/commands/doctor/checks/channel-config.js.map +1 -1
- package/dist/src/cli/commands/init.js +4 -2
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/config/loader.js +3 -1
- package/dist/src/config/loader.js.map +1 -1
- package/dist/src/config/models-json.js +4 -5
- package/dist/src/config/models-json.js.map +1 -1
- package/dist/src/config/schema.d.ts +12 -4
- package/dist/src/config/schema.js +31 -5
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/cron/persistence.d.ts +1 -3
- package/dist/src/cron/persistence.js +6 -17
- package/dist/src/cron/persistence.js.map +1 -1
- package/dist/src/cron/validation.js +1 -1
- package/dist/src/cron/validation.js.map +1 -1
- package/dist/src/extensions/activation-context.js +0 -1
- package/dist/src/extensions/activation-context.js.map +1 -1
- package/dist/src/extensions/lockfile.js +4 -2
- package/dist/src/extensions/lockfile.js.map +1 -1
- package/dist/src/gateway/auth.d.ts +0 -9
- package/dist/src/gateway/auth.js +1 -12
- package/dist/src/gateway/auth.js.map +1 -1
- package/dist/src/gateway/hono/lib/config-payload.d.ts +1 -1
- package/dist/src/gateway/hono/lib/extension-store.js +4 -4
- package/dist/src/gateway/hono/lib/extension-store.js.map +1 -1
- package/dist/src/gateway/hono/routes/channels.js +5 -3
- package/dist/src/gateway/hono/routes/channels.js.map +1 -1
- package/dist/src/gateway/hono/routes/commands-skills.js +28 -3
- package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
- package/dist/src/gateway/hono/routes/config.js +23 -2
- package/dist/src/gateway/hono/routes/config.js.map +1 -1
- package/dist/src/gateway/hono/routes/sessions.js +124 -2
- package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
- package/dist/src/gateway/hono/sse.js +9 -2
- package/dist/src/gateway/hono/sse.js.map +1 -1
- package/dist/src/gateway/index.js +2 -2
- package/dist/src/gateway/lock.js +1 -1
- package/dist/src/gateway/service/run-gateway-agent.d.ts +37 -0
- package/dist/src/gateway/service/run-gateway-agent.js +163 -0
- package/dist/src/gateway/service/run-gateway-agent.js.map +1 -0
- package/dist/src/gateway/service/save-webchat-user-message.d.ts +9 -0
- package/dist/src/gateway/service/save-webchat-user-message.js +34 -0
- package/dist/src/gateway/service/save-webchat-user-message.js.map +1 -0
- package/dist/src/gateway/service/session-chat-ids.d.ts +9 -0
- package/dist/src/gateway/service/session-chat-ids.js +33 -0
- package/dist/src/gateway/service/session-chat-ids.js.map +1 -0
- package/dist/src/gateway/service/sse-hub.d.ts +10 -0
- package/dist/src/gateway/service/sse-hub.js +55 -0
- package/dist/src/gateway/service/sse-hub.js.map +1 -0
- package/dist/src/gateway/service/types.d.ts +9 -0
- package/dist/src/gateway/service/types.js +1 -0
- package/dist/src/gateway/service.d.ts +42 -33
- package/dist/src/gateway/service.js +92 -246
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/infra/update-lock.js +4 -2
- package/dist/src/infra/update-lock.js.map +1 -1
- package/dist/src/infra/update-startup.js +5 -14
- package/dist/src/infra/update-startup.js.map +1 -1
- package/dist/src/infra/write-file-atomic.d.ts +18 -0
- package/dist/src/infra/write-file-atomic.js +115 -0
- package/dist/src/infra/write-file-atomic.js.map +1 -0
- package/dist/src/session/abort-cutoff.d.ts +6 -0
- package/dist/src/session/abort-cutoff.js +10 -0
- package/dist/src/session/abort-cutoff.js.map +1 -0
- package/dist/src/session/compaction-checkpoints.d.ts +8 -0
- package/dist/src/session/compaction-checkpoints.js +21 -0
- package/dist/src/session/compaction-checkpoints.js.map +1 -0
- package/dist/src/session/config-store.js +4 -2
- package/dist/src/session/config-store.js.map +1 -1
- package/dist/src/session/index.d.ts +8 -1
- package/dist/src/session/index.js +7 -1
- package/dist/src/session/manager.d.ts +26 -1
- package/dist/src/session/manager.js +39 -2
- package/dist/src/session/manager.js.map +1 -1
- package/dist/src/session/patch-metadata.d.ts +12 -0
- package/dist/src/session/patch-metadata.js +23 -0
- package/dist/src/session/patch-metadata.js.map +1 -0
- package/dist/src/session/search-index.d.ts +2 -0
- package/dist/src/session/search-index.js +30 -2
- package/dist/src/session/search-index.js.map +1 -1
- package/dist/src/session/session-context-for-llm.d.ts +32 -0
- package/dist/src/session/session-context-for-llm.js +60 -0
- package/dist/src/session/session-context-for-llm.js.map +1 -0
- package/dist/src/session/store.d.ts +53 -2
- package/dist/src/session/store.js +427 -145
- package/dist/src/session/store.js.map +1 -1
- package/dist/src/session/strip-webchat-early-save.d.ts +5 -0
- package/dist/src/session/strip-webchat-early-save.js +17 -0
- package/dist/src/session/strip-webchat-early-save.js.map +1 -0
- package/dist/src/session/transcript-format.d.ts +46 -0
- package/dist/src/session/transcript-format.js +88 -0
- package/dist/src/session/transcript-format.js.map +1 -0
- package/dist/src/session/types.d.ts +37 -0
- package/dist/src/session/types.js.map +1 -1
- package/dist/src/utils/logger/log-store.js +4 -3
- package/dist/src/utils/logger/log-store.js.map +1 -1
- package/dist/src/voice/tts/merge-config.js +0 -1
- package/dist/src/voice/tts/merge-config.js.map +1 -1
- package/dist/src/voice/tts/service.js +1 -2
- package/dist/src/voice/tts/service.js.map +1 -1
- package/package.json +1 -1
- package/skills/business/company-values/SKILL-zh.md +80 -0
- package/skills/business/company-values/SKILL.md +80 -0
- package/skills/business/find-community/SKILL-zh.md +50 -0
- package/skills/business/find-community/SKILL.md +50 -0
- package/skills/business/first-customers/SKILL-zh.md +76 -0
- package/skills/business/first-customers/SKILL.md +76 -0
- package/skills/business/grow-sustainably/SKILL-zh.md +92 -0
- package/skills/business/grow-sustainably/SKILL.md +92 -0
- package/skills/business/marketing-plan/SKILL-zh.md +100 -0
- package/skills/business/marketing-plan/SKILL.md +100 -0
- package/skills/business/minimalist-review/SKILL-zh.md +82 -0
- package/skills/business/minimalist-review/SKILL.md +82 -0
- package/skills/business/mvp/SKILL-zh.md +81 -0
- package/skills/business/mvp/SKILL.md +81 -0
- package/skills/business/pricing/SKILL-zh.md +64 -0
- package/skills/business/pricing/SKILL.md +64 -0
- package/skills/business/processize/SKILL-zh.md +91 -0
- package/skills/business/processize/SKILL.md +91 -0
- package/skills/business/validate-idea/SKILL-zh.md +68 -0
- package/skills/business/validate-idea/SKILL.md +68 -0
- package/skills/{skill-creator → creative/algorithmic-art}/LICENSE.txt +1 -1
- package/skills/creative/algorithmic-art/SKILL-zh.md +405 -0
- package/skills/creative/algorithmic-art/SKILL.md +405 -0
- package/skills/creative/algorithmic-art/templates/generator_template.js +223 -0
- package/skills/creative/algorithmic-art/templates/viewer.html +599 -0
- package/skills/creative/canvas-design/LICENSE.txt +202 -0
- package/skills/creative/canvas-design/SKILL-zh.md +130 -0
- package/skills/creative/canvas-design/SKILL.md +130 -0
- package/skills/creative/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/BigShoulders-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Boldonse-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/DMMono-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/EricaOne-OFL.txt +94 -0
- package/skills/creative/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/GeistMono-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Gloock-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Italiana-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Jura-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Lora-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/NationalPark-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Outfit-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/PixelifySans-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/PoiretOne-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/RedHatMono-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Silkscreen-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/SmoochSans-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Tektur-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/YoungSerif-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- package/skills/creative/frontend-design/LICENSE.txt +177 -0
- package/skills/creative/frontend-design/SKILL-zh.md +42 -0
- package/skills/creative/frontend-design/SKILL.md +42 -0
- package/skills/creative/theme-factory/LICENSE.txt +202 -0
- package/skills/creative/theme-factory/SKILL-zh.md +59 -0
- package/skills/creative/theme-factory/SKILL.md +59 -0
- package/skills/creative/theme-factory/theme-showcase.pdf +0 -0
- package/skills/creative/theme-factory/themes/arctic-frost.md +19 -0
- package/skills/creative/theme-factory/themes/botanical-garden.md +19 -0
- package/skills/creative/theme-factory/themes/desert-rose.md +19 -0
- package/skills/creative/theme-factory/themes/forest-canopy.md +19 -0
- package/skills/creative/theme-factory/themes/golden-hour.md +19 -0
- package/skills/creative/theme-factory/themes/midnight-galaxy.md +19 -0
- package/skills/creative/theme-factory/themes/modern-minimalist.md +19 -0
- package/skills/creative/theme-factory/themes/ocean-depths.md +19 -0
- package/skills/creative/theme-factory/themes/sunset-boulevard.md +19 -0
- package/skills/creative/theme-factory/themes/tech-innovation.md +19 -0
- package/skills/creative/web-artifacts-builder/LICENSE.txt +202 -0
- package/skills/creative/web-artifacts-builder/SKILL-zh.md +74 -0
- package/skills/creative/web-artifacts-builder/SKILL.md +74 -0
- package/skills/creative/web-artifacts-builder/scripts/bundle-artifact.sh +54 -0
- package/skills/creative/web-artifacts-builder/scripts/init-artifact.sh +322 -0
- package/skills/creative/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
- package/skills/documents/doc-coauthoring/SKILL-zh.md +375 -0
- package/skills/documents/doc-coauthoring/SKILL.md +375 -0
- package/skills/documents/docx/SKILL-zh.md +590 -0
- package/skills/{docx → documents/docx}/SKILL.md +11 -11
- package/skills/{docx → documents/docx}/scripts/comment.py +2 -2
- package/skills/{docx → documents/docx}/scripts/office/helpers/simplify_redlines.py +1 -1
- package/skills/{docx → documents/docx}/scripts/office/pack.py +2 -2
- package/skills/{xlsx → documents/docx}/scripts/office/validate.py +2 -2
- package/skills/{xlsx → documents/docx}/scripts/office/validators/redlining.py +1 -1
- package/skills/documents/pdf/SKILL-zh.md +314 -0
- package/skills/documents/pptx/SKILL-zh.md +232 -0
- package/skills/{pptx → documents/pptx}/editing.md +3 -3
- package/skills/{pptx → documents/pptx}/scripts/office/helpers/simplify_redlines.py +1 -1
- package/skills/{xlsx → documents/pptx}/scripts/office/pack.py +2 -2
- package/skills/{pptx → documents/pptx}/scripts/office/validate.py +2 -2
- package/skills/{docx → documents/pptx}/scripts/office/validators/redlining.py +1 -1
- package/skills/documents/xlsx/SKILL-zh.md +292 -0
- package/skills/{xlsx → documents/xlsx}/scripts/office/helpers/simplify_redlines.py +1 -1
- package/skills/{pptx → documents/xlsx}/scripts/office/pack.py +2 -2
- package/skills/{docx → documents/xlsx}/scripts/office/validate.py +2 -2
- package/skills/{pptx → documents/xlsx}/scripts/office/validators/redlining.py +1 -1
- package/skills/meta/skill-creator/LICENSE.txt +202 -0
- package/skills/meta/skill-creator/SKILL-zh.md +483 -0
- package/skills/{skill-creator → meta/skill-creator}/SKILL.md +0 -1
- package/skills/tools/find-skills/SKILL-zh.md +440 -0
- package/skills/tools/github/SKILL-zh.md +48 -0
- package/skills/tools/internal-comms/LICENSE.txt +202 -0
- package/skills/tools/internal-comms/SKILL-zh.md +32 -0
- package/skills/tools/internal-comms/SKILL.md +32 -0
- package/skills/tools/internal-comms/examples/3p-updates.md +47 -0
- package/skills/tools/internal-comms/examples/company-newsletter.md +65 -0
- package/skills/tools/internal-comms/examples/faq-answers.md +30 -0
- package/skills/tools/internal-comms/examples/general-comms.md +16 -0
- package/skills/tools/summarize/SKILL-zh.md +47 -0
- package/skills/tools/weather/SKILL-zh.md +46 -0
- package/skills/tools/webapp-testing/LICENSE.txt +202 -0
- package/skills/tools/webapp-testing/SKILL-zh.md +96 -0
- package/skills/tools/webapp-testing/SKILL.md +96 -0
- package/skills/tools/webapp-testing/examples/console_logging.py +35 -0
- package/skills/tools/webapp-testing/examples/element_discovery.py +40 -0
- package/skills/tools/webapp-testing/examples/static_html_automation.py +33 -0
- package/skills/tools/webapp-testing/scripts/with_server.py +106 -0
- package/dist/gateway/static/root/assets/agents-CkgFSiCY.js +0 -216
- package/dist/gateway/static/root/assets/agents-CkgFSiCY.js.map +0 -1
- package/dist/gateway/static/root/assets/channels-settings-CE7jrdkO.js +0 -9
- package/dist/gateway/static/root/assets/channels-settings-CE7jrdkO.js.map +0 -1
- package/dist/gateway/static/root/assets/cron-page-BpPPcykJ.js +0 -2
- package/dist/gateway/static/root/assets/cron-page-BpPPcykJ.js.map +0 -1
- package/dist/gateway/static/root/assets/cron-utils-N1PqD2DB.js +0 -3
- package/dist/gateway/static/root/assets/cron-utils-N1PqD2DB.js.map +0 -1
- package/dist/gateway/static/root/assets/dist--p2HQ2QF.js +0 -2
- package/dist/gateway/static/root/assets/index-Dnfha4O2.css +0 -1
- package/dist/gateway/static/root/assets/logs-page-CQwdV_Xw.js +0 -2
- package/dist/gateway/static/root/assets/logs-page-CQwdV_Xw.js.map +0 -1
- package/dist/gateway/static/root/assets/sessions-page-Be5kIGl_.js +0 -2
- package/dist/gateway/static/root/assets/settings-page-PodSlNwr.js +0 -2
- package/dist/gateway/static/root/assets/settings-page-PodSlNwr.js.map +0 -1
- package/dist/gateway/static/root/assets/skills-page-Clg8deH0.js +0 -3
- package/dist/gateway/static/root/assets/skills-page-Clg8deH0.js.map +0 -1
- package/dist/src/agent/skills/skills-store-client.d.ts +0 -66
- package/dist/src/agent/skills/skills-store-client.js.map +0 -1
- package/dist/src/stt/index.d.ts +0 -1
- package/dist/src/stt/index.js +0 -8
- /package/skills/{docx → documents/docx}/LICENSE.txt +0 -0
- /package/skills/{docx → documents/docx}/scripts/__init__.py +0 -0
- /package/skills/{docx → documents/docx}/scripts/accept_changes.py +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/helpers/__init__.py +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/helpers/merge_runs.py +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/mce/mc.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/microsoft/wml-2010.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/microsoft/wml-2012.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/microsoft/wml-2018.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/soffice.py +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/unpack.py +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/validators/__init__.py +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/validators/base.py +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/validators/docx.py +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/validators/pptx.py +0 -0
- /package/skills/{docx → documents/docx}/scripts/templates/comments.xml +0 -0
- /package/skills/{docx → documents/docx}/scripts/templates/commentsExtended.xml +0 -0
- /package/skills/{docx → documents/docx}/scripts/templates/commentsExtensible.xml +0 -0
- /package/skills/{docx → documents/docx}/scripts/templates/commentsIds.xml +0 -0
- /package/skills/{docx → documents/docx}/scripts/templates/people.xml +0 -0
- /package/skills/{pdf → documents/pdf}/LICENSE.txt +0 -0
- /package/skills/{pdf → documents/pdf}/SKILL.md +0 -0
- /package/skills/{pdf → documents/pdf}/forms.md +0 -0
- /package/skills/{pdf → documents/pdf}/reference.md +0 -0
- /package/skills/{pdf → documents/pdf}/scripts/check_bounding_boxes.py +0 -0
- /package/skills/{pdf → documents/pdf}/scripts/check_fillable_fields.py +0 -0
- /package/skills/{pdf → documents/pdf}/scripts/convert_pdf_to_images.py +0 -0
- /package/skills/{pdf → documents/pdf}/scripts/create_validation_image.py +0 -0
- /package/skills/{pdf → documents/pdf}/scripts/extract_form_field_info.py +0 -0
- /package/skills/{pdf → documents/pdf}/scripts/extract_form_structure.py +0 -0
- /package/skills/{pdf → documents/pdf}/scripts/fill_fillable_fields.py +0 -0
- /package/skills/{pdf → documents/pdf}/scripts/fill_pdf_form_with_annotations.py +0 -0
- /package/skills/{pptx → documents/pptx}/LICENSE.txt +0 -0
- /package/skills/{pptx → documents/pptx}/SKILL.md +0 -0
- /package/skills/{pptx → documents/pptx}/pptxgenjs.md +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/__init__.py +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/add_slide.py +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/clean.py +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/helpers/__init__.py +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/helpers/merge_runs.py +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/mce/mc.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/microsoft/wml-2010.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/microsoft/wml-2012.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/microsoft/wml-2018.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/soffice.py +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/unpack.py +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/validators/__init__.py +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/validators/base.py +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/validators/docx.py +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/validators/pptx.py +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/thumbnail.py +0 -0
- /package/skills/{xlsx → documents/xlsx}/LICENSE.txt +0 -0
- /package/skills/{xlsx → documents/xlsx}/SKILL.md +0 -0
- /package/skills/{skill-creator/scripts → documents/xlsx/scripts/office/helpers}/__init__.py +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/helpers/merge_runs.py +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/mce/mc.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/microsoft/wml-2010.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/microsoft/wml-2012.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/microsoft/wml-2018.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/soffice.py +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/unpack.py +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/validators/__init__.py +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/validators/base.py +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/validators/docx.py +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/validators/pptx.py +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/recalc.py +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/agents/analyzer.md +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/agents/comparator.md +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/agents/grader.md +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/assets/eval_review.html +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/eval-viewer/generate_review.py +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/eval-viewer/viewer.html +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/references/schemas.md +0 -0
- /package/skills/{xlsx/scripts/office/helpers → meta/skill-creator/scripts}/__init__.py +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/scripts/aggregate_benchmark.py +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/scripts/generate_report.py +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/scripts/improve_description.py +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/scripts/package_skill.py +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/scripts/quick_validate.py +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/scripts/run_eval.py +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/scripts/run_loop.py +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/scripts/utils.py +0 -0
- /package/skills/{find-skills → tools/find-skills}/SKILL.md +0 -0
- /package/skills/{github → tools/github}/SKILL.md +0 -0
- /package/skills/{summarize → tools/summarize}/SKILL.md +0 -0
- /package/skills/{weather → tools/weather}/SKILL.md +0 -0
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/jszip.min-CL3dfyxs.js","assets/rolldown-runtime-DWdDZTNf.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{i as t,t as n}from"./vendor-react-DbimaAId.js";import{Cn as r}from"./vendor-codemirror-CXAvob9m.js";import{t as i}from"./cn-BMCV0OMB.js";import{$n as a,$r as o,An as s,At as c,B as l,Dt as ee,En as u,F as d,H as te,I as ne,K as f,L as re,Ln as ie,Nr as ae,Or as oe,Ot as p,P as m,Qr as se,R as ce,Rr as le,Tn as ue,Tr as h,Tt as g,U as de,V as fe,Vn as pe,W as me,Xn as _,_n as v,dn as y,ei as b,fi as he,fn as ge,hi as _e,kt as x,q as ve,tr as S,wt as ye,z as be}from"./index-DHLmAIQl.js";import{a as xe,i as Se,n as C,r as w,t as Ce}from"./dist-D0jxbvuz.js";var T=e(t(),1),E=n(),D=[{light:`bg-sky-100 text-sky-800`,dark:`dark:bg-sky-950/55 dark:text-sky-200`},{light:`bg-violet-100 text-violet-800`,dark:`dark:bg-violet-950/55 dark:text-violet-200`},{light:`bg-emerald-100 text-emerald-800`,dark:`dark:bg-emerald-950/55 dark:text-emerald-200`},{light:`bg-orange-100 text-orange-800`,dark:`dark:bg-orange-950/55 dark:text-orange-200`},{light:`bg-rose-100 text-rose-800`,dark:`dark:bg-rose-950/55 dark:text-rose-200`},{light:`bg-amber-100 text-amber-900`,dark:`dark:bg-amber-950/55 dark:text-amber-200`},{light:`bg-cyan-100 text-cyan-800`,dark:`dark:bg-cyan-950/55 dark:text-cyan-200`},{light:`bg-indigo-100 text-indigo-800`,dark:`dark:bg-indigo-950/55 dark:text-indigo-200`},{light:`bg-fuchsia-100 text-fuchsia-800`,dark:`dark:bg-fuchsia-950/55 dark:text-fuchsia-200`},{light:`bg-teal-100 text-teal-800`,dark:`dark:bg-teal-950/55 dark:text-teal-200`}];function O(e){let t=0;for(let n=0;n<e.length;n+=1)t=Math.imul(31,t)+e.charCodeAt(n)|0;return Math.abs(t)}function we(e){let t=e.trim();if(!t)return`?`;let n=t.match(/[\p{L}\p{N}]/u);return n?n[0].toLocaleUpperCase(`en-US`):t[0]}function k({name:e,className:t}){let n=we(e),r=D[O(e)%D.length];return(0,E.jsx)(`div`,{className:i(`flex size-11 shrink-0 items-center justify-center rounded-xl font-semibold tracking-tight shadow-surface`,`text-[1.05rem] ring-1 ring-inset ring-black/[0.06] dark:ring-white/[0.1]`,`transition-[transform,box-shadow] duration-200 ease-out group-hover:ring-black/[0.1] dark:group-hover:ring-white/[0.14]`,`group-hover:-translate-y-px`,r.light,r.dark,t),"aria-hidden":!0,children:n})}function Te(e,t){return e.replace(/\{\{(\w+)\}\}/g,(e,n)=>String(t[n]??``))}function Ee(e){let t=[e.kind];return e.label?.trim()&&t.push(e.label.trim()),e.package?.trim()&&t.push(e.package.trim()),e.formula?.trim()&&t.push(e.formula.trim()),e.module?.trim()&&t.push(e.module.trim()),e.url?.trim()&&t.push(e.url.trim()),t.join(` · `)}function De(e){return{...e,enabled:e.enabled??!0,disableModelInvocation:e.disableModelInvocation??!1}}function A({label:e,children:t}){return t==null||t===!1?null:(0,E.jsxs)(`div`,{className:`mt-3 border-t border-edge-subtle pt-3 dark:border-edge/60`,children:[(0,E.jsx)(`div`,{className:`text-xs font-semibold uppercase tracking-wide text-fg-muted`,children:e}),(0,E.jsx)(`div`,{className:`mt-1.5 min-w-0 text-sm text-fg`,children:t})]})}function j({preview:e,sk:t}){let n=e.metadata,r=e.toolConditions,a=!!r&&(r.requiresTools.length>0||r.requiresToolsets.length>0||r.fallbackForTools.length>0||r.fallbackForToolsets.length>0),o=n.requires,s=o&&((o.bins?.length??0)>0||(o.env?.length??0)>0||(o.anyBins?.length??0)>0),c=n.install?.filter(e=>e&&typeof e.kind==`string`)??[],l=e.requiredEnvVarNames?.filter(e=>e.trim())??[];return(0,E.jsxs)(`div`,{className:`space-y-6`,children:[(0,E.jsxs)(`section`,{"aria-labelledby":`skill-detail-summary-heading`,children:[(0,E.jsx)(`h3`,{id:`skill-detail-summary-heading`,className:`mb-2 text-xs font-semibold uppercase tracking-wide text-fg-muted`,children:t.detailSummaryHeading}),(0,E.jsxs)(`div`,{className:`rounded-xl border border-edge bg-surface-base px-4 py-3 dark:bg-surface-hover/25`,children:[n.emoji?.trim()?(0,E.jsx)(`p`,{className:`text-2xl leading-none`,"aria-hidden":!0,children:n.emoji.trim()}):null,(0,E.jsx)(`p`,{className:i(`text-sm leading-relaxed text-fg`,n.emoji?.trim()?`mt-2`:``),children:e.description}),e.disableModelInvocation?(0,E.jsx)(`p`,{className:`mt-3 rounded-lg border border-amber-200/80 bg-amber-50/90 px-3 py-2 text-xs leading-snug text-amber-950 dark:border-amber-900/50 dark:bg-amber-950/40 dark:text-amber-100`,children:t.detailNotInjectedNote}):null,(0,E.jsx)(A,{label:t.detailHomepageLabel,children:n.homepage?.trim()?(0,E.jsx)(`a`,{href:n.homepage.trim(),target:`_blank`,rel:`noopener noreferrer`,className:`break-all text-accent underline-offset-2 hover:underline`,children:n.homepage.trim()}):null}),(0,E.jsx)(A,{label:t.detailPlatformsLabel,children:n.os&&n.os.length>0?(0,E.jsx)(`span`,{className:`font-mono text-xs text-fg-muted`,children:n.os.join(`, `)}):null}),(0,E.jsx)(A,{label:t.detailRequiresLabel,children:s&&o?(0,E.jsxs)(`ul`,{className:`list-inside list-disc space-y-1 text-sm text-fg-muted`,children:[o.bins&&o.bins.length>0?(0,E.jsxs)(`li`,{children:[(0,E.jsxs)(`span`,{className:`text-fg`,children:[t.detailRequiresBins,`: `]}),o.bins.join(`, `)]}):null,o.env&&o.env.length>0?(0,E.jsxs)(`li`,{children:[(0,E.jsxs)(`span`,{className:`text-fg`,children:[t.detailRequiresEnv,`: `]}),(0,E.jsx)(`span`,{className:`font-mono text-xs`,children:o.env.join(`, `)})]}):null,o.anyBins&&o.anyBins.length>0?(0,E.jsxs)(`li`,{children:[(0,E.jsxs)(`span`,{className:`text-fg`,children:[t.detailRequiresAnyBins,`: `]}),o.anyBins.join(`, `)]}):null]}):null}),(0,E.jsx)(A,{label:t.detailInstallLabel,children:c.length>0?(0,E.jsx)(`ul`,{className:`list-inside list-decimal space-y-1.5 text-sm text-fg-muted`,children:c.map((e,t)=>(0,E.jsx)(`li`,{className:`[overflow-wrap:anywhere]`,children:(0,E.jsx)(`span`,{className:`text-fg`,children:Ee(e)})},e.id||`${e.kind}-${t}`))}):null}),(0,E.jsx)(A,{label:t.detailToolGatingLabel,children:a&&r?(0,E.jsxs)(`ul`,{className:`mt-1 space-y-2 text-sm text-fg-muted`,children:[r.requiresTools.length>0?(0,E.jsxs)(`li`,{children:[(0,E.jsxs)(`span`,{className:`font-medium text-fg`,children:[t.detailToolsRequiresList,`: `]}),r.requiresTools.join(`, `)]}):null,r.requiresToolsets.length>0?(0,E.jsxs)(`li`,{children:[(0,E.jsxs)(`span`,{className:`font-medium text-fg`,children:[t.detailToolsetsRequiresList,`: `]}),r.requiresToolsets.join(`, `)]}):null,r.fallbackForTools.length>0?(0,E.jsxs)(`li`,{children:[(0,E.jsxs)(`span`,{className:`font-medium text-fg`,children:[t.detailToolsFallbackList,`: `]}),r.fallbackForTools.join(`, `)]}):null,r.fallbackForToolsets.length>0?(0,E.jsxs)(`li`,{children:[(0,E.jsxs)(`span`,{className:`font-medium text-fg`,children:[t.detailToolsetsFallbackList,`: `]}),r.fallbackForToolsets.join(`, `)]}):null]}):null}),(0,E.jsx)(A,{label:t.detailEnvVarsLabel,children:l.length>0?(0,E.jsx)(`span`,{className:`font-mono text-xs text-fg-muted`,children:l.join(`, `)}):null})]})]}),(0,E.jsxs)(`section`,{"aria-labelledby":`skill-detail-instructions-heading`,children:[(0,E.jsx)(`h3`,{id:`skill-detail-instructions-heading`,className:`mb-2 text-xs font-semibold uppercase tracking-wide text-fg-muted`,children:t.detailInstructionsHeading}),e.bodyMarkdown.trim()?(0,E.jsx)(`div`,{className:`markdown-content min-w-0 break-words`,children:(0,E.jsx)(ve,{content:e.bodyMarkdown})}):(0,E.jsx)(`p`,{className:`text-sm italic text-fg-muted`,children:t.detailNoInstructionsBody})]})]})}var Oe=(0,T.memo)(function({loading:e,onReloadClick:t,searchQuery:n,setSearchQuery:r,mainTab:o,sk:s,setPendingFile:c,setInstallOpen:l}){return(0,E.jsxs)(`div`,{className:`flex min-w-0 flex-1 flex-wrap items-center justify-end gap-2`,children:[(0,E.jsx)(u,{type:`button`,variant:`ghost`,className:`h-9 w-9 shrink-0 p-0`,disabled:e,title:s.reloadRuntime,"aria-label":s.reloadDiskAria,onClick:()=>void t(),children:(0,E.jsx)(a,{className:i(`size-4`,e&&`animate-spin`),strokeWidth:1.75})}),(0,E.jsxs)(`label`,{className:`relative flex min-h-9 min-w-0 max-w-sm cursor-text items-center rounded-pill border border-edge bg-surface-base py-1.5 pl-9 pr-3 shadow-surface dark:bg-surface-hover/40 sm:max-w-md`,children:[(0,E.jsx)(_,{className:`pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-fg-disabled`,strokeWidth:1.75,"aria-hidden":!0}),(0,E.jsx)(`input`,{type:`text`,role:`searchbox`,enterKeyHint:`search`,value:n,onChange:e=>r(e.target.value),placeholder:o===`marketplace`?s.marketplaceSearchPackages:s.searchPlaceholder,autoComplete:`off`,spellCheck:!1,className:`min-w-0 flex-1 appearance-none border-0 bg-transparent py-0.5 text-sm leading-normal text-fg caret-current placeholder:text-fg-disabled focus:border-0 focus:shadow-none focus:outline-none focus:ring-0 focus-visible:outline-none`})]}),(0,E.jsxs)(u,{type:`button`,variant:`primary`,className:`shrink-0 gap-2`,onClick:()=>{c(null),l(!0)},children:[(0,E.jsx)(S,{className:`size-4`,strokeWidth:1.75,"aria-hidden":!0}),s.installCta]})]})});function M({checked:e,onChange:t}){return(0,E.jsx)(`button`,{type:`button`,role:`switch`,"aria-checked":e,className:i(`relative h-6 w-10 shrink-0 overflow-hidden rounded-full border border-edge p-0.5`,`transition-[border-color,background-color] duration-200 ease-out`,`focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 focus-visible:ring-offset-surface-base`,`active:scale-[0.97] motion-reduce:transition-none motion-reduce:active:scale-100`,e?`bg-accent`:`bg-surface-hover`),onClick:()=>t(!e),children:(0,E.jsx)(`span`,{className:i(`pointer-events-none absolute left-0.5 top-1/2 block size-4 -translate-y-1/2 rounded-full bg-surface-panel shadow-surface ring-1 ring-edge/40 dark:ring-edge/55`,`transition-transform duration-200 ease-out motion-reduce:transition-none`,e?`translate-x-5`:`translate-x-0`),"aria-hidden":!0})})}function ke(){let e=`animate-pulse motion-reduce:animate-none rounded-md bg-surface-hover dark:bg-surface-active/50`;return(0,E.jsxs)(`div`,{className:`flex items-center gap-4 px-4 py-3.5`,"aria-hidden":!0,children:[(0,E.jsx)(`div`,{className:i(`size-11 shrink-0 rounded-xl`,e)}),(0,E.jsxs)(`div`,{className:`min-w-0 flex-1 space-y-2`,children:[(0,E.jsx)(`div`,{className:i(`h-4 max-w-[10rem]`,e)}),(0,E.jsx)(`div`,{className:i(`h-3 w-full max-w-xl rounded`,e)})]}),(0,E.jsx)(`div`,{className:i(`h-6 w-10 shrink-0 rounded-full`,e)})]})}function Ae(){let e=`animate-pulse motion-reduce:animate-none rounded-md bg-surface-hover dark:bg-surface-active/50`;return(0,E.jsxs)(`div`,{className:`flex items-center gap-4 px-4 py-3.5`,"aria-hidden":!0,children:[(0,E.jsx)(`div`,{className:i(`size-11 shrink-0 rounded-xl`,e)}),(0,E.jsxs)(`div`,{className:`min-w-0 flex-1 space-y-2 pr-2`,children:[(0,E.jsx)(`div`,{className:i(`h-4 max-w-[12rem]`,e)}),(0,E.jsx)(`div`,{className:i(`h-3 w-full max-w-xl rounded`,e)}),(0,E.jsxs)(`div`,{className:`flex flex-wrap gap-1.5 pt-0.5`,children:[(0,E.jsx)(`div`,{className:i(`h-5 w-[5.5rem] rounded-md`,e)}),(0,E.jsx)(`div`,{className:i(`h-5 w-16 rounded-md`,e)}),(0,E.jsx)(`div`,{className:i(`h-5 w-14 rounded-md`,e)})]})]}),(0,E.jsx)(`div`,{className:i(`h-9 min-w-[6.5rem] shrink-0 rounded-lg`,e)})]})}var N=new Set([`builtin`,`user`,`marketplace`]),je=new Set([`all`,`global`,`workspace`,`extra`]),P=[`business`,`creative`,`documents`,`tools`,`meta`];function F({vm:e}){let{sk:t,hasToken:n,catalog:r,loading:a,error:l,uploading:d,searchQuery:te,setSearchQuery:ne,actionFeedback:re,mainTab:m,setMainTab:ce,setSourceFilter:ue,builtinCategoryFilter:de,setBuiltinCategoryFilter:fe,installOpen:me,setInstallOpen:_,pendingFile:v,setPendingFile:he,dropActive:ge,setDropActive:_e,confirmOpen:S,setConfirmOpen:be,confirmId:D,setConfirmId:O,togglingSkillName:we,enabledOverride:Ee,detailOpen:De,setDetailOpen:A,detailSource:N,setDetailSource:je,detailTitle:P,setDetailTitle:F,detailMarkdown:Me,setDetailMarkdown:I,detailCatalogPreview:Ne,setDetailCatalogPreview:L,detailMarketplacePreview:Pe,setDetailMarketplacePreview:R,detailLoading:Fe,detailError:z,setDetailError:Ie,marketSort:B,setMarketSort:Le,marketPage:V,setMarketPage:H,mpLoading:U,mpError:W,mpPayload:G,installingMarketName:Re,marketCategoryId:K,setMarketCategoryId:ze,mpCategories:q,mpCategoriesError:Be,mpCategoriesLoading:J,marketplaceProviderId:Ve,builtinTabStats:He,userTabStats:Y,detailEnabled:Ue,filteredCatalog:We,builtinCategories:Ge,categoryFilteredCatalog:Ke,filterLabel:qe,inSettingsShell:Je,categoryLabel:X,onReloadClick:Ye,openSkillDetail:Xe,openMarketplaceDetail:Z,onSkillToggle:Q,onInstallSubmit:Ze,onFileInputChange:Qe,onModalDragOver:$e,onModalDragLeave:et,onModalDrop:tt,sourceLabel:nt,runDelete:rt,onMarketInstall:it,isSkillInstalledByName:$}=e,at=y(e=>e.setPageHeader),ot=y(e=>e.clearPageHeader),st=(0,T.useMemo)(()=>(0,E.jsx)(Oe,{loading:a,onReloadClick:Ye,searchQuery:te,setSearchQuery:ne,mainTab:m,sk:t,setPendingFile:he,setInstallOpen:_}),[a,Ye,te,ne,m,t,he,_]);return(0,T.useLayoutEffect)(()=>!n||Je?(ot(),()=>ot()):(at({startExtra:null,main:null,end:st}),()=>ot()),[ot,n,Je,at,st]),n?(0,E.jsxs)(`div`,{className:`flex min-h-0 flex-1 flex-col overflow-y-auto bg-surface-panel`,children:[(0,E.jsxs)(`div`,{className:`mx-auto flex w-full max-w-app-main flex-col gap-6 px-4 py-6 sm:px-8`,children:[re?(0,E.jsx)(`div`,{role:`status`,"aria-live":`polite`,className:i(`rounded-xl border px-3 py-2 text-sm`,re.kind===`success`?`border-emerald-200 bg-emerald-50 text-emerald-800 dark:border-emerald-900/40 dark:bg-emerald-950/40 dark:text-emerald-200`:`border-red-200 bg-red-50 text-red-800 dark:border-red-900/50 dark:bg-red-950/40 dark:text-red-200`),children:re.message}):l?(0,E.jsx)(`div`,{className:`rounded-xl border border-edge bg-red-50 px-3 py-2 text-sm text-red-700 dark:border-edge dark:bg-red-950/40 dark:text-red-300`,role:`alert`,children:l}):null,(0,E.jsx)(`header`,{className:`flex flex-col gap-4`,children:(0,E.jsxs)(`div`,{className:`min-w-0`,children:[(0,E.jsx)(`h1`,{className:`text-xl font-semibold tracking-tight text-fg`,children:t.title}),(0,E.jsx)(`p`,{className:`mt-1 max-w-2xl text-sm text-fg-muted`,children:t.tagline})]})}),Je?(0,E.jsx)(`div`,{className:`flex flex-col gap-3 border-b border-edge-subtle pb-4 dark:border-edge-subtle sm:flex-row sm:flex-wrap sm:items-center sm:justify-end`,children:st}):null,(0,E.jsxs)(`section`,{className:`flex flex-col gap-4`,children:[(0,E.jsxs)(`div`,{className:`flex flex-col gap-3 border-b border-edge-subtle pb-3 sm:flex-row sm:items-center sm:justify-between dark:border-edge-subtle`,children:[(0,E.jsxs)(`div`,{className:`flex flex-wrap gap-x-1 gap-y-1`,role:`tablist`,"aria-label":t.skillsNavAria,children:[(0,E.jsxs)(`button`,{type:`button`,role:`tab`,"aria-selected":m===`marketplace`,className:i(`relative max-w-full rounded-md px-3 py-2 text-left text-sm font-medium transition-colors sm:text-center`,m===`marketplace`?`text-fg`:`text-fg-muted hover:text-fg`,m===`marketplace`&&`after:absolute after:bottom-0 after:left-1/2 after:h-0.5 after:w-9 after:-translate-x-1/2 after:rounded-full after:bg-accent`),onClick:()=>ce(`marketplace`),children:[t.tabMarketplace,Ve?(0,E.jsxs)(`span`,{className:`font-normal text-fg-muted`,children:[`(`,Ve,`)`]}):null]}),(0,E.jsxs)(`button`,{type:`button`,role:`tab`,"aria-selected":m===`builtin`,className:i(`relative rounded-md px-3 py-2 text-sm font-medium transition-colors`,m===`builtin`?`text-fg`:`text-fg-muted hover:text-fg`,m===`builtin`&&`after:absolute after:bottom-0 after:left-1/2 after:h-0.5 after:w-9 after:-translate-x-1/2 after:rounded-full after:bg-accent`),onClick:()=>ce(`builtin`),children:[t.tabBuiltin,(0,E.jsxs)(`span`,{className:`ml-1 tabular-nums text-fg-muted`,children:[`(`,He.enabled,`/`,He.total,`)`]})]}),(0,E.jsxs)(`button`,{type:`button`,role:`tab`,"aria-selected":m===`user`,className:i(`relative rounded-md px-3 py-2 text-sm font-medium transition-colors`,m===`user`?`text-fg`:`text-fg-muted hover:text-fg`,m===`user`&&`after:absolute after:bottom-0 after:left-1/2 after:h-0.5 after:w-9 after:-translate-x-1/2 after:rounded-full after:bg-accent`),onClick:()=>ce(`user`),children:[t.tabUser,(0,E.jsxs)(`span`,{className:`ml-1 tabular-nums text-fg-muted`,children:[`(`,Y.enabled,`/`,Y.total,`)`]})]})]}),(0,E.jsxs)(`div`,{className:i(`flex min-h-9 min-w-0 items-center gap-2`,m===`user`?`flex-nowrap overflow-x-auto pb-0.5 sm:justify-end`:`flex-wrap sm:justify-end`),children:[m===`user`?(0,E.jsxs)(Se,{children:[(0,E.jsx)(xe,{asChild:!0,children:(0,E.jsxs)(`button`,{type:`button`,className:i(`inline-flex h-9 min-h-9 min-w-[9rem] shrink-0 items-center gap-1.5 rounded-lg border border-edge bg-surface-panel px-2.5 text-xs font-medium text-fg shadow-surface`,f.transition,f.focusRingPanel),children:[(0,E.jsx)(oe,{className:`size-3.5 text-fg-muted`,strokeWidth:1.75,"aria-hidden":!0}),(0,E.jsx)(`span`,{children:qe}),(0,E.jsx)(b,{className:`size-3.5 text-fg-subtle`,strokeWidth:1.75,"aria-hidden":!0})]})}),(0,E.jsx)(w,{children:(0,E.jsx)(Ce,{className:`z-50 min-w-[10rem] rounded-xl border border-edge bg-surface-panel p-1 shadow-popover dark:border-edge`,sideOffset:6,align:`end`,children:[`all`,`global`,`workspace`,`extra`].map(e=>(0,E.jsx)(C,{className:i(`cursor-pointer rounded-lg px-3 py-2 text-sm text-fg outline-none`,`hover:bg-surface-hover data-[highlighted]:bg-surface-hover`),onSelect:()=>ue(e),children:e===`all`?t.filterAll:e===`global`?t.filterGlobal:e===`workspace`?t.filterWorkspace:t.filterExtra},e))})})]}):null,m===`marketplace`?(0,E.jsxs)(Se,{children:[(0,E.jsx)(xe,{asChild:!0,children:(0,E.jsxs)(`button`,{type:`button`,className:i(`inline-flex h-9 min-h-9 min-w-[9rem] shrink-0 items-center gap-1.5 rounded-lg border border-edge bg-surface-panel px-2.5 text-xs font-medium text-fg shadow-surface`,f.transition,f.focusRingPanel),children:[(0,E.jsx)(oe,{className:`size-3.5 text-fg-muted`,strokeWidth:1.75,"aria-hidden":!0}),(0,E.jsx)(`span`,{children:B===`newest`?t.marketplaceSortNewest:t.marketplaceSortDownloads}),(0,E.jsx)(b,{className:`size-3.5 text-fg-subtle`,strokeWidth:1.75,"aria-hidden":!0})]})}),(0,E.jsx)(w,{children:(0,E.jsxs)(Ce,{className:`z-50 min-w-[10rem] rounded-xl border border-edge bg-surface-panel p-1 shadow-popover dark:border-edge`,sideOffset:6,align:`end`,children:[(0,E.jsx)(C,{className:i(`cursor-pointer rounded-lg px-3 py-2 text-sm text-fg outline-none`,`hover:bg-surface-hover data-[highlighted]:bg-surface-hover`),onSelect:()=>Le(`downloads`),children:t.marketplaceSortDownloads}),(0,E.jsx)(C,{className:i(`cursor-pointer rounded-lg px-3 py-2 text-sm text-fg outline-none`,`hover:bg-surface-hover data-[highlighted]:bg-surface-hover`),onSelect:()=>Le(`newest`),children:t.marketplaceSortNewest})]})})]}):null,m===`builtin`?(0,E.jsx)(`div`,{className:`h-9 min-w-[9rem] shrink-0`,"aria-hidden":!0}):null]})]}),m===`marketplace`?(0,E.jsxs)(E.Fragment,{children:[(0,E.jsx)(`div`,{className:i(`-mx-1 flex min-h-[2.75rem] items-center gap-2 overflow-x-auto px-1 pb-1 pt-0.5 [scrollbar-width:thin]`,!J&&q.length===0&&`min-h-0 pb-0 pt-0`),role:q.length>0||J?`tablist`:void 0,"aria-label":q.length>0||J?t.marketplaceCategoriesAria:void 0,children:q.length>0?(0,E.jsxs)(E.Fragment,{children:[(0,E.jsx)(`button`,{type:`button`,role:`tab`,"aria-selected":K===``,className:i(`shrink-0 rounded-full border px-3 py-1.5 text-xs font-medium transition-colors`,f.focusRingPanel,K===``?`border-fg bg-fg text-surface-panel dark:border-fg dark:bg-fg dark:text-surface-base`:`border-edge bg-surface-panel text-fg-muted hover:border-edge-strong hover:text-fg dark:border-edge dark:bg-surface-hover/40`),onClick:()=>ze(``),children:t.marketplaceCategoryAll}),q.map(e=>{let t=K===e.id;return(0,E.jsx)(`button`,{type:`button`,role:`tab`,"aria-selected":t,className:i(`max-w-[14rem] shrink-0 truncate rounded-full border px-3 py-1.5 text-xs font-medium transition-colors`,f.focusRingPanel,t?`border-fg bg-fg text-surface-panel dark:border-fg dark:bg-fg dark:text-surface-base`:`border-edge bg-surface-panel text-fg-muted hover:border-edge-strong hover:text-fg dark:border-edge dark:bg-surface-hover/40`),title:e.label,onClick:()=>ze(e.id),children:e.label},e.id)})]}):J?(0,E.jsx)(`div`,{className:`flex gap-2 px-1`,"aria-hidden":!0,children:Array.from({length:5},(e,t)=>(0,E.jsx)(`div`,{className:`h-8 w-[4.5rem] shrink-0 animate-pulse rounded-full bg-surface-hover motion-reduce:animate-none dark:bg-surface-active/50`},t))}):null}),Be?(0,E.jsx)(`p`,{className:`text-xs text-red-600 dark:text-red-400`,role:`alert`,children:Be}):null,U?(0,E.jsx)(`div`,{className:`overflow-hidden rounded-2xl border border-edge-subtle bg-surface-base dark:border-edge-subtle`,"aria-busy":`true`,"aria-label":t.loading,children:Array.from({length:6},(e,t)=>(0,E.jsx)(Ae,{},t))}):W?(0,E.jsx)(`div`,{className:`rounded-xl border border-edge bg-red-50 px-3 py-2 text-sm text-red-700 dark:border-edge dark:bg-red-950/40 dark:text-red-300`,role:`alert`,children:W}):!G||G.items.length===0?(0,E.jsx)(`div`,{className:`rounded-2xl border border-dashed border-edge py-16 text-center text-sm text-fg-muted`,children:t.marketplaceEmpty}):(0,E.jsxs)(E.Fragment,{children:[(0,E.jsx)(`div`,{className:`overflow-hidden rounded-2xl border border-edge-subtle bg-surface-base dark:border-edge-subtle`,children:G.items.map(e=>{let n=$(e.id),r=Re===e.id;return(0,E.jsxs)(`article`,{className:i(`group relative flex items-center gap-4 border-b border-edge-subtle px-4 py-3.5 last:border-b-0`,`transition-colors hover:bg-surface-hover/50 dark:hover:bg-surface-hover/25`),children:[(0,E.jsxs)(`button`,{type:`button`,className:i(`flex min-w-0 flex-1 cursor-pointer items-center gap-4 rounded-lg text-left outline-none`,f.focusRingPanel),onClick:()=>void Z(e.id,e.name),children:[(0,E.jsx)(k,{name:e.id}),(0,E.jsxs)(`div`,{className:`min-w-0 flex-1 pr-2`,children:[(0,E.jsx)(`h3`,{className:`text-[15px] font-semibold leading-snug tracking-tight text-fg`,children:e.name}),(0,E.jsx)(`p`,{className:`mt-0.5 truncate text-sm leading-relaxed text-fg-muted`,title:e.description?e.description:void 0,children:e.description||`—`}),(0,E.jsxs)(`div`,{className:`mt-1.5 flex flex-wrap gap-1.5 text-[11px] text-fg-subtle`,children:[(0,E.jsxs)(`span`,{className:`rounded-md bg-surface-hover/60 px-2 py-0.5 dark:bg-surface-active/50`,children:[t.marketplaceAuthor,`: `,e.author.username]}),(0,E.jsxs)(`span`,{className:`rounded-md bg-surface-hover/60 px-2 py-0.5 dark:bg-surface-active/50`,children:[t.marketplaceDownloads,`: `,e.downloads]}),e.stars!=null&&e.stars>0?(0,E.jsxs)(`span`,{className:`inline-flex items-center gap-0.5 rounded-md bg-surface-hover/60 px-2 py-0.5 dark:bg-surface-active/50`,children:[(0,E.jsx)(pe,{className:`size-3 shrink-0 text-amber-600 dark:text-amber-400`,strokeWidth:2,"aria-hidden":!0}),e.stars]}):null,e.sourceLabel?(0,E.jsxs)(`span`,{className:`rounded-md bg-surface-hover/60 px-2 py-0.5 dark:bg-surface-active/50`,children:[t.marketplaceSource,`: `,e.sourceLabel]}):null,e.latestVersion?(0,E.jsxs)(`span`,{className:`rounded-md bg-surface-hover/60 px-2 py-0.5 font-mono text-[10px] dark:bg-surface-active/50`,children:[t.marketplaceVersion,`: `,e.latestVersion]}):null,n?(0,E.jsx)(`span`,{className:`rounded-md bg-emerald-500/15 px-2 py-0.5 text-emerald-800 dark:text-emerald-200`,children:t.marketplaceInstalled}):null]})]})]}),(0,E.jsx)(`div`,{className:`flex shrink-0 justify-end sm:pl-2`,children:(0,E.jsx)(u,{type:`button`,variant:n?`secondary`:`primary`,className:`min-w-[6.5rem]`,disabled:r||U,onClick:()=>void it(e.id),children:r?t.uploading:n?t.marketplaceReinstall:t.marketplaceInstall})})]},e.id)})}),(0,E.jsxs)(`div`,{className:`flex flex-col items-center justify-between gap-3 sm:flex-row`,children:[(0,E.jsx)(`p`,{className:`text-center text-xs text-fg-muted sm:text-left`,children:Te(t.marketplacePageStatus,{page:G.meta.page,totalPages:G.meta.totalPages,total:G.meta.total})}),(0,E.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,E.jsxs)(u,{type:`button`,variant:`ghost`,className:`h-9 gap-1 px-2`,disabled:U||V<=1,"aria-label":t.marketplacePagePrev,onClick:()=>H(e=>Math.max(1,e-1)),children:[(0,E.jsx)(o,{className:`size-4`,strokeWidth:1.75,"aria-hidden":!0}),(0,E.jsx)(`span`,{className:`sr-only sm:not-sr-only`,children:t.marketplacePagePrev})]}),(0,E.jsxs)(u,{type:`button`,variant:`ghost`,className:`h-9 gap-1 px-2`,disabled:U||V>=G.meta.totalPages,"aria-label":t.marketplacePageNext,onClick:()=>H(e=>Math.min(G.meta.totalPages,e+1)),children:[(0,E.jsx)(`span`,{className:`sr-only sm:not-sr-only`,children:t.marketplacePageNext}),(0,E.jsx)(se,{className:`size-4`,strokeWidth:1.75,"aria-hidden":!0})]})]})]})]})]}):(0,E.jsx)(E.Fragment,{children:a?(0,E.jsx)(`div`,{className:`overflow-hidden rounded-2xl border border-edge-subtle bg-surface-base dark:border-edge-subtle`,"aria-busy":`true`,"aria-label":t.loading,children:Array.from({length:6},(e,t)=>(0,E.jsx)(ke,{},t))}):r.length===0?(0,E.jsx)(`div`,{className:`rounded-2xl border border-dashed border-edge py-16 text-center text-sm text-fg-muted`,children:t.empty}):We.length===0?(0,E.jsx)(`div`,{className:`rounded-2xl border border-dashed border-edge py-16 text-center text-sm text-fg-muted`,children:t.noSearchResults}):(0,E.jsxs)(E.Fragment,{children:[Ge.length>1?(0,E.jsxs)(`div`,{role:`tablist`,"aria-label":t.marketplaceCategoriesAria,className:`-mx-1 flex gap-2 overflow-x-auto px-1 pb-1 pt-0.5 [scrollbar-width:thin]`,children:[(0,E.jsx)(`button`,{type:`button`,role:`tab`,"aria-selected":de===``,className:i(`shrink-0 rounded-full border px-3 py-1.5 text-xs font-medium transition-colors`,f.focusRingPanel,de===``?`border-fg bg-fg text-surface-panel dark:border-fg dark:bg-fg dark:text-surface-base`:`border-edge bg-surface-panel text-fg-muted hover:border-edge-strong hover:text-fg dark:border-edge dark:bg-surface-hover/40`),onClick:()=>fe(``),children:t.marketplaceCategoryAll}),Ge.map(e=>{let t=de===e;return(0,E.jsx)(`button`,{type:`button`,role:`tab`,"aria-selected":t,className:i(`max-w-[14rem] shrink-0 truncate rounded-full border px-3 py-1.5 text-xs font-medium transition-colors`,f.focusRingPanel,t?`border-fg bg-fg text-surface-panel dark:border-fg dark:bg-fg dark:text-surface-base`:`border-edge bg-surface-panel text-fg-muted hover:border-edge-strong hover:text-fg dark:border-edge dark:bg-surface-hover/40`),title:X(e),onClick:()=>fe(e),children:X(e)},e)})]}):null,Ke.length===0?(0,E.jsx)(`div`,{className:`rounded-2xl border border-dashed border-edge py-16 text-center text-sm text-fg-muted`,children:t.noSearchResults}):(0,E.jsx)(`div`,{className:`overflow-hidden rounded-2xl border border-edge-subtle bg-surface-base dark:border-edge-subtle`,children:Ke.map((e,n,r)=>(0,E.jsxs)(`article`,{className:i(`group relative flex items-center gap-4 border-b border-edge-subtle px-4 py-3.5`,n===r.length-1&&`border-b-0`,`transition-colors hover:bg-surface-hover/50 dark:hover:bg-surface-hover/25`),children:[(0,E.jsxs)(`button`,{type:`button`,className:i(`flex min-w-0 flex-1 cursor-pointer items-center gap-4 rounded-lg text-left outline-none`,f.focusRingPanel),onClick:()=>void Xe(e),children:[(0,E.jsx)(k,{name:e.name}),(0,E.jsxs)(`div`,{className:`min-w-0 flex-1 pr-2`,children:[(0,E.jsx)(`h3`,{className:`text-[15px] font-semibold leading-snug tracking-tight text-fg`,children:e.name}),(0,E.jsx)(`p`,{className:`mt-0.5 truncate text-sm leading-relaxed text-fg-muted`,title:e.description?e.description:void 0,children:e.description||`—`}),m!==`builtin`||e.managed?(0,E.jsxs)(`div`,{className:`mt-1.5 flex flex-wrap gap-1.5 text-[11px] text-fg-subtle`,children:[m===`builtin`?null:(0,E.jsx)(`span`,{className:`rounded-md bg-surface-hover/60 px-2 py-0.5 dark:bg-surface-active/50`,children:nt(e.source)}),e.managed?(0,E.jsxs)(`span`,{className:`rounded-md bg-surface-hover/60 px-2 py-0.5 dark:bg-surface-active/50`,children:[t.col.managed,`: `,t.yes]}):null,e.hub?(0,E.jsxs)(`span`,{className:`max-w-full truncate rounded-md bg-surface-hover/60 px-2 py-0.5 font-mono text-[10px] dark:bg-surface-active/50`,title:`${e.hub.source}${e.hub.ref?`\nref: ${e.hub.ref}`:``}\nupdated: ${e.hub.updatedAt}`,children:[t.hubRemote,` ·`,` `,e.hub.kind===`git`?t.hubKindGit:t.hubKindArchive,` ·`,` `,e.hub.source.length>48?`${e.hub.source.slice(0,48)}…`:e.hub.source]}):null]}):null]})]}),(0,E.jsxs)(`div`,{className:`flex shrink-0 items-center gap-1`,onClick:e=>e.stopPropagation(),role:`presentation`,children:[e.managed?(0,E.jsxs)(Se,{children:[(0,E.jsx)(xe,{asChild:!0,children:(0,E.jsx)(`button`,{type:`button`,className:i(`flex size-9 items-center justify-center rounded-lg text-fg-muted hover:bg-surface-hover hover:text-fg`,f.focusRingPanel),"aria-label":t.col.actions,children:(0,E.jsx)(le,{className:`size-4`,strokeWidth:1.75})})}),(0,E.jsx)(w,{children:(0,E.jsx)(Ce,{className:`z-50 min-w-[8rem] rounded-xl border border-edge bg-surface-panel p-1 shadow-popover dark:border-edge`,sideOffset:4,align:`end`,children:(0,E.jsxs)(C,{className:i(`flex cursor-pointer items-center gap-2 rounded-lg px-3 py-2 text-sm text-red-600 outline-none`,`hover:bg-red-50 data-[highlighted]:bg-red-50 dark:text-red-400 dark:hover:bg-red-950/40`),onSelect:()=>{O(e.directoryId),be(!0)},children:[(0,E.jsx)(ie,{className:`size-4`,strokeWidth:1.75,"aria-hidden":!0}),t.delete]})})})]}):null,(0,E.jsx)(M,{checked:Ee[e.name]??e.enabled,onChange:t=>void Q(e.name,t)})]})]},`${e.directoryId}-${e.path}`))})]})})]})]}),(0,E.jsx)(x,{open:De,onOpenChange:e=>{A(e),e||(je(`catalog`),I(``),L(null),R(null),Ie(null),F(``))},children:(0,E.jsxs)(p,{children:[(0,E.jsx)(ee,{className:`xopc-dialog-overlay fixed inset-0 z-[60] bg-scrim`}),(0,E.jsxs)(g,{className:i(`xopc-dialog-content fixed left-1/2 top-1/2 z-[60] flex h-[min(88vh,44rem)] max-h-[min(92vh,56rem)] w-[min(100%-2rem,min(92vw,56rem))]`,`-translate-x-1/2 -translate-y-1/2 flex-col overflow-hidden rounded-2xl border border-edge bg-surface-panel shadow-float dark:border-edge`),children:[(0,E.jsxs)(`div`,{className:`group flex min-h-[3.25rem] shrink-0 items-center gap-3 border-b border-edge px-4 py-3`,children:[(0,E.jsx)(k,{name:P||`?`}),(0,E.jsx)(c,{className:`min-w-0 flex-1 truncate text-base font-semibold text-fg`,children:P||`—`}),(0,E.jsx)(ye,{asChild:!0,children:(0,E.jsx)(`button`,{type:`button`,className:i(`rounded-lg p-1.5 text-fg-muted hover:bg-surface-hover hover:text-fg`,f.focusRingPanel),"aria-label":t.detailCloseAria,children:(0,E.jsx)(s,{className:`size-5`,strokeWidth:1.75,"aria-hidden":!0})})})]}),(0,E.jsxs)(`div`,{className:`flex min-h-[3.25rem] shrink-0 items-start gap-2 border-b border-blue-200/80 bg-blue-50/95 px-4 py-2.5 text-sm text-fg dark:border-blue-900/50 dark:bg-blue-950/45`,children:[(0,E.jsx)(h,{className:`mt-0.5 size-4 shrink-0 text-blue-600 dark:text-blue-400`,strokeWidth:1.75,"aria-hidden":!0}),(0,E.jsx)(`p`,{className:`min-w-0 leading-relaxed`,children:N===`store`&&Pe?t.detailModalBanner:N===`store`?t.detailModalBannerStore:t.detailModalBanner})]}),(0,E.jsx)(`div`,{className:`min-h-0 min-w-0 flex-1 overflow-auto px-4 py-4`,children:Fe?(0,E.jsx)(`div`,{className:`flex h-full min-h-[14rem] flex-col gap-2.5 py-1`,"aria-busy":`true`,"aria-label":t.loading,children:Array.from({length:10},(e,t)=>(0,E.jsx)(`div`,{className:i(`h-4 animate-pulse rounded-md bg-surface-hover dark:bg-surface-active/50`,t%3==0?`w-[92%]`:t%3==1?`w-full`:`w-4/5`)},t))}):z?(0,E.jsx)(`p`,{className:`text-sm text-red-600 dark:text-red-400`,children:z}):N===`catalog`&&Ne?(0,E.jsx)(j,{preview:Ne,sk:t}):N===`store`&&Pe?(0,E.jsx)(j,{preview:Pe,sk:t}):(0,E.jsx)(`div`,{className:`markdown-content min-w-0 break-words`,children:(0,E.jsx)(ve,{content:Me})})}),(0,E.jsx)(`div`,{className:`flex shrink-0 justify-end gap-2 border-t border-edge px-4 py-3`,children:N===`store`?(0,E.jsxs)(E.Fragment,{children:[(0,E.jsx)(u,{type:`button`,variant:`ghost`,onClick:()=>A(!1),children:t.cancel}),(0,E.jsx)(u,{type:`button`,variant:$(P)?`secondary`:`primary`,disabled:!P||Re===P,onClick:()=>{P&&it(P)},children:Re===P?t.uploading:$(P)?t.marketplaceReinstall:t.marketplaceInstall})]}):(0,E.jsx)(u,{type:`button`,variant:`primary`,disabled:!P||we===P,onClick:async()=>{P&&await Q(P,!Ue)&&A(!1)},children:Ue?t.detailModalDisable:t.detailModalEnable})})]})]})}),(0,E.jsx)(x,{open:me,onOpenChange:e=>{_(e),e||(he(null),_e(!1))},children:(0,E.jsxs)(p,{children:[(0,E.jsx)(ee,{className:`xopc-dialog-overlay fixed inset-0 z-[60] bg-scrim`}),(0,E.jsxs)(g,{className:i(`xopc-dialog-content fixed left-1/2 top-1/2 z-[60] max-h-[min(100vh-2rem,44rem)] w-[min(100%-2rem,min(92vw,48rem))] -translate-x-1/2 -translate-y-1/2 overflow-y-auto`,`rounded-2xl border border-edge bg-surface-panel p-6 shadow-float dark:border-edge`),children:[(0,E.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,E.jsx)(c,{className:`text-base font-semibold text-fg`,children:t.installModalTitle}),(0,E.jsx)(ye,{asChild:!0,children:(0,E.jsxs)(`button`,{type:`button`,className:i(`rounded-lg p-1.5 text-fg-muted hover:bg-surface-hover hover:text-fg`,f.focusRingPanel),"aria-label":t.installClose,children:[(0,E.jsx)(s,{className:`size-5`,strokeWidth:1.75,"aria-hidden":!0}),(0,E.jsx)(`span`,{className:`sr-only`,children:t.installClose})]})})]}),(0,E.jsxs)(`label`,{className:i(`mt-4 flex min-h-[11rem] cursor-pointer flex-col items-center justify-center gap-3 rounded-xl border-2 border-dashed px-6 py-12 text-center transition-colors`,ge?`border-accent bg-accent-soft/60 dark:bg-blue-950/40`:`border-edge bg-surface-base dark:bg-surface-hover/30`),onDragLeave:et,onDragOver:$e,onDrop:tt,children:[(0,E.jsx)(`input`,{type:`file`,accept:`.zip,.md,application/zip,text/markdown`,className:`sr-only`,"aria-label":t.installModalDropHint,disabled:d,onChange:Qe}),(0,E.jsx)(ae,{className:`size-12 text-fg-subtle`,strokeWidth:1.25,"aria-hidden":!0}),(0,E.jsx)(`span`,{className:`text-sm text-fg-muted`,children:t.installModalDropHint}),v?(0,E.jsx)(`span`,{className:`text-xs font-medium text-fg`,children:v.name}):null]}),(0,E.jsxs)(`div`,{className:`mt-5 space-y-2`,children:[(0,E.jsx)(`p`,{className:`text-sm font-medium text-fg`,children:t.installModalReqTitle}),(0,E.jsxs)(`ul`,{className:`list-inside list-disc space-y-1 text-sm text-fg-muted`,children:[(0,E.jsx)(`li`,{children:t.installModalReq1}),(0,E.jsx)(`li`,{children:t.installModalReq2})]})]}),(0,E.jsx)(`button`,{type:`button`,disabled:!v||d,className:i(`mt-6 flex w-full items-center justify-center rounded-xl py-3 text-sm font-semibold`,`transition-colors`,!v||d?`cursor-not-allowed bg-surface-active text-fg-disabled`:`bg-accent text-white hover:bg-accent-hover`,f.focusRingPanel),onClick:()=>void Ze(),children:d?t.uploading:t.installAction})]})]})}),(0,E.jsx)(x,{open:S,onOpenChange:e=>{be(e),e||O(null)},children:(0,E.jsxs)(p,{children:[(0,E.jsx)(ee,{className:`xopc-dialog-overlay fixed inset-0 z-[60] bg-scrim`}),(0,E.jsxs)(g,{className:`xopc-dialog-content fixed left-1/2 top-1/2 z-[60] w-[min(100%-2rem,24rem)] -translate-x-1/2 -translate-y-1/2 rounded-xl border border-edge bg-surface-panel p-4 shadow-popover dark:border-edge`,children:[(0,E.jsx)(c,{className:`text-base font-semibold text-fg`,children:t.deleteTitle}),(0,E.jsx)(`p`,{className:`mt-2 text-sm text-fg-muted`,children:D?Te(t.deleteMessage,{id:D}):``}),(0,E.jsxs)(`div`,{className:`mt-4 flex justify-end gap-2`,children:[(0,E.jsx)(u,{type:`button`,variant:`secondary`,onClick:()=>be(!1),children:t.cancel}),(0,E.jsx)(u,{type:`button`,variant:`primary`,className:`bg-red-600 hover:bg-red-700`,onClick:()=>void rt(),children:t.deleteConfirm})]})]})]})})]}):(0,E.jsx)(`div`,{className:`mx-auto w-full max-w-app-main px-4 py-16 text-center text-sm text-fg-muted sm:px-8`,children:t.needToken})}async function Me(t){let n=t.name.toLowerCase();if(n.endsWith(`.zip`))return t;if(n.endsWith(`skill.md`)){let n=(await r(async()=>{let{default:t}=await import(`./jszip.min-CL3dfyxs.js`).then(t=>e(t.default,1));return{default:t}},__vite__mapDeps([0,1]))).default,i=new n;i.file(`SKILL.md`,await t.arrayBuffer());let a=await i.generateAsync({type:`blob`,compression:`DEFLATE`}),o=t.name.replace(/\.md$/i,``).replace(/\s+/g,`-`)||`skill`;return new File([a],`${o}.zip`,{type:`application/zip`})}throw Error(`invalid`)}function I(){let e=v(e=>e.language),t=ue(e).skills,n=!!ge(e=>e.token),[r,i]=_e(),[a,o]=(0,T.useState)([]),[s,c]=(0,T.useState)(!1),[ee,u]=(0,T.useState)(null),[f,ie]=(0,T.useState)(!1),ae=r.get(`q`)??``,oe=r.get(`tab`),p=r.get(`source`),se=N.has(oe)?oe:`marketplace`,le=je.has(p)?p:`all`,[h,g]=(0,T.useState)(ae),[pe,_]=(0,T.useState)(null),[y,b]=(0,T.useState)(se),[x,ve]=(0,T.useState)(le),[S,ye]=(0,T.useState)(``),[xe,Se]=(0,T.useState)(!1),[C,w]=(0,T.useState)(null),[Ce,E]=(0,T.useState)(!1),[D,O]=(0,T.useState)(!1),[we,k]=(0,T.useState)(null),[Te,Ee]=(0,T.useState)(null),[A,j]=(0,T.useState)({}),[Oe,M]=(0,T.useState)(!1),[ke,Ae]=(0,T.useState)(`catalog`),[F,I]=(0,T.useState)(``),[Ne,L]=(0,T.useState)(``),[Pe,R]=(0,T.useState)(null),[Fe,z]=(0,T.useState)(null),[Ie,B]=(0,T.useState)(!1),[Le,V]=(0,T.useState)(null),[H,U]=(0,T.useState)(`downloads`),[W,G]=(0,T.useState)(1),[Re,K]=(0,T.useState)(!1),[ze,q]=(0,T.useState)(null),[Be,J]=(0,T.useState)(null),[Ve,He]=(0,T.useState)(null),[Y,Ue]=(0,T.useState)(``),[We,Ge]=(0,T.useState)([]),[Ke,qe]=(0,T.useState)(null),[Je,X]=(0,T.useState)(!1),[Ye,Xe]=(0,T.useState)(null),Z=(0,T.useCallback)(async n=>{let r=n?.silent===!0;r||c(!0),u(null);try{return o((await l(e===`en`?void 0:e)).catalog.map(De)),{ok:!0}}catch(e){let n=e instanceof Error?e.message:t.loadFailed;return u(n),{ok:!1,message:n}}finally{r||c(!1)}},[e,t.loadFailed]);(0,T.useEffect)(()=>{n&&Z()},[n,Z]),(0,T.useEffect)(()=>{if(!n){Xe(null);return}let e=!1;return re().then(t=>{e||Xe(t.provider)}).catch(()=>{e||Xe(null)}),()=>{e=!0}},[n]),(0,T.useEffect)(()=>{let e=r.get(`q`)??``,t=r.get(`tab`),n=r.get(`source`),i=N.has(t)?t:`marketplace`,a=je.has(n)?n:`all`;g(t=>t===e?t:e),b(e=>e===i?e:i),ve(e=>e===a?e:a);let o=r.get(`mcat`)??``;Ue(i===`marketplace`?e=>e===o?e:o:``)},[r]),(0,T.useEffect)(()=>{y===`marketplace`&&G(1)},[h,H,y,Y]),(0,T.useLayoutEffect)(()=>{!n||y!==`marketplace`||K(!0)},[n,y,Y,W,H,h]),(0,T.useLayoutEffect)(()=>{!n||y!==`marketplace`||X(!0)},[n,y]),(0,T.useEffect)(()=>{y!==`marketplace`&&(Ge([]),qe(null),X(!1))},[y]),(0,T.useEffect)(()=>{if(!n||y!==`marketplace`)return;let e=!1;return q(null),ce({q:h.trim()||void 0,page:W,pageSize:20,sort:H,category:Y.trim()||void 0}).then(t=>{e||J(t)}).catch(n=>{e||(q(n instanceof Error?n.message:t.marketplaceLoadFailed),J(null))}).finally(()=>{e||K(!1)}),()=>{e=!0}},[n,y,Y,W,H,h,t.marketplaceLoadFailed]),(0,T.useEffect)(()=>{if(!n||y!==`marketplace`)return;let e=!1;return qe(null),d().then(t=>{e||Ge(t.items)}).catch(n=>{e||(Ge([]),qe(n instanceof Error?n.message:t.marketplaceCategoriesFailed))}).finally(()=>{e||X(!1)}),()=>{e=!0,X(!1)}},[n,y,t.marketplaceCategoriesFailed]),(0,T.useEffect)(()=>{!Y.trim()||We.length===0||We.some(e=>e.id===Y)||Ue(``)},[We,Y]),(0,T.useEffect)(()=>{i(e=>{let t=new URLSearchParams(e),n=h.trim();return n?t.set(`q`,n):t.delete(`q`),y===`marketplace`?t.delete(`tab`):t.set(`tab`,y),x===`all`?t.delete(`source`):t.set(`source`,x),y===`marketplace`&&Y.trim()?t.set(`mcat`,Y.trim()):t.delete(`mcat`),t.toString()===e.toString()?e:t},{replace:!0})},[y,Y,h,i,x]);let Q=(0,T.useCallback)((e,t,n=5e3)=>{_({kind:e,message:t}),window.setTimeout(()=>_(null),n)},[]),Ze=(0,T.useCallback)(async n=>{Ae(`catalog`),M(!0),I(n.name),L(``),R(null),z(null),V(null),B(!0);try{let t=await be(n.name,e===`en`?void 0:e);R(t),I(t.name)}catch(e){R(null),V(e instanceof Error?e.message:t.detailLoadFailed)}finally{B(!1)}},[e,t.detailLoadFailed]),Qe=(0,T.useCallback)(async(e,n)=>{Ae(`store`),M(!0),I(n?.trim()||e),L(``),R(null),z(null),V(null),B(!0);try{let n=await ne(e);if(I(n.name),n.skillDocPreview)z(n.skillDocPreview),L(``);else{z(null);let e=n.readme?.trim();e?L(e):n.description?.trim()?L(`## ${n.name}\n\n${n.description.trim()}`):L(`*${t.marketplaceNoReadme}*`)}}catch(e){z(null),V(e instanceof Error?e.message:t.detailLoadFailed)}finally{B(!1)}},[t.detailLoadFailed,t.marketplaceNoReadme]),$e=(0,T.useCallback)(async(e,n)=>{Ee(e),j(t=>({...t,[e]:n})),_(null);try{return await te(e,n),await Z({silent:!0}),!0}catch(n){return j(t=>{let{[e]:n,...r}=t;return r}),Q(`error`,n instanceof Error?n.message:t.skillToggleFailed),!1}finally{Ee(null),j(t=>{let{[e]:n,...r}=t;return r})}},[Z,Q,t.skillToggleFailed]),et=(0,T.useCallback)(async()=>{_(null),c(!0),u(null);try{await de()}catch(e){u(e instanceof Error?e.message:t.reloadFailed),c(!1);return}await Z()},[Z,t.reloadFailed]),tt=(0,T.useMemo)(()=>{let e=a.filter(e=>e.source===`builtin`);return{total:e.length,enabled:e.filter(e=>A[e.name]??e.enabled).length}},[a,A]),nt=(0,T.useMemo)(()=>{let e=a.filter(e=>e.source!==`builtin`);return{total:e.length,enabled:e.filter(e=>A[e.name]??e.enabled).length}},[a,A]),rt=(0,T.useMemo)(()=>F?a.find(e=>e.name===F):void 0,[a,F]),it=rt==null?!0:A[F]??rt.enabled,$=(0,T.useMemo)(()=>{let e=h.trim().toLowerCase(),t=a;return y===`builtin`?t=t.filter(e=>e.source===`builtin`):(t=t.filter(e=>e.source!==`builtin`),x!==`all`&&(t=t.filter(e=>e.source===x))),e?t.filter(t=>[t.name,t.description,t.directoryId,t.path,t.source,t.hub?.source,t.hub?.ref].filter(Boolean).join(` `).toLowerCase().includes(e)):t},[a,h,y,x]),at=(0,T.useMemo)(()=>{let e=new Set,t=[];for(let n of $){let r=n.category;!r||e.has(r)||(e.add(r),t.push(r))}return t.sort((e,t)=>{let n=P.indexOf(e),r=P.indexOf(t);return n>=0&&r>=0?n-r:n>=0?-1:r>=0?1:e.localeCompare(t)})},[$]),ot=(0,T.useCallback)(e=>t.categoryLabel?.[e]||e,[t.categoryLabel]),st=(0,T.useMemo)(()=>S?$.filter(e=>e.category===S):$,[$,S]),ct=async e=>{_(null),ie(!0),u(null);try{let n;try{n=await Me(e)}catch{u(t.invalidFile),Q(`error`,t.invalidFile);return}await me(n,{overwrite:!0}),await Z(),Q(`success`,t.installSuccess),Se(!1),w(null),b(`user`)}catch(e){u(e instanceof Error?e.message:t.uploadFailed),Q(`error`,e instanceof Error?e.message:t.uploadFailed)}finally{ie(!1)}},lt=()=>{C&&ct(C)},ut=e=>{let t=e.target.files?.[0];e.target.value=``,t&&w(t)},dt=e=>{e.preventDefault(),e.stopPropagation(),e.dataTransfer.types.includes(`Files`)&&(E(!0),e.dataTransfer.dropEffect=`copy`)},ft=e=>{let t=e.currentTarget,n=e.relatedTarget;n&&t.contains(n)||E(!1)},pt=e=>{e.preventDefault(),e.stopPropagation(),E(!1);let t=e.dataTransfer?.files?.[0];t&&w(t)},mt=e=>{switch(e){case`builtin`:return t.source.builtin;case`workspace`:return t.source.workspace;case`global`:return t.source.global;case`extra`:return t.source.extra;default:return e}},ht=async()=>{let e=we;if(O(!1),k(null),e){_(null);try{await m(e),await Z()}catch(e){u(e instanceof Error?e.message:t.deleteFailed)}}},gt=(0,T.useCallback)(e=>a.some(t=>t.name===e),[a]),_t=(0,T.useCallback)(async e=>{let n=gt(e);if(!(n&&!window.confirm(t.marketplaceReinstallConfirm))){_(null),He(e);try{await fe({name:e,overwrite:n}),await Z({silent:!0}),Q(`success`,t.installSuccess),M(!1),b(`user`)}catch(e){Q(`error`,e instanceof Error?e.message:t.uploadFailed)}finally{He(null)}}},[gt,Z,Q,t.installSuccess,t.marketplaceReinstallConfirm,t.uploadFailed]),vt=x===`all`?t.filterAll:x===`global`?t.filterGlobal:x===`workspace`?t.filterWorkspace:t.filterExtra,{pathname:yt}=he();return{sk:t,hasToken:n,catalog:a,loading:s,error:ee,uploading:f,searchQuery:h,setSearchQuery:g,actionFeedback:pe,mainTab:y,setMainTab:b,sourceFilter:x,setSourceFilter:ve,builtinCategoryFilter:S,setBuiltinCategoryFilter:ye,installOpen:xe,setInstallOpen:Se,pendingFile:C,setPendingFile:w,dropActive:Ce,setDropActive:E,confirmOpen:D,setConfirmOpen:O,confirmId:we,setConfirmId:k,togglingSkillName:Te,enabledOverride:A,detailOpen:Oe,setDetailOpen:M,detailSource:ke,setDetailSource:Ae,detailTitle:F,setDetailTitle:I,detailMarkdown:Ne,setDetailMarkdown:L,detailCatalogPreview:Pe,setDetailCatalogPreview:R,detailMarketplacePreview:Fe,setDetailMarketplacePreview:z,detailLoading:Ie,detailError:Le,setDetailError:V,marketSort:H,setMarketSort:U,marketPage:W,setMarketPage:G,mpLoading:Re,mpError:ze,mpPayload:Be,installingMarketName:Ve,marketCategoryId:Y,setMarketCategoryId:Ue,mpCategories:We,mpCategoriesError:Ke,mpCategoriesLoading:Je,marketplaceProviderId:Ye,builtinTabStats:tt,userTabStats:nt,detailEnabled:it,filteredCatalog:$,builtinCategories:at,categoryFilteredCatalog:st,filterLabel:vt,inSettingsShell:yt.startsWith(`/settings/`),categoryLabel:ot,onReloadClick:et,openSkillDetail:Ze,openMarketplaceDetail:Qe,onSkillToggle:$e,onInstallSubmit:lt,onFileInputChange:ut,onModalDragOver:dt,onModalDragLeave:ft,onModalDrop:pt,sourceLabel:mt,runDelete:ht,onMarketInstall:_t,isSkillInstalledByName:gt}}function Ne(){return(0,E.jsx)(F,{vm:I()})}export{Ne as SkillsPage};
|
|
3
|
+
//# sourceMappingURL=skills-page-CVwEzD_J.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"mappings":"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ACvB,GAAwB,EAAK,CAC7B,GAAI,CACF,MAAM,GAAwB,CAAE,OAAM,UAAW,EAAW,CAAC,CAC7D,MAAM,EAAK,CAAE,OAAQ,GAAM,CAAC,CAC5B,EAAa,UAAW,EAAG,eAAe,CAC1C,EAAc,GAAM,CACpB,EAAW,OAAO,OACX,EAAG,CACV,EAAa,QAAS,aAAa,MAAQ,EAAE,QAAU,EAAG,aAAa,QAC/D,CACR,GAAwB,KAAK,IAGjC,CACE,GACA,EACA,EACA,EAAG,eACH,EAAG,4BACH,EAAG,aACJ,CACF,CAEK,GACJ,IAAiB,MACb,EAAG,UACH,IAAiB,SACf,EAAG,aACH,IAAiB,YACf,EAAG,gBACH,EAAG,YAEP,CAAE,aAAa,IAAa,CAGlC,MAAO,CACL,KACA,WACA,UACA,UACA,SACA,YACA,cACA,iBACA,kBACA,UACA,aACA,eACA,mBACA,wBACA,4BACA,eACA,kBACA,cACA,iBACA,cACA,gBACA,cACA,iBACA,aACA,eACA,qBACA,kBACA,cACA,gBACA,gBACA,mBACA,cACA,iBACA,kBACA,oBACA,wBACA,0BACA,4BACA,8BACA,iBACA,eACA,iBACA,aACA,gBACA,aACA,gBACA,aACA,WACA,aACA,wBACA,mBACA,uBACA,gBACA,qBACA,uBACA,yBACA,mBACA,gBACA,iBACA,kBACA,qBACA,2BACA,eACA,gBAlEsB,GAAS,WAAW,aAkE1C,CACA,iBACA,iBACA,mBACA,yBACA,iBACA,mBACA,qBACA,mBACA,oBACA,eACA,eACA,aACA,mBACA,0BACD,CChsBH,SAAgB,IAAa,CAE3B,OAAO,SAAC,EAAD,CAAoB,GADhB,GACgB,CAAM","names":[],"ignoreList":[],"sources":["../../../../../web/src/features/skills/skill-card-icon.tsx","../../../../../web/src/features/skills/skills-page.utils.ts","../../../../../web/src/features/skills/skill-catalog-structured-preview.tsx","../../../../../web/src/features/skills/skills-page-header-end.tsx","../../../../../web/src/features/skills/skills-page-primitives.tsx","../../../../../web/src/features/skills/skills-page.constants.ts","../../../../../web/src/features/skills/skills-page-view.tsx","../../../../../web/src/features/skills/skill-upload-zip.ts","../../../../../web/src/features/skills/use-skills-page.ts","../../../../../web/src/features/skills/skills-page.tsx"],"sourcesContent":["import { cn } from '@/lib/cn';\n\n/** Pastel tile + saturated letter (light / dark pairs), stable per skill name hash. */\nconst SKILL_INITIAL_PALETTE: { light: string; dark: string }[] = [\n { light: 'bg-sky-100 text-sky-800', dark: 'dark:bg-sky-950/55 dark:text-sky-200' },\n { light: 'bg-violet-100 text-violet-800', dark: 'dark:bg-violet-950/55 dark:text-violet-200' },\n { light: 'bg-emerald-100 text-emerald-800', dark: 'dark:bg-emerald-950/55 dark:text-emerald-200' },\n { light: 'bg-orange-100 text-orange-800', dark: 'dark:bg-orange-950/55 dark:text-orange-200' },\n { light: 'bg-rose-100 text-rose-800', dark: 'dark:bg-rose-950/55 dark:text-rose-200' },\n { light: 'bg-amber-100 text-amber-900', dark: 'dark:bg-amber-950/55 dark:text-amber-200' },\n { light: 'bg-cyan-100 text-cyan-800', dark: 'dark:bg-cyan-950/55 dark:text-cyan-200' },\n { light: 'bg-indigo-100 text-indigo-800', dark: 'dark:bg-indigo-950/55 dark:text-indigo-200' },\n { light: 'bg-fuchsia-100 text-fuchsia-800', dark: 'dark:bg-fuchsia-950/55 dark:text-fuchsia-200' },\n { light: 'bg-teal-100 text-teal-800', dark: 'dark:bg-teal-950/55 dark:text-teal-200' },\n];\n\nfunction hashSkillNameKey(name: string): number {\n let h = 0;\n for (let i = 0; i < name.length; i += 1) {\n h = (Math.imul(31, h) + name.charCodeAt(i)) | 0;\n }\n return Math.abs(h);\n}\n\n/** First letter or digit (Unicode letters included); skips leading punctuation in slugs. */\nfunction skillInitialLetter(name: string): string {\n const t = name.trim();\n if (!t) return '?';\n const m = t.match(/[\\p{L}\\p{N}]/u);\n if (m) {\n const ch = m[0];\n return ch.toLocaleUpperCase('en-US');\n }\n return t[0];\n}\n\nexport function SkillCardIcon({ name, className }: { name: string; className?: string }) {\n const initial = skillInitialLetter(name);\n const pair = SKILL_INITIAL_PALETTE[hashSkillNameKey(name) % SKILL_INITIAL_PALETTE.length];\n return (\n <div\n className={cn(\n 'flex size-11 shrink-0 items-center justify-center rounded-xl font-semibold tracking-tight shadow-surface',\n 'text-[1.05rem] ring-1 ring-inset ring-black/[0.06] dark:ring-white/[0.1]',\n 'transition-[transform,box-shadow] duration-200 ease-out group-hover:ring-black/[0.1] dark:group-hover:ring-white/[0.14]',\n 'group-hover:-translate-y-px',\n pair.light,\n pair.dark,\n className,\n )}\n aria-hidden\n >\n {initial}\n </div>\n );\n}\n","import type { SkillCatalogEntry, SkillInstallSpecApi } from '@/features/skills/skill.types';\n\nexport function interpolate(template: string, params: Record<string, string | number>): string {\n return template.replace(/\\{\\{(\\w+)\\}\\}/g, (_, key) => String(params[key] ?? ''));\n}\n\nexport function installSpecSummary(spec: SkillInstallSpecApi): string {\n const parts = [spec.kind];\n if (spec.label?.trim()) parts.push(spec.label.trim());\n if (spec.package?.trim()) parts.push(spec.package.trim());\n if (spec.formula?.trim()) parts.push(spec.formula.trim());\n if (spec.module?.trim()) parts.push(spec.module.trim());\n if (spec.url?.trim()) parts.push(spec.url.trim());\n return parts.join(' · ');\n}\n\nexport function normalizeCatalogEntry(r: SkillCatalogEntry): SkillCatalogEntry {\n return {\n ...r,\n enabled: r.enabled ?? true,\n disableModelInvocation: r.disableModelInvocation ?? false,\n };\n}\n","import { type ReactNode } from 'react';\n\nimport { MarkdownView } from '@/components/markdown/markdown-view';\nimport { cn } from '@/lib/cn';\nimport type { SkillMarkdownPreviewPayload } from '@/features/skills/skill.types';\nimport { installSpecSummary } from '@/features/skills/skills-page.utils';\nimport type { MessageBundle } from '@/i18n/messages';\n\nexport type SkillsCopy = MessageBundle['skills'];\n\nfunction MetaRow({ label, children }: { label: string; children: ReactNode }) {\n if (children === null || children === undefined || children === false) return null;\n return (\n <div className=\"mt-3 border-t border-edge-subtle pt-3 dark:border-edge/60\">\n <div className=\"text-xs font-semibold uppercase tracking-wide text-fg-muted\">{label}</div>\n <div className=\"mt-1.5 min-w-0 text-sm text-fg\">{children}</div>\n </div>\n );\n}\n\nexport function SkillCatalogStructuredPreview({\n preview,\n sk,\n}: {\n preview: SkillMarkdownPreviewPayload;\n sk: SkillsCopy;\n}) {\n const meta = preview.metadata;\n const gate = preview.toolConditions;\n const hasToolGating =\n !!gate &&\n (gate.requiresTools.length > 0 ||\n gate.requiresToolsets.length > 0 ||\n gate.fallbackForTools.length > 0 ||\n gate.fallbackForToolsets.length > 0);\n const req = meta.requires;\n const hasRequires =\n req &&\n ((req.bins?.length ?? 0) > 0 || (req.env?.length ?? 0) > 0 || (req.anyBins?.length ?? 0) > 0);\n const installs = meta.install?.filter((s) => s && typeof s.kind === 'string') ?? [];\n const envNames = preview.requiredEnvVarNames?.filter((n) => n.trim()) ?? [];\n\n return (\n <div className=\"space-y-6\">\n <section aria-labelledby=\"skill-detail-summary-heading\">\n <h3\n id=\"skill-detail-summary-heading\"\n className=\"mb-2 text-xs font-semibold uppercase tracking-wide text-fg-muted\"\n >\n {sk.detailSummaryHeading}\n </h3>\n <div className=\"rounded-xl border border-edge bg-surface-base px-4 py-3 dark:bg-surface-hover/25\">\n {meta.emoji?.trim() ? (\n <p className=\"text-2xl leading-none\" aria-hidden>\n {meta.emoji.trim()}\n </p>\n ) : null}\n <p className={cn('text-sm leading-relaxed text-fg', meta.emoji?.trim() ? 'mt-2' : '')}>\n {preview.description}\n </p>\n {preview.disableModelInvocation ? (\n <p className=\"mt-3 rounded-lg border border-amber-200/80 bg-amber-50/90 px-3 py-2 text-xs leading-snug text-amber-950 dark:border-amber-900/50 dark:bg-amber-950/40 dark:text-amber-100\">\n {sk.detailNotInjectedNote}\n </p>\n ) : null}\n <MetaRow label={sk.detailHomepageLabel}>\n {meta.homepage?.trim() ? (\n <a\n href={meta.homepage.trim()}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"break-all text-accent underline-offset-2 hover:underline\"\n >\n {meta.homepage.trim()}\n </a>\n ) : null}\n </MetaRow>\n <MetaRow label={sk.detailPlatformsLabel}>\n {meta.os && meta.os.length > 0 ? (\n <span className=\"font-mono text-xs text-fg-muted\">{meta.os.join(', ')}</span>\n ) : null}\n </MetaRow>\n <MetaRow label={sk.detailRequiresLabel}>\n {hasRequires && req ? (\n <ul className=\"list-inside list-disc space-y-1 text-sm text-fg-muted\">\n {req.bins && req.bins.length > 0 ? (\n <li>\n <span className=\"text-fg\">{sk.detailRequiresBins}: </span>\n {req.bins.join(', ')}\n </li>\n ) : null}\n {req.env && req.env.length > 0 ? (\n <li>\n <span className=\"text-fg\">{sk.detailRequiresEnv}: </span>\n <span className=\"font-mono text-xs\">{req.env.join(', ')}</span>\n </li>\n ) : null}\n {req.anyBins && req.anyBins.length > 0 ? (\n <li>\n <span className=\"text-fg\">{sk.detailRequiresAnyBins}: </span>\n {req.anyBins.join(', ')}\n </li>\n ) : null}\n </ul>\n ) : null}\n </MetaRow>\n <MetaRow label={sk.detailInstallLabel}>\n {installs.length > 0 ? (\n <ul className=\"list-inside list-decimal space-y-1.5 text-sm text-fg-muted\">\n {installs.map((spec, i) => (\n <li key={spec.id || `${spec.kind}-${i}`} className=\"[overflow-wrap:anywhere]\">\n <span className=\"text-fg\">{installSpecSummary(spec)}</span>\n </li>\n ))}\n </ul>\n ) : null}\n </MetaRow>\n <MetaRow label={sk.detailToolGatingLabel}>\n {hasToolGating && gate ? (\n <ul className=\"mt-1 space-y-2 text-sm text-fg-muted\">\n {gate.requiresTools.length > 0 ? (\n <li>\n <span className=\"font-medium text-fg\">{sk.detailToolsRequiresList}: </span>\n {gate.requiresTools.join(', ')}\n </li>\n ) : null}\n {gate.requiresToolsets.length > 0 ? (\n <li>\n <span className=\"font-medium text-fg\">{sk.detailToolsetsRequiresList}: </span>\n {gate.requiresToolsets.join(', ')}\n </li>\n ) : null}\n {gate.fallbackForTools.length > 0 ? (\n <li>\n <span className=\"font-medium text-fg\">{sk.detailToolsFallbackList}: </span>\n {gate.fallbackForTools.join(', ')}\n </li>\n ) : null}\n {gate.fallbackForToolsets.length > 0 ? (\n <li>\n <span className=\"font-medium text-fg\">{sk.detailToolsetsFallbackList}: </span>\n {gate.fallbackForToolsets.join(', ')}\n </li>\n ) : null}\n </ul>\n ) : null}\n </MetaRow>\n <MetaRow label={sk.detailEnvVarsLabel}>\n {envNames.length > 0 ? (\n <span className=\"font-mono text-xs text-fg-muted\">{envNames.join(', ')}</span>\n ) : null}\n </MetaRow>\n </div>\n </section>\n <section aria-labelledby=\"skill-detail-instructions-heading\">\n <h3\n id=\"skill-detail-instructions-heading\"\n className=\"mb-2 text-xs font-semibold uppercase tracking-wide text-fg-muted\"\n >\n {sk.detailInstructionsHeading}\n </h3>\n {preview.bodyMarkdown.trim() ? (\n <div className=\"markdown-content min-w-0 break-words\">\n <MarkdownView content={preview.bodyMarkdown} />\n </div>\n ) : (\n <p className=\"text-sm italic text-fg-muted\">{sk.detailNoInstructionsBody}</p>\n )}\n </section>\n </div>\n );\n}\n","import { Plus, RefreshCw, Search } from 'lucide-react';\nimport { memo } from 'react';\n\nimport { Button } from '@/components/ui/button';\nimport { cn } from '@/lib/cn';\nimport type { MainTab } from '@/features/skills/skills-page.constants';\nimport type { SkillsCopy } from '@/features/skills/skill-catalog-structured-preview';\n\nexport const SkillsPageHeaderEnd = memo(function SkillsPageHeaderEnd({\n loading,\n onReloadClick,\n searchQuery,\n setSearchQuery,\n mainTab,\n sk,\n setPendingFile,\n setInstallOpen,\n}: {\n loading: boolean;\n onReloadClick: () => void;\n searchQuery: string;\n setSearchQuery: (v: string) => void;\n mainTab: MainTab;\n sk: SkillsCopy;\n setPendingFile: (f: File | null) => void;\n setInstallOpen: (v: boolean) => void;\n}) {\n return (\n <div className=\"flex min-w-0 flex-1 flex-wrap items-center justify-end gap-2\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"h-9 w-9 shrink-0 p-0\"\n disabled={loading}\n title={sk.reloadRuntime}\n aria-label={sk.reloadDiskAria}\n onClick={() => void onReloadClick()}\n >\n <RefreshCw className={cn('size-4', loading && 'animate-spin')} strokeWidth={1.75} />\n </Button>\n <label className=\"relative flex min-h-9 min-w-0 max-w-sm cursor-text items-center rounded-pill border border-edge bg-surface-base py-1.5 pl-9 pr-3 shadow-surface dark:bg-surface-hover/40 sm:max-w-md\">\n <Search\n className=\"pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-fg-disabled\"\n strokeWidth={1.75}\n aria-hidden\n />\n <input\n type=\"text\"\n role=\"searchbox\"\n enterKeyHint=\"search\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n placeholder={mainTab === 'marketplace' ? sk.marketplaceSearchPackages : sk.searchPlaceholder}\n autoComplete=\"off\"\n spellCheck={false}\n className=\"min-w-0 flex-1 appearance-none border-0 bg-transparent py-0.5 text-sm leading-normal text-fg caret-current placeholder:text-fg-disabled focus:border-0 focus:shadow-none focus:outline-none focus:ring-0 focus-visible:outline-none\"\n />\n </label>\n <Button\n type=\"button\"\n variant=\"primary\"\n className=\"shrink-0 gap-2\"\n onClick={() => {\n setPendingFile(null);\n setInstallOpen(true);\n }}\n >\n <Plus className=\"size-4\" strokeWidth={1.75} aria-hidden />\n {sk.installCta}\n </Button>\n </div>\n );\n});\n","import { cn } from '@/lib/cn';\n\nexport function SkillEnableSwitch({\n checked,\n onChange,\n}: {\n checked: boolean;\n onChange: (next: boolean) => void;\n}) {\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n className={cn(\n 'relative h-6 w-10 shrink-0 overflow-hidden rounded-full border border-edge p-0.5',\n 'transition-[border-color,background-color] duration-200 ease-out',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 focus-visible:ring-offset-surface-base',\n 'active:scale-[0.97] motion-reduce:transition-none motion-reduce:active:scale-100',\n checked ? 'bg-accent' : 'bg-surface-hover',\n )}\n onClick={() => onChange(!checked)}\n >\n <span\n className={cn(\n 'pointer-events-none absolute left-0.5 top-1/2 block size-4 -translate-y-1/2 rounded-full bg-surface-panel shadow-surface ring-1 ring-edge/40 dark:ring-edge/55',\n 'transition-transform duration-200 ease-out motion-reduce:transition-none',\n checked ? 'translate-x-5' : 'translate-x-0',\n )}\n aria-hidden\n />\n </button>\n );\n}\n\nexport function SkillListRowSkeleton() {\n const skel =\n 'animate-pulse motion-reduce:animate-none rounded-md bg-surface-hover dark:bg-surface-active/50';\n return (\n <div className=\"flex items-center gap-4 px-4 py-3.5\" aria-hidden>\n <div className={cn('size-11 shrink-0 rounded-xl', skel)} />\n <div className=\"min-w-0 flex-1 space-y-2\">\n <div className={cn('h-4 max-w-[10rem]', skel)} />\n <div className={cn('h-3 w-full max-w-xl rounded', skel)} />\n </div>\n <div className={cn('h-6 w-10 shrink-0 rounded-full', skel)} />\n </div>\n );\n}\n\n/** Taller row — matches marketplace cards (meta pills + install button) to avoid layout jump after fetch. */\nexport function MarketplaceSkillListRowSkeleton() {\n const skel =\n 'animate-pulse motion-reduce:animate-none rounded-md bg-surface-hover dark:bg-surface-active/50';\n return (\n <div className=\"flex items-center gap-4 px-4 py-3.5\" aria-hidden>\n <div className={cn('size-11 shrink-0 rounded-xl', skel)} />\n <div className=\"min-w-0 flex-1 space-y-2 pr-2\">\n <div className={cn('h-4 max-w-[12rem]', skel)} />\n <div className={cn('h-3 w-full max-w-xl rounded', skel)} />\n <div className=\"flex flex-wrap gap-1.5 pt-0.5\">\n <div className={cn('h-5 w-[5.5rem] rounded-md', skel)} />\n <div className={cn('h-5 w-16 rounded-md', skel)} />\n <div className={cn('h-5 w-14 rounded-md', skel)} />\n </div>\n </div>\n <div className={cn('h-9 min-w-[6.5rem] shrink-0 rounded-lg', skel)} />\n </div>\n );\n}\n","export type MainTab = 'builtin' | 'user' | 'marketplace';\nexport type SourceFilter = 'all' | 'global' | 'workspace' | 'extra';\n\nexport const MAIN_TAB_SET = new Set<MainTab>(['builtin', 'user', 'marketplace']);\nexport const SOURCE_FILTER_SET = new Set<SourceFilter>(['all', 'global', 'workspace', 'extra']);\n\nexport const SKILL_LIST_SKELETON_COUNT = 6;\n\n/** Category display order for consistent pill ordering on the built-in tab. */\nexport const BUILTIN_SKILL_CATEGORY_ORDER = ['business', 'creative', 'documents', 'tools', 'meta'] as const;\n","import * as Dialog from '@radix-ui/react-dialog';\nimport * as DropdownMenu from '@radix-ui/react-dropdown-menu';\nimport {\n ChevronDown,\n ChevronLeft,\n ChevronRight,\n FileArchive,\n Funnel,\n Info,\n MoreVertical,\n Star,\n Trash2,\n X,\n} from 'lucide-react';\nimport { useLayoutEffect, useMemo } from 'react';\n\nimport { MarkdownView } from '@/components/markdown/markdown-view';\nimport { Button } from '@/components/ui/button';\nimport { cn } from '@/lib/cn';\nimport { interaction } from '@/lib/interaction';\nimport { SkillCardIcon } from '@/features/skills/skill-card-icon';\nimport { SkillCatalogStructuredPreview } from '@/features/skills/skill-catalog-structured-preview';\nimport { SkillsPageHeaderEnd } from '@/features/skills/skills-page-header-end';\nimport {\n MarketplaceSkillListRowSkeleton,\n SkillEnableSwitch,\n SkillListRowSkeleton,\n} from '@/features/skills/skills-page-primitives';\nimport { SKILL_LIST_SKELETON_COUNT } from '@/features/skills/skills-page.constants';\nimport { interpolate } from '@/features/skills/skills-page.utils';\nimport type { SkillsPageVm } from '@/features/skills/use-skills-page';\nimport { usePageHeaderStore } from '@/stores/page-header-store';\n\nexport function SkillsPageView({ vm }: { vm: SkillsPageVm }) {\n const {\n sk,\n hasToken,\n catalog,\n loading,\n error,\n uploading,\n searchQuery,\n setSearchQuery,\n actionFeedback,\n mainTab,\n setMainTab,\n setSourceFilter,\n builtinCategoryFilter,\n setBuiltinCategoryFilter,\n installOpen,\n setInstallOpen,\n pendingFile,\n setPendingFile,\n dropActive,\n setDropActive,\n confirmOpen,\n setConfirmOpen,\n confirmId,\n setConfirmId,\n togglingSkillName,\n enabledOverride,\n detailOpen,\n setDetailOpen,\n detailSource,\n setDetailSource,\n detailTitle,\n setDetailTitle,\n detailMarkdown,\n setDetailMarkdown,\n detailCatalogPreview,\n setDetailCatalogPreview,\n detailMarketplacePreview,\n setDetailMarketplacePreview,\n detailLoading,\n detailError,\n setDetailError,\n marketSort,\n setMarketSort,\n marketPage,\n setMarketPage,\n mpLoading,\n mpError,\n mpPayload,\n installingMarketName,\n marketCategoryId,\n setMarketCategoryId,\n mpCategories,\n mpCategoriesError,\n mpCategoriesLoading,\n marketplaceProviderId,\n builtinTabStats,\n userTabStats,\n detailEnabled,\n filteredCatalog,\n builtinCategories,\n categoryFilteredCatalog,\n filterLabel,\n inSettingsShell,\n categoryLabel,\n onReloadClick,\n openSkillDetail,\n openMarketplaceDetail,\n onSkillToggle,\n onInstallSubmit,\n onFileInputChange,\n onModalDragOver,\n onModalDragLeave,\n onModalDrop,\n sourceLabel,\n runDelete,\n onMarketInstall,\n isSkillInstalledByName,\n } = vm;\n\n const setPageHeader = usePageHeaderStore((s) => s.setPageHeader);\n const clearPageHeader = usePageHeaderStore((s) => s.clearPageHeader);\n\n const skillsHeaderEnd = useMemo(\n () => (\n <SkillsPageHeaderEnd\n loading={loading}\n onReloadClick={onReloadClick}\n searchQuery={searchQuery}\n setSearchQuery={setSearchQuery}\n mainTab={mainTab}\n sk={sk}\n setPendingFile={setPendingFile}\n setInstallOpen={setInstallOpen}\n />\n ),\n [\n loading,\n onReloadClick,\n searchQuery,\n setSearchQuery,\n mainTab,\n sk,\n setPendingFile,\n setInstallOpen,\n ],\n );\n\n useLayoutEffect(() => {\n if (!hasToken || inSettingsShell) {\n clearPageHeader();\n return () => clearPageHeader();\n }\n setPageHeader({\n startExtra: null,\n main: null,\n end: skillsHeaderEnd,\n });\n return () => clearPageHeader();\n }, [clearPageHeader, hasToken, inSettingsShell, setPageHeader, skillsHeaderEnd]);\n\n if (!hasToken) {\n return (\n <div className=\"mx-auto w-full max-w-app-main px-4 py-16 text-center text-sm text-fg-muted sm:px-8\">\n {sk.needToken}\n </div>\n );\n }\n\n return (\n <div className=\"flex min-h-0 flex-1 flex-col overflow-y-auto bg-surface-panel\">\n <div className=\"mx-auto flex w-full max-w-app-main flex-col gap-6 px-4 py-6 sm:px-8\">\n {actionFeedback ? (\n <div\n role=\"status\"\n aria-live=\"polite\"\n className={cn(\n 'rounded-xl border px-3 py-2 text-sm',\n actionFeedback.kind === 'success'\n ? 'border-emerald-200 bg-emerald-50 text-emerald-800 dark:border-emerald-900/40 dark:bg-emerald-950/40 dark:text-emerald-200'\n : 'border-red-200 bg-red-50 text-red-800 dark:border-red-900/50 dark:bg-red-950/40 dark:text-red-200',\n )}\n >\n {actionFeedback.message}\n </div>\n ) : error ? (\n <div\n className=\"rounded-xl border border-edge bg-red-50 px-3 py-2 text-sm text-red-700 dark:border-edge dark:bg-red-950/40 dark:text-red-300\"\n role=\"alert\"\n >\n {error}\n </div>\n ) : null}\n\n <header className=\"flex flex-col gap-4\">\n <div className=\"min-w-0\">\n <h1 className=\"text-xl font-semibold tracking-tight text-fg\">{sk.title}</h1>\n <p className=\"mt-1 max-w-2xl text-sm text-fg-muted\">{sk.tagline}</p>\n </div>\n </header>\n\n {inSettingsShell ? (\n <div className=\"flex flex-col gap-3 border-b border-edge-subtle pb-4 dark:border-edge-subtle sm:flex-row sm:flex-wrap sm:items-center sm:justify-end\">\n {skillsHeaderEnd}\n </div>\n ) : null}\n\n <section className=\"flex flex-col gap-4\">\n <div className=\"flex flex-col gap-3 border-b border-edge-subtle pb-3 sm:flex-row sm:items-center sm:justify-between dark:border-edge-subtle\">\n <div\n className=\"flex flex-wrap gap-x-1 gap-y-1\"\n role=\"tablist\"\n aria-label={sk.skillsNavAria}\n >\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={mainTab === 'marketplace'}\n className={cn(\n 'relative max-w-full rounded-md px-3 py-2 text-left text-sm font-medium transition-colors sm:text-center',\n mainTab === 'marketplace' ? 'text-fg' : 'text-fg-muted hover:text-fg',\n mainTab === 'marketplace' &&\n 'after:absolute after:bottom-0 after:left-1/2 after:h-0.5 after:w-9 after:-translate-x-1/2 after:rounded-full after:bg-accent',\n )}\n onClick={() => setMainTab('marketplace')}\n >\n {sk.tabMarketplace}\n {marketplaceProviderId ? (\n <span className=\"font-normal text-fg-muted\">({marketplaceProviderId})</span>\n ) : null}\n </button>\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={mainTab === 'builtin'}\n className={cn(\n 'relative rounded-md px-3 py-2 text-sm font-medium transition-colors',\n mainTab === 'builtin' ? 'text-fg' : 'text-fg-muted hover:text-fg',\n mainTab === 'builtin' &&\n 'after:absolute after:bottom-0 after:left-1/2 after:h-0.5 after:w-9 after:-translate-x-1/2 after:rounded-full after:bg-accent',\n )}\n onClick={() => setMainTab('builtin')}\n >\n {sk.tabBuiltin}\n <span className=\"ml-1 tabular-nums text-fg-muted\">\n ({builtinTabStats.enabled}/{builtinTabStats.total})\n </span>\n </button>\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={mainTab === 'user'}\n className={cn(\n 'relative rounded-md px-3 py-2 text-sm font-medium transition-colors',\n mainTab === 'user' ? 'text-fg' : 'text-fg-muted hover:text-fg',\n mainTab === 'user' &&\n 'after:absolute after:bottom-0 after:left-1/2 after:h-0.5 after:w-9 after:-translate-x-1/2 after:rounded-full after:bg-accent',\n )}\n onClick={() => setMainTab('user')}\n >\n {sk.tabUser}\n <span className=\"ml-1 tabular-nums text-fg-muted\">\n ({userTabStats.enabled}/{userTabStats.total})\n </span>\n </button>\n </div>\n <div\n className={cn(\n 'flex min-h-9 min-w-0 items-center gap-2',\n mainTab === 'user'\n ? 'flex-nowrap overflow-x-auto pb-0.5 sm:justify-end'\n : 'flex-wrap sm:justify-end',\n )}\n >\n {mainTab === 'user' ? (\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <button\n type=\"button\"\n className={cn(\n 'inline-flex h-9 min-h-9 min-w-[9rem] shrink-0 items-center gap-1.5 rounded-lg border border-edge bg-surface-panel px-2.5 text-xs font-medium text-fg shadow-surface',\n interaction.transition,\n interaction.focusRingPanel,\n )}\n >\n <Funnel className=\"size-3.5 text-fg-muted\" strokeWidth={1.75} aria-hidden />\n <span>{filterLabel}</span>\n <ChevronDown className=\"size-3.5 text-fg-subtle\" strokeWidth={1.75} aria-hidden />\n </button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content\n className=\"z-50 min-w-[10rem] rounded-xl border border-edge bg-surface-panel p-1 shadow-popover dark:border-edge\"\n sideOffset={6}\n align=\"end\"\n >\n {(['all', 'global', 'workspace', 'extra'] as const).map((key) => (\n <DropdownMenu.Item\n key={key}\n className={cn(\n 'cursor-pointer rounded-lg px-3 py-2 text-sm text-fg outline-none',\n 'hover:bg-surface-hover data-[highlighted]:bg-surface-hover',\n )}\n onSelect={() => setSourceFilter(key)}\n >\n {key === 'all'\n ? sk.filterAll\n : key === 'global'\n ? sk.filterGlobal\n : key === 'workspace'\n ? sk.filterWorkspace\n : sk.filterExtra}\n </DropdownMenu.Item>\n ))}\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n ) : null}\n {mainTab === 'marketplace' ? (\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <button\n type=\"button\"\n className={cn(\n 'inline-flex h-9 min-h-9 min-w-[9rem] shrink-0 items-center gap-1.5 rounded-lg border border-edge bg-surface-panel px-2.5 text-xs font-medium text-fg shadow-surface',\n interaction.transition,\n interaction.focusRingPanel,\n )}\n >\n <Funnel className=\"size-3.5 text-fg-muted\" strokeWidth={1.75} aria-hidden />\n <span>\n {marketSort === 'newest' ? sk.marketplaceSortNewest : sk.marketplaceSortDownloads}\n </span>\n <ChevronDown className=\"size-3.5 text-fg-subtle\" strokeWidth={1.75} aria-hidden />\n </button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content\n className=\"z-50 min-w-[10rem] rounded-xl border border-edge bg-surface-panel p-1 shadow-popover dark:border-edge\"\n sideOffset={6}\n align=\"end\"\n >\n <DropdownMenu.Item\n className={cn(\n 'cursor-pointer rounded-lg px-3 py-2 text-sm text-fg outline-none',\n 'hover:bg-surface-hover data-[highlighted]:bg-surface-hover',\n )}\n onSelect={() => setMarketSort('downloads')}\n >\n {sk.marketplaceSortDownloads}\n </DropdownMenu.Item>\n <DropdownMenu.Item\n className={cn(\n 'cursor-pointer rounded-lg px-3 py-2 text-sm text-fg outline-none',\n 'hover:bg-surface-hover data-[highlighted]:bg-surface-hover',\n )}\n onSelect={() => setMarketSort('newest')}\n >\n {sk.marketplaceSortNewest}\n </DropdownMenu.Item>\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n ) : null}\n {mainTab === 'builtin' ? (\n <div className=\"h-9 min-w-[9rem] shrink-0\" aria-hidden />\n ) : null}\n </div>\n </div>\n\n {mainTab === 'marketplace' ? (\n <>\n <div\n className={cn(\n '-mx-1 flex min-h-[2.75rem] items-center gap-2 overflow-x-auto px-1 pb-1 pt-0.5 [scrollbar-width:thin]',\n !mpCategoriesLoading && mpCategories.length === 0 && 'min-h-0 pb-0 pt-0',\n )}\n role={mpCategories.length > 0 || mpCategoriesLoading ? 'tablist' : undefined}\n aria-label={\n mpCategories.length > 0 || mpCategoriesLoading ? sk.marketplaceCategoriesAria : undefined\n }\n >\n {mpCategories.length > 0 ? (\n <>\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={marketCategoryId === ''}\n className={cn(\n 'shrink-0 rounded-full border px-3 py-1.5 text-xs font-medium transition-colors',\n interaction.focusRingPanel,\n marketCategoryId === ''\n ? 'border-fg bg-fg text-surface-panel dark:border-fg dark:bg-fg dark:text-surface-base'\n : 'border-edge bg-surface-panel text-fg-muted hover:border-edge-strong hover:text-fg dark:border-edge dark:bg-surface-hover/40',\n )}\n onClick={() => setMarketCategoryId('')}\n >\n {sk.marketplaceCategoryAll}\n </button>\n {mpCategories.map((c) => {\n const selected = marketCategoryId === c.id;\n return (\n <button\n key={c.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={selected}\n className={cn(\n 'max-w-[14rem] shrink-0 truncate rounded-full border px-3 py-1.5 text-xs font-medium transition-colors',\n interaction.focusRingPanel,\n selected\n ? 'border-fg bg-fg text-surface-panel dark:border-fg dark:bg-fg dark:text-surface-base'\n : 'border-edge bg-surface-panel text-fg-muted hover:border-edge-strong hover:text-fg dark:border-edge dark:bg-surface-hover/40',\n )}\n title={c.label}\n onClick={() => setMarketCategoryId(c.id)}\n >\n {c.label}\n </button>\n );\n })}\n </>\n ) : mpCategoriesLoading ? (\n <div className=\"flex gap-2 px-1\" aria-hidden>\n {Array.from({ length: 5 }, (_, i) => (\n <div\n key={i}\n className=\"h-8 w-[4.5rem] shrink-0 animate-pulse rounded-full bg-surface-hover motion-reduce:animate-none dark:bg-surface-active/50\"\n />\n ))}\n </div>\n ) : null}\n </div>\n {mpCategoriesError ? (\n <p className=\"text-xs text-red-600 dark:text-red-400\" role=\"alert\">\n {mpCategoriesError}\n </p>\n ) : null}\n {mpLoading ? (\n <div\n className=\"overflow-hidden rounded-2xl border border-edge-subtle bg-surface-base dark:border-edge-subtle\"\n aria-busy=\"true\"\n aria-label={sk.loading}\n >\n {Array.from({ length: SKILL_LIST_SKELETON_COUNT }, (_, i) => (\n <MarketplaceSkillListRowSkeleton key={i} />\n ))}\n </div>\n ) : mpError ? (\n <div\n className=\"rounded-xl border border-edge bg-red-50 px-3 py-2 text-sm text-red-700 dark:border-edge dark:bg-red-950/40 dark:text-red-300\"\n role=\"alert\"\n >\n {mpError}\n </div>\n ) : !mpPayload || mpPayload.items.length === 0 ? (\n <div className=\"rounded-2xl border border-dashed border-edge py-16 text-center text-sm text-fg-muted\">\n {sk.marketplaceEmpty}\n </div>\n ) : (\n <>\n <div className=\"overflow-hidden rounded-2xl border border-edge-subtle bg-surface-base dark:border-edge-subtle\">\n {mpPayload.items.map((row) => {\n const installed = isSkillInstalledByName(row.id);\n const busy = installingMarketName === row.id;\n return (\n <article\n key={row.id}\n className={cn(\n 'group relative flex items-center gap-4 border-b border-edge-subtle px-4 py-3.5 last:border-b-0',\n 'transition-colors hover:bg-surface-hover/50 dark:hover:bg-surface-hover/25',\n )}\n >\n <button\n type=\"button\"\n className={cn(\n 'flex min-w-0 flex-1 cursor-pointer items-center gap-4 rounded-lg text-left outline-none',\n interaction.focusRingPanel,\n )}\n onClick={() => void openMarketplaceDetail(row.id, row.name)}\n >\n <SkillCardIcon name={row.id} />\n <div className=\"min-w-0 flex-1 pr-2\">\n <h3 className=\"text-[15px] font-semibold leading-snug tracking-tight text-fg\">\n {row.name}\n </h3>\n <p\n className=\"mt-0.5 truncate text-sm leading-relaxed text-fg-muted\"\n title={row.description ? row.description : undefined}\n >\n {row.description || '—'}\n </p>\n <div className=\"mt-1.5 flex flex-wrap gap-1.5 text-[11px] text-fg-subtle\">\n <span className=\"rounded-md bg-surface-hover/60 px-2 py-0.5 dark:bg-surface-active/50\">\n {sk.marketplaceAuthor}: {row.author.username}\n </span>\n <span className=\"rounded-md bg-surface-hover/60 px-2 py-0.5 dark:bg-surface-active/50\">\n {sk.marketplaceDownloads}: {row.downloads}\n </span>\n {row.stars != null && row.stars > 0 ? (\n <span className=\"inline-flex items-center gap-0.5 rounded-md bg-surface-hover/60 px-2 py-0.5 dark:bg-surface-active/50\">\n <Star className=\"size-3 shrink-0 text-amber-600 dark:text-amber-400\" strokeWidth={2} aria-hidden />\n {row.stars}\n </span>\n ) : null}\n {row.sourceLabel ? (\n <span className=\"rounded-md bg-surface-hover/60 px-2 py-0.5 dark:bg-surface-active/50\">\n {sk.marketplaceSource}: {row.sourceLabel}\n </span>\n ) : null}\n {row.latestVersion ? (\n <span className=\"rounded-md bg-surface-hover/60 px-2 py-0.5 font-mono text-[10px] dark:bg-surface-active/50\">\n {sk.marketplaceVersion}: {row.latestVersion}\n </span>\n ) : null}\n {installed ? (\n <span className=\"rounded-md bg-emerald-500/15 px-2 py-0.5 text-emerald-800 dark:text-emerald-200\">\n {sk.marketplaceInstalled}\n </span>\n ) : null}\n </div>\n </div>\n </button>\n <div className=\"flex shrink-0 justify-end sm:pl-2\">\n <Button\n type=\"button\"\n variant={installed ? 'secondary' : 'primary'}\n className=\"min-w-[6.5rem]\"\n disabled={busy || mpLoading}\n onClick={() => void onMarketInstall(row.id)}\n >\n {busy ? sk.uploading : installed ? sk.marketplaceReinstall : sk.marketplaceInstall}\n </Button>\n </div>\n </article>\n );\n })}\n </div>\n <div className=\"flex flex-col items-center justify-between gap-3 sm:flex-row\">\n <p className=\"text-center text-xs text-fg-muted sm:text-left\">\n {interpolate(sk.marketplacePageStatus, {\n page: mpPayload.meta.page,\n totalPages: mpPayload.meta.totalPages,\n total: mpPayload.meta.total,\n })}\n </p>\n <div className=\"flex items-center gap-2\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"h-9 gap-1 px-2\"\n disabled={mpLoading || marketPage <= 1}\n aria-label={sk.marketplacePagePrev}\n onClick={() => setMarketPage((p) => Math.max(1, p - 1))}\n >\n <ChevronLeft className=\"size-4\" strokeWidth={1.75} aria-hidden />\n <span className=\"sr-only sm:not-sr-only\">{sk.marketplacePagePrev}</span>\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"h-9 gap-1 px-2\"\n disabled={mpLoading || marketPage >= mpPayload.meta.totalPages}\n aria-label={sk.marketplacePageNext}\n onClick={() =>\n setMarketPage((p) => Math.min(mpPayload.meta.totalPages, p + 1))\n }\n >\n <span className=\"sr-only sm:not-sr-only\">{sk.marketplacePageNext}</span>\n <ChevronRight className=\"size-4\" strokeWidth={1.75} aria-hidden />\n </Button>\n </div>\n </div>\n </>\n )}\n </>\n ) : (\n <>\n {loading ? (\n <div\n className=\"overflow-hidden rounded-2xl border border-edge-subtle bg-surface-base dark:border-edge-subtle\"\n aria-busy=\"true\"\n aria-label={sk.loading}\n >\n {Array.from({ length: SKILL_LIST_SKELETON_COUNT }, (_, i) => (\n <SkillListRowSkeleton key={i} />\n ))}\n </div>\n ) : catalog.length === 0 ? (\n <div className=\"rounded-2xl border border-dashed border-edge py-16 text-center text-sm text-fg-muted\">\n {sk.empty}\n </div>\n ) : filteredCatalog.length === 0 ? (\n <div className=\"rounded-2xl border border-dashed border-edge py-16 text-center text-sm text-fg-muted\">\n {sk.noSearchResults}\n </div>\n ) : (\n <>\n {builtinCategories.length > 1 ? (\n <div\n role=\"tablist\"\n aria-label={sk.marketplaceCategoriesAria}\n className=\"-mx-1 flex gap-2 overflow-x-auto px-1 pb-1 pt-0.5 [scrollbar-width:thin]\"\n >\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={builtinCategoryFilter === ''}\n className={cn(\n 'shrink-0 rounded-full border px-3 py-1.5 text-xs font-medium transition-colors',\n interaction.focusRingPanel,\n builtinCategoryFilter === ''\n ? 'border-fg bg-fg text-surface-panel dark:border-fg dark:bg-fg dark:text-surface-base'\n : 'border-edge bg-surface-panel text-fg-muted hover:border-edge-strong hover:text-fg dark:border-edge dark:bg-surface-hover/40',\n )}\n onClick={() => setBuiltinCategoryFilter('')}\n >\n {sk.marketplaceCategoryAll}\n </button>\n {builtinCategories.map((cat) => {\n const selected = builtinCategoryFilter === cat;\n return (\n <button\n key={cat}\n type=\"button\"\n role=\"tab\"\n aria-selected={selected}\n className={cn(\n 'max-w-[14rem] shrink-0 truncate rounded-full border px-3 py-1.5 text-xs font-medium transition-colors',\n interaction.focusRingPanel,\n selected\n ? 'border-fg bg-fg text-surface-panel dark:border-fg dark:bg-fg dark:text-surface-base'\n : 'border-edge bg-surface-panel text-fg-muted hover:border-edge-strong hover:text-fg dark:border-edge dark:bg-surface-hover/40',\n )}\n title={categoryLabel(cat)}\n onClick={() => setBuiltinCategoryFilter(cat)}\n >\n {categoryLabel(cat)}\n </button>\n );\n })}\n </div>\n ) : null}\n {categoryFilteredCatalog.length === 0 ? (\n <div className=\"rounded-2xl border border-dashed border-edge py-16 text-center text-sm text-fg-muted\">\n {sk.noSearchResults}\n </div>\n ) : (\n <div className=\"overflow-hidden rounded-2xl border border-edge-subtle bg-surface-base dark:border-edge-subtle\">\n {categoryFilteredCatalog.map((row, i, arr) => (\n <article\n key={`${row.directoryId}-${row.path}`}\n className={cn(\n 'group relative flex items-center gap-4 border-b border-edge-subtle px-4 py-3.5',\n i === arr.length - 1 && 'border-b-0',\n 'transition-colors hover:bg-surface-hover/50 dark:hover:bg-surface-hover/25',\n )}\n >\n <button\n type=\"button\"\n className={cn(\n 'flex min-w-0 flex-1 cursor-pointer items-center gap-4 rounded-lg text-left outline-none',\n interaction.focusRingPanel,\n )}\n onClick={() => void openSkillDetail(row)}\n >\n <SkillCardIcon name={row.name} />\n <div className=\"min-w-0 flex-1 pr-2\">\n <h3 className=\"text-[15px] font-semibold leading-snug tracking-tight text-fg\">\n {row.name}\n </h3>\n <p\n className=\"mt-0.5 truncate text-sm leading-relaxed text-fg-muted\"\n title={row.description ? row.description : undefined}\n >\n {row.description || '—'}\n </p>\n {mainTab !== 'builtin' || row.managed ? (\n <div className=\"mt-1.5 flex flex-wrap gap-1.5 text-[11px] text-fg-subtle\">\n {mainTab !== 'builtin' ? (\n <span className=\"rounded-md bg-surface-hover/60 px-2 py-0.5 dark:bg-surface-active/50\">\n {sourceLabel(row.source)}\n </span>\n ) : null}\n {row.managed ? (\n <span className=\"rounded-md bg-surface-hover/60 px-2 py-0.5 dark:bg-surface-active/50\">\n {sk.col.managed}: {sk.yes}\n </span>\n ) : null}\n {row.hub ? (\n <span\n className=\"max-w-full truncate rounded-md bg-surface-hover/60 px-2 py-0.5 font-mono text-[10px] dark:bg-surface-active/50\"\n title={`${row.hub.source}${row.hub.ref ? `\\nref: ${row.hub.ref}` : ''}\\nupdated: ${row.hub.updatedAt}`}\n >\n {sk.hubRemote} ·{' '}\n {row.hub.kind === 'git' ? sk.hubKindGit : sk.hubKindArchive} ·{' '}\n {row.hub.source.length > 48\n ? `${row.hub.source.slice(0, 48)}…`\n : row.hub.source}\n </span>\n ) : null}\n </div>\n ) : null}\n </div>\n </button>\n <div\n className=\"flex shrink-0 items-center gap-1\"\n onClick={(e) => e.stopPropagation()}\n role=\"presentation\"\n >\n {row.managed ? (\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <button\n type=\"button\"\n className={cn(\n 'flex size-9 items-center justify-center rounded-lg text-fg-muted hover:bg-surface-hover hover:text-fg',\n interaction.focusRingPanel,\n )}\n aria-label={sk.col.actions}\n >\n <MoreVertical className=\"size-4\" strokeWidth={1.75} />\n </button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content\n className=\"z-50 min-w-[8rem] rounded-xl border border-edge bg-surface-panel p-1 shadow-popover dark:border-edge\"\n sideOffset={4}\n align=\"end\"\n >\n <DropdownMenu.Item\n className={cn(\n 'flex cursor-pointer items-center gap-2 rounded-lg px-3 py-2 text-sm text-red-600 outline-none',\n 'hover:bg-red-50 data-[highlighted]:bg-red-50 dark:text-red-400 dark:hover:bg-red-950/40',\n )}\n onSelect={() => {\n setConfirmId(row.directoryId);\n setConfirmOpen(true);\n }}\n >\n <Trash2 className=\"size-4\" strokeWidth={1.75} aria-hidden />\n {sk.delete}\n </DropdownMenu.Item>\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n ) : null}\n <SkillEnableSwitch\n checked={enabledOverride[row.name] ?? row.enabled}\n onChange={(next) => void onSkillToggle(row.name, next)}\n />\n </div>\n </article>\n ))}\n </div>\n )}\n </>\n )}\n </>\n )}\n </section>\n </div>\n\n <Dialog.Root\n open={detailOpen}\n onOpenChange={(open) => {\n setDetailOpen(open);\n if (!open) {\n setDetailSource('catalog');\n setDetailMarkdown('');\n setDetailCatalogPreview(null);\n setDetailMarketplacePreview(null);\n setDetailError(null);\n setDetailTitle('');\n }\n }}\n >\n <Dialog.Portal>\n <Dialog.Overlay className=\"xopc-dialog-overlay fixed inset-0 z-[60] bg-scrim\" />\n <Dialog.Content\n className={cn(\n 'xopc-dialog-content fixed left-1/2 top-1/2 z-[60] flex h-[min(88vh,44rem)] max-h-[min(92vh,56rem)] w-[min(100%-2rem,min(92vw,56rem))]',\n '-translate-x-1/2 -translate-y-1/2 flex-col overflow-hidden rounded-2xl border border-edge bg-surface-panel shadow-float dark:border-edge',\n )}\n >\n <div className=\"group flex min-h-[3.25rem] shrink-0 items-center gap-3 border-b border-edge px-4 py-3\">\n <SkillCardIcon name={detailTitle || '?'} />\n <Dialog.Title className=\"min-w-0 flex-1 truncate text-base font-semibold text-fg\">\n {detailTitle || '—'}\n </Dialog.Title>\n <Dialog.Close asChild>\n <button\n type=\"button\"\n className={cn(\n 'rounded-lg p-1.5 text-fg-muted hover:bg-surface-hover hover:text-fg',\n interaction.focusRingPanel,\n )}\n aria-label={sk.detailCloseAria}\n >\n <X className=\"size-5\" strokeWidth={1.75} aria-hidden />\n </button>\n </Dialog.Close>\n </div>\n <div className=\"flex min-h-[3.25rem] shrink-0 items-start gap-2 border-b border-blue-200/80 bg-blue-50/95 px-4 py-2.5 text-sm text-fg dark:border-blue-900/50 dark:bg-blue-950/45\">\n <Info className=\"mt-0.5 size-4 shrink-0 text-blue-600 dark:text-blue-400\" strokeWidth={1.75} aria-hidden />\n <p className=\"min-w-0 leading-relaxed\">\n {detailSource === 'store' && detailMarketplacePreview\n ? sk.detailModalBanner\n : detailSource === 'store'\n ? sk.detailModalBannerStore\n : sk.detailModalBanner}\n </p>\n </div>\n <div className=\"min-h-0 min-w-0 flex-1 overflow-auto px-4 py-4\">\n {detailLoading ? (\n <div\n className=\"flex h-full min-h-[14rem] flex-col gap-2.5 py-1\"\n aria-busy=\"true\"\n aria-label={sk.loading}\n >\n {Array.from({ length: 10 }, (_, i) => (\n <div\n key={i}\n className={cn(\n 'h-4 animate-pulse rounded-md bg-surface-hover dark:bg-surface-active/50',\n i % 3 === 0 ? 'w-[92%]' : i % 3 === 1 ? 'w-full' : 'w-4/5',\n )}\n />\n ))}\n </div>\n ) : detailError ? (\n <p className=\"text-sm text-red-600 dark:text-red-400\">{detailError}</p>\n ) : detailSource === 'catalog' && detailCatalogPreview ? (\n <SkillCatalogStructuredPreview preview={detailCatalogPreview} sk={sk} />\n ) : detailSource === 'store' && detailMarketplacePreview ? (\n <SkillCatalogStructuredPreview preview={detailMarketplacePreview} sk={sk} />\n ) : (\n <div className=\"markdown-content min-w-0 break-words\">\n <MarkdownView content={detailMarkdown} />\n </div>\n )}\n </div>\n <div className=\"flex shrink-0 justify-end gap-2 border-t border-edge px-4 py-3\">\n {detailSource === 'store' ? (\n <>\n <Button type=\"button\" variant=\"ghost\" onClick={() => setDetailOpen(false)}>\n {sk.cancel}\n </Button>\n <Button\n type=\"button\"\n variant={isSkillInstalledByName(detailTitle) ? 'secondary' : 'primary'}\n disabled={!detailTitle || installingMarketName === detailTitle}\n onClick={() => {\n if (!detailTitle) return;\n void onMarketInstall(detailTitle);\n }}\n >\n {installingMarketName === detailTitle\n ? sk.uploading\n : isSkillInstalledByName(detailTitle)\n ? sk.marketplaceReinstall\n : sk.marketplaceInstall}\n </Button>\n </>\n ) : (\n <Button\n type=\"button\"\n variant=\"primary\"\n disabled={!detailTitle || togglingSkillName === detailTitle}\n onClick={async () => {\n if (!detailTitle) return;\n const ok = await onSkillToggle(detailTitle, !detailEnabled);\n if (ok) setDetailOpen(false);\n }}\n >\n {detailEnabled ? sk.detailModalDisable : sk.detailModalEnable}\n </Button>\n )}\n </div>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n\n <Dialog.Root\n open={installOpen}\n onOpenChange={(open) => {\n setInstallOpen(open);\n if (!open) {\n setPendingFile(null);\n setDropActive(false);\n }\n }}\n >\n <Dialog.Portal>\n <Dialog.Overlay className=\"xopc-dialog-overlay fixed inset-0 z-[60] bg-scrim\" />\n <Dialog.Content\n className={cn(\n 'xopc-dialog-content fixed left-1/2 top-1/2 z-[60] max-h-[min(100vh-2rem,44rem)] w-[min(100%-2rem,min(92vw,48rem))] -translate-x-1/2 -translate-y-1/2 overflow-y-auto',\n 'rounded-2xl border border-edge bg-surface-panel p-6 shadow-float dark:border-edge',\n )}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <Dialog.Title className=\"text-base font-semibold text-fg\">{sk.installModalTitle}</Dialog.Title>\n <Dialog.Close asChild>\n <button\n type=\"button\"\n className={cn(\n 'rounded-lg p-1.5 text-fg-muted hover:bg-surface-hover hover:text-fg',\n interaction.focusRingPanel,\n )}\n aria-label={sk.installClose}\n >\n <X className=\"size-5\" strokeWidth={1.75} aria-hidden />\n <span className=\"sr-only\">{sk.installClose}</span>\n </button>\n </Dialog.Close>\n </div>\n\n <label\n className={cn(\n 'mt-4 flex min-h-[11rem] cursor-pointer flex-col items-center justify-center gap-3 rounded-xl border-2 border-dashed px-6 py-12 text-center transition-colors',\n dropActive\n ? 'border-accent bg-accent-soft/60 dark:bg-blue-950/40'\n : 'border-edge bg-surface-base dark:bg-surface-hover/30',\n )}\n onDragLeave={onModalDragLeave}\n onDragOver={onModalDragOver}\n onDrop={onModalDrop}\n >\n <input\n type=\"file\"\n accept=\".zip,.md,application/zip,text/markdown\"\n className=\"sr-only\"\n aria-label={sk.installModalDropHint}\n disabled={uploading}\n onChange={onFileInputChange}\n />\n <FileArchive className=\"size-12 text-fg-subtle\" strokeWidth={1.25} aria-hidden />\n <span className=\"text-sm text-fg-muted\">{sk.installModalDropHint}</span>\n {pendingFile ? (\n <span className=\"text-xs font-medium text-fg\">{pendingFile.name}</span>\n ) : null}\n </label>\n\n <div className=\"mt-5 space-y-2\">\n <p className=\"text-sm font-medium text-fg\">{sk.installModalReqTitle}</p>\n <ul className=\"list-inside list-disc space-y-1 text-sm text-fg-muted\">\n <li>{sk.installModalReq1}</li>\n <li>{sk.installModalReq2}</li>\n </ul>\n </div>\n\n <button\n type=\"button\"\n disabled={!pendingFile || uploading}\n className={cn(\n 'mt-6 flex w-full items-center justify-center rounded-xl py-3 text-sm font-semibold',\n 'transition-colors',\n !pendingFile || uploading\n ? 'cursor-not-allowed bg-surface-active text-fg-disabled'\n : 'bg-accent text-white hover:bg-accent-hover',\n interaction.focusRingPanel,\n )}\n onClick={() => void onInstallSubmit()}\n >\n {uploading ? sk.uploading : sk.installAction}\n </button>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n\n <Dialog.Root\n open={confirmOpen}\n onOpenChange={(open) => {\n setConfirmOpen(open);\n if (!open) setConfirmId(null);\n }}\n >\n <Dialog.Portal>\n <Dialog.Overlay className=\"xopc-dialog-overlay fixed inset-0 z-[60] bg-scrim\" />\n <Dialog.Content className=\"xopc-dialog-content fixed left-1/2 top-1/2 z-[60] w-[min(100%-2rem,24rem)] -translate-x-1/2 -translate-y-1/2 rounded-xl border border-edge bg-surface-panel p-4 shadow-popover dark:border-edge\">\n <Dialog.Title className=\"text-base font-semibold text-fg\">{sk.deleteTitle}</Dialog.Title>\n <p className=\"mt-2 text-sm text-fg-muted\">\n {confirmId ? interpolate(sk.deleteMessage, { id: confirmId }) : ''}\n </p>\n <div className=\"mt-4 flex justify-end gap-2\">\n <Button type=\"button\" variant=\"secondary\" onClick={() => setConfirmOpen(false)}>\n {sk.cancel}\n </Button>\n <Button\n type=\"button\"\n variant=\"primary\"\n className=\"bg-red-600 hover:bg-red-700\"\n onClick={() => void runDelete()}\n >\n {sk.deleteConfirm}\n </Button>\n </div>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n </div>\n );\n}\n","export async function fileToZipUpload(file: File): Promise<File> {\n const lower = file.name.toLowerCase();\n if (lower.endsWith('.zip')) return file;\n if (lower.endsWith('skill.md')) {\n const JSZip = (await import('jszip')).default;\n const zip = new JSZip();\n zip.file('SKILL.md', await file.arrayBuffer());\n const blob = await zip.generateAsync({ type: 'blob', compression: 'DEFLATE' });\n const base = file.name.replace(/\\.md$/i, '').replace(/\\s+/g, '-') || 'skill';\n return new File([blob], `${base}.zip`, { type: 'application/zip' });\n }\n throw new Error('invalid');\n}\n","import {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useState,\n type ChangeEvent,\n type DragEvent,\n} from 'react';\nimport { useLocation, useSearchParams } from 'react-router-dom';\n\nimport {\n deleteSkill,\n getMarketplaceCategories,\n getMarketplacePackageDetail,\n getMarketplaceProvider,\n getMarketplaceSkills,\n getSkillMarkdown,\n getSkills,\n installMarketplaceSkill,\n patchSkillEnabled,\n reloadSkills,\n uploadSkillZip,\n} from '@/features/skills/skill-api';\nimport type {\n MarketplaceCategoryItem,\n MarketplacePackageItem,\n SkillCatalogEntry,\n SkillMarkdownPreviewPayload,\n} from '@/features/skills/skill.types';\nimport { fileToZipUpload } from '@/features/skills/skill-upload-zip';\nimport {\n BUILTIN_SKILL_CATEGORY_ORDER,\n MAIN_TAB_SET,\n SOURCE_FILTER_SET,\n type MainTab,\n type SourceFilter,\n} from '@/features/skills/skills-page.constants';\nimport { normalizeCatalogEntry } from '@/features/skills/skills-page.utils';\nimport { messages } from '@/i18n/messages';\nimport { useGatewayStore } from '@/stores/gateway-store';\nimport { useLocaleStore } from '@/stores/locale-store';\n\nexport function useSkillsPage() {\n const language = useLocaleStore((s) => s.language);\n const m = messages(language);\n const sk = m.skills;\n const token = useGatewayStore((st) => st.token);\n const hasToken = Boolean(token);\n const [searchParams, setSearchParams] = useSearchParams();\n\n const [catalog, setCatalog] = useState<SkillCatalogEntry[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [uploading, setUploading] = useState(false);\n const initialSearch = searchParams.get('q') ?? '';\n const initialTabRaw = searchParams.get('tab');\n const initialSourceRaw = searchParams.get('source');\n const initialTab: MainTab = MAIN_TAB_SET.has(initialTabRaw as MainTab)\n ? (initialTabRaw as MainTab)\n : 'marketplace';\n const initialSourceFilter: SourceFilter = SOURCE_FILTER_SET.has(initialSourceRaw as SourceFilter)\n ? (initialSourceRaw as SourceFilter)\n : 'all';\n\n const [searchQuery, setSearchQuery] = useState(initialSearch);\n const [actionFeedback, setActionFeedback] = useState<{\n kind: 'success' | 'error';\n message: string;\n } | null>(null);\n\n const [mainTab, setMainTab] = useState<MainTab>(initialTab);\n const [sourceFilter, setSourceFilter] = useState<SourceFilter>(initialSourceFilter);\n const [builtinCategoryFilter, setBuiltinCategoryFilter] = useState('');\n\n const [installOpen, setInstallOpen] = useState(false);\n const [pendingFile, setPendingFile] = useState<File | null>(null);\n const [dropActive, setDropActive] = useState(false);\n\n const [confirmOpen, setConfirmOpen] = useState(false);\n const [confirmId, setConfirmId] = useState<string | null>(null);\n const [togglingSkillName, setTogglingSkillName] = useState<string | null>(null);\n const [enabledOverride, setEnabledOverride] = useState<Record<string, boolean>>({});\n\n const [detailOpen, setDetailOpen] = useState(false);\n const [detailSource, setDetailSource] = useState<'catalog' | 'store'>('catalog');\n const [detailTitle, setDetailTitle] = useState('');\n const [detailMarkdown, setDetailMarkdown] = useState('');\n const [detailCatalogPreview, setDetailCatalogPreview] = useState<SkillMarkdownPreviewPayload | null>(null);\n const [detailMarketplacePreview, setDetailMarketplacePreview] = useState<SkillMarkdownPreviewPayload | null>(\n null,\n );\n const [detailLoading, setDetailLoading] = useState(false);\n const [detailError, setDetailError] = useState<string | null>(null);\n\n const [marketSort, setMarketSort] = useState<'downloads' | 'newest'>('downloads');\n const [marketPage, setMarketPage] = useState(1);\n const [mpLoading, setMpLoading] = useState(false);\n const [mpError, setMpError] = useState<string | null>(null);\n const [mpPayload, setMpPayload] = useState<{\n items: MarketplacePackageItem[];\n meta: { page: number; pageSize: number; total: number; totalPages: number };\n provider?: 'store' | 'skillhub';\n } | null>(null);\n const [installingMarketName, setInstallingMarketName] = useState<string | null>(null);\n const [marketCategoryId, setMarketCategoryId] = useState('');\n const [mpCategories, setMpCategories] = useState<MarketplaceCategoryItem[]>([]);\n const [mpCategoriesError, setMpCategoriesError] = useState<string | null>(null);\n const [mpCategoriesLoading, setMpCategoriesLoading] = useState(false);\n const [marketplaceProviderId, setMarketplaceProviderId] = useState<'store' | 'skillhub' | null>(null);\n\n const load = useCallback(\n async (opts?: { silent?: boolean }): Promise<{ ok: true } | { ok: false; message: string }> => {\n const silent = opts?.silent === true;\n if (!silent) {\n setLoading(true);\n }\n setError(null);\n try {\n const data = await getSkills(language !== 'en' ? language : undefined);\n setCatalog(data.catalog.map(normalizeCatalogEntry));\n return { ok: true };\n } catch (e) {\n const message = e instanceof Error ? e.message : sk.loadFailed;\n setError(message);\n return { ok: false, message };\n } finally {\n if (!silent) {\n setLoading(false);\n }\n }\n },\n [language, sk.loadFailed],\n );\n\n useEffect(() => {\n if (!hasToken) return;\n void load();\n }, [hasToken, load]);\n\n useEffect(() => {\n if (!hasToken) {\n setMarketplaceProviderId(null);\n return;\n }\n let cancelled = false;\n void getMarketplaceProvider()\n .then((info) => {\n if (!cancelled) setMarketplaceProviderId(info.provider);\n })\n .catch(() => {\n if (!cancelled) setMarketplaceProviderId(null);\n });\n return () => {\n cancelled = true;\n };\n }, [hasToken]);\n\n useEffect(() => {\n const nextQ = searchParams.get('q') ?? '';\n const nextTabRaw = searchParams.get('tab');\n const nextSourceRaw = searchParams.get('source');\n const nextTab: MainTab = MAIN_TAB_SET.has(nextTabRaw as MainTab)\n ? (nextTabRaw as MainTab)\n : 'marketplace';\n const nextSource: SourceFilter = SOURCE_FILTER_SET.has(nextSourceRaw as SourceFilter)\n ? (nextSourceRaw as SourceFilter)\n : 'all';\n setSearchQuery((prev) => (prev === nextQ ? prev : nextQ));\n setMainTab((prev) => (prev === nextTab ? prev : nextTab));\n setSourceFilter((prev) => (prev === nextSource ? prev : nextSource));\n const nextMcat = searchParams.get('mcat') ?? '';\n if (nextTab === 'marketplace') {\n setMarketCategoryId((prev) => (prev === nextMcat ? prev : nextMcat));\n } else {\n setMarketCategoryId('');\n }\n }, [searchParams]);\n\n useEffect(() => {\n if (mainTab !== 'marketplace') return;\n setMarketPage(1);\n }, [searchQuery, marketSort, mainTab, marketCategoryId]);\n\n /** Before paint: avoid one frame of empty/stale list then skeleton (useEffect runs too late). */\n useLayoutEffect(() => {\n if (!hasToken || mainTab !== 'marketplace') return;\n setMpLoading(true);\n }, [hasToken, mainTab, marketCategoryId, marketPage, marketSort, searchQuery]);\n\n useLayoutEffect(() => {\n if (!hasToken || mainTab !== 'marketplace') return;\n setMpCategoriesLoading(true);\n }, [hasToken, mainTab]);\n\n useEffect(() => {\n if (mainTab === 'marketplace') return;\n setMpCategories([]);\n setMpCategoriesError(null);\n setMpCategoriesLoading(false);\n }, [mainTab]);\n\n useEffect(() => {\n if (!hasToken || mainTab !== 'marketplace') return;\n let cancelled = false;\n setMpError(null);\n void getMarketplaceSkills({\n q: searchQuery.trim() || undefined,\n page: marketPage,\n pageSize: 20,\n sort: marketSort,\n category: marketCategoryId.trim() || undefined,\n })\n .then((payload) => {\n if (!cancelled) setMpPayload(payload);\n })\n .catch((e) => {\n if (!cancelled) {\n setMpError(e instanceof Error ? e.message : sk.marketplaceLoadFailed);\n setMpPayload(null);\n }\n })\n .finally(() => {\n if (!cancelled) setMpLoading(false);\n });\n return () => {\n cancelled = true;\n };\n }, [\n hasToken,\n mainTab,\n marketCategoryId,\n marketPage,\n marketSort,\n searchQuery,\n sk.marketplaceLoadFailed,\n ]);\n\n useEffect(() => {\n if (!hasToken || mainTab !== 'marketplace') return;\n let cancelled = false;\n setMpCategoriesError(null);\n void getMarketplaceCategories()\n .then((r) => {\n if (!cancelled) setMpCategories(r.items);\n })\n .catch((e) => {\n if (!cancelled) {\n setMpCategories([]);\n setMpCategoriesError(e instanceof Error ? e.message : sk.marketplaceCategoriesFailed);\n }\n })\n .finally(() => {\n if (!cancelled) setMpCategoriesLoading(false);\n });\n return () => {\n cancelled = true;\n setMpCategoriesLoading(false);\n };\n }, [hasToken, mainTab, sk.marketplaceCategoriesFailed]);\n\n useEffect(() => {\n if (!marketCategoryId.trim() || mpCategories.length === 0) return;\n if (!mpCategories.some((c) => c.id === marketCategoryId)) {\n setMarketCategoryId('');\n }\n }, [mpCategories, marketCategoryId]);\n\n useEffect(() => {\n setSearchParams(\n (prev) => {\n const params = new URLSearchParams(prev);\n const nextQ = searchQuery.trim();\n if (nextQ) params.set('q', nextQ);\n else params.delete('q');\n if (mainTab !== 'marketplace') params.set('tab', mainTab);\n else params.delete('tab');\n if (sourceFilter !== 'all') params.set('source', sourceFilter);\n else params.delete('source');\n if (mainTab === 'marketplace' && marketCategoryId.trim()) {\n params.set('mcat', marketCategoryId.trim());\n } else {\n params.delete('mcat');\n }\n if (params.toString() === prev.toString()) {\n return prev;\n }\n return params;\n },\n { replace: true },\n );\n }, [mainTab, marketCategoryId, searchQuery, setSearchParams, sourceFilter]);\n\n const showFeedback = useCallback((kind: 'success' | 'error', message: string, durationMs = 5000) => {\n setActionFeedback({ kind, message });\n window.setTimeout(() => setActionFeedback(null), durationMs);\n }, []);\n\n const openSkillDetail = useCallback(\n async (row: SkillCatalogEntry) => {\n setDetailSource('catalog');\n setDetailOpen(true);\n setDetailTitle(row.name);\n setDetailMarkdown('');\n setDetailCatalogPreview(null);\n setDetailMarketplacePreview(null);\n setDetailError(null);\n setDetailLoading(true);\n try {\n const preview = await getSkillMarkdown(row.name, language !== 'en' ? language : undefined);\n setDetailCatalogPreview(preview);\n setDetailTitle(preview.name);\n } catch (e) {\n setDetailCatalogPreview(null);\n setDetailError(e instanceof Error ? e.message : sk.detailLoadFailed);\n } finally {\n setDetailLoading(false);\n }\n },\n [language, sk.detailLoadFailed],\n );\n\n const openMarketplaceDetail = useCallback(\n async (packageId: string, listTitle?: string) => {\n setDetailSource('store');\n setDetailOpen(true);\n setDetailTitle(listTitle?.trim() || packageId);\n setDetailMarkdown('');\n setDetailCatalogPreview(null);\n setDetailMarketplacePreview(null);\n setDetailError(null);\n setDetailLoading(true);\n try {\n const pkg = await getMarketplacePackageDetail(packageId);\n setDetailTitle(pkg.name);\n if (pkg.skillDocPreview) {\n setDetailMarketplacePreview(pkg.skillDocPreview);\n setDetailMarkdown('');\n } else {\n setDetailMarketplacePreview(null);\n const readme = pkg.readme?.trim();\n if (readme) {\n setDetailMarkdown(readme);\n } else if (pkg.description?.trim()) {\n setDetailMarkdown(`## ${pkg.name}\\n\\n${pkg.description.trim()}`);\n } else {\n setDetailMarkdown(`*${sk.marketplaceNoReadme}*`);\n }\n }\n } catch (e) {\n setDetailMarketplacePreview(null);\n setDetailError(e instanceof Error ? e.message : sk.detailLoadFailed);\n } finally {\n setDetailLoading(false);\n }\n },\n [sk.detailLoadFailed, sk.marketplaceNoReadme],\n );\n\n const onSkillToggle = useCallback(\n async (name: string, next: boolean): Promise<boolean> => {\n setTogglingSkillName(name);\n setEnabledOverride((prev) => ({ ...prev, [name]: next }));\n setActionFeedback(null);\n try {\n await patchSkillEnabled(name, next);\n await load({ silent: true });\n return true;\n } catch (e) {\n setEnabledOverride((prev) => {\n const { [name]: _, ...rest } = prev;\n return rest;\n });\n const msg = e instanceof Error ? e.message : sk.skillToggleFailed;\n showFeedback('error', msg);\n return false;\n } finally {\n setTogglingSkillName(null);\n setEnabledOverride((prev) => {\n const { [name]: _, ...rest } = prev;\n return rest;\n });\n }\n },\n [load, showFeedback, sk.skillToggleFailed],\n );\n\n const onReloadClick = useCallback(async () => {\n setActionFeedback(null);\n setLoading(true);\n setError(null);\n try {\n await reloadSkills();\n } catch (e) {\n const msg = e instanceof Error ? e.message : sk.reloadFailed;\n setError(msg);\n setLoading(false);\n return;\n }\n await load();\n }, [load, sk.reloadFailed]);\n\n const builtinTabStats = useMemo(() => {\n const rows = catalog.filter((r) => r.source === 'builtin');\n return {\n total: rows.length,\n enabled: rows.filter((r) => enabledOverride[r.name] ?? r.enabled).length,\n };\n }, [catalog, enabledOverride]);\n\n const userTabStats = useMemo(() => {\n const rows = catalog.filter((r) => r.source !== 'builtin');\n return {\n total: rows.length,\n enabled: rows.filter((r) => enabledOverride[r.name] ?? r.enabled).length,\n };\n }, [catalog, enabledOverride]);\n\n const detailFromCatalog = useMemo(\n () => (detailTitle ? catalog.find((r) => r.name === detailTitle) : undefined),\n [catalog, detailTitle],\n );\n const detailEnabled =\n detailFromCatalog == null\n ? true\n : (enabledOverride[detailTitle] ?? detailFromCatalog.enabled);\n\n const filteredCatalog = useMemo(() => {\n const q = searchQuery.trim().toLowerCase();\n let rows = catalog;\n\n if (mainTab === 'builtin') {\n rows = rows.filter((r) => r.source === 'builtin');\n } else {\n rows = rows.filter((r) => r.source !== 'builtin');\n if (sourceFilter !== 'all') {\n rows = rows.filter((r) => r.source === sourceFilter);\n }\n }\n\n if (!q) return rows;\n return rows.filter((row) => {\n const blob = [\n row.name,\n row.description,\n row.directoryId,\n row.path,\n row.source,\n row.hub?.source,\n row.hub?.ref,\n ]\n .filter(Boolean)\n .join(' ')\n .toLowerCase();\n return blob.includes(q);\n });\n }, [catalog, searchQuery, mainTab, sourceFilter]);\n\n const builtinCategories = useMemo(() => {\n const seen = new Set<string>();\n const ordered: string[] = [];\n for (const entry of filteredCatalog) {\n const cat = entry.category;\n if (!cat || seen.has(cat)) continue;\n seen.add(cat);\n ordered.push(cat);\n }\n return ordered.sort((a, b) => {\n const ai = BUILTIN_SKILL_CATEGORY_ORDER.indexOf(a as (typeof BUILTIN_SKILL_CATEGORY_ORDER)[number]);\n const bi = BUILTIN_SKILL_CATEGORY_ORDER.indexOf(b as (typeof BUILTIN_SKILL_CATEGORY_ORDER)[number]);\n if (ai >= 0 && bi >= 0) return ai - bi;\n if (ai >= 0) return -1;\n if (bi >= 0) return 1;\n return a.localeCompare(b);\n });\n }, [filteredCatalog]);\n\n const categoryLabel = useCallback(\n (cat: string): string => {\n const labels = sk.categoryLabel as Record<string, string> | undefined;\n return labels?.[cat] || cat;\n },\n [sk.categoryLabel],\n );\n\n const categoryFilteredCatalog = useMemo(() => {\n if (!builtinCategoryFilter) return filteredCatalog;\n return filteredCatalog.filter((r) => r.category === builtinCategoryFilter);\n }, [filteredCatalog, builtinCategoryFilter]);\n\n const runUpload = async (file: File) => {\n setActionFeedback(null);\n setUploading(true);\n setError(null);\n try {\n let upload: File;\n try {\n upload = await fileToZipUpload(file);\n } catch {\n setError(sk.invalidFile);\n showFeedback('error', sk.invalidFile);\n return;\n }\n await uploadSkillZip(upload, { overwrite: true });\n await load();\n showFeedback('success', sk.installSuccess);\n setInstallOpen(false);\n setPendingFile(null);\n setMainTab('user');\n } catch (err) {\n setError(err instanceof Error ? err.message : sk.uploadFailed);\n showFeedback('error', err instanceof Error ? err.message : sk.uploadFailed);\n } finally {\n setUploading(false);\n }\n };\n\n const onInstallSubmit = () => {\n if (pendingFile) void runUpload(pendingFile);\n };\n\n const onFileInputChange = (e: ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n e.target.value = '';\n if (file) setPendingFile(file);\n };\n\n const onModalDragOver = (e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (e.dataTransfer.types.includes('Files')) {\n setDropActive(true);\n e.dataTransfer.dropEffect = 'copy';\n }\n };\n\n const onModalDragLeave = (e: DragEvent) => {\n const root = e.currentTarget as HTMLElement;\n const to = e.relatedTarget as Node | null;\n if (to && root.contains(to)) return;\n setDropActive(false);\n };\n\n const onModalDrop = (e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setDropActive(false);\n const file = e.dataTransfer?.files?.[0];\n if (file) setPendingFile(file);\n };\n\n const sourceLabel = (source: SkillCatalogEntry['source']): string => {\n switch (source) {\n case 'builtin':\n return sk.source.builtin;\n case 'workspace':\n return sk.source.workspace;\n case 'global':\n return sk.source.global;\n case 'extra':\n return sk.source.extra;\n default:\n return source;\n }\n };\n\n const runDelete = async () => {\n const id = confirmId;\n setConfirmOpen(false);\n setConfirmId(null);\n if (!id) return;\n setActionFeedback(null);\n try {\n await deleteSkill(id);\n await load();\n } catch (e) {\n setError(e instanceof Error ? e.message : sk.deleteFailed);\n }\n };\n\n const isSkillInstalledByName = useCallback(\n (name: string) => catalog.some((r) => r.name === name),\n [catalog],\n );\n\n const onMarketInstall = useCallback(\n async (name: string) => {\n const installed = isSkillInstalledByName(name);\n if (installed) {\n const ok = window.confirm(sk.marketplaceReinstallConfirm);\n if (!ok) return;\n }\n setActionFeedback(null);\n setInstallingMarketName(name);\n try {\n await installMarketplaceSkill({ name, overwrite: installed });\n await load({ silent: true });\n showFeedback('success', sk.installSuccess);\n setDetailOpen(false);\n setMainTab('user');\n } catch (e) {\n showFeedback('error', e instanceof Error ? e.message : sk.uploadFailed);\n } finally {\n setInstallingMarketName(null);\n }\n },\n [\n isSkillInstalledByName,\n load,\n showFeedback,\n sk.installSuccess,\n sk.marketplaceReinstallConfirm,\n sk.uploadFailed,\n ],\n );\n\n const filterLabel =\n sourceFilter === 'all'\n ? sk.filterAll\n : sourceFilter === 'global'\n ? sk.filterGlobal\n : sourceFilter === 'workspace'\n ? sk.filterWorkspace\n : sk.filterExtra;\n\n const { pathname } = useLocation();\n const inSettingsShell = pathname.startsWith('/settings/');\n\n return {\n sk,\n hasToken,\n catalog,\n loading,\n error,\n uploading,\n searchQuery,\n setSearchQuery,\n actionFeedback,\n mainTab,\n setMainTab,\n sourceFilter,\n setSourceFilter,\n builtinCategoryFilter,\n setBuiltinCategoryFilter,\n installOpen,\n setInstallOpen,\n pendingFile,\n setPendingFile,\n dropActive,\n setDropActive,\n confirmOpen,\n setConfirmOpen,\n confirmId,\n setConfirmId,\n togglingSkillName,\n enabledOverride,\n detailOpen,\n setDetailOpen,\n detailSource,\n setDetailSource,\n detailTitle,\n setDetailTitle,\n detailMarkdown,\n setDetailMarkdown,\n detailCatalogPreview,\n setDetailCatalogPreview,\n detailMarketplacePreview,\n setDetailMarketplacePreview,\n detailLoading,\n detailError,\n setDetailError,\n marketSort,\n setMarketSort,\n marketPage,\n setMarketPage,\n mpLoading,\n mpError,\n mpPayload,\n installingMarketName,\n marketCategoryId,\n setMarketCategoryId,\n mpCategories,\n mpCategoriesError,\n mpCategoriesLoading,\n marketplaceProviderId,\n builtinTabStats,\n userTabStats,\n detailEnabled,\n filteredCatalog,\n builtinCategories,\n categoryFilteredCatalog,\n filterLabel,\n inSettingsShell,\n categoryLabel,\n onReloadClick,\n openSkillDetail,\n openMarketplaceDetail,\n onSkillToggle,\n onInstallSubmit,\n onFileInputChange,\n onModalDragOver,\n onModalDragLeave,\n onModalDrop,\n sourceLabel,\n runDelete,\n onMarketInstall,\n isSkillInstalledByName,\n };\n}\n\nexport type SkillsPageVm = ReturnType<typeof useSkillsPage>;\n","import { SkillsPageView } from '@/features/skills/skills-page-view';\nimport { useSkillsPage } from '@/features/skills/use-skills-page';\n\nexport function SkillsPage() {\n const vm = useSkillsPage();\n return <SkillsPageView vm={vm} />;\n}\n"],"file":"skills-page-CVwEzD_J.js"}
|
|
@@ -9,14 +9,14 @@
|
|
|
9
9
|
<link rel="icon" type="image/svg+xml" href="/logo.svg" />
|
|
10
10
|
<link rel="apple-touch-icon" href="/logo.svg" />
|
|
11
11
|
<title>xopc</title>
|
|
12
|
-
<script type="module" crossorigin src="/assets/index-
|
|
12
|
+
<script type="module" crossorigin src="/assets/index-DHLmAIQl.js"></script>
|
|
13
13
|
<link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-DWdDZTNf.js">
|
|
14
14
|
<link rel="modulepreload" crossorigin href="/assets/vendor-codemirror-CXAvob9m.js">
|
|
15
15
|
<link rel="modulepreload" crossorigin href="/assets/cn-BMCV0OMB.js">
|
|
16
16
|
<link rel="modulepreload" crossorigin href="/assets/vendor-react-DbimaAId.js">
|
|
17
17
|
<link rel="modulepreload" crossorigin href="/assets/vendor-swr-B5fPo7KK.js">
|
|
18
18
|
<link rel="modulepreload" crossorigin href="/assets/attachment-utils-core-ECbeoa9H.js">
|
|
19
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
19
|
+
<link rel="stylesheet" crossorigin href="/assets/index-DoPwy4aU.css">
|
|
20
20
|
</head>
|
|
21
21
|
<body>
|
|
22
22
|
<div id="root"></div>
|
package/dist/package.js
CHANGED
|
@@ -14,7 +14,7 @@ import type { MessageBus } from '../infra/bus/index.js';
|
|
|
14
14
|
import type { CronService } from '../cron/index.js';
|
|
15
15
|
import type { SessionStore } from '../session/store.js';
|
|
16
16
|
import type { SessionContext } from './session/session-context.js';
|
|
17
|
-
import type { Skill } from './skills/types.js';
|
|
17
|
+
import type { Skill, SkillMarkdownPreviewPayload } from './skills/types.js';
|
|
18
18
|
import { type SkillHubLockEntry } from './skills/hub-lock.js';
|
|
19
19
|
import type { MemoryManager } from './memory/manager.js';
|
|
20
20
|
import type { MemorySnapshot } from './memory/types.js';
|
|
@@ -136,14 +136,12 @@ export declare class AgentManager {
|
|
|
136
136
|
*/
|
|
137
137
|
expandSkillUserText(text: string): string;
|
|
138
138
|
/**
|
|
139
|
-
*
|
|
139
|
+
* Structured SKILL.md preview for the gateway console.
|
|
140
|
+
* When `lang` is provided (e.g. "zh"), tries SKILL-{lang}.md first; falls back to SKILL.md.
|
|
140
141
|
*/
|
|
141
|
-
getSkillMarkdownSource(skillName: string):
|
|
142
|
-
name: string;
|
|
143
|
-
markdown: string;
|
|
144
|
-
} | null;
|
|
142
|
+
getSkillMarkdownSource(skillName: string, lang?: string): SkillMarkdownPreviewPayload | null;
|
|
145
143
|
private loadBootstrapForProfile;
|
|
146
|
-
getSkillCatalog(): SkillCatalogEntry[];
|
|
144
|
+
getSkillCatalog(lang?: string): SkillCatalogEntry[];
|
|
147
145
|
/**
|
|
148
146
|
* After ~/.xopc/skills.json changes (enable/disable), refresh `<available_skills>` on active agents.
|
|
149
147
|
*/
|
|
@@ -17,6 +17,7 @@ import { isValidSkillEnvVarName } from "./skills/required-env-vars.js";
|
|
|
17
17
|
import { SkillManager } from "./skills/skill-manager.js";
|
|
18
18
|
import "./skills/index.js";
|
|
19
19
|
import { SystemPromptBuilder } from "./prompt/service-prompt-builder.js";
|
|
20
|
+
import { resolveLocalizedSkillMarkdown, resolveLocalizedSkillMeta } from "./skills/skill-view-path.js";
|
|
20
21
|
import { isCuratedMemoryInPrompt, isMemorySubsystemEnabled, resolveBuiltinMemoryStoreConfig, shouldInjectMemoryPrefetchThisTurn } from "./memory/memory-config.js";
|
|
21
22
|
import { AgentToolsFactory } from "./tools/factory.js";
|
|
22
23
|
import { loadSkillsLock } from "./skills/hub-lock.js";
|
|
@@ -30,7 +31,6 @@ import { isAssistantTurnAborted, isAssistantTurnFailed } from "./orchestration/l
|
|
|
30
31
|
import { runBackgroundReviewTurn } from "./background-review/run-background-review.js";
|
|
31
32
|
import { Agent } from "@mariozechner/pi-agent-core";
|
|
32
33
|
import { basename, resolve, sep } from "node:path";
|
|
33
|
-
import { readFileSync } from "node:fs";
|
|
34
34
|
//#region src/agent/agent-manager.ts
|
|
35
35
|
/**
|
|
36
36
|
* Agent Manager - Manages Agent instances per session
|
|
@@ -345,31 +345,31 @@ var AgentManager = class {
|
|
|
345
345
|
return this.getWorkspaceRuntime(path).skillManager.expandCommand(text);
|
|
346
346
|
}
|
|
347
347
|
/**
|
|
348
|
-
*
|
|
348
|
+
* Structured SKILL.md preview for the gateway console.
|
|
349
|
+
* When `lang` is provided (e.g. "zh"), tries SKILL-{lang}.md first; falls back to SKILL.md.
|
|
349
350
|
*/
|
|
350
|
-
getSkillMarkdownSource(skillName) {
|
|
351
|
+
getSkillMarkdownSource(skillName, lang) {
|
|
351
352
|
const skill = this.getWorkspaceRuntime(this.baseWorkspacePath).skillManager.findSkill(skillName);
|
|
352
353
|
if (!skill) return null;
|
|
353
|
-
|
|
354
|
-
const
|
|
355
|
-
return
|
|
356
|
-
name: skill.name,
|
|
357
|
-
markdown
|
|
358
|
-
};
|
|
359
|
-
} catch (err) {
|
|
360
|
-
log.warn({
|
|
361
|
-
err,
|
|
362
|
-
skillName,
|
|
363
|
-
path: skill.filePath
|
|
364
|
-
}, "Failed to read SKILL.md");
|
|
365
|
-
return null;
|
|
354
|
+
if (lang) {
|
|
355
|
+
const localized = resolveLocalizedSkillMarkdown(skill, lang);
|
|
356
|
+
if (localized) return localized;
|
|
366
357
|
}
|
|
358
|
+
return {
|
|
359
|
+
name: skill.name,
|
|
360
|
+
description: skill.description,
|
|
361
|
+
bodyMarkdown: skill.content,
|
|
362
|
+
disableModelInvocation: skill.disableModelInvocation,
|
|
363
|
+
metadata: skill.metadata,
|
|
364
|
+
toolConditions: skill.toolConditions,
|
|
365
|
+
requiredEnvVarNames: skill.requiredEnvVarNames
|
|
366
|
+
};
|
|
367
367
|
}
|
|
368
368
|
loadBootstrapForProfile(profile) {
|
|
369
369
|
const cfg = this.config.config;
|
|
370
370
|
return loadBootstrapFiles(resolveAgentBootstrapDir(cfg, profile.agentId));
|
|
371
371
|
}
|
|
372
|
-
getSkillCatalog() {
|
|
372
|
+
getSkillCatalog(lang) {
|
|
373
373
|
const skillsConfig = createSkillConfigManager(resolveStateDir()).load();
|
|
374
374
|
const lock = loadSkillsLock();
|
|
375
375
|
return this.getWorkspaceRuntime(this.baseWorkspacePath).skillManager.getSkills().map((s) => {
|
|
@@ -379,10 +379,12 @@ var AgentManager = class {
|
|
|
379
379
|
const enabled = !(skillsConfig.entries?.[s.name]?.enabled === false);
|
|
380
380
|
const hubKey = managed ? basename(base) : "";
|
|
381
381
|
const hub = managed && hubKey ? lock.entries[hubKey] : void 0;
|
|
382
|
+
const localized = lang ? resolveLocalizedSkillMeta(s, lang) : null;
|
|
382
383
|
return {
|
|
383
384
|
directoryId,
|
|
384
|
-
name: s.name,
|
|
385
|
-
description: s.description,
|
|
385
|
+
name: localized?.name ?? s.name,
|
|
386
|
+
description: localized?.description ?? s.description,
|
|
387
|
+
category: s.category,
|
|
386
388
|
source: s.source,
|
|
387
389
|
path: s.baseDir,
|
|
388
390
|
managed,
|