@kevin5251984/guild 0.2.12
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/LICENSE +21 -0
- package/bin/guildd.mjs +20 -0
- package/cordis.yml +24 -0
- package/package.json +52 -0
- package/src/agent-file.ts +125 -0
- package/src/browser.ts +668 -0
- package/src/catalog/default-bots.ts +263 -0
- package/src/catalog/skills.ts +128 -0
- package/src/catalog/subagents.ts +70 -0
- package/src/chat-parts.ts +71 -0
- package/src/cli-args.ts +75 -0
- package/src/cli.ts +60 -0
- package/src/compact.ts +355 -0
- package/src/cordis.d.ts +40 -0
- package/src/db.ts +653 -0
- package/src/generate.ts +673 -0
- package/src/handlers.ts +1623 -0
- package/src/harness.ts +326 -0
- package/src/host-agents.ts +137 -0
- package/src/host-browse.ts +199 -0
- package/src/host-skills.ts +150 -0
- package/src/image-gen.ts +270 -0
- package/src/index.ts +12 -0
- package/src/llm.ts +993 -0
- package/src/mcp.ts +563 -0
- package/src/memory.ts +159 -0
- package/src/mention.ts +176 -0
- package/src/oauth.ts +1474 -0
- package/src/plugins/api.ts +8 -0
- package/src/plugins/chat.ts +31 -0
- package/src/plugins/harness.ts +77 -0
- package/src/plugins/llm.ts +50 -0
- package/src/plugins/mcp.ts +58 -0
- package/src/plugins/memory.ts +42 -0
- package/src/plugins/oauth.ts +47 -0
- package/src/plugins/server.ts +126 -0
- package/src/plugins/store.ts +29 -0
- package/src/plugins/tools.ts +79 -0
- package/src/public/buddy.js +432 -0
- package/src/public/chat.css +3045 -0
- package/src/public/chat.html +5834 -0
- package/src/public/favicon-16.png +0 -0
- package/src/public/favicon-16.svg +10 -0
- package/src/public/favicon-32.png +0 -0
- package/src/public/favicon.ico +0 -0
- package/src/public/favicon.svg +13 -0
- package/src/public/i18n.js +663 -0
- package/src/public/index.html +143 -0
- package/src/public/library.html +678 -0
- package/src/public/mcp-add.html +126 -0
- package/src/public/md.js +332 -0
- package/src/public/rpg/inn-street.jpg +0 -0
- package/src/public/settings.html +795 -0
- package/src/public/skills-add.html +212 -0
- package/src/public/studio.html +1181 -0
- package/src/public/style.css +1678 -0
- package/src/public/subagents-add.html +152 -0
- package/src/router.ts +978 -0
- package/src/send-budget.ts +52 -0
- package/src/server.ts +1 -0
- package/src/skill-import.ts +250 -0
- package/src/slash.ts +15 -0
- package/src/start.ts +103 -0
- package/src/store.ts +1208 -0
- package/src/subagent.ts +355 -0
- package/src/tools.ts +818 -0
- package/src/trajectory.ts +339 -0
- package/src/usage.ts +111 -0
- package/vendor/protocol/package.json +19 -0
- package/vendor/protocol/src/index.ts +159 -0
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="zh-Hant">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<link rel="icon" href="/favicon.ico" sizes="32x32" />
|
|
7
|
+
<link rel="icon" href="/favicon.svg" type="image/svg+xml" />
|
|
8
|
+
<link rel="icon" href="/favicon-32.png" type="image/png" sizes="32x32" />
|
|
9
|
+
<link rel="icon" href="/favicon-16.png" type="image/png" sizes="16x16" />
|
|
10
|
+
<title>Guild — 新增子代理</title>
|
|
11
|
+
<link rel="stylesheet" href="/style.css" />
|
|
12
|
+
<script src="/i18n.js"></script>
|
|
13
|
+
</head>
|
|
14
|
+
<body class="app skills-add-page" data-i18n-page="subagentsAdd">
|
|
15
|
+
<aside class="sidebar">
|
|
16
|
+
<div class="side-brand"><a class="logo" href="/">Guild</a></div>
|
|
17
|
+
<nav class="side-nav">
|
|
18
|
+
<a href="/" data-i18n="nav.chat">大廳</a>
|
|
19
|
+
<a href="/studio" data-i18n="nav.studio">編制</a>
|
|
20
|
+
<a class="on" href="/subagents" data-i18n="nav.library">工坊</a>
|
|
21
|
+
<a href="/settings" data-i18n="nav.settings">模型</a>
|
|
22
|
+
</nav>
|
|
23
|
+
<div class="sidebar-resizer" data-i18n-title="sidebar.resize" title="拖曳調整寬度"></div>
|
|
24
|
+
</aside>
|
|
25
|
+
<section class="pane">
|
|
26
|
+
<header class="pane-head">
|
|
27
|
+
<h1 data-i18n="subagentsAdd.title">新增子代理</h1>
|
|
28
|
+
</header>
|
|
29
|
+
<div class="page-body">
|
|
30
|
+
<p class="lede" data-i18n="subagentsAdd.lede">寫成 Codex 相容的 TOML(name / description / developer_instructions)。存進 Guild 之後,對話裡 spawn 那個名字即可。也可把檔案放到 ~/.codex/agents/ 給 Codex 用。</p>
|
|
31
|
+
<p id="flash" class="muted"></p>
|
|
32
|
+
|
|
33
|
+
<div class="tabs">
|
|
34
|
+
<button type="button" class="tab on" data-tab="ai" data-i18n="skillsAdd.tabAi">AI 生成</button>
|
|
35
|
+
<button type="button" class="tab" data-tab="paste" data-i18n="subagentsAdd.tabPaste">貼上 TOML</button>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
<section class="card tab-pane" id="pane-ai">
|
|
39
|
+
<h2 data-i18n="subagentsAdd.aiTitle">描述角色,請 AI 生成 TOML</h2>
|
|
40
|
+
<label data-i18n="subagentsAdd.what">這個子代理要做什麼?</label>
|
|
41
|
+
<input id="ai-prompt" placeholder="唯讀搜尋 auth 流程,回絕對路徑" data-i18n-placeholder="subagentsAdd.whatPh" />
|
|
42
|
+
<button type="button" class="secondary" id="ai-generate" data-i18n="subagentsAdd.gen">用 AI 生成 SUBAGENT.toml</button>
|
|
43
|
+
<label data-i18n="skillsAdd.name">名稱</label>
|
|
44
|
+
<input id="ai-name" placeholder="explorer-auth" />
|
|
45
|
+
<label>SUBAGENT.toml</label>
|
|
46
|
+
<textarea id="ai-body" class="body" placeholder='name = "explorer" description = "..." developer_instructions = """ ... """'></textarea>
|
|
47
|
+
<button type="button" id="ai-save" data-i18n="subagentsAdd.save">加入子代理庫</button>
|
|
48
|
+
</section>
|
|
49
|
+
|
|
50
|
+
<section class="card tab-pane hidden" id="pane-paste">
|
|
51
|
+
<h2 data-i18n="subagentsAdd.pasteTitle">貼上現成的 Codex / Grok agent</h2>
|
|
52
|
+
<p class="muted" data-i18n="subagentsAdd.pasteHint">TOML(Codex ~/.codex/agents)或 Markdown frontmatter(Grok / Claude agents)。</p>
|
|
53
|
+
<label data-i18n="skillsAdd.name">名稱</label>
|
|
54
|
+
<input id="paste-name" placeholder="my-reviewer" />
|
|
55
|
+
<label>檔案內容</label>
|
|
56
|
+
<textarea id="paste-body" class="body"></textarea>
|
|
57
|
+
<button type="button" id="paste-save" data-i18n="subagentsAdd.save">加入子代理庫</button>
|
|
58
|
+
</section>
|
|
59
|
+
</div>
|
|
60
|
+
</section>
|
|
61
|
+
<script>
|
|
62
|
+
const flash = document.getElementById("flash");
|
|
63
|
+
function setFlash(kind, text) {
|
|
64
|
+
flash.className = kind;
|
|
65
|
+
flash.textContent = text;
|
|
66
|
+
}
|
|
67
|
+
document.querySelectorAll(".tab").forEach((tab) => {
|
|
68
|
+
tab.addEventListener("click", () => {
|
|
69
|
+
document.querySelectorAll(".tab").forEach((t) => t.classList.remove("on"));
|
|
70
|
+
tab.classList.add("on");
|
|
71
|
+
const id = tab.getAttribute("data-tab");
|
|
72
|
+
document.querySelectorAll(".tab-pane").forEach((pane) => {
|
|
73
|
+
pane.classList.toggle("hidden", pane.id !== "pane-" + id);
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
async function saveAgent(name, body) {
|
|
78
|
+
const response = await fetch("/library/subagents", {
|
|
79
|
+
method: "POST",
|
|
80
|
+
headers: { "content-type": "application/json" },
|
|
81
|
+
body: JSON.stringify({ name: name, body: body }),
|
|
82
|
+
});
|
|
83
|
+
const json = await response.json();
|
|
84
|
+
if (!response.ok) throw new Error(json.error || "save failed");
|
|
85
|
+
return json;
|
|
86
|
+
}
|
|
87
|
+
document.getElementById("ai-generate").addEventListener("click", async () => {
|
|
88
|
+
const prompt = document.getElementById("ai-prompt").value.trim();
|
|
89
|
+
if (!prompt) {
|
|
90
|
+
setFlash("error", t("studio.needPrompt", { kind: "subagent" }));
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const button = document.getElementById("ai-generate");
|
|
94
|
+
if (button.disabled || button.getAttribute("aria-busy") === "true") return;
|
|
95
|
+
button.disabled = true;
|
|
96
|
+
button.setAttribute("aria-busy", "true");
|
|
97
|
+
button.classList.add("is-busy");
|
|
98
|
+
const idle = button.textContent;
|
|
99
|
+
button.textContent = t("studio.generating");
|
|
100
|
+
try {
|
|
101
|
+
const response = await fetch("/generate", {
|
|
102
|
+
method: "POST",
|
|
103
|
+
headers: { "content-type": "application/json" },
|
|
104
|
+
body: JSON.stringify({ kind: "subagent", prompt: prompt }),
|
|
105
|
+
});
|
|
106
|
+
const body = await response.json();
|
|
107
|
+
if (!response.ok) {
|
|
108
|
+
setFlash("error", body.error || "generate failed");
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
document.getElementById("ai-name").value = body.name || "";
|
|
112
|
+
document.getElementById("ai-body").value = body.body || "";
|
|
113
|
+
setFlash(
|
|
114
|
+
"health",
|
|
115
|
+
body.source === "llm"
|
|
116
|
+
? t("studio.generated", { kind: "subagent" })
|
|
117
|
+
: t("studio.generatedLocal", { kind: "subagent" }),
|
|
118
|
+
);
|
|
119
|
+
} catch (err) {
|
|
120
|
+
setFlash("error", err.message);
|
|
121
|
+
} finally {
|
|
122
|
+
button.disabled = false;
|
|
123
|
+
button.removeAttribute("aria-busy");
|
|
124
|
+
button.classList.remove("is-busy");
|
|
125
|
+
button.textContent = idle;
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
document.getElementById("ai-save").addEventListener("click", async () => {
|
|
129
|
+
try {
|
|
130
|
+
const saved = await saveAgent(
|
|
131
|
+
document.getElementById("ai-name").value,
|
|
132
|
+
document.getElementById("ai-body").value,
|
|
133
|
+
);
|
|
134
|
+
setFlash("health", t("subagentsAdd.saved", { name: saved.name || saved.slug }));
|
|
135
|
+
} catch (err) {
|
|
136
|
+
setFlash("error", err.message);
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
document.getElementById("paste-save").addEventListener("click", async () => {
|
|
140
|
+
try {
|
|
141
|
+
const saved = await saveAgent(
|
|
142
|
+
document.getElementById("paste-name").value,
|
|
143
|
+
document.getElementById("paste-body").value,
|
|
144
|
+
);
|
|
145
|
+
setFlash("health", t("subagentsAdd.saved", { name: saved.name || saved.slug }));
|
|
146
|
+
} catch (err) {
|
|
147
|
+
setFlash("error", err.message);
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
</script>
|
|
151
|
+
</body>
|
|
152
|
+
</html>
|