agim-cli 1.1.9 → 1.1.11
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/CHANGELOG.md +100 -0
- package/dist/cli-ui/entry-menu.d.ts +2 -0
- package/dist/cli-ui/entry-menu.d.ts.map +1 -1
- package/dist/cli-ui/entry-menu.js +2 -1
- package/dist/cli-ui/entry-menu.js.map +1 -1
- package/dist/cli-ui/i18n.d.ts +14 -0
- package/dist/cli-ui/i18n.d.ts.map +1 -1
- package/dist/cli-ui/i18n.js +30 -0
- package/dist/cli-ui/i18n.js.map +1 -1
- package/dist/cli-ui/token-menu.d.ts +3 -0
- package/dist/cli-ui/token-menu.d.ts.map +1 -0
- package/dist/cli-ui/token-menu.js +127 -0
- package/dist/cli-ui/token-menu.js.map +1 -0
- package/dist/cli.js +89 -12
- package/dist/cli.js.map +1 -1
- package/dist/core/a2a-notify.d.ts +35 -0
- package/dist/core/a2a-notify.d.ts.map +1 -0
- package/dist/core/a2a-notify.js +265 -0
- package/dist/core/a2a-notify.js.map +1 -0
- package/dist/core/a2a.d.ts +5 -0
- package/dist/core/a2a.d.ts.map +1 -1
- package/dist/core/a2a.js +59 -3
- package/dist/core/a2a.js.map +1 -1
- package/dist/core/access-token.d.ts +41 -0
- package/dist/core/access-token.d.ts.map +1 -0
- package/dist/core/access-token.js +179 -0
- package/dist/core/access-token.js.map +1 -0
- package/dist/core/agent-base.d.ts.map +1 -1
- package/dist/core/agent-base.js +4 -1
- package/dist/core/agent-base.js.map +1 -1
- package/dist/core/restart-flow.d.ts.map +1 -1
- package/dist/core/restart-flow.js +50 -12
- package/dist/core/restart-flow.js.map +1 -1
- package/dist/core/types.d.ts +6 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/web/public/_app.js +59 -0
- package/dist/web/public/login.html +196 -0
- package/dist/web/public/settings.html +140 -1
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +190 -8
- package/dist/web/server.js.map +1 -1
- package/dist/web/viewer-render.d.ts.map +1 -1
- package/dist/web/viewer-render.js +7 -4
- package/dist/web/viewer-render.js.map +1 -1
- package/package.json +1 -1
package/dist/core/types.d.ts
CHANGED
|
@@ -363,6 +363,12 @@ export interface AgentSendOpts {
|
|
|
363
363
|
* call_agent hop). Adapters forward it into RunContext.callDepth so
|
|
364
364
|
* the bus can enforce IMHUB_A2A_MAX_DEPTH on the next hop. */
|
|
365
365
|
callDepth?: number;
|
|
366
|
+
/** Optional AbortSignal. When aborted, the adapter should terminate the
|
|
367
|
+
* underlying child process (SIGTERM, then SIGKILL after a brief grace
|
|
368
|
+
* period). A2A wires this from its per-call timeout so timeout failures
|
|
369
|
+
* don't leave orphan codex / claude / opencode processes writing into
|
|
370
|
+
* `_agim-output/` long after agim has given up on the result. */
|
|
371
|
+
signal?: AbortSignal;
|
|
366
372
|
}
|
|
367
373
|
/**
|
|
368
374
|
* Adapter interface for AI coding agents (Claude Code, Codex, Copilot)
|
package/dist/core/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
|
package/dist/web/public/_app.js
CHANGED
|
@@ -158,7 +158,25 @@
|
|
|
158
158
|
if (init.body && !headers['Content-Type']) {
|
|
159
159
|
headers['Content-Type'] = 'application/json'
|
|
160
160
|
}
|
|
161
|
+
// v1.1.10: attach the web access token from localStorage (set after a
|
|
162
|
+
// successful /login). Cookie is also set by /api/auth/login, but adding
|
|
163
|
+
// the header makes the API directly usable via curl + a bearer prefix.
|
|
164
|
+
if (!headers['Authorization']) {
|
|
165
|
+
try {
|
|
166
|
+
const tk = localStorage.getItem('agim_token')
|
|
167
|
+
if (tk) headers['Authorization'] = `Bearer ${tk}`
|
|
168
|
+
} catch { /* ignore */ }
|
|
169
|
+
}
|
|
161
170
|
const res = await fetch(path, { ...init, headers, credentials: 'same-origin' })
|
|
171
|
+
if (res.status === 401) {
|
|
172
|
+
// Token missing / invalid / expired — kick the user to /login.
|
|
173
|
+
try { localStorage.removeItem('agim_token') } catch { /* ignore */ }
|
|
174
|
+
const next = encodeURIComponent(location.pathname + location.search)
|
|
175
|
+
location.href = `/login?next=${next}`
|
|
176
|
+
const err = new Error('unauthorized')
|
|
177
|
+
err.status = 401
|
|
178
|
+
throw err
|
|
179
|
+
}
|
|
162
180
|
if (!res.ok) {
|
|
163
181
|
let msg = `${res.status} ${res.statusText}`
|
|
164
182
|
try { const j = await res.json(); if (j?.error) msg = j.error } catch { /* ignore */ }
|
|
@@ -171,6 +189,47 @@
|
|
|
171
189
|
return ct.includes('application/json') ? res.json() : res.text()
|
|
172
190
|
}
|
|
173
191
|
|
|
192
|
+
// ============================================================
|
|
193
|
+
// Global fetch interceptor (v1.1.10)
|
|
194
|
+
// ============================================================
|
|
195
|
+
// Static pages (tasks.html / reminders.html / memos.html) often call
|
|
196
|
+
// `fetch('/api/foo')` directly without going through apiFetch. Patch
|
|
197
|
+
// window.fetch so the access token attaches automatically + 401 kicks
|
|
198
|
+
// the user back to /login.
|
|
199
|
+
;(function installFetchAuth(){
|
|
200
|
+
if (window.__agimFetchPatched) return
|
|
201
|
+
window.__agimFetchPatched = true
|
|
202
|
+
var origFetch = window.fetch.bind(window)
|
|
203
|
+
window.fetch = function(input, init){
|
|
204
|
+
var opts = init || {}
|
|
205
|
+
var url = typeof input === 'string' ? input : (input && input.url) || ''
|
|
206
|
+
// Only inject for same-origin API paths (/api/...) and the static
|
|
207
|
+
// route serving — leave external fetches (CDN) alone.
|
|
208
|
+
var isLocalApi = url.startsWith('/') || url.startsWith(location.origin)
|
|
209
|
+
if (isLocalApi) {
|
|
210
|
+
var headers = new Headers(opts.headers || (typeof input !== 'string' ? input.headers : undefined))
|
|
211
|
+
if (!headers.has('Authorization')) {
|
|
212
|
+
try {
|
|
213
|
+
var tk = localStorage.getItem('agim_token')
|
|
214
|
+
if (tk) headers.set('Authorization', 'Bearer ' + tk)
|
|
215
|
+
} catch { /* ignore */ }
|
|
216
|
+
}
|
|
217
|
+
opts = Object.assign({}, opts, { headers, credentials: opts.credentials || 'same-origin' })
|
|
218
|
+
}
|
|
219
|
+
return origFetch(input, opts).then(function(res){
|
|
220
|
+
if (res.status === 401 && isLocalApi && !url.startsWith('/api/auth/')) {
|
|
221
|
+
try { localStorage.removeItem('agim_token') } catch {}
|
|
222
|
+
var next = encodeURIComponent(location.pathname + location.search)
|
|
223
|
+
// Only redirect from non-login pages to avoid loops.
|
|
224
|
+
if (!location.pathname.startsWith('/login')) {
|
|
225
|
+
location.href = '/login?next=' + next
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return res
|
|
229
|
+
})
|
|
230
|
+
}
|
|
231
|
+
})()
|
|
232
|
+
|
|
174
233
|
// ============================================================
|
|
175
234
|
// Expose
|
|
176
235
|
// ============================================================
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="zh">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover">
|
|
6
|
+
<meta name="robots" content="noindex,nofollow">
|
|
7
|
+
<title>Agim · Login</title>
|
|
8
|
+
<style>
|
|
9
|
+
:root{color-scheme:light dark;--bg:#f6f8fa;--fg:#1f2328;--card:#ffffff;--border:#d0d7de;--muted:#656d76;--accent:#0969da;--accent-hover:#0860c9;--ok:#1a7f37;--err:#cf222e;--code:#f4f6f8}
|
|
10
|
+
@media (prefers-color-scheme:dark){:root{--bg:#0d1117;--fg:#e6edf3;--card:#161b22;--border:#30363d;--muted:#8d96a0;--accent:#2f81f7;--accent-hover:#388bfd;--ok:#3fb950;--err:#f85149;--code:#21262d}}
|
|
11
|
+
*{box-sizing:border-box}
|
|
12
|
+
html,body{margin:0;padding:0;height:100%;background:var(--bg);color:var(--fg);font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"}
|
|
13
|
+
.wrap{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:24px}
|
|
14
|
+
.card{width:100%;max-width:460px;background:var(--card);border:1px solid var(--border);border-radius:10px;padding:28px 28px 24px;box-shadow:0 4px 16px rgba(0,0,0,0.06)}
|
|
15
|
+
header{display:flex;align-items:center;gap:10px;margin-bottom:6px}
|
|
16
|
+
header .lock{font-size:24px}
|
|
17
|
+
header h1{margin:0;font-size:18px;font-weight:600}
|
|
18
|
+
.sub{margin:0 0 18px;color:var(--muted);font-size:13px}
|
|
19
|
+
label{display:block;font-size:12px;font-weight:600;margin-bottom:6px;color:var(--muted)}
|
|
20
|
+
input[type=text],input[type=password]{width:100%;padding:9px 12px;border:1px solid var(--border);border-radius:6px;background:var(--card);color:var(--fg);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:13px}
|
|
21
|
+
input:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px color-mix(in srgb,var(--accent) 25%,transparent)}
|
|
22
|
+
button{margin-top:14px;width:100%;padding:9px 12px;background:var(--accent);color:#fff;border:none;border-radius:6px;font-size:14px;font-weight:600;cursor:pointer}
|
|
23
|
+
button:hover{background:var(--accent-hover)}
|
|
24
|
+
button:disabled{opacity:0.6;cursor:default}
|
|
25
|
+
.msg{margin-top:12px;font-size:13px;min-height:18px}
|
|
26
|
+
.msg.err{color:var(--err)}
|
|
27
|
+
.msg.ok{color:var(--ok)}
|
|
28
|
+
.divider{margin:22px 0 12px;display:flex;align-items:center;gap:8px;color:var(--muted);font-size:12px}
|
|
29
|
+
.divider::before,.divider::after{content:"";flex:1;height:1px;background:var(--border)}
|
|
30
|
+
.howto{font-size:13px;color:var(--muted);line-height:1.7}
|
|
31
|
+
.howto h2{margin:0 0 8px;font-size:13px;color:var(--fg);font-weight:600}
|
|
32
|
+
.howto ol{padding-left:18px;margin:0 0 8px}
|
|
33
|
+
.howto li{margin:2px 0}
|
|
34
|
+
.howto code{background:var(--code);padding:1px 6px;border-radius:4px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;color:var(--fg)}
|
|
35
|
+
.howto .hint{font-size:12px;color:var(--muted);margin-top:8px}
|
|
36
|
+
.lang{position:absolute;top:20px;right:24px}
|
|
37
|
+
.lang button{margin:0;padding:4px 10px;background:transparent;color:var(--muted);border:1px solid var(--border);width:auto;font-size:11px;font-weight:500;border-radius:14px}
|
|
38
|
+
.lang button.active{background:var(--accent);color:#fff;border-color:var(--accent)}
|
|
39
|
+
</style>
|
|
40
|
+
</head>
|
|
41
|
+
<body>
|
|
42
|
+
<div class="lang">
|
|
43
|
+
<button id="lang-en" class="active" type="button">EN</button>
|
|
44
|
+
<button id="lang-zh" type="button">中文</button>
|
|
45
|
+
</div>
|
|
46
|
+
<div class="wrap">
|
|
47
|
+
<div class="card">
|
|
48
|
+
<header>
|
|
49
|
+
<span class="lock">🔒</span>
|
|
50
|
+
<h1 id="t-title">Agim Console</h1>
|
|
51
|
+
</header>
|
|
52
|
+
<p class="sub" id="t-sub">Enter your access token to continue.</p>
|
|
53
|
+
|
|
54
|
+
<form id="login-form">
|
|
55
|
+
<label for="token" id="t-label">Access token</label>
|
|
56
|
+
<input id="token" type="password" autocomplete="off" autofocus placeholder="agim_xxxxxxxxxxxxxx" />
|
|
57
|
+
<button type="submit" id="t-submit">Sign in →</button>
|
|
58
|
+
</form>
|
|
59
|
+
<div id="msg" class="msg"></div>
|
|
60
|
+
|
|
61
|
+
<div class="divider" id="t-howto-title">How to get a token</div>
|
|
62
|
+
<div class="howto">
|
|
63
|
+
<ol>
|
|
64
|
+
<li id="t-step1">SSH into the Agim host and run <code>agim</code></li>
|
|
65
|
+
<li id="t-step2">Pick <em>Manage web access tokens</em></li>
|
|
66
|
+
<li id="t-step3">Pick <em>Generate a new token</em></li>
|
|
67
|
+
<li id="t-step4">Paste the printed value above</li>
|
|
68
|
+
</ol>
|
|
69
|
+
<div class="hint" id="t-hint">⚠️ The raw token is shown only once on the terminal — save it in a password manager.<br>Power users: <code>agim token create</code> works one-shot.</div>
|
|
70
|
+
</div>
|
|
71
|
+
</div>
|
|
72
|
+
</div>
|
|
73
|
+
<script>
|
|
74
|
+
(function(){
|
|
75
|
+
// i18n
|
|
76
|
+
var T = {
|
|
77
|
+
en: {
|
|
78
|
+
title: 'Agim Console',
|
|
79
|
+
sub: 'Enter your access token to continue.',
|
|
80
|
+
label: 'Access token',
|
|
81
|
+
submit: 'Sign in →',
|
|
82
|
+
submitting: 'Signing in…',
|
|
83
|
+
howto: 'How to get a token',
|
|
84
|
+
step1: 'SSH into the Agim host and run <code>agim</code>',
|
|
85
|
+
step2: 'Pick <em>Manage web access tokens</em>',
|
|
86
|
+
step3: 'Pick <em>Generate a new token</em>',
|
|
87
|
+
step4: 'Paste the printed value above',
|
|
88
|
+
hint: '⚠️ The raw token is shown only once on the terminal — save it in a password manager.<br>Power users: <code>agim token create</code> works one-shot.',
|
|
89
|
+
bad: 'Invalid token. Run <code>agim token create</code> to generate a new one.',
|
|
90
|
+
err: 'Login failed: ',
|
|
91
|
+
ok: '✓ Authenticated, redirecting…',
|
|
92
|
+
},
|
|
93
|
+
zh: {
|
|
94
|
+
title: 'Agim 控制台',
|
|
95
|
+
sub: '请输入访问 Token 继续。',
|
|
96
|
+
label: '访问 Token',
|
|
97
|
+
submit: '登录 →',
|
|
98
|
+
submitting: '验证中…',
|
|
99
|
+
howto: '如何获取 Token',
|
|
100
|
+
step1: 'SSH 登录 Agim 主机,执行 <code>agim</code>',
|
|
101
|
+
step2: '选择"管理 Web 访问 Token"',
|
|
102
|
+
step3: '选择"生成新 Token"',
|
|
103
|
+
step4: '把终端打印的 Token 粘贴到上方',
|
|
104
|
+
hint: '⚠️ 原文只在终端显示一次,请妥善保存到密码管理器。<br>快捷方式:<code>agim token create</code> 一键生成。',
|
|
105
|
+
bad: 'Token 无效。可在终端执行 <code>agim token create</code> 生成新 Token。',
|
|
106
|
+
err: '登录失败:',
|
|
107
|
+
ok: '✓ 验证通过,正在跳转…',
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
function applyLang(lang){
|
|
112
|
+
var t = T[lang];
|
|
113
|
+
document.getElementById('t-title').textContent = t.title;
|
|
114
|
+
document.getElementById('t-sub').textContent = t.sub;
|
|
115
|
+
document.getElementById('t-label').textContent = t.label;
|
|
116
|
+
document.getElementById('t-submit').textContent = t.submit;
|
|
117
|
+
document.getElementById('t-howto-title').textContent = t.howto;
|
|
118
|
+
document.getElementById('t-step1').innerHTML = t.step1;
|
|
119
|
+
document.getElementById('t-step2').innerHTML = t.step2;
|
|
120
|
+
document.getElementById('t-step3').innerHTML = t.step3;
|
|
121
|
+
document.getElementById('t-step4').innerHTML = t.step4;
|
|
122
|
+
document.getElementById('t-hint').innerHTML = t.hint;
|
|
123
|
+
document.documentElement.lang = lang === 'zh' ? 'zh' : 'en';
|
|
124
|
+
document.getElementById('lang-en').classList.toggle('active', lang === 'en');
|
|
125
|
+
document.getElementById('lang-zh').classList.toggle('active', lang === 'zh');
|
|
126
|
+
localStorage.setItem('im-hub-lang', lang);
|
|
127
|
+
window.__lang = lang;
|
|
128
|
+
}
|
|
129
|
+
var initial = localStorage.getItem('im-hub-lang') || (navigator.language && navigator.language.toLowerCase().startsWith('zh') ? 'zh' : 'en');
|
|
130
|
+
applyLang(initial);
|
|
131
|
+
document.getElementById('lang-en').addEventListener('click', function(){ applyLang('en'); });
|
|
132
|
+
document.getElementById('lang-zh').addEventListener('click', function(){ applyLang('zh'); });
|
|
133
|
+
|
|
134
|
+
function nextUrl(){
|
|
135
|
+
var p = new URLSearchParams(location.search);
|
|
136
|
+
var n = p.get('next') || '/';
|
|
137
|
+
// Disallow open redirects to other hosts.
|
|
138
|
+
try {
|
|
139
|
+
var u = new URL(n, location.origin);
|
|
140
|
+
if (u.origin !== location.origin) return '/';
|
|
141
|
+
return u.pathname + u.search;
|
|
142
|
+
} catch { return '/'; }
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
var form = document.getElementById('login-form');
|
|
146
|
+
var msg = document.getElementById('msg');
|
|
147
|
+
var input = document.getElementById('token');
|
|
148
|
+
var btn = document.getElementById('t-submit');
|
|
149
|
+
|
|
150
|
+
form.addEventListener('submit', async function(ev){
|
|
151
|
+
ev.preventDefault();
|
|
152
|
+
var token = (input.value || '').trim();
|
|
153
|
+
if (!token) return;
|
|
154
|
+
var t = T[window.__lang || 'en'];
|
|
155
|
+
msg.className = 'msg';
|
|
156
|
+
msg.innerHTML = '';
|
|
157
|
+
btn.disabled = true;
|
|
158
|
+
btn.textContent = t.submitting;
|
|
159
|
+
try {
|
|
160
|
+
var r = await fetch('/api/auth/login', {
|
|
161
|
+
method: 'POST',
|
|
162
|
+
headers: { 'Content-Type': 'application/json' },
|
|
163
|
+
body: JSON.stringify({ token: token }),
|
|
164
|
+
});
|
|
165
|
+
if (r.status === 401) {
|
|
166
|
+
msg.className = 'msg err';
|
|
167
|
+
msg.innerHTML = t.bad;
|
|
168
|
+
btn.disabled = false;
|
|
169
|
+
btn.textContent = t.submit;
|
|
170
|
+
input.select();
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
if (!r.ok) {
|
|
174
|
+
var body = await r.text();
|
|
175
|
+
msg.className = 'msg err';
|
|
176
|
+
msg.textContent = t.err + (r.status + ' ' + body.slice(0, 200));
|
|
177
|
+
btn.disabled = false;
|
|
178
|
+
btn.textContent = t.submit;
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
// Also stash in localStorage so old _app.js code paths that read it still work.
|
|
182
|
+
localStorage.setItem('agim_token', token);
|
|
183
|
+
msg.className = 'msg ok';
|
|
184
|
+
msg.textContent = t.ok;
|
|
185
|
+
setTimeout(function(){ location.href = nextUrl(); }, 350);
|
|
186
|
+
} catch (err) {
|
|
187
|
+
msg.className = 'msg err';
|
|
188
|
+
msg.textContent = t.err + (err && err.message || String(err));
|
|
189
|
+
btn.disabled = false;
|
|
190
|
+
btn.textContent = t.submit;
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
})();
|
|
194
|
+
</script>
|
|
195
|
+
</body>
|
|
196
|
+
</html>
|
|
@@ -178,6 +178,23 @@
|
|
|
178
178
|
viewerTunnelBinaryMissing: 'cloudflared not installed',
|
|
179
179
|
viewerTunnelCurrentUrl: 'Current URL',
|
|
180
180
|
viewerTunnelRefresh: 'Refresh',
|
|
181
|
+
a2aNotifyTitle: 'A2A Notifications',
|
|
182
|
+
a2aNotifyHint: 'Push intermediate state to your IM thread when one agent calls another (e.g. Claude → Codex). Keeps you in the loop during long handoffs.',
|
|
183
|
+
a2aDefaultTimeout: 'Default A2A timeout (minutes)',
|
|
184
|
+
a2aDefaultTimeoutHint: 'How long agim waits for a child agent before timing out. Raised from 10 min to 30 min in v1.1.10 — long enough for Codex to do ~4 API pulls + write a report.',
|
|
185
|
+
a2aMaxTimeout: 'Max allowed timeout (minutes)',
|
|
186
|
+
a2aMaxTimeoutHint: 'Hard ceiling. Refuses caller-supplied timeoutMs larger than this so an agent can\'t block A2A forever.',
|
|
187
|
+
a2aNotifyMode: 'Notify mode',
|
|
188
|
+
a2aNotifyOff: 'Off',
|
|
189
|
+
a2aNotifyEssential: 'Essential (start + complete/timeout/failed)',
|
|
190
|
+
a2aNotifyVerbose: 'Verbose (add heartbeats on file changes)',
|
|
191
|
+
a2aMaxDepth: 'Max notify depth',
|
|
192
|
+
a2aMaxDepthHint: 'Only notify for callees up to this nesting depth (1 = direct child only). Avoids spamming on deep call chains.',
|
|
193
|
+
a2aHeartbeatMin: 'Heartbeat interval (minutes, verbose only)',
|
|
194
|
+
a2aHeartbeatHint: 'Checks the callee\'s _agim-output/ directory; pushes a note if files changed or a "still thinking" note otherwise.',
|
|
195
|
+
a2aSave: 'Save',
|
|
196
|
+
a2aSaved: 'Saved — applies to the next A2A invocation, no restart needed.',
|
|
197
|
+
a2aSaveFailed: 'Failed to save A2A settings',
|
|
181
198
|
},
|
|
182
199
|
zh: {
|
|
183
200
|
title: 'Agim — 设置',
|
|
@@ -342,6 +359,23 @@
|
|
|
342
359
|
viewerTunnelBinaryMissing: '未安装 cloudflared',
|
|
343
360
|
viewerTunnelCurrentUrl: '当前 URL',
|
|
344
361
|
viewerTunnelRefresh: '刷新',
|
|
362
|
+
a2aNotifyTitle: 'A2A 中间状态通知',
|
|
363
|
+
a2aNotifyHint: '当一个 agent 调另一个 agent(例如 Claude → Codex)时,把开始/进度/完成/超时的状态推到你的 IM 会话,避免长任务"哑巴等"。',
|
|
364
|
+
a2aDefaultTimeout: 'A2A 默认超时(分钟)',
|
|
365
|
+
a2aDefaultTimeoutHint: 'agim 等子 agent 的时长上限。v1.1.10 从 10 min 提到 30 min — 足够 Codex 拉几次 API + 写报告。',
|
|
366
|
+
a2aMaxTimeout: 'A2A 最大允许超时(分钟)',
|
|
367
|
+
a2aMaxTimeoutHint: '硬上限。agent 调用时即使传更大的 timeoutMs 也会被截到这个值。防止 A2A 被永久卡住。',
|
|
368
|
+
a2aNotifyMode: '通知模式',
|
|
369
|
+
a2aNotifyOff: '关闭',
|
|
370
|
+
a2aNotifyEssential: '精简(仅 start + 终态)',
|
|
371
|
+
a2aNotifyVerbose: '详细(额外在文件变化时推 heartbeat)',
|
|
372
|
+
a2aMaxDepth: '最大通知深度',
|
|
373
|
+
a2aMaxDepthHint: '只对嵌套深度 ≤ 此值的子调用发通知(1 = 仅直接子调用)。避免深度嵌套刷屏。',
|
|
374
|
+
a2aHeartbeatMin: 'Heartbeat 间隔(分钟,详细模式生效)',
|
|
375
|
+
a2aHeartbeatHint: '每隔这么久检查一次子 agent 的 _agim-output/ 目录;有新文件就推一条,没变化就推"仍在 think"。',
|
|
376
|
+
a2aSave: '保存',
|
|
377
|
+
a2aSaved: '已保存 — 下次 A2A 调用生效,无需重启。',
|
|
378
|
+
a2aSaveFailed: '保存 A2A 配置失败',
|
|
345
379
|
},
|
|
346
380
|
};
|
|
347
381
|
function t(key) { return T[window.__lang][key] || T.en[key] || key; }
|
|
@@ -744,7 +778,23 @@
|
|
|
744
778
|
// (if any reverse-proxy added one) is sent automatically.
|
|
745
779
|
function authFetch(url, init = {}) {
|
|
746
780
|
const headers = { ...(init.headers || {}) };
|
|
747
|
-
|
|
781
|
+
// v1.1.10: attach access token (Bearer + Cookie both work, but
|
|
782
|
+
// setting Bearer ensures direct curl-style usage from devtools also
|
|
783
|
+
// succeeds). 401 → redirect to /login with `next` set to current URL.
|
|
784
|
+
if (!headers['Authorization']) {
|
|
785
|
+
try {
|
|
786
|
+
const tk = localStorage.getItem('agim_token');
|
|
787
|
+
if (tk) headers['Authorization'] = `Bearer ${tk}`;
|
|
788
|
+
} catch { /* ignore */ }
|
|
789
|
+
}
|
|
790
|
+
return fetch(url, { ...init, headers, credentials: 'same-origin' }).then(r => {
|
|
791
|
+
if (r.status === 401) {
|
|
792
|
+
try { localStorage.removeItem('agim_token'); } catch {}
|
|
793
|
+
const next = encodeURIComponent(location.pathname + location.search);
|
|
794
|
+
location.href = `/login?next=${next}`;
|
|
795
|
+
}
|
|
796
|
+
return r;
|
|
797
|
+
});
|
|
748
798
|
}
|
|
749
799
|
|
|
750
800
|
// Fetch config on load
|
|
@@ -1476,6 +1526,50 @@
|
|
|
1476
1526
|
<p class="muted" id="viewerStatus" style="margin-top:8px;font-size:12px"></p>
|
|
1477
1527
|
</div>
|
|
1478
1528
|
|
|
1529
|
+
<!-- A2A Notifications (env-file) — push intermediate state during agent-to-agent handoffs -->
|
|
1530
|
+
<div class="card">
|
|
1531
|
+
<h2>🔀 ${t('a2aNotifyTitle')}</h2>
|
|
1532
|
+
<p class="muted" style="margin-top:-4px;margin-bottom:12px;font-size:13px">${t('a2aNotifyHint')}</p>
|
|
1533
|
+
|
|
1534
|
+
<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px;max-width:720px">
|
|
1535
|
+
<div>
|
|
1536
|
+
<label>${t('a2aDefaultTimeout')}</label>
|
|
1537
|
+
<input type="number" id="a2aDefaultTimeout" min="1" max="60" placeholder="30" />
|
|
1538
|
+
<p class="muted" style="margin-top:4px;font-size:11px">${t('a2aDefaultTimeoutHint')}</p>
|
|
1539
|
+
</div>
|
|
1540
|
+
<div>
|
|
1541
|
+
<label>${t('a2aMaxTimeout')}</label>
|
|
1542
|
+
<input type="number" id="a2aMaxTimeout" min="1" max="180" placeholder="60" />
|
|
1543
|
+
<p class="muted" style="margin-top:4px;font-size:11px">${t('a2aMaxTimeoutHint')}</p>
|
|
1544
|
+
</div>
|
|
1545
|
+
</div>
|
|
1546
|
+
|
|
1547
|
+
<label style="margin-top:12px;display:block">${t('a2aNotifyMode')}</label>
|
|
1548
|
+
<select id="a2aNotifyMode" style="max-width:480px">
|
|
1549
|
+
<option value="off">${t('a2aNotifyOff')}</option>
|
|
1550
|
+
<option value="essential" selected>${t('a2aNotifyEssential')}</option>
|
|
1551
|
+
<option value="verbose">${t('a2aNotifyVerbose')}</option>
|
|
1552
|
+
</select>
|
|
1553
|
+
|
|
1554
|
+
<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px;margin-top:12px;max-width:720px">
|
|
1555
|
+
<div>
|
|
1556
|
+
<label>${t('a2aMaxDepth')}</label>
|
|
1557
|
+
<input type="number" id="a2aMaxDepth" min="0" max="5" placeholder="1" />
|
|
1558
|
+
<p class="muted" style="margin-top:4px;font-size:11px">${t('a2aMaxDepthHint')}</p>
|
|
1559
|
+
</div>
|
|
1560
|
+
<div>
|
|
1561
|
+
<label>${t('a2aHeartbeatMin')}</label>
|
|
1562
|
+
<input type="number" id="a2aHeartbeatMin" min="1" max="60" placeholder="5" />
|
|
1563
|
+
<p class="muted" style="margin-top:4px;font-size:11px">${t('a2aHeartbeatHint')}</p>
|
|
1564
|
+
</div>
|
|
1565
|
+
</div>
|
|
1566
|
+
|
|
1567
|
+
<div class="actions" style="margin-top:12px">
|
|
1568
|
+
<button type="button" class="btn btn-primary" id="saveA2A">${t('a2aSave')}</button>
|
|
1569
|
+
</div>
|
|
1570
|
+
<p class="muted" id="a2aStatus" style="margin-top:8px;font-size:12px"></p>
|
|
1571
|
+
</div>
|
|
1572
|
+
|
|
1479
1573
|
<!-- Baidu Maps AK (env-file) — feeds /memo address geocoding -->
|
|
1480
1574
|
<div class="card">
|
|
1481
1575
|
<h2>🗺 Baidu Maps AK</h2>
|
|
@@ -1548,6 +1642,22 @@
|
|
|
1548
1642
|
set('viewerLines', 'IMHUB_VIEWER_LINES');
|
|
1549
1643
|
set('viewerCodeLines', 'IMHUB_VIEWER_CODE_LINES');
|
|
1550
1644
|
set('viewerMaxPastes', 'IMHUB_VIEWER_MAX_PASTES');
|
|
1645
|
+
// A2A card — values stored as ms / direct values; UI uses minutes for the timeouts.
|
|
1646
|
+
const a2aDt = document.getElementById('a2aDefaultTimeout');
|
|
1647
|
+
if (a2aDt) {
|
|
1648
|
+
const ms = parseInt(env['IMHUB_A2A_TIMEOUT_DEFAULT_MS'] || '', 10);
|
|
1649
|
+
a2aDt.value = Number.isFinite(ms) && ms > 0 ? String(Math.round(ms / 60000)) : '';
|
|
1650
|
+
}
|
|
1651
|
+
const a2aMt = document.getElementById('a2aMaxTimeout');
|
|
1652
|
+
if (a2aMt) {
|
|
1653
|
+
const ms = parseInt(env['IMHUB_A2A_MAX_TIMEOUT_MS'] || '', 10);
|
|
1654
|
+
a2aMt.value = Number.isFinite(ms) && ms > 0 ? String(Math.round(ms / 60000)) : '';
|
|
1655
|
+
}
|
|
1656
|
+
const a2aMode = document.getElementById('a2aNotifyMode');
|
|
1657
|
+
if (a2aMode) a2aMode.value = (env['IMHUB_A2A_NOTIFY_MODE'] || 'essential').toLowerCase();
|
|
1658
|
+
set('a2aMaxDepth', 'IMHUB_A2A_NOTIFY_MAX_DEPTH');
|
|
1659
|
+
set('a2aHeartbeatMin', 'IMHUB_A2A_HEARTBEAT_MIN');
|
|
1660
|
+
|
|
1551
1661
|
const vTunnelMode = document.getElementById('viewerTunnelMode');
|
|
1552
1662
|
if (vTunnelMode) {
|
|
1553
1663
|
vTunnelMode.value = (env['IMHUB_VIEWER_TUNNEL_MODE'] || 'off').toLowerCase() === 'quick' ? 'quick' : 'off';
|
|
@@ -1869,6 +1979,35 @@
|
|
|
1869
1979
|
});
|
|
1870
1980
|
document.getElementById('revealBaidu')?.addEventListener('click', () => loadEnvSection(true));
|
|
1871
1981
|
|
|
1982
|
+
// A2A card — save timeouts (min → ms) + mode + depth + heartbeat.
|
|
1983
|
+
document.getElementById('saveA2A')?.addEventListener('click', async () => {
|
|
1984
|
+
const dtMin = parseInt(document.getElementById('a2aDefaultTimeout')?.value || '', 10);
|
|
1985
|
+
const mtMin = parseInt(document.getElementById('a2aMaxTimeout')?.value || '', 10);
|
|
1986
|
+
const mode = document.getElementById('a2aNotifyMode')?.value || 'essential';
|
|
1987
|
+
const depth = (document.getElementById('a2aMaxDepth')?.value || '').trim();
|
|
1988
|
+
const heartbeat = (document.getElementById('a2aHeartbeatMin')?.value || '').trim();
|
|
1989
|
+
const status = document.getElementById('a2aStatus');
|
|
1990
|
+
try {
|
|
1991
|
+
await authFetch('/api/env', {
|
|
1992
|
+
method: 'PUT',
|
|
1993
|
+
headers: { 'Content-Type': 'application/json' },
|
|
1994
|
+
body: JSON.stringify({
|
|
1995
|
+
updates: {
|
|
1996
|
+
IMHUB_A2A_TIMEOUT_DEFAULT_MS: Number.isFinite(dtMin) && dtMin > 0 ? String(dtMin * 60000) : null,
|
|
1997
|
+
IMHUB_A2A_MAX_TIMEOUT_MS: Number.isFinite(mtMin) && mtMin > 0 ? String(mtMin * 60000) : null,
|
|
1998
|
+
IMHUB_A2A_NOTIFY_MODE: mode,
|
|
1999
|
+
IMHUB_A2A_NOTIFY_MAX_DEPTH: depth || null,
|
|
2000
|
+
IMHUB_A2A_HEARTBEAT_MIN: heartbeat || null,
|
|
2001
|
+
},
|
|
2002
|
+
}),
|
|
2003
|
+
});
|
|
2004
|
+
if (status) status.textContent = t('a2aSaved');
|
|
2005
|
+
await loadEnvSection();
|
|
2006
|
+
} catch (err) {
|
|
2007
|
+
if (status) status.textContent = t('a2aSaveFailed') + ': ' + (err && err.message ? err.message : err);
|
|
2008
|
+
}
|
|
2009
|
+
});
|
|
2010
|
+
|
|
1872
2011
|
// Tunnel mode dropdown — show/hide status panel on change.
|
|
1873
2012
|
document.getElementById('viewerTunnelMode')?.addEventListener('change', (e) => {
|
|
1874
2013
|
const box = document.getElementById('viewerTunnelStatusBox');
|
package/dist/web/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/web/server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/web/server.ts"],"names":[],"mappings":"AA+JA,wBAAgB,iBAAiB,IAAI,CAAC,EAAE,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,CAOrE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,YAAY,EAAE,MAAM,CAAA;CACrB,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CA4tB/C"}
|