@kevin5251984/guild 0.2.18 → 0.2.20
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/package.json +2 -2
- package/src/catalog/subagents.ts +2 -1
- package/src/chat-parts.ts +6 -1
- package/src/cli.ts +2 -5
- package/src/compact.ts +27 -0
- package/src/db.ts +236 -68
- package/src/generate.ts +59 -28
- package/src/handlers.ts +355 -84
- package/src/harness.ts +39 -10
- package/src/host-browse.ts +149 -4
- package/src/image-gen.ts +2 -1
- package/src/llm.ts +435 -71
- package/src/mcp.ts +32 -5
- package/src/memory.ts +69 -0
- package/src/mention.ts +189 -14
- package/src/oauth.ts +204 -27
- package/src/opencode-free.ts +248 -0
- package/src/public/buddy.js +432 -0
- package/src/public/chat.css +174 -72
- package/src/public/chat.html +354 -69
- package/src/public/i18n.js +44 -6
- package/src/public/index.html +1 -46
- package/src/public/mobile.css +597 -0
- package/src/public/mobile.html +954 -0
- package/src/public/settings.html +239 -35
- package/src/public/skills-add.html +8 -0
- package/src/public/studio.html +171 -117
- package/src/public/style.css +220 -26
- package/src/public/subagents-add.html +8 -0
- package/src/reasoning-catalog.ts +346 -0
- package/src/router.ts +184 -13
- package/src/store.ts +170 -5
- package/src/subagent.ts +239 -7
- package/src/tools.ts +132 -21
- package/src/trajectory.ts +72 -9
- package/src/usage.ts +10 -0
- package/src/version.ts +25 -0
- package/vendor/protocol/src/index.ts +27 -2
package/src/public/i18n.js
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
/** Guild UI strings. Default follows the browser; packs are zh-Hant and en. */
|
|
2
2
|
var I18N_ROWS = [
|
|
3
3
|
["title.chat", "Guild — 大廳", "Guild — Hall"],
|
|
4
|
+
["title.mobile", "Guild — 外出", "Guild — Away"],
|
|
5
|
+
["mobile.hint", "外出時用 Tailscale 連到家裡這台 guildd(埠 7420)。", "Away from the desk: Tailscale onto this machine's guildd (port 7420)."],
|
|
6
|
+
["mobile.back", "返回委託", "Back to channels"],
|
|
7
|
+
["mobile.recent", "只顯示最近 {n} 則。完整紀錄在大廳。", "Showing the latest {n}. Full log is in the hall."],
|
|
4
8
|
["title.library", "Guild — 技能庫", "Guild — Skills"],
|
|
5
9
|
["title.subagents", "Guild — 子代理", "Guild — Subagents"],
|
|
6
10
|
["title.subagentsAdd", "Guild — 新增子代理", "Guild — Add subagent"],
|
|
@@ -24,7 +28,7 @@ var I18N_ROWS = [
|
|
|
24
28
|
["search.subagents", "搜尋子代理", "Search subagents"],
|
|
25
29
|
["search.mcp", "搜尋 MCP", "Search MCP"],
|
|
26
30
|
["search.models", "搜尋全部模型", "Search all models"],
|
|
27
|
-
["search.traj", "搜尋 system / tool / spawn / 結果", "Search system / tool / spawn / result"],
|
|
31
|
+
["search.traj", "搜尋 system / tool / spawn / 子代理 / 結果", "Search system / tool / spawn / subagent / result"],
|
|
28
32
|
["channels", "委託", "Channels"],
|
|
29
33
|
["dms", "密談", "Whispers"],
|
|
30
34
|
["newChannel", "新委託", "New channel"],
|
|
@@ -63,6 +67,12 @@ var I18N_ROWS = [
|
|
|
63
67
|
["edit", "編輯", "Edit"],
|
|
64
68
|
["reply", "回覆", "Reply"],
|
|
65
69
|
["retry", "重問", "Retry"],
|
|
70
|
+
["branch", "分支", "Branch"],
|
|
71
|
+
["branch.name", "子委託名稱", "Name this side quest"],
|
|
72
|
+
["branch.close", "結案", "Close quest"],
|
|
73
|
+
["branch.closeConfirm", "結案 #{name}?子委託會從側欄拿掉。", "Close #{name}? It leaves the sidebar."],
|
|
74
|
+
["branch.closeMerge", "要把紀錄整理後寫回主委託 MEMORY.md 嗎?", "Write the notes back into the parent MEMORY.md?"],
|
|
75
|
+
["branch.closeFailed", "結案失敗", "Couldn't close"],
|
|
66
76
|
["stats", "統計", "Stats"],
|
|
67
77
|
["stats.title", "回應統計", "Response statistics"],
|
|
68
78
|
["stats.tokens", "Token", "Tokens"],
|
|
@@ -71,7 +81,7 @@ var I18N_ROWS = [
|
|
|
71
81
|
["stats.rounds", "模型回合", "Agent rounds"],
|
|
72
82
|
["stats.cost", "費用", "Cost"],
|
|
73
83
|
["stats.estimated", "估算", "Estimated"],
|
|
74
|
-
["stats.inOut", "輸入 {in} · 輸出 {out}", "in {in} · out {out}"],
|
|
84
|
+
["stats.inOut", "輸入 {in} · 快取命中 {cache} · 輸出 {out}", "in {in} · cache {cache} · out {out}"],
|
|
75
85
|
["askAgain", "重新詢問", "Ask again"],
|
|
76
86
|
["send", "送出", "Send"],
|
|
77
87
|
["jumpBottom", "滾到最新", "Jump to latest"],
|
|
@@ -95,6 +105,11 @@ var I18N_ROWS = [
|
|
|
95
105
|
["busy", "忙碌中", "Busy"],
|
|
96
106
|
["unread", "未讀", "Unread"],
|
|
97
107
|
["noMessages", "還沒有紀錄。寫一句話開始。據點裡記得 @handle。", "No log yet. Say something. In a hall, @handle an adventurer."],
|
|
108
|
+
["setup.kicker", "第一步", "Step 1"],
|
|
109
|
+
["setup.needModel", "還沒接模型。Guild 不能想、也不能跑工具。", "No model yet. Guild cannot think or run tools."],
|
|
110
|
+
["setup.needModelBody", "先連接訂閱或填 API key,套用主模型,再回來點名。", "Connect a subscription or paste an API key, apply a default, then come back to @mention someone."],
|
|
111
|
+
["setup.subs", "連接訂閱", "Connect a subscription"],
|
|
112
|
+
["setup.keys", "填 API key", "Add an API key"],
|
|
98
113
|
["dm", "密談", "Whisper"],
|
|
99
114
|
["justNow", "剛剛", "Just now"],
|
|
100
115
|
["minutesAgo", "{n} 分鐘前", "{n} min ago"],
|
|
@@ -104,10 +119,13 @@ var I18N_ROWS = [
|
|
|
104
119
|
["local", "本地", "Local"],
|
|
105
120
|
["you", "你", "You"],
|
|
106
121
|
["emptyParen", "(空)", "(empty)"],
|
|
122
|
+
["reason.none", "關閉", "Off"],
|
|
107
123
|
["reason.min", "最低", "Min"],
|
|
108
124
|
["reason.low", "低", "Low"],
|
|
109
125
|
["reason.mid", "中", "Mid"],
|
|
110
126
|
["reason.high", "高", "High"],
|
|
127
|
+
["reason.xhigh", "極高", "Extra high"],
|
|
128
|
+
["reason.max", "最大", "Max"],
|
|
111
129
|
["speed.normal", "標準", "Standard"],
|
|
112
130
|
["speed.fast", "快速", "Fast"],
|
|
113
131
|
["model", "模型", "Model"],
|
|
@@ -140,15 +158,16 @@ var I18N_ROWS = [
|
|
|
140
158
|
["remove", "移除", "Remove"],
|
|
141
159
|
["cancelReply", "取消回覆", "Cancel reply"],
|
|
142
160
|
["replying", "回覆…", "Replying…"],
|
|
143
|
-
["trace", "
|
|
161
|
+
["trace", "軌跡", "Trajectory"],
|
|
144
162
|
["trace.steps", "步驟", "Steps"],
|
|
145
163
|
["trace.long", "長輸出", "Long output"],
|
|
146
164
|
["trace.pick", "選一筆事件。", "Select an event."],
|
|
147
165
|
["trace.empty", "沒有事件。送一則訊息後會開始記錄。", "No events yet. Send a message to start the log."],
|
|
148
|
-
["trace.log", "
|
|
166
|
+
["trace.log", "只追加紀錄", "append-only log"],
|
|
149
167
|
["trace.derived", "由訊息還原", "rebuilt from messages"],
|
|
150
168
|
["trace.live", "進行中", "in progress"],
|
|
151
169
|
["trace.loading", "讀取中…", "Loading…"],
|
|
170
|
+
["trace.filter.all", "全部", "All"],
|
|
152
171
|
["html.preview", "預覽", "Preview"],
|
|
153
172
|
["html.code", "原始碼", "Code"],
|
|
154
173
|
["html.expand", "放大預覽", "Expand preview"],
|
|
@@ -266,7 +285,7 @@ var I18N_ROWS = [
|
|
|
266
285
|
["library.local", "本機", "Host"],
|
|
267
286
|
["settings.eyebrow", "Hermes-style", "Hermes-style"],
|
|
268
287
|
["settings.title", "模型", "Models"],
|
|
269
|
-
["settings.lede", "
|
|
288
|
+
["settings.lede", "第一次:先連訂閱或填 API key,再套用主模型。沒有模型就不能用。訂閱走 OAuth;API key 寫入 ~/.guild/models.json。", "First time: connect a subscription or paste an API key, then apply a default. Guild does not run without a model. Subscriptions use OAuth. API keys go in ~/.guild/models.json."],
|
|
270
289
|
["settings.accounts", "連接帳號", "Accounts"],
|
|
271
290
|
["settings.accountsHint", "用訂閱登入,不必複製金鑰。瀏覽器完成授權後會自動刷新 token。", "Subscription login, no key paste. Tokens refresh after the browser handshake."],
|
|
272
291
|
["settings.connect", "連接", "Connect"],
|
|
@@ -275,6 +294,18 @@ var I18N_ROWS = [
|
|
|
275
294
|
["settings.pending", "登入中", "Signing in"],
|
|
276
295
|
["settings.keys", "API 金鑰供應商", "API key providers"],
|
|
277
296
|
["settings.keysHint", "點名稱切換供應商。要加新的,點「+ 新增」。金鑰可用 $ENV 或直接貼上。", "Tap a name to switch. Tap “+ Add” for a new provider. Keys can be $ENV or pasted."],
|
|
297
|
+
["settings.keyless", "無需金鑰", "No key needed"],
|
|
298
|
+
["settings.opencodeFreeHint", "不用登入、不用註冊、不用環境變數。走 OpenCode Zen 匿名免費層。", "No login, no account, no env var. OpenCode Zen's anonymous free tier."],
|
|
299
|
+
["settings.saveKeylessHint", "這家不用金鑰。套用主模型即可。", "No key to save. Apply it as the default."],
|
|
300
|
+
["settings.sync", "Sync", "Sync"],
|
|
301
|
+
["settings.syncing", "同步並測試中…", "Syncing and probing…"],
|
|
302
|
+
["settings.synced", "已同步 {n} 個可用模型", "Synced {n} working models"],
|
|
303
|
+
["settings.syncedSkip", "已同步 {ok} 個可用 · 略過 {names}", "Synced {ok} working · skipped {names}"],
|
|
304
|
+
["settings.syncedNone", "目錄有了,但沒有模型測得通", "Catalog ok, but no model answered"],
|
|
305
|
+
["settings.probeOk", "可用", "Works"],
|
|
306
|
+
["settings.probeBusy", "限流", "Busy"],
|
|
307
|
+
["settings.probeFail", "無法連線", "Down"],
|
|
308
|
+
["settings.syncFailed", "同步失敗", "Couldn't sync"],
|
|
278
309
|
["settings.noProviders", "還沒有供應商。點「+ 新增」選一家模板。", "No providers yet. Tap “+ Add” and pick a template."],
|
|
279
310
|
["settings.addProvider", "新增供應商", "Add provider"],
|
|
280
311
|
["settings.addChip", "+ 新增", "+ Add"],
|
|
@@ -286,7 +317,7 @@ var I18N_ROWS = [
|
|
|
286
317
|
["settings.provider", "供應商", "Provider"],
|
|
287
318
|
["settings.apply", "套用", "Apply"],
|
|
288
319
|
["settings.aux", "輔助模型", "Auxiliary models"],
|
|
289
|
-
["settings.auxHint", "Vision、Web extract、
|
|
320
|
+
["settings.auxHint", "只有 Vision、Web extract、SubAgent 可以另選模型。其餘用途一律跟主模型。", "Only Vision, web extract, and SubAgent can use a different model. Everything else follows the default."],
|
|
290
321
|
["settings.auxReset", "全部改回主模型", "Reset all to default"],
|
|
291
322
|
["settings.useMain", "改回跟主模型", "Follow default"],
|
|
292
323
|
["settings.change", "更改", "Change"],
|
|
@@ -297,6 +328,7 @@ var I18N_ROWS = [
|
|
|
297
328
|
["settings.noDefault", "尚未設定主模型", "No default model"],
|
|
298
329
|
["settings.currentMain", "目前主模型:{name}", "Default: {name}"],
|
|
299
330
|
["settings.delete", "刪除", "Delete"],
|
|
331
|
+
["settings.deletedProvider", "已刪除 {name}", "Deleted {name}"],
|
|
300
332
|
["settings.locale", "介面語言", "Language"],
|
|
301
333
|
["settings.localeHint", "寫進這個瀏覽器。大廳、編制、工坊、模型共用。", "Saved in this browser. Shared by Hall, Roster, Workshop, and Models."],
|
|
302
334
|
["settings.oauthCode", "在瀏覽器開啟授權頁,輸入代碼:", "Open the auth page and enter this code:"],
|
|
@@ -326,6 +358,8 @@ var I18N_ROWS = [
|
|
|
326
358
|
["studio.streetAlt", "Guild 酒館門口", "Guild inn door"],
|
|
327
359
|
["studio.leave", "出門", "Leave"],
|
|
328
360
|
["studio.inn", "酒館", "Inn"],
|
|
361
|
+
["studio.idle", "待命", "idle"],
|
|
362
|
+
["studio.diving", "潛水", "diving"],
|
|
329
363
|
["studio.streetLine", "夜晚的酒館還開著。點那扇門進去。", "The inn is still open. Tap the door."],
|
|
330
364
|
["studio.tonight", "今晚", "Tonight"],
|
|
331
365
|
["studio.hire", "招募冒險者", "Recruit an adventurer"],
|
|
@@ -384,6 +418,10 @@ var I18N_ROWS = [
|
|
|
384
418
|
["studio.vacant", "空位", "Vacant"],
|
|
385
419
|
["studio.vacantLine", "空座位。要招冒險者進來嗎?", "Empty seat. Recruit someone?"],
|
|
386
420
|
["studio.hireChip", "招募", "Hire"],
|
|
421
|
+
["studio.genLook", "生成形象", "Generate look"],
|
|
422
|
+
["studio.genLookBusy", "畫臉中…", "Drawing…"],
|
|
423
|
+
["studio.genLookDone", "新形象好了。", "New look ready."],
|
|
424
|
+
["studio.genLookFail", "生圖失敗。到模型頁接 Grok 訂閱或填金鑰再試。", "Image failed. Connect a Grok subscription or add a key on the models page."],
|
|
387
425
|
["studio.drink", "……今晚在這兒喝酒。", "…drinking here tonight."],
|
|
388
426
|
["studio.notFound", "找不到這名冒險者", "Adventurer not found"],
|
|
389
427
|
["studio.editing", "正在編輯 @{handle} · 勾選只屬於這名冒險者", "Editing @{handle} · skills are only for this adventurer"],
|
package/src/public/index.html
CHANGED
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
rel="stylesheet"
|
|
16
16
|
/>
|
|
17
17
|
<link rel="stylesheet" href="/style.css" />
|
|
18
|
+
<script src="/buddy.js"></script>
|
|
18
19
|
</head>
|
|
19
20
|
<body class="office-page">
|
|
20
21
|
<header class="appbar">
|
|
@@ -63,53 +64,7 @@
|
|
|
63
64
|
const colors = ["#7c6af7", "#5b8def", "#2ea887", "#e07a3d", "#d4537e"];
|
|
64
65
|
return colors[seedOf(key) % colors.length];
|
|
65
66
|
}
|
|
66
|
-
function px(ctx, x, y, w, h, color) {
|
|
67
|
-
ctx.fillStyle = color;
|
|
68
|
-
ctx.fillRect(x, y, w, h);
|
|
69
|
-
}
|
|
70
|
-
function drawBuddy(canvas, shirt, seed) {
|
|
71
|
-
const ctx = canvas.getContext("2d");
|
|
72
|
-
canvas.width = 16;
|
|
73
|
-
canvas.height = 24;
|
|
74
|
-
ctx.imageSmoothingEnabled = false;
|
|
75
|
-
const skin = ["#f0c8a0", "#e2b184", "#c68642", "#8d5524"][seed % 4];
|
|
76
|
-
const hair = ["#2a1c12", "#c4a35a", "#1a1a1a", "#6b2d3c", "#3c4a6e"][seed % 5];
|
|
77
|
-
const outline = "#1b1510";
|
|
78
|
-
const pants = "#2a3140";
|
|
79
|
-
const style = seed % 3;
|
|
80
|
-
|
|
81
|
-
px(ctx, 4, 12, 8, 7, outline);
|
|
82
|
-
px(ctx, 5, 13, 6, 5, shirt);
|
|
83
|
-
px(ctx, 3, 13, 2, 5, shirt);
|
|
84
|
-
px(ctx, 11, 13, 2, 5, shirt);
|
|
85
|
-
px(ctx, 3, 18, 2, 1, skin);
|
|
86
|
-
px(ctx, 11, 18, 2, 1, skin);
|
|
87
|
-
|
|
88
|
-
px(ctx, 4, 4, 8, 8, outline);
|
|
89
|
-
px(ctx, 5, 5, 6, 6, skin);
|
|
90
|
-
px(ctx, 6, 7, 1, 1, outline);
|
|
91
|
-
px(ctx, 9, 7, 1, 1, outline);
|
|
92
|
-
px(ctx, 7, 9, 2, 1, "#c07070");
|
|
93
67
|
|
|
94
|
-
if (style === 0) {
|
|
95
|
-
px(ctx, 4, 3, 8, 3, hair);
|
|
96
|
-
px(ctx, 4, 5, 2, 3, hair);
|
|
97
|
-
px(ctx, 10, 5, 2, 3, hair);
|
|
98
|
-
} else if (style === 1) {
|
|
99
|
-
px(ctx, 4, 2, 8, 4, hair);
|
|
100
|
-
px(ctx, 3, 5, 2, 4, hair);
|
|
101
|
-
px(ctx, 11, 5, 2, 4, hair);
|
|
102
|
-
} else {
|
|
103
|
-
px(ctx, 5, 2, 6, 2, hair);
|
|
104
|
-
px(ctx, 4, 4, 8, 2, hair);
|
|
105
|
-
px(ctx, 7, 1, 2, 2, hair);
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
px(ctx, 5, 19, 3, 4, pants);
|
|
109
|
-
px(ctx, 8, 19, 3, 4, pants);
|
|
110
|
-
px(ctx, 5, 23, 3, 1, outline);
|
|
111
|
-
px(ctx, 8, 23, 3, 1, outline);
|
|
112
|
-
}
|
|
113
68
|
function escapeHtml(value) {
|
|
114
69
|
return String(value)
|
|
115
70
|
.replace(/&/g, "&")
|