dsh-mobile-plugin 0.5.27 → 0.5.29
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/extensions/catalog.json +10 -1
- package/extensions/magpie/agentcompact.js +104 -0
- package/extensions/magpie/app.css +4902 -0
- package/extensions/magpie/app.js +24474 -0
- package/extensions/magpie/autobackup.js +185 -0
- package/extensions/magpie/autoresetown.js +151 -0
- package/extensions/magpie/balfound.js +38 -0
- package/extensions/magpie/boot.js +23 -0
- package/extensions/magpie/cfgblocked.js +39 -0
- package/extensions/magpie/checkinnow.js +111 -0
- package/extensions/magpie/claudemode.js +92 -0
- package/extensions/magpie/compat.js +41 -0
- package/extensions/magpie/context.css +433 -0
- package/extensions/magpie/context.js +1576 -0
- package/extensions/magpie/ctxtext.js +223 -0
- package/extensions/magpie/fonts.js +42 -0
- package/extensions/magpie/i18n.js +18942 -0
- package/extensions/magpie/icons/ai21.svg +1 -0
- package/extensions/magpie/icons/ai302-color.svg +1 -0
- package/extensions/magpie/icons/ai360-color.svg +1 -0
- package/extensions/magpie/icons/aihubmix-color.svg +1 -0
- package/extensions/magpie/icons/aionui.svg +1 -0
- package/extensions/magpie/icons/air.svg +4 -0
- package/extensions/magpie/icons/alibaba-color.svg +1 -0
- package/extensions/magpie/icons/alibabacloud-color.svg +1 -0
- package/extensions/magpie/icons/alma.png +0 -0
- package/extensions/magpie/icons/anthropic.svg +1 -0
- package/extensions/magpie/icons/antigravity-color.svg +1 -0
- package/extensions/magpie/icons/anyscale-color.svg +1 -0
- package/extensions/magpie/icons/app-alma.png +0 -0
- package/extensions/magpie/icons/app-cc-switch.png +0 -0
- package/extensions/magpie/icons/apple-touch-icon.png +0 -0
- package/extensions/magpie/icons/aside.svg +28 -0
- package/extensions/magpie/icons/astrbot.svg +1 -0
- package/extensions/magpie/icons/atomcode.png +0 -0
- package/extensions/magpie/icons/aws.svg +1 -0
- package/extensions/magpie/icons/azure-color.svg +1 -0
- package/extensions/magpie/icons/azureai-color.svg +1 -0
- package/extensions/magpie/icons/baichuan-color.svg +1 -0
- package/extensions/magpie/icons/baidu-color.svg +1 -0
- package/extensions/magpie/icons/baiducloud-color.svg +1 -0
- package/extensions/magpie/icons/bailian-color.svg +1 -0
- package/extensions/magpie/icons/baseten.svg +1 -0
- package/extensions/magpie/icons/bedrock-color.svg +1 -0
- package/extensions/magpie/icons/burncloud-color.svg +1 -0
- package/extensions/magpie/icons/bytedance-color.svg +1 -0
- package/extensions/magpie/icons/cerebras.svg +1 -0
- package/extensions/magpie/icons/chatglm-color.svg +1 -0
- package/extensions/magpie/icons/cherryin-color.svg +1 -0
- package/extensions/magpie/icons/chutes.svg +1 -0
- package/extensions/magpie/icons/cindy.png +0 -0
- package/extensions/magpie/icons/claude-color.svg +1 -0
- package/extensions/magpie/icons/claudecode-color.svg +1 -0
- package/extensions/magpie/icons/cline.svg +1 -0
- package/extensions/magpie/icons/cloudflare-color.svg +1 -0
- package/extensions/magpie/icons/codebuddy-color.svg +1 -0
- package/extensions/magpie/icons/codex-color.svg +1 -0
- package/extensions/magpie/icons/cohere-color.svg +1 -0
- package/extensions/magpie/icons/cometapi-color.svg +1 -0
- package/extensions/magpie/icons/commandcode.svg +1 -0
- package/extensions/magpie/icons/copilot-color.svg +1 -0
- package/extensions/magpie/icons/coze.svg +1 -0
- package/extensions/magpie/icons/crush.png +0 -0
- package/extensions/magpie/icons/curl.svg +1 -0
- package/extensions/magpie/icons/cursor.svg +1 -0
- package/extensions/magpie/icons/deepinfra-color.svg +1 -0
- package/extensions/magpie/icons/deepmind-color.svg +1 -0
- package/extensions/magpie/icons/deepseek-color.svg +1 -0
- package/extensions/magpie/icons/deveco-color.svg +12 -0
- package/extensions/magpie/icons/devin.svg +1 -0
- package/extensions/magpie/icons/doubao-color.svg +1 -0
- package/extensions/magpie/icons/empryo-color.svg +1 -0
- package/extensions/magpie/icons/factory.svg +1 -0
- package/extensions/magpie/icons/favicon.svg +1 -0
- package/extensions/magpie/icons/featherless-color.svg +1 -0
- package/extensions/magpie/icons/fireworks-color.svg +1 -0
- package/extensions/magpie/icons/friendli.svg +1 -0
- package/extensions/magpie/icons/fx.svg +1 -0
- package/extensions/magpie/icons/gemini-color.svg +1 -0
- package/extensions/magpie/icons/geminicli-color.svg +1 -0
- package/extensions/magpie/icons/gemma-color.svg +1 -0
- package/extensions/magpie/icons/giteeai.svg +1 -0
- package/extensions/magpie/icons/github.svg +1 -0
- package/extensions/magpie/icons/githubcopilot.svg +1 -0
- package/extensions/magpie/icons/glama.svg +1 -0
- package/extensions/magpie/icons/gmicloud.svg +1 -0
- package/extensions/magpie/icons/google-color.svg +1 -0
- package/extensions/magpie/icons/googlecloud-color.svg +1 -0
- package/extensions/magpie/icons/goose.svg +1 -0
- package/extensions/magpie/icons/grok.svg +1 -0
- package/extensions/magpie/icons/groq.svg +1 -0
- package/extensions/magpie/icons/hanako.png +0 -0
- package/extensions/magpie/icons/hermes.svg +1 -0
- package/extensions/magpie/icons/huawei-color.svg +1 -0
- package/extensions/magpie/icons/huaweicloud-color.svg +1 -0
- package/extensions/magpie/icons/huggingface-color.svg +1 -0
- package/extensions/magpie/icons/hunyuan-color.svg +1 -0
- package/extensions/magpie/icons/hyperbolic-color.svg +1 -0
- package/extensions/magpie/icons/icon-512.png +0 -0
- package/extensions/magpie/icons/iflytekcloud-color.svg +1 -0
- package/extensions/magpie/icons/inference.svg +1 -0
- package/extensions/magpie/icons/infinigence-color.svg +1 -0
- package/extensions/magpie/icons/internlm-color.svg +1 -0
- package/extensions/magpie/icons/jcode.svg +1 -0
- package/extensions/magpie/icons/jina.svg +1 -0
- package/extensions/magpie/icons/kilo.svg +1 -0
- package/extensions/magpie/icons/kilocode.svg +1 -0
- package/extensions/magpie/icons/kimi-code-desktop.png +0 -0
- package/extensions/magpie/icons/kimi.svg +1 -0
- package/extensions/magpie/icons/kiro-color.svg +1 -0
- package/extensions/magpie/icons/kling-color.svg +1 -0
- package/extensions/magpie/icons/lambda.svg +1 -0
- package/extensions/magpie/icons/leptonai-color.svg +1 -0
- package/extensions/magpie/icons/liquid.svg +1 -0
- package/extensions/magpie/icons/liveagent-color.svg +1 -0
- package/extensions/magpie/icons/llmapi.svg +1 -0
- package/extensions/magpie/icons/lmstudio.svg +1 -0
- package/extensions/magpie/icons/lody.png +0 -0
- package/extensions/magpie/icons/longcat.svg +1 -0
- package/extensions/magpie/icons/magpie.svg +1 -0
- package/extensions/magpie/icons/meta-color.svg +1 -0
- package/extensions/magpie/icons/metaai-color.svg +1 -0
- package/extensions/magpie/icons/microsoft-color.svg +1 -0
- package/extensions/magpie/icons/mimocode.svg +1 -0
- package/extensions/magpie/icons/minimax-color.svg +1 -0
- package/extensions/magpie/icons/mistermorph-color.svg +1 -0
- package/extensions/magpie/icons/mistral-color.svg +1 -0
- package/extensions/magpie/icons/mlx-serve.png +0 -0
- package/extensions/magpie/icons/modelscope-color.svg +1 -0
- package/extensions/magpie/icons/monica-color.svg +1 -0
- package/extensions/magpie/icons/moonshot.svg +1 -0
- package/extensions/magpie/icons/morph-color.svg +1 -0
- package/extensions/magpie/icons/mothx.png +0 -0
- package/extensions/magpie/icons/nebius.svg +1 -0
- package/extensions/magpie/icons/newapi-color.svg +1 -0
- package/extensions/magpie/icons/nousresearch.svg +1 -0
- package/extensions/magpie/icons/nova-color.svg +1 -0
- package/extensions/magpie/icons/novita-color.svg +1 -0
- package/extensions/magpie/icons/nvidia-color.svg +1 -0
- package/extensions/magpie/icons/ollama.svg +1 -0
- package/extensions/magpie/icons/omlx.svg +1 -0
- package/extensions/magpie/icons/omo.svg +1 -0
- package/extensions/magpie/icons/omp.svg +1 -0
- package/extensions/magpie/icons/openai.svg +1 -0
- package/extensions/magpie/icons/openchamber.svg +11 -0
- package/extensions/magpie/icons/openclaw.svg +1 -0
- package/extensions/magpie/icons/opencode.svg +1 -0
- package/extensions/magpie/icons/openmausbot.svg +1 -0
- package/extensions/magpie/icons/openrouter.svg +1 -0
- package/extensions/magpie/icons/openwebui.svg +1 -0
- package/extensions/magpie/icons/parasail.svg +1 -0
- package/extensions/magpie/icons/penguin-color.svg +1 -0
- package/extensions/magpie/icons/perplexity-color.svg +1 -0
- package/extensions/magpie/icons/phala-color.svg +1 -0
- package/extensions/magpie/icons/pi.svg +1 -0
- package/extensions/magpie/icons/pipellm-color.svg +5 -0
- package/extensions/magpie/icons/poe.svg +1 -0
- package/extensions/magpie/icons/ppio-color.svg +1 -0
- package/extensions/magpie/icons/prime-agent.svg +1 -0
- package/extensions/magpie/icons/qiniu-color.svg +1 -0
- package/extensions/magpie/icons/qoder.svg +1 -0
- package/extensions/magpie/icons/qwen-color.svg +1 -0
- package/extensions/magpie/icons/qwenpaw.svg +1 -0
- package/extensions/magpie/icons/raycast.svg +1 -0
- package/extensions/magpie/icons/reasonix-color.svg +48 -0
- package/extensions/magpie/icons/reka.svg +1 -0
- package/extensions/magpie/icons/replicate.svg +1 -0
- package/extensions/magpie/icons/roocode.svg +1 -0
- package/extensions/magpie/icons/rtk.png +0 -0
- package/extensions/magpie/icons/sambanova-color.svg +1 -0
- package/extensions/magpie/icons/sensenova-color.svg +1 -0
- package/extensions/magpie/icons/siliconcloud-color.svg +1 -0
- package/extensions/magpie/icons/snow.png +0 -0
- package/extensions/magpie/icons/snowflake-color.svg +1 -0
- package/extensions/magpie/icons/sophnet-color.svg +1 -0
- package/extensions/magpie/icons/spark-color.svg +1 -0
- package/extensions/magpie/icons/stepfun-color.svg +1 -0
- package/extensions/magpie/icons/straico-color.svg +1 -0
- package/extensions/magpie/icons/submodel-color.svg +1 -0
- package/extensions/magpie/icons/t3code.svg +4 -0
- package/extensions/magpie/icons/targon-color.svg +1 -0
- package/extensions/magpie/icons/tencent-color.svg +1 -0
- package/extensions/magpie/icons/tencentcloud-color.svg +1 -0
- package/extensions/magpie/icons/tiangong-color.svg +1 -0
- package/extensions/magpie/icons/together-color.svg +1 -0
- package/extensions/magpie/icons/trae.svg +1 -0
- package/extensions/magpie/icons/typesafe.png +0 -0
- package/extensions/magpie/icons/upstage-color.svg +1 -0
- package/extensions/magpie/icons/venice-color.svg +1 -0
- package/extensions/magpie/icons/vercel.svg +1 -0
- package/extensions/magpie/icons/vertexai-color.svg +1 -0
- package/extensions/magpie/icons/vllm-color.svg +1 -0
- package/extensions/magpie/icons/volcengine-color.svg +1 -0
- package/extensions/magpie/icons/voyage-color.svg +1 -0
- package/extensions/magpie/icons/vscode.svg +1 -0
- package/extensions/magpie/icons/wenxin-color.svg +1 -0
- package/extensions/magpie/icons/windsurf.svg +1 -0
- package/extensions/magpie/icons/workbuddy-color.svg +1 -0
- package/extensions/magpie/icons/workersai-color.svg +1 -0
- package/extensions/magpie/icons/xai.svg +1 -0
- package/extensions/magpie/icons/xiaomimimo.svg +1 -0
- package/extensions/magpie/icons/xinference-color.svg +1 -0
- package/extensions/magpie/icons/yi.svg +1 -0
- package/extensions/magpie/icons/yuanbao-color.svg +1 -0
- package/extensions/magpie/icons/yylx.svg +5 -0
- package/extensions/magpie/icons/zai.svg +1 -0
- package/extensions/magpie/icons/zcode.png +0 -0
- package/extensions/magpie/icons/zed.svg +1 -0
- package/extensions/magpie/icons/zenmux.svg +1 -0
- package/extensions/magpie/icons/zeroone.svg +1 -0
- package/extensions/magpie/icons/zhipu-color.svg +1 -0
- package/extensions/magpie/icons/zoo-code.png +0 -0
- package/extensions/magpie/index.html +572 -0
- package/extensions/magpie/kernel.js +274 -0
- package/extensions/magpie/keyspend.js +63 -0
- package/extensions/magpie/layout.js +26 -0
- package/extensions/magpie/manifest.json +37 -0
- package/extensions/magpie/navlamp.js +47 -0
- package/extensions/magpie/omarchy.css +72 -0
- package/extensions/magpie/omarchy.js +46 -0
- package/extensions/magpie/passerrors.js +21 -0
- package/extensions/magpie/pluginpages.js +405 -0
- package/extensions/magpie/plugins/gateway/client.js +1194 -0
- package/extensions/magpie/plugins/gateway/keys.js +972 -0
- package/extensions/magpie/plugins/gateway/settings.js +459 -0
- package/extensions/magpie/plugins/library/client.js +6788 -0
- package/extensions/magpie/plugins/library/i18n.js +3228 -0
- package/extensions/magpie/plugins/library/library.css +848 -0
- package/extensions/magpie/plugins/otel/i18n.js +48 -0
- package/extensions/magpie/plugins/otel/page.js +189 -0
- package/extensions/magpie/plugins/redact/client.js +46 -0
- package/extensions/magpie/plugins/redact/demo.js +461 -0
- package/extensions/magpie/plugins/redact/i18n.js +432 -0
- package/extensions/magpie/plugins/redact/page.js +985 -0
- package/extensions/magpie/plugins/redact/redact.css +385 -0
- package/extensions/magpie/plugins/redact/settings.js +248 -0
- package/extensions/magpie/plugins/redact/xq_dark.jpg +0 -0
- package/extensions/magpie/plugins/redact/xq_dark.webm +0 -0
- package/extensions/magpie/plugins/redact/xq_light.jpg +0 -0
- package/extensions/magpie/plugins/redact/xq_light.webm +0 -0
- package/extensions/magpie/plugins/routing/client.js +8593 -0
- package/extensions/magpie/plugins/routing/i18n.js +2696 -0
- package/extensions/magpie/plugins/routing/routing.css +1111 -0
- package/extensions/magpie/plugins/search/settings.js +460 -0
- package/extensions/magpie/plugins/sessions/client.js +1622 -0
- package/extensions/magpie/plugins/sessions/i18n.js +360 -0
- package/extensions/magpie/plugins/sessions/sessions.css +181 -0
- package/extensions/magpie/plugins/sessions/settings.js +100 -0
- package/extensions/magpie/plugins/usage/client.js +150 -0
- package/extensions/magpie/plugins/usage/i18n.js +984 -0
- package/extensions/magpie/plugins/usage/page.js +4307 -0
- package/extensions/magpie/plugins.css +319 -0
- package/extensions/magpie/plugins.js +1926 -0
- package/extensions/magpie/profilerename.js +27 -0
- package/extensions/magpie/purposes.js +2 -0
- package/extensions/magpie/quitask.js +79 -0
- package/extensions/magpie/quotaall.js +142 -0
- package/extensions/magpie/ratewindows.js +123 -0
- package/extensions/magpie/registry.js +87 -0
- package/extensions/magpie/resetask.js +137 -0
- package/extensions/magpie/ruleedit.js +53 -0
- package/extensions/magpie/scrollends.js +91 -0
- package/extensions/magpie/settingshints.js +75 -0
- package/extensions/magpie/signsheets.js +86 -0
- package/extensions/magpie/start.js +26 -0
- package/extensions/magpie/syncfiles.js +216 -0
- package/extensions/magpie/theme.js +29 -0
- package/extensions/magpie/traywindows.js +41 -0
- package/extensions/magpie/webfonts.js +130 -0
- package/extensions/magpie/whatsnew.js +252 -0
- package/extensions/magpie.zip +0 -0
- package/knowledge/apps/baijiahao.md +30 -0
- package/knowledge/apps/bilibili.md +1 -0
- package/knowledge/apps/dedao.md +33 -0
- package/knowledge/apps/feishu.md +35 -0
- package/knowledge/apps/gmail.md +33 -0
- package/knowledge/apps/jike.md +31 -0
- package/knowledge/apps/kuaishou.md +34 -0
- package/knowledge/apps/linkedin.md +33 -0
- package/knowledge/apps/qqmail.md +30 -0
- package/knowledge/apps/telegram.md +27 -0
- package/knowledge/apps/toutiao.md +32 -0
- package/knowledge/apps/uber-eats.md +26 -0
- package/knowledge/apps/uber.md +27 -0
- package/knowledge/apps/whatsapp.md +27 -0
- package/knowledge/apps/x.md +32 -0
- package/knowledge/apps/xiaohongshu.md +1 -0
- package/knowledge/apps/zhihu.md +1 -0
- package/knowledge/sites/bilibili.com/SITE.md +50 -0
- package/knowledge/sites/bilibili.com/references/view-fields.md +17 -0
- package/knowledge/sites/github.com/SITE.md +51 -0
- package/knowledge/sites/github.com/references/repo-fields.md +13 -0
- package/knowledge/sites/x.com/SITE.md +47 -0
- package/knowledge/sites/xiaohongshu.com/SITE.md +48 -0
- package/knowledge/sites/xiaohongshu.com/references/note-fields.md +18 -0
- package/knowledge/sites/youtube.com/SITE.md +49 -0
- package/knowledge/sites/youtube.com/references/innertube-fields.md +14 -0
- package/knowledge/sites/zhihu.com/SITE.md +47 -0
- package/knowledge/sites/zhihu.com/references/api-fields.md +21 -0
- package/lib/mobile/extension-catalog.js +41 -1
- package/lib/mobile/extension-data.js +224 -0
- package/lib/mobile/extension-dev.js +3 -1
- package/lib/mobile/file-ops.js +252 -0
- package/lib/mobile/history-derive.js +80 -4
- package/lib/mobile/host-bridge/endpoints.js +48 -6
- package/lib/mobile/host-bridge/event-synthesis.js +33 -6
- package/lib/mobile/jobs-control.js +118 -0
- package/lib/mobile/memory.js +635 -0
- package/lib/mobile/model-badges.js +77 -0
- package/lib/mobile/pet-tools.js +50 -4
- package/lib/mobile/pets.js +214 -18
- package/lib/mobile/phone/access.js +85 -0
- package/lib/mobile/phone/evidence.js +228 -0
- package/lib/mobile/phone/gate.js +290 -0
- package/lib/mobile/phone/grounding.js +314 -0
- package/lib/mobile/phone/guard.js +465 -0
- package/lib/mobile/phone/irreversible.js +88 -8
- package/lib/mobile/phone/knowledge-tools.js +665 -0
- package/lib/mobile/phone/learn.js +329 -0
- package/lib/mobile/phone/redact.js +237 -0
- package/lib/mobile/phone/risk.js +95 -0
- package/lib/mobile/phone/routes.js +28 -1
- package/lib/mobile/phone/service.js +23 -0
- package/lib/mobile/phone/site-commands.js +271 -0
- package/lib/mobile/phone/step-summary.js +201 -0
- package/lib/mobile/phone/stop-summary.js +235 -0
- package/lib/mobile/phone/tool-groups.js +125 -0
- package/lib/mobile/phone/tools.js +589 -0
- package/lib/mobile/phone/untrusted.js +65 -0
- package/lib/mobile/phone-knowledge.js +20 -4
- package/lib/mobile/schedule-edit.js +500 -0
- package/lib/mobile/schedule.js +5 -0
- package/lib/mobile/send-continuation.js +52 -0
- package/lib/mobile/session-models.js +27 -31
- package/lib/mobile/session-send.js +12 -12
- package/lib/mobile/skill-import.js +338 -0
- package/lib/mobile/skill-store.js +524 -0
- package/lib/routes/mobile-api.js +42 -0
- package/package.json +7 -6
- package/skills/skill-authoring/SKILL.md +46 -0
- package/skills/skill-authoring/references/examples.md +82 -0
- package/skills/skill-authoring/references/frontmatter-and-fields.md +46 -0
- package/skills/skill-authoring/scripts/check_skill.py +167 -0
- package/skills/skill-authoring/scripts/manifest.json +3 -0
- package/knowledge/sites/bilibili.com.md +0 -27
- package/knowledge/sites/github.com.md +0 -27
- package/knowledge/sites/x.com.md +0 -28
- package/knowledge/sites/xiaohongshu.com.md +0 -27
- package/knowledge/sites/youtube.com.md +0 -28
- package/knowledge/sites/zhihu.com.md +0 -27
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
// The sessions plugin's part of Settings: General's Session terminal and
|
|
2
|
+
// Privacy's Agents' session history. Run after app.js, whose helpers it
|
|
3
|
+
// shares (el, segs, svg, api, writingPrefs, savePrefs, openProtoMenu,
|
|
4
|
+
// status), and before start.js draws Settings; drawn whether the plugin is
|
|
5
|
+
// on or off.
|
|
6
|
+
|
|
7
|
+
function renderSessionTerminal(s, keep) {
|
|
8
|
+
const row = $("#sessionTerminalRow");
|
|
9
|
+
// a Mac's, and Windows' and Linux's when a terminal is found there
|
|
10
|
+
const mac = document.body.classList.contains("mac");
|
|
11
|
+
const apps = [...(s.terminalApps || [])];
|
|
12
|
+
row.hidden = web || !mac && !apps.length;
|
|
13
|
+
if (row.hidden) return;
|
|
14
|
+
const select = $("#sessionTerminalSelect");
|
|
15
|
+
if (mac && !apps.some((app) => app.id === "com.apple.Terminal")) apps.unshift({ id: "com.apple.Terminal", name: "Terminal" });
|
|
16
|
+
const chosen = s.sessionTerminal || "system";
|
|
17
|
+
// a default that is not a terminal opens Terminal, as the server does
|
|
18
|
+
const defaultApp = apps.find((app) => app.id === s.terminalDefault) || apps.find((app) => app.id === "com.apple.Terminal") || apps[0];
|
|
19
|
+
const options = [{ id: "system", name: t("System default ({name})", { name: defaultApp.name }) }];
|
|
20
|
+
for (const app of apps) {
|
|
21
|
+
if (app.id === defaultApp.id && app.id !== chosen) continue;
|
|
22
|
+
options.push({ id: app.id, name: app.id === defaultApp.id ? t("{name} (fixed)", { name: app.name }) : app.name });
|
|
23
|
+
}
|
|
24
|
+
if (!options.some((app) => app.id === chosen)) {
|
|
25
|
+
options.push({ id: chosen, name: t("Unavailable app ({id})", { id: chosen }) });
|
|
26
|
+
}
|
|
27
|
+
// the app's own menu, not a native select
|
|
28
|
+
select.dataset.value = chosen;
|
|
29
|
+
select.replaceChildren(el("span", "", options.find((app) => app.id === chosen).name), svg(CHEV, 11, 1.6));
|
|
30
|
+
select.onclick = (e) => {
|
|
31
|
+
e.stopPropagation();
|
|
32
|
+
if (select.classList.contains("open")) return closeProtoMenu();
|
|
33
|
+
openProtoMenu(select, options.map((app) => ({ v: app.id, name: app.name, note: "", literalName: true })), chosen, (v) => {
|
|
34
|
+
if (v === chosen) return;
|
|
35
|
+
// drawn at once; the save draws it again with what was kept
|
|
36
|
+
select.dataset.value = v;
|
|
37
|
+
select.firstChild.textContent = options.find((app) => app.id === v).name;
|
|
38
|
+
savePrefs({ ...keep, sessionTerminal: v === "system" ? "" : v });
|
|
39
|
+
}, "Session terminal", "sess-menu");
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// renderSessionReads: which agents' own session history magpie reads
|
|
44
|
+
// (RustCats on X: a new install showed every agent's sessions before
|
|
45
|
+
// anyone agreed). The Sessions page asks once; here it changes later.
|
|
46
|
+
// "Agents found later" is whether an agent with no row of its own is
|
|
47
|
+
// read, and drawn from the settings at once; each agent found on this
|
|
48
|
+
// computer has a row of its own, read from /api/sessions/reads when the
|
|
49
|
+
// Privacy part is shown (loadSessionReads).
|
|
50
|
+
let sessionReads = null; // /api/sessions/reads, as last read
|
|
51
|
+
let sessionReadsSeq = 0;
|
|
52
|
+
function renderSessionReads(s) {
|
|
53
|
+
const box = $("#sessionReadsList");
|
|
54
|
+
const r = sessionReads || { asked: !!s?.sessionReads?.asked, all: !!s?.sessionReads?.all, found: [] };
|
|
55
|
+
// gateway mode reads no agent's session history here, whatever these
|
|
56
|
+
// say (ownSessionsOff), so they are left out
|
|
57
|
+
const gw = !!(s?.gatewayOn || r.gateway);
|
|
58
|
+
box.hidden = gw;
|
|
59
|
+
box.previousElementSibling.hidden = gw;
|
|
60
|
+
if (gw) return;
|
|
61
|
+
const save = (body) => {
|
|
62
|
+
const n = ++sessionReadsSeq;
|
|
63
|
+
writingPrefs(api("sessions/reads", body))
|
|
64
|
+
.then((got) => { if (n === sessionReadsSeq) { sessionReads = got; renderSessionReads(prefs); } })
|
|
65
|
+
.catch((e) => { status(t(e.message), "err"); renderSessionReads(prefs); });
|
|
66
|
+
};
|
|
67
|
+
const row = (name, sub, on, fn) => {
|
|
68
|
+
const rw = el("div", "row pref");
|
|
69
|
+
const who = el("div", "who");
|
|
70
|
+
who.append(el("div", "name", name));
|
|
71
|
+
if (sub) who.append(el("div", "sub", sub));
|
|
72
|
+
const val = el("div", "val");
|
|
73
|
+
val.append(segs([["off", t("Off")], ["on", t("On")]], on ? "on" : "off", (v) => {
|
|
74
|
+
if ((v === "on") !== on) fn(v === "on");
|
|
75
|
+
}));
|
|
76
|
+
rw.append(who, val);
|
|
77
|
+
return rw;
|
|
78
|
+
};
|
|
79
|
+
const rows = [row(t("Agents found later"), t("Read the session history of an agent with no row here, one installed later too. Off, magpie reads only the agents turned on below; what its gateway served is counted either way"),
|
|
80
|
+
r.asked && r.all, (on) => {
|
|
81
|
+
// the agents with a row keep what their rows show
|
|
82
|
+
const agents = {};
|
|
83
|
+
for (const a of r.found || []) agents[a.agent] = !!a.on;
|
|
84
|
+
save(Object.keys(agents).length ? { all: on, agents } : { all: on });
|
|
85
|
+
})];
|
|
86
|
+
for (const a of r.found || []) {
|
|
87
|
+
const rw = row(a.name, "", a.on, (on) => save({ agents: { [a.agent]: on } }));
|
|
88
|
+
rw.dataset.agent = a.agent;
|
|
89
|
+
rows.push(rw);
|
|
90
|
+
}
|
|
91
|
+
box.replaceChildren(...rows);
|
|
92
|
+
}
|
|
93
|
+
function loadSessionReads() {
|
|
94
|
+
const n = ++sessionReadsSeq;
|
|
95
|
+
api("sessions/reads").then((got) => {
|
|
96
|
+
if (n !== sessionReadsSeq) return;
|
|
97
|
+
sessionReads = got;
|
|
98
|
+
renderSessionReads(prefs);
|
|
99
|
+
}).catch(() => {}); // the row drawn from the settings stays
|
|
100
|
+
}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
// The Usage page: the allowances, what was spent and on what, the
|
|
2
|
+
// sessions, each request, and what filled the context window.
|
|
3
|
+
//
|
|
4
|
+
// A page the Usage plugin adds to the window (kernel.js), its words in
|
|
5
|
+
// i18n.js beside this file. This file registers the page and its markup,
|
|
6
|
+
// before app.js; page.js, after app.js and the scripts it shares the page
|
|
7
|
+
// with, is the page's code, and start.js then shows the first page. The
|
|
8
|
+
// hooks are what the shell asks of it: open (the reader came to the page),
|
|
9
|
+
// refresh (the window came back: the tab shown read again, quietly when it
|
|
10
|
+
// has its figures), reload (Refresh in the sidebar), costs (the currency
|
|
11
|
+
// or a rate changed) and tab (the tab shown, for the allowance card a
|
|
12
|
+
// link opens on). The allowance cards themselves, which the tray panel
|
|
13
|
+
// shows too, stay app.js's.
|
|
14
|
+
magpie.plugin("usage", (ctx) => {
|
|
15
|
+
ctx.slots.add("page", {
|
|
16
|
+
key: "usage",
|
|
17
|
+
title: "Usage",
|
|
18
|
+
html: `
|
|
19
|
+
<div class="usage-head">
|
|
20
|
+
<div class="segs" id="usageTab"></div>
|
|
21
|
+
<div class="segs" id="period"></div>
|
|
22
|
+
<div class="segs" id="sessRange" hidden></div>
|
|
23
|
+
<span class="ctx-range" id="ctxRange" hidden></span>
|
|
24
|
+
<button class="usage-range-menu" id="usageRangeMenu" type="button" aria-haspopup="menu" hidden></button>
|
|
25
|
+
<span class="grow"></span>
|
|
26
|
+
<span class="usage-refresh" id="usageRefresh">
|
|
27
|
+
<button class="icon" id="usageReload" type="button" aria-label="Refresh now" data-tt><svg viewBox="0 0 16 16" width="13" height="13" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M13.5 8a5.5 5.5 0 1 1-1.6-3.9M13.5 2.5v3h-3"/></svg></button>
|
|
28
|
+
<button class="sess-pick" id="usageEvery" type="button"></button>
|
|
29
|
+
</span>
|
|
30
|
+
<span class="usage-cost" id="usageCost"></span>
|
|
31
|
+
</div>
|
|
32
|
+
<div class="usage-pane" id="usagePane">
|
|
33
|
+
<div class="row-head quota-head" id="quotaHead" hidden>
|
|
34
|
+
<span class="label" data-t>Allowances</span>
|
|
35
|
+
<span class="grow"></span>
|
|
36
|
+
<button class="sess-pick quota-trend" id="quotaTrend" type="button" hidden></button>
|
|
37
|
+
<button class="text rt-mask" id="usageMask" aria-pressed="false" data-tt="Mask the accounts on every page — email addresses and account names — for a screenshot to share"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9.9 4.2A10.4 10.4 0 0 1 12 4c6.5 0 10 8 10 8a17.6 17.6 0 0 1-2.2 3.2M6.6 6.6C3.9 8.4 2 12 2 12s3.5 8 10 8a9.7 9.7 0 0 0 5.4-1.6M9.9 9.9a3 3 0 0 0 4.2 4.2M2 2l20 20"/></svg><span data-t>Hide accounts</span></button>
|
|
38
|
+
<div class="segs" id="quotaMode" hidden></div>
|
|
39
|
+
</div>
|
|
40
|
+
<section class="subscription-usage" id="subscriptionUsage"></section>
|
|
41
|
+
<div class="us-hid" id="quotaHid" hidden><button class="text us-hidline" type="button" aria-expanded="false"></button><div class="list" hidden></div></div>
|
|
42
|
+
<p class="usage-note" id="usageScope" data-t>Gateway calls only; session-log calls are in Requests. Local rejections are excluded from totals.</p>
|
|
43
|
+
<section class="stats" id="stats"></section>
|
|
44
|
+
<section class="chart" id="chart"></section>
|
|
45
|
+
<div class="row-head"><button class="fold" type="button" data-fold="agents" aria-expanded="true" aria-controls="usageAgents"><span class="label" data-t>Agents</span></button></div>
|
|
46
|
+
<div class="list" id="usageAgents"></div>
|
|
47
|
+
<div class="us-hid" id="usageAgentsHid" hidden><button class="text us-hidline" type="button" aria-expanded="false"></button><div class="list" hidden></div></div>
|
|
48
|
+
<div class="row-head"><button class="fold" type="button" data-fold="models" aria-expanded="true" aria-controls="usageModels"><span class="label" data-t>Models</span></button></div>
|
|
49
|
+
<div class="list" id="usageModels"></div>
|
|
50
|
+
<div class="row-head" id="usageAccountsHead" hidden><button class="fold" type="button" data-fold="accounts" aria-expanded="true" aria-controls="usageAccounts"><span class="label" data-t>Accounts</span></button></div>
|
|
51
|
+
<div class="list" id="usageAccounts" hidden></div>
|
|
52
|
+
<div class="row-head" id="usageKeysHead" hidden><button class="fold" type="button" data-fold="keys" aria-expanded="true" aria-controls="usageKeys"><span class="label" data-t>Gateway keys</span></button></div>
|
|
53
|
+
<div class="list" id="usageKeys" hidden></div>
|
|
54
|
+
<p class="usage-note" id="usageNote"></p>
|
|
55
|
+
<p class="usage-clear"><button class="text" id="usageClear" type="button" hidden><span data-t>Clear all usage…</span></button></p>
|
|
56
|
+
<div class="plugin-slot" data-slot="usage" hidden></div>
|
|
57
|
+
</div>
|
|
58
|
+
<div class="usage-pane" id="ledgerPane" hidden>
|
|
59
|
+
<div class="sess-tools">
|
|
60
|
+
<button class="sess-pick" id="ledComputer" type="button" hidden></button>
|
|
61
|
+
<button class="sess-pick" id="ledAgent" type="button" hidden></button>
|
|
62
|
+
<button class="sess-pick" id="ledPurpose" type="button" hidden></button>
|
|
63
|
+
<button class="sess-pick" id="ledProvider" type="button" hidden></button>
|
|
64
|
+
<button class="sess-pick led-more" id="ledProviderMore" type="button" aria-haspopup="menu" hidden></button>
|
|
65
|
+
<button class="sess-pick" id="ledModel" type="button" hidden></button>
|
|
66
|
+
<button class="sess-pick" id="ledAccount" type="button" hidden></button>
|
|
67
|
+
<button class="sess-pick" id="ledKey" type="button" hidden></button>
|
|
68
|
+
<div class="segs" id="ledStatus"></div>
|
|
69
|
+
<span id="ledRoute" hidden><span id="ledRouteLabel"></span><button class="text" id="ledRouteClear" type="button" data-tt="Clear filter" aria-label="Clear filter">×</button></span>
|
|
70
|
+
<span class="grow"></span>
|
|
71
|
+
<input class="sess-filter" id="ledQ" type="search" spellcheck="false" autocomplete="off" placeholder="Search models, providers, sessions" data-tp>
|
|
72
|
+
<button class="text" id="ledExport" type="button" title="Save every request listed, all pages, as a CSV file in Downloads" data-tt><span data-t>Export CSV</span></button>
|
|
73
|
+
</div>
|
|
74
|
+
<p class="usage-note" id="ledScope" data-t>Gateway and session-log calls; local rejections excluded from totals.</p>
|
|
75
|
+
<div class="led-dash" id="ledDash" hidden>
|
|
76
|
+
<div class="led-strip" id="ledKpi"></div>
|
|
77
|
+
<section class="led-trend">
|
|
78
|
+
<div class="led-bar">
|
|
79
|
+
<div class="segs" id="ledMetric"></div>
|
|
80
|
+
<div class="segs led-style" id="ledStyle"></div>
|
|
81
|
+
<span class="grow"></span>
|
|
82
|
+
<span class="led-split"><span class="led-by" data-t>Split by</span><span class="segs" id="ledSplit"></span></span>
|
|
83
|
+
</div>
|
|
84
|
+
<div class="led-body">
|
|
85
|
+
<div class="led-chart" id="ledChart"></div>
|
|
86
|
+
<div class="led-rank" id="ledRank"></div>
|
|
87
|
+
<div class="led-rail" id="ledRail" hidden><i></i></div>
|
|
88
|
+
</div>
|
|
89
|
+
</section>
|
|
90
|
+
</div>
|
|
91
|
+
<section class="led-heat" id="ledHeat" hidden>
|
|
92
|
+
<div class="led-bar">
|
|
93
|
+
<div class="heat-title"><b data-t>Usage heatmap</b><span data-t>Daily usage over the last 53 weeks</span></div>
|
|
94
|
+
<span class="grow"></span>
|
|
95
|
+
<div class="segs" id="ledHeatMetric"></div>
|
|
96
|
+
</div>
|
|
97
|
+
<div class="heat-scroll" id="ledHeatScroll"></div>
|
|
98
|
+
<div class="heat-foot"></div>
|
|
99
|
+
<div class="heat-tip" id="ledHeatTip" hidden></div>
|
|
100
|
+
</section>
|
|
101
|
+
<div class="led-head"><p class="led-sum" id="ledSum"></p><span class="grow"></span><span class="led-arch" id="ledArchive"></span></div>
|
|
102
|
+
<div class="led-strip led-vias" id="ledVia" hidden></div>
|
|
103
|
+
<div class="led-wrap" id="ledWrap"></div>
|
|
104
|
+
<div class="led-hscroll" id="ledHScroll" hidden><div></div></div>
|
|
105
|
+
<div class="led-pager" id="ledPager" hidden></div>
|
|
106
|
+
<p class="usage-note" id="ledNote"></p>
|
|
107
|
+
</div>
|
|
108
|
+
<div class="usage-pane ctx-pane" id="contextPane" hidden></div>
|
|
109
|
+
<div class="usage-pane sess-pane" id="sessionsPane" hidden>
|
|
110
|
+
<div class="sess-tools">
|
|
111
|
+
<button class="sess-pick" id="sessAgent" type="button" hidden></button>
|
|
112
|
+
<button class="sess-pick" id="sessModel" type="button" hidden></button>
|
|
113
|
+
<button class="sess-pick" id="sessFolder" type="button" hidden></button>
|
|
114
|
+
</div>
|
|
115
|
+
<section class="stats" id="sessStats"></section>
|
|
116
|
+
<section class="chart sess-chart" id="sessChart" hidden></section>
|
|
117
|
+
<div class="sess-grid" id="sessGrid" hidden>
|
|
118
|
+
<section class="sess-card" id="sessProjects"></section>
|
|
119
|
+
<section class="sess-card" id="sessModels"></section>
|
|
120
|
+
<section class="sess-card" id="sessHours"></section>
|
|
121
|
+
<section class="sess-card" id="sessTop"></section>
|
|
122
|
+
<section class="sess-card" id="sessShape"></section>
|
|
123
|
+
<section class="sess-card" id="sessSkills"></section>
|
|
124
|
+
<section class="sess-card wide" id="sessTools"></section>
|
|
125
|
+
</div>
|
|
126
|
+
<div class="row-head" id="sessListHead" hidden>
|
|
127
|
+
<span class="label" data-t>Latest sessions</span>
|
|
128
|
+
<span class="grow"></span>
|
|
129
|
+
<button class="text sess-all" id="sessAll" type="button" data-feature="sessions" data-t>All sessions</button>
|
|
130
|
+
<input class="sess-filter" id="sessQ" type="search" spellcheck="false" autocomplete="off" placeholder="Search sessions" data-tp>
|
|
131
|
+
</div>
|
|
132
|
+
<div class="list sess-list" id="sessList"></div>
|
|
133
|
+
<p class="usage-note" id="sessNote"></p>
|
|
134
|
+
</div>
|
|
135
|
+
`,
|
|
136
|
+
mount() { mountUsageFolds(); },
|
|
137
|
+
open() { return loadUsage(true).catch((e) => status(e.message, "err")); },
|
|
138
|
+
refresh(again) {
|
|
139
|
+
// on the Overview, where the allowances are, coming back is opening them (#1588)
|
|
140
|
+
if (again && usageTab === "usage") quotasOpened();
|
|
141
|
+
return (again && usageDrawn() ? refreshUsage() : loadUsage()).catch((e) => status(e.message, "err"));
|
|
142
|
+
},
|
|
143
|
+
reload() { return refreshUsage(true); },
|
|
144
|
+
costs() { renderCosts(); },
|
|
145
|
+
tab() { return usageTab; },
|
|
146
|
+
// the reader goes to another page: the Requests give back what a
|
|
147
|
+
// click lent them (ledLeave)
|
|
148
|
+
leave() { if (usageTab === "requests") ledLeave(); },
|
|
149
|
+
});
|
|
150
|
+
});
|